/** * Generate the byte codes for a JavaScript scope class with fieldCount fields * and paramCount parameters. * * @param fieldCount Number of fields in the JavaScript scope. * @param paramCount Number of parameters in the JavaScript scope * . * @return Byte codes for generated class. */ public byte[] generate(final int fieldCount, final int paramCount) { final String className = getClassName(fieldCount, paramCount); final String superName = className(FunctionScope.class); final ClassEmitter classEmitter = newClassEmitter(className, superName); final List<String> initFields = addFields(classEmitter, fieldCount); final MethodEmitter init = newInitScopeMethod(classEmitter); initializeToUndefined(init, className, initFields); init.returnVoid(); init.end(); final MethodEmitter initWithSpillArrays = newInitWithSpillArraysMethod(classEmitter, FunctionScope.class); initializeToUndefined(initWithSpillArrays, className, initFields); initWithSpillArrays.returnVoid(); initWithSpillArrays.end(); final MethodEmitter initWithArguments = newInitScopeWithArgumentsMethod(classEmitter); initializeToUndefined(initWithArguments, className, initFields); initWithArguments.returnVoid(); initWithArguments.end(); return toByteArray(className, classEmitter); }
/** * Generate the byte codes for a JavaScript scope class with fieldCount fields * and paramCount parameters. * * @param fieldCount Number of fields in the JavaScript scope. * @param paramCount Number of parameters in the JavaScript scope * . * @return Byte codes for generated class. */ public byte[] generate(final int fieldCount, final int paramCount) { final String className = getClassName(fieldCount, paramCount, dualFields); final String superName = className(FunctionScope.class); final ClassEmitter classEmitter = newClassEmitter(className, superName); final List<String> initFields = addFields(classEmitter, fieldCount); final MethodEmitter init = newInitScopeMethod(classEmitter); initializeToUndefined(init, className, initFields); init.returnVoid(); init.end(); final MethodEmitter initWithSpillArrays = newInitWithSpillArraysMethod(classEmitter, FunctionScope.class); initializeToUndefined(initWithSpillArrays, className, initFields); initWithSpillArrays.returnVoid(); initWithSpillArrays.end(); final MethodEmitter initWithArguments = newInitScopeWithArgumentsMethod(classEmitter); initializeToUndefined(initWithArguments, className, initFields); initWithArguments.returnVoid(); initWithArguments.end(); return toByteArray(className, classEmitter); }
/** * Generate the byte codes for a JavaScript scope class with fieldCount fields * and paramCount parameters. * * @param fieldCount Number of fields in the JavaScript scope. * @param paramCount Number of parameters in the JavaScript scope * . * @return Byte codes for generated class. */ public byte[] generate(final int fieldCount, final int paramCount) { final String className = getClassName(fieldCount, paramCount); final String superName = className(FunctionScope.class); final ClassEmitter classEmitter = newClassEmitter(className, superName); final List<String> initFields = addFields(classEmitter, fieldCount); final MethodEmitter init = newInitScopeMethod(classEmitter); initializeToUndefined(init, className, initFields); init.returnVoid(); init.end(); final MethodEmitter initWithArguments = newInitScopeWithArgumentsMethod(classEmitter); initializeToUndefined(initWithArguments, className, initFields); initWithArguments.returnVoid(); initWithArguments.end(); return toByteArray(classEmitter); }
/** * Allocate and initialize a new <init> method for scopes. * @param classEmitter Open class emitter. * @return Open method emitter. */ private static MethodEmitter newInitScopeMethod(final ClassEmitter classEmitter) { final MethodEmitter init = classEmitter.init(PropertyMap.class, ScriptObject.class); init.begin(); init.load(Type.OBJECT, JAVA_THIS.slot()); init.load(Type.OBJECT, INIT_MAP.slot()); init.load(Type.OBJECT, INIT_SCOPE.slot()); init.invoke(constructorNoLookup(FunctionScope.class, PropertyMap.class, ScriptObject.class)); return init; }
/** * Allocate and initialize a new <init> method for scopes with arguments. * @param classEmitter Open class emitter. * @return Open method emitter. */ private static MethodEmitter newInitScopeWithArgumentsMethod(final ClassEmitter classEmitter) { final MethodEmitter init = classEmitter.init(PropertyMap.class, ScriptObject.class, ScriptObject.class); init.begin(); init.load(Type.OBJECT, JAVA_THIS.slot()); init.load(Type.OBJECT, INIT_MAP.slot()); init.load(Type.OBJECT, INIT_SCOPE.slot()); init.load(Type.OBJECT, INIT_ARGUMENTS.slot()); init.invoke(constructorNoLookup(FunctionScope.class, PropertyMap.class, ScriptObject.class, ScriptObject.class)); return init; }