42 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_ADD; 43 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_ADD_DESC; 44 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_TYPE; 45 import static jdk.nashorn.internal.tools.nasgen.StringConstants.DEFAULT_INIT_DESC; 46 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GETTER_PREFIX; 47 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GET_CLASS_NAME; 48 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GET_CLASS_NAME_DESC; 49 import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT; 50 import static jdk.nashorn.internal.tools.nasgen.StringConstants.LIST_DESC; 51 import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC; 52 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DESC; 53 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_FIELD_NAME; 54 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP; 55 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP_DESC; 56 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_TYPE; 57 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN; 58 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN_DESC; 59 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC; 60 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY; 61 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC; 62 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_TYPE; 63 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SETTER_PREFIX; 64 import static jdk.nashorn.internal.tools.nasgen.StringConstants.TYPE_OBJECT; 65 66 import java.io.BufferedInputStream; 67 import java.io.FileInputStream; 68 import java.io.IOException; 69 import java.util.List; 70 import jdk.internal.org.objectweb.asm.ClassReader; 71 import jdk.internal.org.objectweb.asm.ClassVisitor; 72 import jdk.internal.org.objectweb.asm.ClassWriter; 73 import jdk.internal.org.objectweb.asm.FieldVisitor; 74 import jdk.internal.org.objectweb.asm.Handle; 75 import jdk.internal.org.objectweb.asm.MethodVisitor; 76 import jdk.internal.org.objectweb.asm.Type; 77 import jdk.nashorn.internal.tools.nasgen.MemberInfo.Kind; 78 79 /** 80 * Base class for class generator classes. 81 * 273 } 274 275 static void newFunction(final MethodGenerator mi, final String className, final MemberInfo memInfo, final List<MemberInfo> specs) { 276 final boolean arityFound = (memInfo.getArity() != MemberInfo.DEFAULT_ARITY); 277 278 mi.loadLiteral(memInfo.getName()); 279 mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className, memInfo.getJavaName(), memInfo.getJavaDesc())); 280 281 assert specs != null; 282 if (!specs.isEmpty()) { 283 mi.memberInfoArray(className, specs); 284 mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC); 285 } else { 286 mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_DESC); 287 } 288 289 if (arityFound) { 290 mi.dup(); 291 mi.push(memInfo.getArity()); 292 mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETARITY, SCRIPTFUNCTION_SETARITY_DESC); 293 } 294 } 295 296 static void linkerAddGetterSetter(final MethodGenerator mi, final String className, final MemberInfo memInfo) { 297 final String propertyName = memInfo.getName(); 298 // stack: Collection 299 // dup of Collection instance 300 mi.dup(); 301 302 // property = AccessorProperty.create(key, flags, getter, setter); 303 mi.loadLiteral(propertyName); 304 // setup flags 305 mi.push(memInfo.getAttributes()); 306 // setup getter method handle 307 String javaName = GETTER_PREFIX + memInfo.getJavaName(); 308 mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, getterDesc(memInfo))); 309 // setup setter method handle 310 if (memInfo.isFinal()) { 311 mi.pushNull(); 312 } else { | 42 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_ADD; 43 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_ADD_DESC; 44 import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTION_TYPE; 45 import static jdk.nashorn.internal.tools.nasgen.StringConstants.DEFAULT_INIT_DESC; 46 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GETTER_PREFIX; 47 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GET_CLASS_NAME; 48 import static jdk.nashorn.internal.tools.nasgen.StringConstants.GET_CLASS_NAME_DESC; 49 import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT; 50 import static jdk.nashorn.internal.tools.nasgen.StringConstants.LIST_DESC; 51 import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC; 52 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DESC; 53 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_FIELD_NAME; 54 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP; 55 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP_DESC; 56 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_TYPE; 57 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN; 58 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN_DESC; 59 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC; 60 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY; 61 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC; 62 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETDOCUMENTATION; 63 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETDOCUMENTATION_DESC; 64 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_TYPE; 65 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SETTER_PREFIX; 66 import static jdk.nashorn.internal.tools.nasgen.StringConstants.TYPE_OBJECT; 67 68 import java.io.BufferedInputStream; 69 import java.io.FileInputStream; 70 import java.io.IOException; 71 import java.util.List; 72 import jdk.internal.org.objectweb.asm.ClassReader; 73 import jdk.internal.org.objectweb.asm.ClassVisitor; 74 import jdk.internal.org.objectweb.asm.ClassWriter; 75 import jdk.internal.org.objectweb.asm.FieldVisitor; 76 import jdk.internal.org.objectweb.asm.Handle; 77 import jdk.internal.org.objectweb.asm.MethodVisitor; 78 import jdk.internal.org.objectweb.asm.Type; 79 import jdk.nashorn.internal.tools.nasgen.MemberInfo.Kind; 80 81 /** 82 * Base class for class generator classes. 83 * 275 } 276 277 static void newFunction(final MethodGenerator mi, final String className, final MemberInfo memInfo, final List<MemberInfo> specs) { 278 final boolean arityFound = (memInfo.getArity() != MemberInfo.DEFAULT_ARITY); 279 280 mi.loadLiteral(memInfo.getName()); 281 mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className, memInfo.getJavaName(), memInfo.getJavaDesc())); 282 283 assert specs != null; 284 if (!specs.isEmpty()) { 285 mi.memberInfoArray(className, specs); 286 mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC); 287 } else { 288 mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_DESC); 289 } 290 291 if (arityFound) { 292 mi.dup(); 293 mi.push(memInfo.getArity()); 294 mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETARITY, SCRIPTFUNCTION_SETARITY_DESC); 295 } 296 297 String doc = memInfo.getDocumentation(); 298 if (doc != null) { 299 mi.dup(); 300 mi.loadLiteral(memInfo.getDocumentation()); 301 mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETDOCUMENTATION, SCRIPTFUNCTION_SETDOCUMENTATION_DESC); 302 } 303 } 304 305 static void linkerAddGetterSetter(final MethodGenerator mi, final String className, final MemberInfo memInfo) { 306 final String propertyName = memInfo.getName(); 307 // stack: Collection 308 // dup of Collection instance 309 mi.dup(); 310 311 // property = AccessorProperty.create(key, flags, getter, setter); 312 mi.loadLiteral(propertyName); 313 // setup flags 314 mi.push(memInfo.getAttributes()); 315 // setup getter method handle 316 String javaName = GETTER_PREFIX + memInfo.getJavaName(); 317 mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, getterDesc(memInfo))); 318 // setup setter method handle 319 if (memInfo.isFinal()) { 320 mi.pushNull(); 321 } else { |