<i18n dev> 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 i18n-dev mailing list