Jdec sometimes generates class names matching jcoder keywords or constant values

B. Blaser bsrbnd at gmail.com
Fri Aug 25 07:35:48 UTC 2017


Hi,

On 7 March 2017 at 18:35, B. Blaser <bsrbnd at gmail.com> wrote:
> Hi,
> Any comment about that?
>
> I think this is what the specification claims here:
>
> https://wiki.openjdk.java.net/display/CodeTools/Chapter+2#Chapter2-AssemblersandDissassemblers

Should I create a JBS issue for that?

Bernard

> Note also the small spelling mistake in the title: Dis(s)assemblers
>
> Thanks,
> Bernard
>
> 2017-02-20 15:06 GMT+01:00 B. Blaser <bsrbnd at gmail.com>:
>> Hi,
>>
>> Jdec sometimes generates class names matching jcoder keywords or
>> constant values, for example:
>>
>> $ cat Method.java I.java z.java
>> // JcodTokens.ConstType.CONSTANT_METHOD
>> class Method {}
>>
>> // Tables.StackMapType.ITEM_Integer
>> interface I {}
>>
>> // JcodTokens.Token.ZEROINDEX
>> class z {}
>>
>> $ javac Method.java I.java z.java
>> $ java -jar asmtools.jar jdec Method.class > Method.jcod
>> $ java -jar asmtools.jar jcoder Method.jcod
>> org.openjdk.asmtools.jcoder.SyntaxError
>>     [...]
>> Method.jcod:1: Name expected.
>> class Method {
>>      ^
>> 1 error
>>
>> $ java -jar asmtools.jar jdec I.class > I.jcod
>> $ java -jar asmtools.jar jcoder I.jcod
>> org.openjdk.asmtools.jcoder.SyntaxError
>>     [...]
>> I.jcod:1: Name expected.
>> class I {
>>      ^
>> 1 error
>>
>> $ java -jar asmtools.jar jdec z.class > z.jcod
>> $ java -jar asmtools.jar jcoder z.jcod
>> org.openjdk.asmtools.jcoder.SyntaxError
>>     [...]
>> z.jcod:1: Name expected.
>> class z {
>>      ^
>> 1 error
>>
>> The fix below (ClassData.decodeClass()) makes jdec print the file name
>> instead of the class name when the latter matches a jcoder keyword or
>> constant value.
>>
>> Any comment or review is welcome.
>>
>> Thanks,
>> Bernard
>>
>> diff --git a/src/org/openjdk/asmtools/jcoder/JcodTokens.java
>> b/src/org/openjdk/asmtools/jcoder/JcodTokens.java
>> --- a/src/org/openjdk/asmtools/jcoder/JcodTokens.java
>> +++ b/src/org/openjdk/asmtools/jcoder/JcodTokens.java
>> @@ -1,5 +1,5 @@
>>  /*
>> - * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
>> + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
>>   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>>   *
>>   * This code is free software; you can redistribute it and/or modify it
>> @@ -368,7 +368,7 @@
>>          ConstantTypes.put(tt.value, tt);
>>      }
>>
>> -    static int constValue(String stringValue) {
>> +    public static int constValue(String stringValue) {
>>          ConstType Val = constType(stringValue);
>>          int val = -1;
>>
>> diff --git a/src/org/openjdk/asmtools/jdec/ClassData.java
>> b/src/org/openjdk/asmtools/jdec/ClassData.java
>> --- a/src/org/openjdk/asmtools/jdec/ClassData.java
>> +++ b/src/org/openjdk/asmtools/jdec/ClassData.java
>> @@ -1,5 +1,5 @@
>>  /*
>> - * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
>> + * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved.
>>   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>>   *
>>   * This code is free software; you can redistribute it and/or modify it
>> @@ -24,6 +24,7 @@
>>
>>  import org.openjdk.asmtools.jasm.Modifiers;
>>  import org.openjdk.asmtools.util.I18NResourceBundle;
>> +import org.openjdk.asmtools.jcoder.JcodTokens;
>>
>>  import java.io.*;
>>
>> @@ -956,7 +957,15 @@
>>                      entityname = "module";
>>                      classname = classname.substring(0, --ind < 0 ? 0
>> : ind ).replace('/', '.');
>>                  }
>> -                out_begin(String.format("%s %s {", entityname, classname));
>> +                if (JcodTokens.keyword_token_ident(classname) !=
>> JcodTokens.Token.IDENT ||
>> +                        JcodTokens.constValue(classname) != -1) {
>> +                    // Jcod can't parse a classname matching a
>> keyword or a constant value,
>> +                    // then use the filename instead:
>> +                    out_begin(String.format("file \"%s.class\" {", classname));
>> +                }
>> +                else {
>> +                    out_begin(String.format("%s %s {", entityname, classname));
>> +                }
>>              } catch (Exception e) {
>>                  classname = inpname;
>>                  out.println("// " + e.getMessage() + " while
>> accessing classname");


More information about the asmtools-dev mailing list