A possible improvement at Tokens and Names
Jonathan Gibbons
jonathan.gibbons at oracle.com
Wed Jan 20 14:26:04 UTC 2021
Hi,
I'll create a JBS issue to track this. In itself, that does not imply a
review or an endorsement of the idea, but it does provide a place to
record the discussion.
https://bugs.openjdk.java.net/browse/JDK-8260053
Can you post the patch as a PR?
-- Jon
On 1/20/21 4:10 AM, Guoxiong Li wrote:
> Hi all,
>
> When I read the code at
> `jdk.compiler/com.sun.tools.javac.parser.Tokens` and
> ``jdk.compiler/com.sun.tools.javac.util.Names`, I find a point which
> can be possibly improved.
>
> The constructor of the class `Tokens` invokes
> `Names.instance(context)` to initialize `Names` which would initialize
> many unrelated names. Then, this constructor uses the method
> `enterKeyword` to initialize the names about `TokenKind` and to set
> `maxKey`. Because `Names.instance(context)` initializes many unrelated
> names, the `Name.index` becomes very large so that the `maxKey` also
> becomes very large. Then, the constructor creates an array `key` by
> using the code `key = new TokenKind[maxKey+1]`. We can identify that
> the variable `key` is unnecessary to be so large.
>
> I would like to initialize the related names, which are about
> `TokenKind`, at the beginning of the constructor of the class `Names`
> to improve the code. The complete patch is shown at the end of this email.
>
> When using the code of the master branch, the length of the array
> `Tokens.key` is 4280. When using my patch, the length of the array
> `Tokens.key` is 383. The improvement is obvious.
>
> Could I get your help to identify whether this improvement is feasible?
> If so, could I get your help to file an issue at the bug tracker?
> Thanks a lot.
>
>
>
> The patch:
>
> diff --git
> a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/Tokens.java
> b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/Tokens.java
> index bd61dcf8ad2..3b4eb5bf4be 100644
> ---
> a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/Tokens.java
> +++
> b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/Tokens.java
> @@ -60,7 +60,7 @@ public class Tokens {
>
> /** The names of all tokens.
> */
> - private Name[] tokenName = new Name[TokenKind.values().length];
> + private Name[] tokenName;
>
> public static final Context.Key<Tokens> tokensKey = new
> Context.Key<>();
>
> @@ -74,11 +74,10 @@ public class Tokens {
> protected Tokens(Context context) {
> context.put(tokensKey, this);
> names = Names.instance(context);
> - for (TokenKind t : TokenKind.values()) {
> - if (t.name <http://t.name> != null)
> - enterKeyword(t.name <http://t.name>, t);
> - else
> - tokenName[t.ordinal()] = null;
> + tokenName = names.tokenName;
> + for (Name n : tokenName) {
> + if (n != null && n.getIndex() > maxKey)
> + maxKey = n.getIndex();
> }
>
> key = new TokenKind[maxKey+1];
> @@ -89,12 +88,6 @@ public class Tokens {
> }
> }
>
> - private void enterKeyword(String s, TokenKind token) {
> - Name n = names.fromString(s);
> - tokenName[token.ordinal()] = n;
> - if (n.getIndex() > maxKey) maxKey = n.getIndex();
> - }
> -
> /**
> * Create a new token given a name; if the name corresponds to a
> token name,
> * a new token of the corresponding kind is returned; otherwise, an
> diff --git
> a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java
> b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java
> index 26e0b7577aa..341817e8ff9 100644
> --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java
> +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Names.java
> @@ -25,6 +25,8 @@
>
> package com.sun.tools.javac.util;
>
> +import com.sun.tools.javac.parser.Tokens.TokenKind;
> +
> /**
> * Access to the compiler's name table. Standard names are defined,
> * as well as methods to create new names.
> @@ -47,6 +49,9 @@ public class Names {
> return instance;
> }
>
> + // the names about TokenKind
> + public final Name[] tokenName = new Name[TokenKind.values().length];
> +
> // operators and punctuation
> public final Name asterisk;
> public final Name comma;
> @@ -220,6 +225,15 @@ public class Names {
> Options options = Options.instance(context);
> table = createTable(options);
>
> + // set the names about TokenKind
> + for (TokenKind tokenKind : TokenKind.values()) {
> + Name tempName = null;
> + if (tokenKind.name != null) {
> + tempName = fromString(tokenKind.name);
> + }
> + tokenName[tokenKind.ordinal()] = tempName;
> + }
> +
> // operators and punctuation
> asterisk = fromString("*");
> comma = fromString(",");
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20210120/3faf2a88/attachment-0001.htm>
More information about the compiler-dev
mailing list