buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java

Print this page
rev 755 : 8035948: Redesign property listeners for shared classes
Reviewed-by: sundar, lagergren


  33 import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKEVIRTUAL;
  34 import static jdk.nashorn.internal.tools.nasgen.StringConstants.CLINIT;
  35 import static jdk.nashorn.internal.tools.nasgen.StringConstants.DEFAULT_INIT_DESC;
  36 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GETTER_PREFIX;
  37 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GET_CLASS_NAME;
  38 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GET_CLASS_NAME_DESC;
  39 import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT;
  40 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ACCESSORPROPERTY_CREATE;
  41 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ACCESSORPROPERTY_CREATE_DESC;
  42 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ACCESSORPROPERTY_TYPE;
  43 import static jdk.nashorn.internal.tools.nasgen.StringConstants.LIST_DESC;
  44 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ARRAYLIST_TYPE;
  45 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ARRAYLIST_INIT_DESC;
  46 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_TYPE;
  47 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_ADD;
  48 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_ADD_DESC;
  49 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTIONS_TYPE;
  50 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTIONS_EMPTY_LIST;
  51 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DESC;
  52 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_FIELD_NAME;
  53 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_SETISSHARED;
  54 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_SETISSHARED_DESC;
  55 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP;
  56 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP_DESC;
  57 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_TYPE;
  58 import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC;
  59 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION;
  60 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION_DESC;
  61 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION_SPECS_DESC;
  62 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_TYPE;
  63 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY;
  64 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC;
  65 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_TYPE;
  66 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SETTER_PREFIX;
  67 import static jdk.nashorn.internal.tools.nasgen.StringConstants.TYPE_OBJECT;
  68 
  69 import java.io.BufferedInputStream;
  70 import java.io.FileInputStream;
  71 import java.io.IOException;
  72 import java.util.List;
  73 import jdk.internal.org.objectweb.asm.ClassReader;
  74 import jdk.internal.org.objectweb.asm.ClassVisitor;


 174     static void emitStaticInitPrefix(final MethodGenerator mi, final String className, final int memberCount) {
 175         mi.visitCode();
 176         if (memberCount > 0) {
 177             // new ArrayList(int)
 178             mi.newObject(ARRAYLIST_TYPE);
 179             mi.dup();
 180             mi.push(memberCount);
 181             mi.invokeSpecial(ARRAYLIST_TYPE, INIT, ARRAYLIST_INIT_DESC);
 182             // stack: ArrayList
 183         } else {
 184             // java.util.Collections.EMPTY_LIST
 185             mi.getStatic(COLLECTIONS_TYPE, COLLECTIONS_EMPTY_LIST, LIST_DESC);
 186             // stack List
 187         }
 188     }
 189 
 190     static void emitStaticInitSuffix(final MethodGenerator mi, final String className) {
 191         // stack: Collection
 192         // pmap = PropertyMap.newMap(Collection<Property>);
 193         mi.invokeStatic(PROPERTYMAP_TYPE, PROPERTYMAP_NEWMAP, PROPERTYMAP_NEWMAP_DESC);
 194         // pmap.setIsShared();
 195         mi.invokeVirtual(PROPERTYMAP_TYPE, PROPERTYMAP_SETISSHARED, PROPERTYMAP_SETISSHARED_DESC);
 196         // $nasgenmap$ = pmap;
 197         mi.putStatic(className, PROPERTYMAP_FIELD_NAME, PROPERTYMAP_DESC);
 198         mi.returnVoid();
 199         mi.computeMaxs();
 200         mi.visitEnd();
 201     }
 202 
 203     @SuppressWarnings("fallthrough")
 204     private static Type memInfoType(final MemberInfo memInfo) {
 205         switch (memInfo.getJavaDesc().charAt(0)) {
 206             case 'I': return Type.INT_TYPE;
 207             case 'J': return Type.LONG_TYPE;
 208             case 'D': return Type.DOUBLE_TYPE;
 209             default:  assert false : memInfo.getJavaDesc();
 210             case 'L': return TYPE_OBJECT;
 211         }
 212     }
 213 
 214     private static String getterDesc(final MemberInfo memInfo) {
 215         return Type.getMethodDescriptor(memInfoType(memInfo));




  33 import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKEVIRTUAL;
  34 import static jdk.nashorn.internal.tools.nasgen.StringConstants.CLINIT;
  35 import static jdk.nashorn.internal.tools.nasgen.StringConstants.DEFAULT_INIT_DESC;
  36 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GETTER_PREFIX;
  37 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GET_CLASS_NAME;
  38 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GET_CLASS_NAME_DESC;
  39 import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT;
  40 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ACCESSORPROPERTY_CREATE;
  41 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ACCESSORPROPERTY_CREATE_DESC;
  42 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ACCESSORPROPERTY_TYPE;
  43 import static jdk.nashorn.internal.tools.nasgen.StringConstants.LIST_DESC;
  44 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ARRAYLIST_TYPE;
  45 import static jdk.nashorn.internal.tools.nasgen.StringConstants.ARRAYLIST_INIT_DESC;
  46 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_TYPE;
  47 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_ADD;
  48 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_ADD_DESC;
  49 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTIONS_TYPE;
  50 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTIONS_EMPTY_LIST;
  51 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DESC;
  52 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_FIELD_NAME;


  53 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP;
  54 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP_DESC;
  55 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_TYPE;
  56 import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC;
  57 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION;
  58 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION_DESC;
  59 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_MAKEFUNCTION_SPECS_DESC;
  60 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTIONIMPL_TYPE;
  61 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY;
  62 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC;
  63 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_TYPE;
  64 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SETTER_PREFIX;
  65 import static jdk.nashorn.internal.tools.nasgen.StringConstants.TYPE_OBJECT;
  66 
  67 import java.io.BufferedInputStream;
  68 import java.io.FileInputStream;
  69 import java.io.IOException;
  70 import java.util.List;
  71 import jdk.internal.org.objectweb.asm.ClassReader;
  72 import jdk.internal.org.objectweb.asm.ClassVisitor;


 172     static void emitStaticInitPrefix(final MethodGenerator mi, final String className, final int memberCount) {
 173         mi.visitCode();
 174         if (memberCount > 0) {
 175             // new ArrayList(int)
 176             mi.newObject(ARRAYLIST_TYPE);
 177             mi.dup();
 178             mi.push(memberCount);
 179             mi.invokeSpecial(ARRAYLIST_TYPE, INIT, ARRAYLIST_INIT_DESC);
 180             // stack: ArrayList
 181         } else {
 182             // java.util.Collections.EMPTY_LIST
 183             mi.getStatic(COLLECTIONS_TYPE, COLLECTIONS_EMPTY_LIST, LIST_DESC);
 184             // stack List
 185         }
 186     }
 187 
 188     static void emitStaticInitSuffix(final MethodGenerator mi, final String className) {
 189         // stack: Collection
 190         // pmap = PropertyMap.newMap(Collection<Property>);
 191         mi.invokeStatic(PROPERTYMAP_TYPE, PROPERTYMAP_NEWMAP, PROPERTYMAP_NEWMAP_DESC);


 192         // $nasgenmap$ = pmap;
 193         mi.putStatic(className, PROPERTYMAP_FIELD_NAME, PROPERTYMAP_DESC);
 194         mi.returnVoid();
 195         mi.computeMaxs();
 196         mi.visitEnd();
 197     }
 198 
 199     @SuppressWarnings("fallthrough")
 200     private static Type memInfoType(final MemberInfo memInfo) {
 201         switch (memInfo.getJavaDesc().charAt(0)) {
 202             case 'I': return Type.INT_TYPE;
 203             case 'J': return Type.LONG_TYPE;
 204             case 'D': return Type.DOUBLE_TYPE;
 205             default:  assert false : memInfo.getJavaDesc();
 206             case 'L': return TYPE_OBJECT;
 207         }
 208     }
 209 
 210     private static String getterDesc(final MemberInfo memInfo) {
 211         return Type.getMethodDescriptor(memInfoType(memInfo));