25 26 package jdk.nashorn.internal.tools.nasgen; 27 28 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_FINAL; 29 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PUBLIC; 30 import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKESTATIC; 31 import static jdk.internal.org.objectweb.asm.Opcodes.V1_7; 32 import static jdk.nashorn.internal.tools.nasgen.StringConstants.CONSTRUCTOR_SUFFIX; 33 import static jdk.nashorn.internal.tools.nasgen.StringConstants.DEFAULT_INIT_DESC; 34 import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT; 35 import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC; 36 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DESC; 37 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_FIELD_NAME; 38 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR; 39 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR_DESC; 40 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_TYPE; 41 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_INIT_DESC3; 42 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_INIT_DESC4; 43 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY; 44 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC; 45 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETPROTOTYPE; 46 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETPROTOTYPE_DESC; 47 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_TYPE; 48 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTOBJECT_INIT_DESC; 49 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTOBJECT_TYPE; 50 51 import java.io.FileOutputStream; 52 import java.io.IOException; 53 import java.util.List; 54 import jdk.internal.org.objectweb.asm.Handle; 55 56 /** 57 * This class generates constructor class for a @ScriptClass annotated class. 58 * 59 */ 60 public class ConstructorGenerator extends ClassGenerator { 61 private final ScriptClassInfo scriptClassInfo; 62 private final String className; 63 private final MemberInfo constructor; 64 private final int memberCount; 141 private void emitConstructor() { 142 final MethodGenerator mi = makeConstructor(); 143 mi.visitCode(); 144 callSuper(mi); 145 146 if (memberCount > 0) { 147 // initialize Function type fields 148 initFunctionFields(mi); 149 // initialize data fields 150 initDataFields(mi); 151 } 152 153 if (constructor != null) { 154 initPrototype(mi); 155 final int arity = constructor.getArity(); 156 if (arity != MemberInfo.DEFAULT_ARITY) { 157 mi.loadThis(); 158 mi.push(arity); 159 mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETARITY, 160 SCRIPTFUNCTION_SETARITY_DESC); 161 } 162 } 163 mi.returnVoid(); 164 mi.computeMaxs(); 165 mi.visitEnd(); 166 } 167 168 private void loadMap(final MethodGenerator mi) { 169 if (memberCount > 0) { 170 mi.getStatic(className, PROPERTYMAP_FIELD_NAME, PROPERTYMAP_DESC); 171 } 172 } 173 174 private void callSuper(final MethodGenerator mi) { 175 String superClass, superDesc; 176 mi.loadThis(); 177 if (constructor == null) { 178 // call ScriptObject.<init> 179 superClass = SCRIPTOBJECT_TYPE; 180 superDesc = (memberCount > 0) ? SCRIPTOBJECT_INIT_DESC : DEFAULT_INIT_DESC; | 25 26 package jdk.nashorn.internal.tools.nasgen; 27 28 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_FINAL; 29 import static jdk.internal.org.objectweb.asm.Opcodes.ACC_PUBLIC; 30 import static jdk.internal.org.objectweb.asm.Opcodes.H_INVOKESTATIC; 31 import static jdk.internal.org.objectweb.asm.Opcodes.V1_7; 32 import static jdk.nashorn.internal.tools.nasgen.StringConstants.CONSTRUCTOR_SUFFIX; 33 import static jdk.nashorn.internal.tools.nasgen.StringConstants.DEFAULT_INIT_DESC; 34 import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT; 35 import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC; 36 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DESC; 37 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_FIELD_NAME; 38 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR; 39 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR_DESC; 40 import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_TYPE; 41 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_INIT_DESC3; 42 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_INIT_DESC4; 43 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY; 44 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETARITY_DESC; 45 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETDOCUMENTATION; 46 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETDOCUMENTATION_DESC; 47 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETPROTOTYPE; 48 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_SETPROTOTYPE_DESC; 49 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTFUNCTION_TYPE; 50 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTOBJECT_INIT_DESC; 51 import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTOBJECT_TYPE; 52 53 import java.io.FileOutputStream; 54 import java.io.IOException; 55 import java.util.List; 56 import jdk.internal.org.objectweb.asm.Handle; 57 58 /** 59 * This class generates constructor class for a @ScriptClass annotated class. 60 * 61 */ 62 public class ConstructorGenerator extends ClassGenerator { 63 private final ScriptClassInfo scriptClassInfo; 64 private final String className; 65 private final MemberInfo constructor; 66 private final int memberCount; 143 private void emitConstructor() { 144 final MethodGenerator mi = makeConstructor(); 145 mi.visitCode(); 146 callSuper(mi); 147 148 if (memberCount > 0) { 149 // initialize Function type fields 150 initFunctionFields(mi); 151 // initialize data fields 152 initDataFields(mi); 153 } 154 155 if (constructor != null) { 156 initPrototype(mi); 157 final int arity = constructor.getArity(); 158 if (arity != MemberInfo.DEFAULT_ARITY) { 159 mi.loadThis(); 160 mi.push(arity); 161 mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETARITY, 162 SCRIPTFUNCTION_SETARITY_DESC); 163 } 164 final String doc = constructor.getDocumentation(); 165 if (doc != null) { 166 mi.loadThis(); 167 mi.loadLiteral(doc); 168 mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETDOCUMENTATION, 169 SCRIPTFUNCTION_SETDOCUMENTATION_DESC); 170 } 171 } 172 mi.returnVoid(); 173 mi.computeMaxs(); 174 mi.visitEnd(); 175 } 176 177 private void loadMap(final MethodGenerator mi) { 178 if (memberCount > 0) { 179 mi.getStatic(className, PROPERTYMAP_FIELD_NAME, PROPERTYMAP_DESC); 180 } 181 } 182 183 private void callSuper(final MethodGenerator mi) { 184 String superClass, superDesc; 185 mi.loadThis(); 186 if (constructor == null) { 187 // call ScriptObject.<init> 188 superClass = SCRIPTOBJECT_TYPE; 189 superDesc = (memberCount > 0) ? SCRIPTOBJECT_INIT_DESC : DEFAULT_INIT_DESC; |