(tapestry-5) 01/04: TAP5-2770: avoiding using FieldHandle when in multiple classloader mode
This is an automated email from the ASF dual-hosted git repository. thiagohp pushed a commit to branch javax in repository https://gitbox.apache.org/repos/asf/tapestry-5.git commit e8564a9ff715d8a21c38b4f3b50cdb93293f126a Author: Thiago H. de Paula Figueiredo AuthorDate: Wed Dec 20 19:00:29 2023 -0300 TAP5-2770: avoiding using FieldHandle when in multiple classloader mode For now, just in ImportWorker. --- .../internal/plastic/InstructionBuilderImpl.java | 45 - .../tapestry5/plastic/FieldValueProvider.java | 64 +++ .../tapestry5/plastic/InstructionBuilder.java | 16 ++ .../org/apache/tapestry5/plastic/PlasticUtils.java | 191 - .../tapestry5/plastic/PropertyValueProvider.java | 74 .../apache/tapestry5/plastic/PlasticUtilsTest.java | 105 +++ .../plastic/test/PlasticUtilsTestObject.java | 105 +++ .../test/PlasticUtilsTestObjectSuperclass.java | 34 .../tapestry5/internal/transform/ImportWorker.java | 80 +++-- 9 files changed, 689 insertions(+), 25 deletions(-) diff --git a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java index dd4488349..a8be0b928 100644 --- a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java +++ b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java @@ -14,16 +14,28 @@ package org.apache.tapestry5.internal.plastic; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + import org.apache.tapestry5.internal.plastic.InstructionBuilderState.LVInfo; import org.apache.tapestry5.internal.plastic.asm.Label; import org.apache.tapestry5.internal.plastic.asm.MethodVisitor; import org.apache.tapestry5.internal.plastic.asm.Opcodes; import org.apache.tapestry5.internal.plastic.asm.Type; -import org.apache.tapestry5.plastic.*; - -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; +import org.apache.tapestry5.plastic.Condition; +import org.apache.tapestry5.plastic.InstructionBuilder; +import org.apache.tapestry5.plastic.InstructionBuilderCallback; +import org.apache.tapestry5.plastic.LocalVariable; +import org.apache.tapestry5.plastic.LocalVariableCallback; +import org.apache.tapestry5.plastic.MethodDescription; +import org.apache.tapestry5.plastic.PlasticField; +import org.apache.tapestry5.plastic.PlasticMethod; +import org.apache.tapestry5.plastic.PlasticUtils; +import org.apache.tapestry5.plastic.SwitchCallback; +import org.apache.tapestry5.plastic.TryCatchCallback; +import org.apache.tapestry5.plastic.WhenCallback; +import org.apache.tapestry5.plastic.WhileCallback; @SuppressWarnings("rawtypes") public class InstructionBuilderImpl extends Lockable implements Opcodes, InstructionBuilder @@ -469,6 +481,29 @@ public class InstructionBuilderImpl extends Lockable implements Opcodes, Instruc return checkcast(cache.toTypeName(clazz)); } + +@Override +public InstructionBuilder instanceOf(String className) +{ +check(); + +// Found out the hard way that array names are handled differently; you cast to the descriptor, not the internal +// name. + +String internalName = className.contains("[") ? cache.toDesc(className) : cache.toInternalName(className); + +v.visitTypeInsn(INSTANCEOF, internalName); + +return this; +} + +@Override +public InstructionBuilder instanceOf(Class clazz) +{ +check(); + +return instanceOf(cache.toTypeName(clazz)); +} @Override public InstructionBuilder startTryCatch(TryCatchCallback callback) diff --git a/plastic/src/main/java/org/apache/tapestry5/plastic/FieldValueProvider.java b/plastic/src/main/java/org/apache/tapestry5/plastic/FieldValueProvider.java new file mode 100644 index 0..79087e8b8 --- /dev/null +++ b/plastic/src/main/java/org/apache/tapestry5/plastic/FieldValueProvider.java @@ -0,0 +1,64 @@ +// Copyright 2023 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.tapestry5.plastic; + +/** + * + * Interface that can be implemented to provide access to field values based on their name. + * Usually implemented with {@linkplain PlasticUtils#implementFieldValueProvider(PlasticClass,
(tapestry-5) 01/04: TAP5-2770: avoiding using FieldHandle when in multiple classloader mode
This is an automated email from the ASF dual-hosted git repository. thiagohp pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tapestry-5.git commit c6aac55764f4910a5f8d3c3a1beb247650445c99 Author: Thiago H. de Paula Figueiredo AuthorDate: Wed Dec 20 19:00:29 2023 -0300 TAP5-2770: avoiding using FieldHandle when in multiple classloader mode For now, just in ImportWorker. --- .../internal/plastic/InstructionBuilderImpl.java | 45 - .../tapestry5/plastic/FieldValueProvider.java | 64 +++ .../tapestry5/plastic/InstructionBuilder.java | 16 ++ .../org/apache/tapestry5/plastic/PlasticUtils.java | 191 - .../tapestry5/plastic/PropertyValueProvider.java | 74 .../apache/tapestry5/plastic/PlasticUtilsTest.java | 105 +++ .../plastic/test/PlasticUtilsTestObject.java | 105 +++ .../test/PlasticUtilsTestObjectSuperclass.java | 34 .../tapestry5/internal/transform/ImportWorker.java | 80 +++-- 9 files changed, 689 insertions(+), 25 deletions(-) diff --git a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java index dd4488349..a8be0b928 100644 --- a/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java +++ b/plastic/src/main/java/org/apache/tapestry5/internal/plastic/InstructionBuilderImpl.java @@ -14,16 +14,28 @@ package org.apache.tapestry5.internal.plastic; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + import org.apache.tapestry5.internal.plastic.InstructionBuilderState.LVInfo; import org.apache.tapestry5.internal.plastic.asm.Label; import org.apache.tapestry5.internal.plastic.asm.MethodVisitor; import org.apache.tapestry5.internal.plastic.asm.Opcodes; import org.apache.tapestry5.internal.plastic.asm.Type; -import org.apache.tapestry5.plastic.*; - -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; +import org.apache.tapestry5.plastic.Condition; +import org.apache.tapestry5.plastic.InstructionBuilder; +import org.apache.tapestry5.plastic.InstructionBuilderCallback; +import org.apache.tapestry5.plastic.LocalVariable; +import org.apache.tapestry5.plastic.LocalVariableCallback; +import org.apache.tapestry5.plastic.MethodDescription; +import org.apache.tapestry5.plastic.PlasticField; +import org.apache.tapestry5.plastic.PlasticMethod; +import org.apache.tapestry5.plastic.PlasticUtils; +import org.apache.tapestry5.plastic.SwitchCallback; +import org.apache.tapestry5.plastic.TryCatchCallback; +import org.apache.tapestry5.plastic.WhenCallback; +import org.apache.tapestry5.plastic.WhileCallback; @SuppressWarnings("rawtypes") public class InstructionBuilderImpl extends Lockable implements Opcodes, InstructionBuilder @@ -469,6 +481,29 @@ public class InstructionBuilderImpl extends Lockable implements Opcodes, Instruc return checkcast(cache.toTypeName(clazz)); } + +@Override +public InstructionBuilder instanceOf(String className) +{ +check(); + +// Found out the hard way that array names are handled differently; you cast to the descriptor, not the internal +// name. + +String internalName = className.contains("[") ? cache.toDesc(className) : cache.toInternalName(className); + +v.visitTypeInsn(INSTANCEOF, internalName); + +return this; +} + +@Override +public InstructionBuilder instanceOf(Class clazz) +{ +check(); + +return instanceOf(cache.toTypeName(clazz)); +} @Override public InstructionBuilder startTryCatch(TryCatchCallback callback) diff --git a/plastic/src/main/java/org/apache/tapestry5/plastic/FieldValueProvider.java b/plastic/src/main/java/org/apache/tapestry5/plastic/FieldValueProvider.java new file mode 100644 index 0..79087e8b8 --- /dev/null +++ b/plastic/src/main/java/org/apache/tapestry5/plastic/FieldValueProvider.java @@ -0,0 +1,64 @@ +// Copyright 2023 The Apache Software Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package org.apache.tapestry5.plastic; + +/** + * + * Interface that can be implemented to provide access to field values based on their name. + * Usually implemented with {@linkplain PlasticUtils#implementFieldValueProvider(PlasticClass,