/** * Generates a type dependent instruction. * * @param opcode * the instruction's opcode. * @param type * the instruction's operand. */ private void typeInsn(final int opcode, final Type type) { mv.visitTypeInsn(opcode, type.getInternalName()); }
protected final void printStack() { mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/RuntimeException", "printStackTrace", "()V"); mv.visitInsn(RETURN); }
protected final void invokeConstructor(Class<?> clazz, Object[] params, Class<?>... paramsType) { mv.visitTypeInsn(NEW, internalName(clazz)); mv.visitInsn(DUP); if (params != null) { for (Object param : params) mv.visitLdcInsn(param); } invokeSpecial(clazz, "<init>", null, paramsType); }
private void buildKeyset( ClassVisitor cw, String wrapperName, String coreName, ClassDefinition trait, ClassDefinition core, BitSet mask ) { String internalWrapper = BuildUtils.getInternalType( wrapperName ); MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "keySet", "()" + Type.getDescriptor( Set.class ), "()Ljava/util/Set<Ljava/lang/String;>;", null ); mv.visitCode(); mv.visitTypeInsn( NEW, Type.getInternalName( HashSet.class ) ); mv.visitInsn( DUP ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( HashSet.class ), "<init>", "()V" ); mv.visitVarInsn( ASTORE, 1 ); for ( FieldDefinition field : core.getFieldsDefinitions() ) { mv.visitVarInsn( ALOAD, 1 ); mv.visitLdcInsn( field.getName() ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Set.class ), "add", "(" + Type.getDescriptor( Object.class ) + ")Z" ); mv.visitInsn( POP ); } mv.visitVarInsn( ALOAD, 1 ); mv.visitVarInsn( ALOAD, 0 ); mv.visitFieldInsn( GETFIELD, internalWrapper, "map", Type.getDescriptor( Map.class ) ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Map.class ), "keySet", "()" + Type.getDescriptor( Set.class ) ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Set.class ), "addAll", "(" + Type.getDescriptor( Collection.class ) + ")Z" ); mv.visitInsn( POP ); mv.visitVarInsn( ALOAD, 1 ); mv.visitInsn( ARETURN ); // mv.visitMaxs( 2, 2 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
public void produceBytecodeGet(MethodVisitor mv, String propertyName, VariableResolverFactory variableResolverFactory) { mv.visitTypeInsn(CHECKCAST, "org/mvel2/tests/core/res/SampleBean"); mv.visitLdcInsn(propertyName); mv.visitMethodInsn(INVOKEVIRTUAL, "org/mvel2/tests/core/res/SampleBean", "getProperty", "(Ljava/lang/String;)Ljava/lang/Object;"); }
protected void buildHardGetter( ClassVisitor cw, FieldDefinition field, String masterName, ClassDefinition proxy, ClassDefinition core, String getterName, boolean protect ) { Class fieldType = field.getType(); MethodVisitor mv = cw.visitMethod( protect ? ACC_PROTECTED : ACC_PUBLIC, getterName, "()" + Type.getDescriptor( fieldType ), null, null); mv.visitCode(); TraitFactory.invokeExtractor( mv, masterName, proxy, core, field ); if ( ! BuildUtils.isPrimitive( field.getTypeName() ) ) { mv.visitTypeInsn( CHECKCAST, Type.getInternalName( fieldType ) ); } mv.visitInsn( BuildUtils.returnType ( fieldType.getName() ) ); // mv.visitMaxs( 2, 1 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
mv.visitTypeInsn(NEW, internalName(toType)); mv.visitInsn(DUP); load(regNr); coerceByConstructor(fromType, toType); mv.visitJumpInsn(GOTO, afterCatch); mv.visitLabel(inCatch); mv.visitInsn(POP); mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, regNr); mv.visitJumpInsn(GOTO, nullLabel); mv.visitLabel(afterCatch);
protected void parseGlobals(String[] globals, String[] globalTypes, int wmReg, StringBuilder methodDescr) { for (int i = 0; i < globals.length; i++) { mv.visitVarInsn(ALOAD, wmReg); // workingMemory push(globals[i]); invokeInterface(WorkingMemory.class, "getGlobal", Object.class, String.class); mv.visitTypeInsn(CHECKCAST, internalName(globalTypes[i])); methodDescr.append(typeDescr(globalTypes[i])); } }
protected void buildCommonMethods( ClassWriter cw, String proxy ) { MethodVisitor mv; { mv = cw.visitMethod( ACC_PUBLIC, "toString", "()" + Type.getDescriptor( String.class ), null, null ); mv.visitCode(); mv.visitTypeInsn( NEW, Type.getInternalName( StringBuilder.class ) ); mv.visitInsn( DUP ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( StringBuilder.class ), "<init>", "()V" ); mv.visitLdcInsn( "(@" + proxy + ") : " ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( String.class ) + ")" + Type.getDescriptor( StringBuilder.class ) ); mv.visitVarInsn( ALOAD, 0 ); mv.visitMethodInsn( INVOKEVIRTUAL, BuildUtils.getInternalType( proxy ), "getFields", "()" + Type.getDescriptor( Map.class ) ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Map.class ) , "entrySet", "()" + Type.getDescriptor( Set.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( Object.class ), "toString", "()" + Type.getDescriptor( String.class )); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( String.class ) + ")" + Type.getDescriptor( StringBuilder.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "toString", "()" + Type.getDescriptor( String.class )); mv.visitInsn( ARETURN ); // mv.visitMaxs( 2, 1 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); } }
public void produceBytecodePut(MethodVisitor mv, String propertyName, VariableResolverFactory factory) { mv.visitTypeInsn(CHECKCAST, "java/util/List"); mv.visitInsn(ICONST_0); mv.visitLdcInsn("set"); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "set", "(ILjava/lang/Object;)Ljava/lang/Object;"); mv.visitInsn(POP); mv.visitInsn(ACONST_NULL); } }
public void checkcast(final Type type) { mv.visitTypeInsn(Opcodes.CHECKCAST, type.getInternalName()); }
private void unwrapPrimitive(Class cls) { if (cls == boolean.class) { assert debug("CHECKCAST java/lang/Boolean"); mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean"); assert debug("INVOKEVIRTUAL java/lang/Boolean.booleanValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z"); mv.visitTypeInsn(CHECKCAST, "java/lang/Integer"); assert debug("INVOKEVIRTUAL java/lang/Integer.intValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I"); mv.visitTypeInsn(CHECKCAST, "java/lang/Float"); assert debug("INVOKEVIRTUAL java/lang/Float.floatValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F"); mv.visitTypeInsn(CHECKCAST, "java/lang/Double"); assert debug("INVOKEVIRTUAL java/lang/Double.doubleValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D"); mv.visitTypeInsn(CHECKCAST, "java/lang/Short"); assert debug("INVOKEVIRTUAL java/lang/Short.shortValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S"); mv.visitTypeInsn(CHECKCAST, "java/lang/Long"); assert debug("INVOKEVIRTUAL java/lang/Long.longValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J"); mv.visitTypeInsn(CHECKCAST, "java/lang/Byte"); assert debug("INVOKEVIRTUAL java/lang/Byte.byteValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B");
private void buildHardGetter( ClassVisitor cw, FieldDefinition field, String masterName, ClassDefinition proxy, ClassDefinition core, String getterName, boolean protect ) { String fieldName = field.getName(); Class fieldType = field.getType(); MethodVisitor mv = cw.visitMethod( protect ? ACC_PROTECTED : ACC_PUBLIC, getterName, "()" + Type.getDescriptor( field.getType() ), null, null); mv.visitCode(); TraitFactory.invokeExtractor( mv, masterName, proxy, core, field ); if ( ! BuildUtils.isPrimitive( field.getTypeName() ) ) { mv.visitTypeInsn( CHECKCAST, Type.getInternalName( fieldType ) ); } mv.visitInsn( BuildUtils.returnType ( field.getTypeName() ) ); // mv.visitMaxs( 2, 1 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); }
private void jitConstructorInvocation(ConstructorInvocation invocation) { Constructor constructor = invocation.getConstructor(); Class<?> clazz = invocation.getReturnType(); mv.visitTypeInsn(NEW, internalName(clazz)); mv.visitInsn(DUP); int argumentCounter = 0; for (Expression argument : invocation.getArguments()) { cast(jitExpression(argument), constructor.getParameterTypes()[argumentCounter++]); } invokeSpecial(clazz, "<init>", null, constructor.getParameterTypes()); }
private void buildCommonMethods(ClassWriter cw, String proxy, String core ) { String proxyType = BuildUtils.getInternalType( proxy ); { MethodVisitor mv = cw.visitMethod( ACC_PUBLIC, "toString", "()" + Type.getDescriptor( String.class ), null, null ); mv.visitCode(); mv.visitTypeInsn( NEW, Type.getInternalName( StringBuilder.class ) ); mv.visitInsn( DUP ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( StringBuilder.class ), "<init>", "()V" ); mv.visitLdcInsn( "(@" + proxy + ") : " ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( String.class ) + ")" + Type.getDescriptor( StringBuilder.class ) ); mv.visitVarInsn( ALOAD, 0 ); mv.visitMethodInsn( INVOKEVIRTUAL, proxyType, "getFields", "()" + Type.getDescriptor( Map.class ) ); mv.visitMethodInsn( INVOKEINTERFACE, Type.getInternalName( Map.class ), "entrySet", "()" + Type.getDescriptor( Set.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( Object.class ), "toString", "()" + Type.getDescriptor( String.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "append", "(" + Type.getDescriptor( String.class ) + ")" + Type.getDescriptor( StringBuilder.class ) ); mv.visitMethodInsn( INVOKEVIRTUAL, Type.getInternalName( StringBuilder.class ), "toString", "()" + Type.getDescriptor( String.class ) ); mv.visitInsn( ARETURN ); // mv.visitMaxs( 2, 1 ); mv.visitMaxs( 0, 0 ); mv.visitEnd(); } }
private void ldcClassConstant(Class cls) { if (OPCODES_VERSION == Opcodes.V1_4) { assert debug("LDC \"" + cls.getName() + "\""); mv.visitLdcInsn(cls.getName()); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;"); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); mv.visitTypeInsn(NEW, "java/lang/NoClassDefFoundError"); mv.visitInsn(DUP_X1); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Throwable", "getMessage", "()Ljava/lang/String;"); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/NoClassDefFoundError", "<init>", "(Ljava/lang/String;)V"); mv.visitInsn(ATHROW); mv.visitLabel(l4); } else { assert debug("LDC " + getType(cls)); mv.visitLdcInsn(getType(cls)); } }
public void anew(final Type type) { mv.visitTypeInsn(Opcodes.NEW, type.getInternalName()); }
private void unwrapPrimitive(Class cls) { if (cls == boolean.class) { assert debug("CHECKCAST java/lang/Boolean"); mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean"); assert debug("INVOKEVIRTUAL java/lang/Boolean.booleanValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z"); mv.visitTypeInsn(CHECKCAST, "java/lang/Integer"); assert debug("INVOKEVIRTUAL java/lang/Integer.intValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I"); mv.visitTypeInsn(CHECKCAST, "java/lang/Float"); assert debug("INVOKEVIRTUAL java/lang/Float.floatValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F"); mv.visitTypeInsn(CHECKCAST, "java/lang/Double"); assert debug("INVOKEVIRTUAL java/lang/Double.doubleValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D"); mv.visitTypeInsn(CHECKCAST, "java/lang/Short"); assert debug("INVOKEVIRTUAL java/lang/Short.shortValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S"); mv.visitTypeInsn(CHECKCAST, "java/lang/Long"); assert debug("INVOKEVIRTUAL java/lang/Long.longValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J"); mv.visitTypeInsn(CHECKCAST, "java/lang/Byte"); assert debug("INVOKEVIRTUAL java/lang/Byte.byteValue"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B");
null); mv.visitCode(); mv.visitTypeInsn( NEW, Type.getInternalName( HashSet.class ) ); mv.visitInsn( DUP ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( HashSet.class ), "<init>", "()V" ); mv.visitVarInsn( ASTORE, 1 ); mv.visitVarInsn( ALOAD, 1 ); mv.visitVarInsn( ALOAD, 0 ); mv.visitMethodInsn( INVOKESPECIAL, Type.getInternalName( TripleBasedStruct.class ), "keySet", "addAll", "(" + Type.getDescriptor( Collection.class ) + ")Z" ); mv.visitInsn( POP ); mv.visitVarInsn( ALOAD, 1 );
private void ldcClassConstant(Class cls) { if (OPCODES_VERSION == Opcodes.V1_4) { assert debug("LDC \"" + cls.getName() + "\""); mv.visitLdcInsn(cls.getName()); mv.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;"); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); mv.visitTypeInsn(NEW, "java/lang/NoClassDefFoundError"); mv.visitInsn(DUP_X1); mv.visitInsn(SWAP); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Throwable", "getMessage", "()Ljava/lang/String;"); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/NoClassDefFoundError", "<init>", "(Ljava/lang/String;)V"); mv.visitInsn(ATHROW); mv.visitLabel(l4); } else { assert debug("LDC " + getType(cls)); mv.visitLdcInsn(getType(cls)); } }