List of usage examples for org.objectweb.asm.commons GeneratorAdapter loadLocal
public void loadLocal(final int local, final Type type)
From source file:com.changingbits.Builder.java
License:Apache License
/** Build a {@link LongRangeMultiSet} implementation to * lookup intervals for a given point.// w w w . ja va2s . c om * * @param useAsm If true, the tree will be compiled to * java bytecodes using the {@code asm} library; typically * this results in a faster (~3X) implementation. */ public LongRangeMultiSet getMultiSet(boolean useAsm, boolean useArrayImpl) { finish(useArrayImpl); if (useAsm) { StringBuilder sb = new StringBuilder(); sb.append('\n'); int count = 0; for (LongRange range : ranges) { sb.append("// range "); sb.append(count++); sb.append(": "); sb.append(range); sb.append('\n'); } sb.append('\n'); sb.append("int upto = 0;\n"); buildJavaSource(root, 0, sb); String javaSource = sb.toString(); //System.out.println("java: " + javaSource); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); classWriter.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, COMPILED_TREE_CLASS.replace('.', '/'), null, LONG_RANGE_MULTI_SET_TYPE.getInternalName(), null); classWriter.visitSource(javaSource, null); Method m = Method.getMethod("void <init> ()"); GeneratorAdapter constructor = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, m, null, null, classWriter); constructor.loadThis(); constructor.loadArgs(); constructor.invokeConstructor(LONG_RANGE_MULTI_SET_TYPE, m); constructor.returnValue(); constructor.endMethod(); GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC, LOOKUP_METHOD, null, null, classWriter); //Label labelTop = new Label(); //Label labelEnd = new Label(); //gen.visitLabel(labelTop); int uptoLocal = gen.newLocal(Type.INT_TYPE); //System.out.println("uptoLocal=" + uptoLocal); // nocommit is this not needed!? //gen.visitLocalVariable("upto", "I", null, labelTop, labelEnd, uptoLocal); gen.push(0); gen.storeLocal(uptoLocal, Type.INT_TYPE); buildAsm(gen, root, uptoLocal); // Return upto: gen.loadLocal(uptoLocal, Type.INT_TYPE); gen.returnValue(); //gen.visitLabel(labelEnd); gen.endMethod(); classWriter.visitEnd(); byte[] bytes = classWriter.toByteArray(); // javap -c /x/tmp/my.class /* try { FileOutputStream fos = new FileOutputStream(new File("/x/tmp/my.class")); fos.write(bytes); fos.close(); } catch (Exception e) { throw new RuntimeException(e); } */ // nocommit allow changing the class loader Class<? extends LongRangeMultiSet> treeClass = new Loader(LongRangeMultiSet.class.getClassLoader()) .define(COMPILED_TREE_CLASS, classWriter.toByteArray()); try { return treeClass.getConstructor().newInstance(); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new RuntimeException(e); } } else if (useArrayImpl) { return new ArrayLongRangeMultiSet(root); } else { return new SimpleLongRangeMultiSet(root); } }
From source file:com.changingbits.Builder.java
License:Apache License
private void buildAsm(GeneratorAdapter gen, Node node, int uptoLocal) { if (node.outputs != null) { //System.out.println("gen outputs=" + node.outputs); // Increment any range outputs at the current node: for (int range : node.outputs) { // Load arg 1 (the int[] answers): gen.loadArg(1);/*from www .ja v a2 s. co m*/ // Load the index we will store to gen.loadLocal(uptoLocal, Type.INT_TYPE); // The range value we will store: gen.push(range); // Store it gen.arrayStore(Type.INT_TYPE); // Increment our upto: gen.iinc(uptoLocal, 1); } } if (node.left != null && (node.left.hasOutputs || node.right.hasOutputs)) { assert node.left.end + 1 == node.right.start; if (node.left.hasOutputs && node.right.hasOutputs) { // Recurse on either left or right Label labelLeft = new Label(); Label labelEnd = new Label(); gen.loadArg(0); gen.push(node.left.end); gen.ifCmp(Type.LONG_TYPE, GeneratorAdapter.LE, labelLeft); buildAsm(gen, node.right, uptoLocal); gen.goTo(labelEnd); gen.visitLabel(labelLeft); buildAsm(gen, node.left, uptoLocal); gen.visitLabel(labelEnd); } else if (node.left.hasOutputs) { // Recurse only on left Label labelEnd = new Label(); gen.loadArg(0); gen.push(node.left.end); gen.ifCmp(Type.LONG_TYPE, GeneratorAdapter.GT, labelEnd); buildAsm(gen, node.left, uptoLocal); gen.visitLabel(labelEnd); } else { // Recurse only on right Label labelEnd = new Label(); gen.loadArg(0); gen.push(node.left.end); gen.ifCmp(Type.LONG_TYPE, GeneratorAdapter.LE, labelEnd); buildAsm(gen, node.right, uptoLocal); gen.visitLabel(labelEnd); } } }
From source file:de.enough.polish.postcompile.java5.Java5ClassVisitor.java
License:Open Source License
public void visitEnd() { if (this.isEnumClass) { if (this.name_values == null) { throw new BuildException("This is not an enum class: " + this.classDesc); }/*from w w w .ja v a2 s . c o m*/ // Generate new <clinit> method. int numValues = EnumManager.getInstance().getNumEnumValues(this.classDesc); Method m = Method.getMethod("void <clinit> ()"); MethodVisitor mv = super.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null); GeneratorAdapter mg = new GeneratorAdapter(ACC_STATIC, m, mv); mg.push(numValues); mg.newArray(Type.INT_TYPE); if (numValues <= 3) { for (int i = 1; i < numValues; i++) { mg.dup(); mg.push(i); mg.push(i); mg.arrayStore(Type.INT_TYPE); } } else { Label labelInitializeField = new Label(); Label labelCheck = new Label(); Label labelDone = new Label(); mg.push(1); mg.storeLocal(0, Type.INT_TYPE); mg.goTo(labelCheck); mg.mark(labelInitializeField); mg.dup(); mg.loadLocal(0, Type.INT_TYPE); mg.dup(); mg.arrayStore(Type.INT_TYPE); mg.iinc(0, 1); mg.mark(labelCheck); mg.loadLocal(0, Type.INT_TYPE); mg.push(numValues); mg.ifICmp(GeneratorAdapter.LT, labelInitializeField); mg.mark(labelDone); } mg.putStatic(Type.getType(this.classDesc), this.name_values, Type.getType(int[].class)); mg.returnValue(); mg.endMethod(); } // Called super implementation of this method to really close this class. super.visitEnd(); }
From source file:lucee.transformer.bytecode.Page.java
License:Open Source License
private void writeOutInitComponent(BytecodeContext statConstr, BytecodeContext constr, List<LitString> keys, ClassWriter cw, Tag component) throws BytecodeException { final GeneratorAdapter adapter = new GeneratorAdapter(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, INIT_COMPONENT, null, new Type[] { Types.PAGE_EXCEPTION }, cw); BytecodeContext bc = new BytecodeContext(null, statConstr, constr, this, keys, cw, name, adapter, INIT_COMPONENT, writeLog(), suppressWSbeforeArg, output); Label methodBegin = new Label(); Label methodEnd = new Label(); adapter.visitLocalVariable("this", "L" + name + ";", null, methodBegin, methodEnd, 0); adapter.visitLabel(methodBegin);//from w ww . j a v a 2 s .c o m // Scope oldData=null; final int oldData = adapter.newLocal(Types.VARIABLES); ASMConstants.NULL(adapter); adapter.storeLocal(oldData); int localBC = adapter.newLocal(Types.BODY_CONTENT); ConditionVisitor cv = new ConditionVisitor(); cv.visitBefore(); cv.visitWhenBeforeExpr(); adapter.loadArg(1); adapter.invokeVirtual(Types.COMPONENT_IMPL, GET_OUTPUT); cv.visitWhenAfterExprBeforeBody(bc); ASMConstants.NULL(adapter); cv.visitWhenAfterBody(bc); cv.visitOtherviseBeforeBody(); adapter.loadArg(0); adapter.invokeVirtual(Types.PAGE_CONTEXT, PUSH_BODY); cv.visitOtherviseAfterBody(); cv.visitAfter(bc); adapter.storeLocal(localBC); // c.init(pc,this); adapter.loadArg(1); adapter.loadArg(0); adapter.visitVarInsn(Opcodes.ALOAD, 0); adapter.invokeVirtual(Types.COMPONENT_IMPL, INIT); //int oldCheckArgs= pc.undefinedScope().setMode(Undefined.MODE_NO_LOCAL_AND_ARGUMENTS); final int oldCheckArgs = adapter.newLocal(Types.INT_VALUE); adapter.loadArg(0); adapter.invokeVirtual(Types.PAGE_CONTEXT, UNDEFINED_SCOPE); adapter.push(Undefined.MODE_NO_LOCAL_AND_ARGUMENTS); adapter.invokeInterface(Types.UNDEFINED, SET_MODE); adapter.storeLocal(oldCheckArgs); TryCatchFinallyVisitor tcf = new TryCatchFinallyVisitor(new OnFinally() { public void _writeOut(BytecodeContext bc) { // undefined.setMode(oldMode); adapter.loadArg(0); adapter.invokeVirtual(Types.PAGE_CONTEXT, UNDEFINED_SCOPE); adapter.loadLocal(oldCheckArgs, Types.INT_VALUE); adapter.invokeInterface(Types.UNDEFINED, SET_MODE); adapter.pop(); // c.afterCall(pc,_oldData); adapter.loadArg(1); adapter.loadArg(0); adapter.loadLocal(oldData); adapter.invokeVirtual(Types.COMPONENT_IMPL, AFTER_CALL); } }, null); tcf.visitTryBegin(bc); // oldData=c.beforeCall(pc); adapter.loadArg(1); adapter.loadArg(0); adapter.invokeVirtual(Types.COMPONENT_IMPL, BEFORE_CALL); adapter.storeLocal(oldData); ExpressionUtil.visitLine(bc, component.getStart()); writeOutCallBody(bc, component.getBody(), IFunction.PAGE_TYPE_COMPONENT); ExpressionUtil.visitLine(bc, component.getEnd()); int t = tcf.visitTryEndCatchBeging(bc); // BodyContentUtil.flushAndPop(pc,bc); adapter.loadArg(0); adapter.loadLocal(localBC); adapter.invokeStatic(Types.BODY_CONTENT_UTIL, FLUSH_AND_POP); // throw Caster.toPageException(t); adapter.loadLocal(t); adapter.invokeStatic(Types.CASTER, TO_PAGE_EXCEPTION); adapter.throwException(); tcf.visitCatchEnd(bc); adapter.loadArg(0); adapter.loadLocal(localBC); adapter.invokeStatic(Types.BODY_CONTENT_UTIL, CLEAR_AND_POP); adapter.returnValue(); adapter.visitLabel(methodEnd); adapter.endMethod(); }
From source file:lucee.transformer.bytecode.statement.Return.java
License:Open Source License
public void _writeOut(BytecodeContext bc) throws BytecodeException { GeneratorAdapter adapter = bc.getAdapter(); if (expr == null) ASMConstants.NULL(adapter);/*from w ww. j a v a 2s . c o m*/ else expr.writeOut(bc, Expression.MODE_REF); // call finallies Stack<OnFinally> finallies = bc.getOnFinallyStack(); int len = finallies.size(); OnFinally onFinally; if (len > 0) { int rtn = adapter.newLocal(Types.OBJECT); adapter.storeLocal(rtn, Types.OBJECT); for (int i = len - 1; i >= 0; i--) { onFinally = finallies.get(i); if (!bc.insideFinally(onFinally)) onFinally.writeOut(bc); } adapter.loadLocal(rtn, Types.OBJECT); } if (bc.getMethod().getReturnType().equals(Types.VOID)) { adapter.pop(); adapter.visitInsn(Opcodes.RETURN); } else adapter.visitInsn(Opcodes.ARETURN); }
From source file:lucee.transformer.bytecode.visitor.ForConditionIntVisitor.java
License:Open Source License
public int visitBegin(GeneratorAdapter adapter, int start, boolean isLocal) { lend = new Label(); lbegin = new Label(); i = adapter.newLocal(Types.INT_VALUE); l0 = new Label(); adapter.visitLabel(l0);// www.j a va2s. co m if (isLocal) adapter.loadLocal(start, Types.INT_VALUE); else adapter.push(start); //mv.visitInsn(ICONST_1); adapter.visitVarInsn(ISTORE, i); l1 = new Label(); adapter.visitLabel(l1); l2 = new Label(); adapter.visitJumpInsn(GOTO, l2); l3 = new Label(); adapter.visitLabel(l3); return i; }
From source file:lucee.transformer.bytecode.visitor.ForDoubleVisitor.java
License:Open Source License
public void forInit(GeneratorAdapter adapter, int start, boolean isLocal) { i = adapter.newLocal(Types.DOUBLE_VALUE); if (isLocal)/*from ww w . ja v a2 s . c o m*/ adapter.loadLocal(start, Types.DOUBLE_VALUE); else adapter.push((double) start); adapter.visitVarInsn(DSTORE, i); }
From source file:lucee.transformer.bytecode.visitor.ForIntVisitor.java
License:Open Source License
private void forInit(GeneratorAdapter adapter, int start, boolean isLocal) { i = adapter.newLocal(Types.INT_VALUE); if (isLocal)//from w w w .java 2 s.c o m adapter.loadLocal(start, Types.INT_VALUE); else adapter.push(start); adapter.visitVarInsn(ISTORE, i); }
From source file:org.evosuite.testcase.variable.VariableReferenceImpl.java
License:Open Source License
/** {@inheritDoc} */ @Override/*from ww w. j a v a 2 s . c om*/ public void loadBytecode(GeneratorAdapter mg, Map<Integer, Integer> locals) { logger.debug("Loading variable in bytecode: " + getStPosition()); if (getStPosition() < 0) { mg.visitInsn(Opcodes.ACONST_NULL); } else mg.loadLocal(locals.get(getStPosition()), org.objectweb.asm.Type.getType(type.getRawClass())); }
From source file:org.evosuite.testcase.VariableReferenceImpl.java
License:Open Source License
/** {@inheritDoc} */ @Override//from w ww . j a v a 2 s . com public void loadBytecode(GeneratorAdapter mg, Map<Integer, Integer> locals) { logger.debug("Loading variable in bytecode: {}", getStPosition()); if (getStPosition() < 0) { mg.visitInsn(Opcodes.ACONST_NULL); } else mg.loadLocal(locals.get(getStPosition()), org.objectweb.asm.Type.getType(type.getRawClass())); }