(tapestry-5) 01/04: TAP5-2770: avoiding using FieldHandle when in multiple classloader mode

2024-03-10 Thread thiagohp
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

2024-03-10 Thread thiagohp
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,