From ba35302fcd202cbde4558f13a903a7f63322bf82 Mon Sep 17 00:00:00 2001 From: lkuskov Date: Wed, 11 Sep 2019 13:10:14 -0700 Subject: [PATCH] CODETOOLS-7901522 Jasm doesn't allow to create REF_invoke* referring an InterfaceMethod --- build/build.xml | 4 +-- src/org/openjdk/asmtools/jasm/ParserCP.java | 31 +++++++++++++++------ 2 files changed, 24 insertions(+), 11 deletions(-) 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) {