58 import java.util.Iterator; |
58 import java.util.Iterator; |
59 import java.util.LinkedHashMap; |
59 import java.util.LinkedHashMap; |
60 import java.util.List; |
60 import java.util.List; |
61 import java.util.Map; |
61 import java.util.Map; |
62 import java.util.Set; |
62 import java.util.Set; |
|
63 import jdk.nashorn.api.scripting.ScriptUtils; |
63 import jdk.internal.org.objectweb.asm.ClassWriter; |
64 import jdk.internal.org.objectweb.asm.ClassWriter; |
64 import jdk.internal.org.objectweb.asm.Handle; |
65 import jdk.internal.org.objectweb.asm.Handle; |
65 import jdk.internal.org.objectweb.asm.Label; |
66 import jdk.internal.org.objectweb.asm.Label; |
66 import jdk.internal.org.objectweb.asm.Opcodes; |
67 import jdk.internal.org.objectweb.asm.Opcodes; |
67 import jdk.internal.org.objectweb.asm.Type; |
68 import jdk.internal.org.objectweb.asm.Type; |
132 * overrides would need to have two potentially different protection domains: one for class-based behavior and one for |
133 * overrides would need to have two potentially different protection domains: one for class-based behavior and one for |
133 * instance-based behavior; since Java classes can only belong to a single protection domain, this could not be |
134 * instance-based behavior; since Java classes can only belong to a single protection domain, this could not be |
134 * implemented securely. |
135 * implemented securely. |
135 */ |
136 */ |
136 final class JavaAdapterBytecodeGenerator { |
137 final class JavaAdapterBytecodeGenerator { |
|
138 private static final Type SCRIPTUTILS_TYPE = Type.getType(ScriptUtils.class); |
137 private static final Type OBJECT_TYPE = Type.getType(Object.class); |
139 private static final Type OBJECT_TYPE = Type.getType(Object.class); |
138 private static final Type CLASS_TYPE = Type.getType(Class.class); |
140 private static final Type CLASS_TYPE = Type.getType(Class.class); |
139 |
141 |
140 static final String OBJECT_TYPE_NAME = OBJECT_TYPE.getInternalName(); |
142 static final String OBJECT_TYPE_NAME = OBJECT_TYPE.getInternalName(); |
|
143 static final String SCRIPTUTILS_TYPE_NAME = SCRIPTUTILS_TYPE.getInternalName(); |
141 |
144 |
142 static final String INIT = "<init>"; |
145 static final String INIT = "<init>"; |
143 |
146 |
144 static final String GLOBAL_FIELD_NAME = "global"; |
147 static final String GLOBAL_FIELD_NAME = "global"; |
145 |
148 |
170 |
173 |
171 private static final String METHOD_HANDLE_TYPE_DESCRIPTOR = METHOD_HANDLE_TYPE.getDescriptor(); |
174 private static final String METHOD_HANDLE_TYPE_DESCRIPTOR = METHOD_HANDLE_TYPE.getDescriptor(); |
172 private static final String GET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE); |
175 private static final String GET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE); |
173 private static final String GET_CLASS_METHOD_DESCRIPTOR = Type.getMethodDescriptor(CLASS_TYPE); |
176 private static final String GET_CLASS_METHOD_DESCRIPTOR = Type.getMethodDescriptor(CLASS_TYPE); |
174 private static final String EXPORT_RETURN_VALUE_METHOD_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE, OBJECT_TYPE); |
177 private static final String EXPORT_RETURN_VALUE_METHOD_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE, OBJECT_TYPE); |
|
178 private static final String UNWRAP_METHOD_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE, OBJECT_TYPE); |
175 private static final String GET_CONVERTER_METHOD_DESCRIPTOR = Type.getMethodDescriptor(METHOD_HANDLE_TYPE, CLASS_TYPE); |
179 private static final String GET_CONVERTER_METHOD_DESCRIPTOR = Type.getMethodDescriptor(METHOD_HANDLE_TYPE, CLASS_TYPE); |
176 private static final String TO_CHAR_PRIMITIVE_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.CHAR_TYPE, OBJECT_TYPE); |
180 private static final String TO_CHAR_PRIMITIVE_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.CHAR_TYPE, OBJECT_TYPE); |
177 private static final String TO_STRING_METHOD_DESCRIPTOR = Type.getMethodDescriptor(STRING_TYPE, OBJECT_TYPE); |
181 private static final String TO_STRING_METHOD_DESCRIPTOR = Type.getMethodDescriptor(STRING_TYPE, OBJECT_TYPE); |
178 |
182 |
179 // Package used when the adapter can't be defined in the adaptee's package (either because it's sealed, or because |
183 // Package used when the adapter can't be defined in the adaptee's package (either because it's sealed, or because |