RFR: JDK-8285932 Implementation of JEP-430 String Templates (Preview) [v8]
Jim Laskey
jlaskey at openjdk.org
Thu Nov 3 14:46:56 UTC 2022
On Wed, 2 Nov 2022 17:53:03 GMT, Jorn Vernee <jvernee at openjdk.org> wrote:
>> Jim Laskey 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 22 additional commits since the last revision:
>>
>> - Merge branch 'master' into 8285932
>> - Add @SafeVarargs declarations
>> - Move template bootstrap
>> - Requested changes #2
>> - Requested changes
>> - Remove .orig file
>> - Update TemplateRuntime::combine
>> - Move StringConcatItem to FormatConcatItem
>> - Tabs to spaces
>> - Force processor before template string expression
>> - ... and 12 more: https://git.openjdk.org/jdk/compare/ab757cc6...6cea084b
>
> src/java.base/share/classes/java/lang/template/TemplateRuntime.java line 118:
>
>> 116: List<Class<?>> result = new ArrayList<>();
>> 117: Class<?> tsClass = st.getClass();
>> 118: if (tsClass.isSynthetic()) {
>
> This check seems pretty ad-hoc... What happens if a synthetic class is passed that declares some `x0` field that doesn't correspond to the type of the value? i.e. someone could generating an implementation of `StringTemplate`, slap `ACC_SYNTHETIC` on it, and it seems that could have the potential to break this code.
>
> I suggest generating an override of `valueTypes` in the synthetic class emitted by javac instead.
I've mentioned TemplateProcessorFactorys and TemplateProcessorBuilders as the long term solution. I think I'll just pull these methods. Optimizing processors is something that needs more discussion.
> src/java.base/share/classes/java/lang/template/TemplateRuntime.java line 160:
>
>> 158: for (int i = 0; ; i++) {
>> 159: Field field = tsClass.getDeclaredField("x" + i);
>> 160: MethodHandle mh = JLIA.unreflectField(field, false);
>
> This by-passes any access checks by using `IMPL_LOOKUP`.
>
> This seems problematic. e.g. there's a class that has some `x0` field that I can't access, but the class is not `final`. I generate an impl of `StringTemplate` that extends that class (with `ACC_SYNTHETIC`), and call `valueAccessors` to get a getter that bypasses all access checks.
>
> I think the synthetic class generated by javac should generate an override of this method as well.
See previous.
-------------
PR: https://git.openjdk.org/jdk/pull/10889
More information about the core-libs-dev
mailing list