[code-reflection] RFR: Support storing the code that builds the code model [v18]

Maurizio Cimadamore mcimadamore at openjdk.org
Thu Mar 13 15:13:25 UTC 2025


On Wed, 12 Mar 2025 18:00:05 GMT, Mourad Abbay <mabbay at openjdk.org> wrote:

>> In this PR we allow the user to decide how to store the code model. The first option is `TEXT`, if this is selected, we store the textual representation of the code model. The second option is `CODE_BUILDR`, if this is selected, we store the code that builds the code model. All work done here is around the second option, because the first option is already supported.
>
> Mourad Abbay has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 20 additional commits since the last revision:
> 
>  - Merge branch 'code-reflection' into code-model-storage-option
>  - Load OpFactory and TypeElementFactory before invocation of opMethod only if the opMethod has there params.
>  - Fix the remaining compiler tests failures
>  - Fix some of the test failures (3 remains)
>  - Fix the remaining test failures of SwitchExpressionTest2
>  - Fix almost all test failures of SwitchExpressionTest2 (one remaining)
>  - Pass arrayType instead of eleType in OpBuilder.buildArray
>  - Ensure that block params are inserted in the correct order
>  - Add missing imports
>  - Merge branch 'code-reflection' into code-model-storage-option
>  - ... and 10 more: https://git.openjdk.org/babylon/compare/29930c4b...966005ce

src/jdk.incubator.code/share/classes/jdk/incubator/code/internal/CodeModelToAST.java line 117:

> 115:         var restype = typeElementToType(invokeOp.resultType());
> 116:         var type = new Type.MethodType(paramTypes, restype, List.nil(), syms.methodClass);
> 117:         var methodSym = new Symbol.MethodSymbol(flags, name, type,

Same as for field access (see below) -- we should not create a new method symbol from scratch but "resolve" a method in a given class symbol (using `Resolve::findInternalMethod`)

src/jdk.incubator.code/share/classes/jdk/incubator/code/internal/CodeModelToAST.java line 192:

> 190:                 var type = typeElementToType(fieldLoadOp.resultType());
> 191:                 var owner = typeElementToType(fieldLoadOp.fieldDescriptor().refType());
> 192:                 var sym = new Symbol.VarSymbol(flags, name, type, owner.tsym);

This seems wrong -- the accessed field symbol should be findable in the scope of the class in which the field is declared. It seems to me that we need some piece of code that turns a method/field descriptor into a java symbol. Look at `Lower::lookupMethod` which uses `Resolve::resolveInternalMethod` -- I think here we should do that too.

-------------

PR Review Comment: https://git.openjdk.org/babylon/pull/305#discussion_r1993741896
PR Review Comment: https://git.openjdk.org/babylon/pull/305#discussion_r1993736120


More information about the babylon-dev mailing list