nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java
changeset 26052 41d18e9e45a4
parent 24778 2ff5d7041566
child 26067 b32ccc3a76c9
equal deleted inserted replaced
25851:cd6f4557e7fe 26052:41d18e9e45a4
    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
   925             break;
   929             break;
   926         case Type.DOUBLE:
   930         case Type.DOUBLE:
   927             invokeValueOf(mv, "Double", 'D');
   931             invokeValueOf(mv, "Double", 'D');
   928             break;
   932             break;
   929         case Type.ARRAY:
   933         case Type.ARRAY:
   930         case Type.OBJECT:
       
   931         case Type.METHOD:
   934         case Type.METHOD:
   932             // Already boxed
   935             // Already boxed
       
   936             break;
       
   937         case Type.OBJECT:
       
   938             if(t.equals(OBJECT_TYPE)) {
       
   939                 mv.invokestatic(SCRIPTUTILS_TYPE_NAME, "unwrap", UNWRAP_METHOD_DESCRIPTOR, false);
       
   940             }
   933             break;
   941             break;
   934         default:
   942         default:
   935             // Not expecting anything else (e.g. VOID)
   943             // Not expecting anything else (e.g. VOID)
   936             assert false;
   944             assert false;
   937             break;
   945             break;