diff --git a/build/build.xml b/build/build.xml index f3921ba..f479ec8 100644 --- a/build/build.xml +++ b/build/build.xml @@ -251,8 +251,8 @@ Other values for TARGET are: "); - throw new Scanner.SyntaxError(); + if (scanner.token == Token.CPINDEX) { + // CONSTANT_FIELD + int cpx = scanner.intValue; + refCell = parser.pool.getCell(cpx); + scanner.scan(); + } else { + // [FIELDREF|METHODREF|INTERFACEMETHODREF] + refCell = parser.parseMethodHandle(subtag); } - int cpx = scanner.intValue; - refCell = parser.pool.getCell(cpx); - scanner.scan(); - } else { + // INVOKESUBTAG : REF_INVOKEINTERFACE, REF_NEWINVOKESPECIAL, ... // normal JASM subtag = parser.parseSubtag(); subtagCell = new ConstantPool.ConstCell(subtag.value()); scanner.expect(Token.COLON); - refCell = parser.parseMethodHandle(subtag); + if (scanner.token == Token.CPINDEX) { + // CODETOOLS-7901522: Jasm doesn't allow to create REF_invoke* referring an InterfaceMethod + // Parsing the case when refCell is CP index (#1) + // const #1 = InterfaceMethod m:"()V"; + // const #2 = MethodHandle REF_invokeSpecial:#1; + int cpx = scanner.intValue; + refCell = parser.pool.getCell(cpx); + scanner.scan(); + } else { + refCell = parser.parseMethodHandle(subtag); + } } obj = new ConstantPool.ConstValue_Pair(tag, subtagCell, refCell); } catch (IOException e) {