org_eclipse_lemminx_extensions_catalog_XMLCatalogExtensionTest_java
org.apache.xerces.impl.xpath.regex.RegularExpression
private int match(Context context, Op op, int n, int n2, int n3) {
        ExpressionTarget expressionTarget = context.target;
        Stack<Op> stack = new Stack<Op>();
        IntStack intStack = new IntStack();
        boolean bl = RegularExpression.isSet(n3, 2);
        int n4 = -1;
        boolean bl2 = false;
        block28: while (true) {
            Object object;
            int n5;
            if (op == null || n > context.limit || n < context.start) {
                n4 = op == null ? (RegularExpression.isSet(n3, 512) && n != context.limit ? -1 : n) : -1;
                bl2 = true;
            } else {
                n4 = -1;
                switch (op.type) {
                    case 1: {
                        int n6;
                        int n7 = n6 = n2 > 0 ? n : n - 1;
                        if (n6 >= context.limit || n6 < 0 || !this.matchChar(op.getData(), expressionTarget.charAt(n6), bl)) {
                            bl2 = true;
                            break;
                        }
                        n += n2;
                        op = op.next;
                        break;
                    }
                    case 0: {
                        int n8;
                        int n9 = n8 = n2 > 0 ? n : n - 1;
                        if (n8 >= context.limit || n8 < 0) {
                            bl2 = true;
                            break;
                        }
                        if (RegularExpression.isSet(n3, 4)) {
                            if (REUtil.isHighSurrogate(expressionTarget.charAt(n8)) && n8 + n2 >= 0 && n8 + n2 < context.limit) {
                                n8 += n2;
                            }
                        } else {
                            n5 = expressionTarget.charAt(n8);
                            if (REUtil.isHighSurrogate(n5) && n8 + n2 >= 0 && n8 + n2 < context.limit) {
                                n5 = REUtil.composeFromSurrogates(n5, expressionTarget.charAt(n8 += n2));
                            }
                            if (RegularExpression.isEOLChar(n5)) {
                                bl2 = true;
                                break;
                            }
                        }
                        n = n2 > 0 ? n8 + 1 : n8;
                        op = op.next;
                        break;
                    }
                    case 3: 
                    case 4: {
                        int n10;
                        int n11 = n10 = n2 > 0 ? n : n - 1;
                        if (n10 >= context.limit || n10 < 0) {
                            bl2 = true;
                            break;
                        }
                        n5 = expressionTarget.charAt(n);
                        if (REUtil.isHighSurrogate(n5) && n10 + n2 < context.limit && n10 + n2 >= 0) {
                            n5 = REUtil.composeFromSurrogates(n5, expressionTarget.charAt(n10 += n2));
                        }
                        if (!((RangeToken)(object = op.getToken())).match(n5)) {
                            bl2 = true;
                            break;
                        }
                        n = n2 > 0 ? n10 + 1 : n10;
                        op = op.next;
                        break;
                    }
                    case 5: {
                        if (!this.matchAnchor(expressionTarget, op, context, n, n3)) {
                            bl2 = true;
                            break;
                        }
                        op = op.next;
                        break;
                    }
                    case 16: {
                        int n12 = op.getData();
                        if (n12 <= 0 || n12 >= this.nofparen) {
                            throw new RuntimeException("Internal Error: Reference number must be more than zero: " + n12);
                        }
                        if (context.match.getBeginning(n12) < 0 || context.match.getEnd(n12) < 0) {
                            bl2 = true;
                            break;
                        }
                        n5 = context.match.getBeginning(n12);
                        int n13 = context.match.getEnd(n12) - n5;
                        if (n2 > 0) {
                            if (!expressionTarget.regionMatches(bl, n, context.limit, n5, n13)) {
                                bl2 = true;
                                break;
                            }
                            n += n13;
                        } else {
                            if (!expressionTarget.regionMatches(bl, n - n13, context.limit, n5, n13)) {
                                bl2 = true;
                                break;
                            }
                            n -= n13;
                        }
                        op = op.next;
                        break;
                    }
                    case 6: {
                        String string = op.getString();
                        n5 = string.length();
                        if (n2 > 0) {
                            if (!expressionTarget.regionMatches(bl, n, context.limit, string, n5)) {
                                bl2 = true;
                                break;
                            }
                            n += n5;
                        } else {
                            if (!expressionTarget.regionMatches(bl, n - n5, context.limit, string, n5)) {
                                bl2 = true;
                                break;
                            }
                            n -= n5;
                        }
                        op = op.next;
                        break;
                    }
                    case 7: {
                        int n14 = op.getData();
                        if (context.closureContexts[n14].contains(n)) {
                            bl2 = true;
                            break;
                        }
                        context.closureContexts[n14].addOffset(n);
                    }
                    case 9: {
                        stack.push(op);
                        intStack.push(n);
                        op = op.getChild();
                        break;
                    }
                    case 8: 
                    case 10: {
                        stack.push(op);
                        intStack.push(n);
                        op = op.next;
                        break;
                    }
                    case 11: {
                        if (op.size() == 0) {
                            bl2 = true;
                            break;
                        }
                        stack.push(op);
                        intStack.push(0);
                        intStack.push(n);
                        op = op.elementAt(0);
                        break;
                    }
                    case 15: {
                        int n15 = op.getData();
                        if (context.match != null) {
                            if (n15 > 0) {
                                intStack.push(context.match.getBeginning(n15));
                                context.match.setBeginning(n15, n);
                            } else {
                                n5 = -n15;
                                intStack.push(context.match.getEnd(n5));
                                context.match.setEnd(n5, n);
                            }
                            stack.push(op);
                            intStack.push(n);
                        }
                        op = op.next;
                        break;
                    }
                    case 20: 
                    case 21: 
                    case 22: 
                    case 23: {
                        stack.push(op);
                        intStack.push(n2);
                        intStack.push(n);
                        n2 = op.type == 20 || op.type == 21 ? 1 : -1;
                        op = op.getChild();
                        break;
                    }
                    case 24: {
                        stack.push(op);
                        intStack.push(n);
                        op = op.getChild();
                        break;
                    }
                    case 25: {
                        int n16 = n3;
                        n16 |= op.getData();
                        stack.push(op);
                        intStack.push(n3);
                        intStack.push(n);
                        n3 = n16 &= ~op.getData2();
                        op = op.getChild();
                        break;
                    }
                    case 26: {
                        Op.ConditionOp conditionOp = (Op.ConditionOp)op;
                        if (conditionOp.refNumber > 0) {
                            if (conditionOp.refNumber >= this.nofparen) {
                                throw new RuntimeException("Internal Error: Reference number must be more than zero: " + conditionOp.refNumber);
                            }
                            if (context.match.getBeginning(conditionOp.refNumber) >= 0 && context.match.getEnd(conditionOp.refNumber) >= 0) {
                                op = conditionOp.yes;
                                break;
                            }
                            if (conditionOp.no != null) {
                                op = conditionOp.no;
                                break;
                            }
                            op = conditionOp.next;
                            break;
                        }
                        stack.push(op);
                        intStack.push(n);
                        op = conditionOp.condition;
                        break;
                    }
                    default: {
                        throw new RuntimeException("Unknown operation type: " + op.type);
                    }
                }
            }
            block29: while (true) {
                if (!bl2) continue block28;
                if (stack.isEmpty()) {
                    return n4;
                }
                op = (Op)stack.pop();
                n = intStack.pop();
                switch (op.type) {
                    case 7: 
                    case 9: {
                        if (n4 >= 0) break;
                        op = op.next;
                        bl2 = false;
                        break;
                    }
                    case 8: 
                    case 10: {
                        if (n4 >= 0) break;
                        op = op.getChild();
                        bl2 = false;
                        break;
                    }
                    case 11: {
                        int n17 = intStack.pop();
                        if (n4 >= 0) continue block29;
                        if (++n17 < op.size()) {
                            stack.push(op);
                            intStack.push(n17);
                            intStack.push(n);
                            op = op.elementAt(n17);
                            bl2 = false;
                            break;
                        }
                        n4 = -1;
                        break;
                    }
                    case 15: {
                        int n18 = op.getData();
                        n5 = intStack.pop();
                        if (n4 >= 0) break;
                        if (n18 > 0) {
                            context.match.setBeginning(n18, n5);
                            break;
                        }
                        context.match.setEnd(-n18, n5);
                        break;
                    }
                    case 20: 
                    case 22: {
                        n2 = intStack.pop();
                        if (0 <= n4) {
                            op = op.next;
                            bl2 = false;
                        }
                        n4 = -1;
                        break;
                    }
                    case 21: 
                    case 23: {
                        n2 = intStack.pop();
                        if (0 > n4) {
                            op = op.next;
                            bl2 = false;
                        }
                        n4 = -1;
                        break;
                    }
                    case 25: {
                        n3 = intStack.pop();
                    }
                    case 24: {
                        if (n4 < 0) break;
                        n = n4;
                        op = op.next;
                        bl2 = false;
                        break;
                    }
                    case 26: {
                        object = (Op.ConditionOp)op;
                        op = 0 <= n4 ? ((Op.ConditionOp)object).yes : (((Op.ConditionOp)object).no != null ? ((Op.ConditionOp)object).no : ((Op.ConditionOp)object).next);
                        bl2 = false;
                        break;
                    }
                }
            }
            break;
        }
    }
 -> java.lang.String.charAt(int): char -> java.util.Stack.push(java.lang.Object): java.lang.Object -> java.lang.String.charAt(int): char -> java.util.Stack.push(java.lang.Object): java.lang.Object -> java.util.Stack.isEmpty(): boolean -> java.util.Stack.pop(): java.lang.Object -> java.util.Stack.push(java.lang.Object): java.lang.Object -> java.util.Stack.isEmpty(): boolean -> java.util.Stack.pop(): java.lang.Object -> java.util.Stack.isEmpty(): boolean -> java.util.Stack.pop(): java.lang.Object -> java.util.Stack.isEmpty(): boolean
 [CALL] [CALL] [EXIT] [CALL] -> java.lang.String.charAt(int): char [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] -> java.util.Stack.push(java.lang.Object): java.lang.Object [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] -> java.lang.String.charAt(int): char [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] -> java.util.Stack.push(java.lang.Object): java.lang.Object [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] -> java.util.Stack.isEmpty(): boolean -> java.util.Stack.pop(): java.lang.Object [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] -> java.util.Stack.push(java.lang.Object): java.lang.Object [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] -> java.util.Stack.isEmpty(): boolean -> java.util.Stack.pop(): java.lang.Object [CALL] [EXIT] [CALL] [EXIT] -> java.util.Stack.isEmpty(): boolean -> java.util.Stack.pop(): java.lang.Object [CALL] [EXIT] -> java.util.Stack.isEmpty(): boolean [EXIT]