List of usage examples for org.objectweb.asm MethodVisitor visitLabel
public void visitLabel(final Label label)
From source file:com.google.gwtorm.jdbc.AccessGen.java
License:Apache License
private void doFetchOne(final MethodVisitor mv, final CodeGenSupport cgs, final ColumnModel field, final int reportLiveInto) { if (field.isNested()) { int oldIdx = cgs.getColumnIndex(); final Type vType = CodeGenSupport.toType(field); final int livecnt; if (field.isNotNull()) { livecnt = -1;//from ww w . j a v a 2s . com } else { livecnt = cgs.newLocal(); cgs.push(0); mv.visitVarInsn(ISTORE, livecnt); } cgs.setFieldReference(field); cgs.fieldSetBegin(); mv.visitTypeInsn(NEW, vType.getInternalName()); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, vType.getInternalName(), "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {})); cgs.fieldSetEnd(); cgs.resetColumnIndex(oldIdx); for (final ColumnModel c : field.getNestedColumns()) { doFetchOne(mv, cgs, c, livecnt); } if (livecnt >= 0) { oldIdx = cgs.getColumnIndex(); final Label islive = new Label(); mv.visitVarInsn(ILOAD, livecnt); mv.visitJumpInsn(IFNE, islive); cgs.setFieldReference(field); cgs.fieldSetBegin(); mv.visitInsn(ACONST_NULL); cgs.fieldSetEnd(); if (reportLiveInto >= 0) { final Label end = new Label(); mv.visitJumpInsn(GOTO, end); mv.visitLabel(islive); mv.visitIincInsn(reportLiveInto, 1); mv.visitLabel(end); } else { mv.visitLabel(islive); } cgs.resetColumnIndex(oldIdx); cgs.freeLocal(livecnt); } } else { final int dupTo; if (reportLiveInto >= 0 && CodeGenSupport.toType(field).getSort() == Type.OBJECT) { dupTo = cgs.newLocal(); } else { dupTo = -1; } cgs.setFieldReference(field); cgs.setDupOnFieldSetEnd(dupTo); dialect.getSqlTypeInfo(field).generateResultSetGet(cgs); if (reportLiveInto >= 0) { final Label wasnull = new Label(); if (dupTo >= 0) { mv.visitVarInsn(ALOAD, dupTo); mv.visitJumpInsn(IFNULL, wasnull); cgs.freeLocal(dupTo); } else { cgs.pushSqlHandle(); mv.visitMethodInsn(INVOKEINTERFACE, Type.getType(ResultSet.class).getInternalName(), "wasNull", Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {})); mv.visitJumpInsn(IFNE, wasnull); } mv.visitIincInsn(reportLiveInto, 1); mv.visitLabel(wasnull); } } }
From source file:com.google.gwtorm.jdbc.AccessGen.java
License:Apache License
private void overrideGetMany() { final KeyModel pk = model.getPrimaryKey(); final StringBuilder query = new StringBuilder(); query.append(model.getSelectSql(dialect, REL_ALIAS)); query.append(" WHERE "); final ColumnModel pkcol = pk.getAllLeafColumns().iterator().next(); query.append(REL_ALIAS);//from w w w . j ava2s.c om query.append('.'); query.append(pkcol.getColumnName()); query.append(" IN"); final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "getBySqlIn", Type.getMethodDescriptor(Type.getType(com.google.gwtorm.server.ResultSet.class), new Type[] { Type.getType(Collection.class) }), null, new String[] { Type.getType(OrmException.class).getInternalName() }); mv.visitCode(); final int keyset = 1; final int psvar = 2; final int itrvar = 3; final int colvar = 4; final int keyvar = 5; mv.visitVarInsn(ALOAD, 0); mv.visitLdcInsn(query.toString()); mv.visitVarInsn(ALOAD, keyset); mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "prepareBySqlIn", Type.getMethodDescriptor(Type.getType(PreparedStatement.class), new Type[] { Type.getType(String.class), Type.getType(Collection.class) })); mv.visitVarInsn(ASTORE, psvar); mv.visitVarInsn(ALOAD, keyset); mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Collection.class), "iterator", Type.getMethodDescriptor(Type.getType(Iterator.class), new Type[] {})); mv.visitVarInsn(ASTORE, itrvar); mv.visitInsn(ICONST_1); mv.visitVarInsn(ISTORE, colvar); final Label endbind = new Label(); final Label again = new Label(); mv.visitLabel(again); mv.visitVarInsn(ALOAD, itrvar); mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Iterator.class), "hasNext", Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] {})); mv.visitJumpInsn(IFEQ, endbind); mv.visitVarInsn(ALOAD, itrvar); mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(Iterator.class), "next", Type.getMethodDescriptor(Type.getType(Object.class), new Type[] {})); mv.visitTypeInsn(CHECKCAST, CodeGenSupport.toType(pk.getField()).getInternalName()); mv.visitVarInsn(ASTORE, keyvar); final CodeGenSupport cgs = new CodeGenSupport(mv) { @Override public void pushSqlHandle() { mv.visitVarInsn(ALOAD, psvar); } @Override public void pushFieldValue() { appendGetField(getFieldReference()); } @Override public void pushColumnIndex() { mv.visitVarInsn(ILOAD, colvar); } @Override protected void appendGetField(final ColumnModel c) { if (c.getParent() == null) { mv.visitVarInsn(ALOAD, keyvar); } else { super.appendGetField(c); } } }; cgs.setFieldReference(pkcol); dialect.getSqlTypeInfo(pkcol).generatePreparedStatementSet(cgs); mv.visitIincInsn(colvar, 1); mv.visitJumpInsn(GOTO, again); mv.visitLabel(endbind); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, psvar); mv.visitMethodInsn(INVOKEVIRTUAL, superTypeName, "queryList", Type.getMethodDescriptor(Type.getType(com.google.gwtorm.server.ResultSet.class), new Type[] { Type.getType(PreparedStatement.class) })); mv.visitInsn(ARETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); }
From source file:com.google.gwtorm.nosql.IndexFunctionGen.java
License:Apache License
private void implementIncludes() throws OrmException { final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "includes", Type.getMethodDescriptor(Type.BOOLEAN_TYPE, new Type[] { object }), null, null); mv.visitCode();//from ww w . j a v a 2s .c o m final IncludeCGS cgs = new IncludeCGS(mv); cgs.setEntityType(pojoType); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, pojoType.getInternalName()); mv.visitVarInsn(ASTORE, 1); Set<ColumnModel> checked = new HashSet<ColumnModel>(); for (QueryModel.OrderBy orderby : myFields) { checkNotNullFields(Collections.singleton(orderby.column), checked, mv, cgs); } final Tree parseTree = query.getParseTree(); if (parseTree != null) { checkConstants(parseTree, mv, cgs); } cgs.push(1); mv.visitInsn(IRETURN); mv.visitLabel(cgs.no); cgs.push(0); mv.visitInsn(IRETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); }
From source file:com.google.gwtorm.protobuf.CodecGen.java
License:Apache License
private static void sizeofMessage(final JavaColumnModel[] myFields, final MethodVisitor mv, final SizeofCGS cgs) throws OrmException { for (final JavaColumnModel f : myFields) { if (f.isNested()) { final Label end = new Label(); cgs.setFieldReference(f);// w w w .ja va 2 s . c o m cgs.pushFieldValue(); mv.visitJumpInsn(IFNULL, end); final int oldVar = cgs.sizeVar; final int msgVar = cgs.newLocal(); cgs.sizeVar = msgVar; cgs.push(0); mv.visitVarInsn(ISTORE, cgs.sizeVar); sizeofMessage(sort(f.getNestedColumns()), mv, cgs); cgs.sizeVar = oldVar; cgs.push(f.getColumnID()); cgs.inc("computeTagSize", Type.INT_TYPE); mv.visitVarInsn(ILOAD, msgVar); cgs.inc("computeRawVarint32Size", Type.INT_TYPE); mv.visitVarInsn(ILOAD, msgVar); cgs.inc(); cgs.freeLocal(msgVar); mv.visitLabel(end); } else { sizeofScalar(mv, cgs, f); } } }
From source file:com.google.gwtorm.protobuf.CodecGen.java
License:Apache License
private static void sizeofScalar(final MethodVisitor mv, final SizeofCGS cgs, final JavaColumnModel f) throws OrmException { cgs.setFieldReference(f);//from ww w . java 2 s .c o m switch (Type.getType(f.getPrimitiveType()).getSort()) { case Type.BOOLEAN: cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.inc("computeBoolSize", Type.INT_TYPE, Type.BOOLEAN_TYPE); break; case Type.CHAR: cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.inc("computeUInt32Size", Type.INT_TYPE, Type.INT_TYPE); break; case Type.BYTE: case Type.SHORT: case Type.INT: cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.inc("computeSInt32Size", Type.INT_TYPE, Type.INT_TYPE); break; case Type.FLOAT: cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.inc("computeFloatSize", Type.INT_TYPE, Type.FLOAT_TYPE); break; case Type.DOUBLE: cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.inc("computeDoubleSize", Type.INT_TYPE, Type.DOUBLE_TYPE); break; case Type.LONG: cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.inc("computeSInt64", Type.INT_TYPE, Type.LONG_TYPE); break; case Type.ARRAY: case Type.OBJECT: { final Label end = new Label(); cgs.pushFieldValue(); mv.visitJumpInsn(IFNULL, end); if (f.getPrimitiveType() == byte[].class) { cgs.push(f.getColumnID()); cgs.inc("computeTagSize", Type.INT_TYPE); cgs.pushFieldValue(); mv.visitInsn(ARRAYLENGTH); cgs.inc("computeRawVarint32Size", Type.INT_TYPE); cgs.pushFieldValue(); mv.visitInsn(ARRAYLENGTH); cgs.inc(); } else if (f.getPrimitiveType() == String.class) { cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.inc("computeStringSize", Type.INT_TYPE, string); } else if (f.getPrimitiveType() == java.sql.Timestamp.class || f.getPrimitiveType() == java.util.Date.class || f.getPrimitiveType() == java.sql.Date.class) { cgs.push(f.getColumnID()); String tsType = Type.getType(f.getPrimitiveType()).getInternalName(); mv.visitMethodInsn(INVOKEVIRTUAL, tsType, "getTime", Type.getMethodDescriptor(Type.LONG_TYPE, new Type[] {})); cgs.inc("computeFixed64Size", Type.INT_TYPE, Type.LONG_TYPE); } else { throw new OrmException( "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName()); } mv.visitLabel(end); break; } default: throw new OrmException( "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName()); } }
From source file:com.google.gwtorm.protobuf.CodecGen.java
License:Apache License
private static void encodeMessage(final JavaColumnModel[] myFields, final MethodVisitor mv, final EncodeCGS cgs) throws OrmException { final int oldVar = cgs.codedOutputStreamVar; cgs.codedOutputStreamVar = cgs.newLocal(); final int strVar = cgs.newLocal(); mv.visitMethodInsn(INVOKESTATIC, byteString.getInternalName(), "newOutput", Type.getMethodDescriptor(byteStringOutput, new Type[] {})); mv.visitVarInsn(ASTORE, strVar);// www.j av a 2 s. c om mv.visitVarInsn(ALOAD, strVar); mv.visitMethodInsn(INVOKESTATIC, codedOutputStream.getInternalName(), "newInstance", Type.getMethodDescriptor(codedOutputStream, new Type[] { Type.getType(OutputStream.class) })); mv.visitVarInsn(ASTORE, cgs.codedOutputStreamVar); for (final JavaColumnModel f : myFields) { if (f.isNested()) { final Label end = new Label(); cgs.setFieldReference(f); cgs.pushFieldValue(); mv.visitJumpInsn(IFNULL, end); final int v = cgs.newLocal(); encodeMessage(sort(f.getNestedColumns()), mv, cgs); mv.visitVarInsn(ASTORE, v); mv.visitVarInsn(ALOAD, v); mv.visitMethodInsn(INVOKEVIRTUAL, byteString.getInternalName(), "size", Type.getMethodDescriptor(Type.INT_TYPE, new Type[] {})); mv.visitJumpInsn(IFEQ, end); cgs.pushCodedOutputStream(); cgs.push(f.getColumnID()); mv.visitVarInsn(ALOAD, v); cgs.write("writeBytes", byteString); cgs.freeLocal(v); mv.visitLabel(end); } else { encodeScalar(mv, cgs, f); } } cgs.pushCodedOutputStream(); mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(), "flush", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {})); cgs.freeLocal(cgs.codedOutputStreamVar); cgs.codedOutputStreamVar = oldVar; mv.visitVarInsn(ALOAD, strVar); mv.visitMethodInsn(INVOKEVIRTUAL, byteStringOutput.getInternalName(), "toByteString", Type.getMethodDescriptor(byteString, new Type[] {})); cgs.freeLocal(strVar); }
From source file:com.google.gwtorm.protobuf.CodecGen.java
License:Apache License
private static void encodeScalar(final MethodVisitor mv, final EncodeCGS cgs, final JavaColumnModel f) throws OrmException { cgs.setFieldReference(f);/*w w w.j a v a 2 s. c o m*/ switch (Type.getType(f.getPrimitiveType()).getSort()) { case Type.BOOLEAN: cgs.pushCodedOutputStream(); cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.write("writeBool", Type.BOOLEAN_TYPE); break; case Type.CHAR: cgs.pushCodedOutputStream(); cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.write("writeUInt32", Type.INT_TYPE); break; case Type.BYTE: case Type.SHORT: case Type.INT: cgs.pushCodedOutputStream(); cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.write("writeSInt32", Type.INT_TYPE); break; case Type.FLOAT: cgs.pushCodedOutputStream(); cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.write("writeFloat", Type.FLOAT_TYPE); break; case Type.DOUBLE: cgs.pushCodedOutputStream(); cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.write("writeDouble", Type.DOUBLE_TYPE); break; case Type.LONG: cgs.pushCodedOutputStream(); cgs.push(f.getColumnID()); cgs.pushFieldValue(); cgs.write("writeSInt64", Type.LONG_TYPE); break; case Type.ARRAY: case Type.OBJECT: { final Label end = new Label(); cgs.pushFieldValue(); mv.visitJumpInsn(IFNULL, end); if (f.getPrimitiveType() == byte[].class) { cgs.pushCodedOutputStream(); cgs.push(f.getColumnID()); cgs.push(WireFormat.FieldType.BYTES.getWireType()); mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(), "writeTag", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.INT_TYPE, Type.INT_TYPE })); cgs.pushCodedOutputStream(); cgs.pushFieldValue(); mv.visitInsn(ARRAYLENGTH); mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(), "writeRawVarint32", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.INT_TYPE })); cgs.pushCodedOutputStream(); cgs.pushFieldValue(); mv.visitMethodInsn(INVOKEVIRTUAL, codedOutputStream.getInternalName(), "writeRawBytes", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.getType(byte[].class) })); } else { cgs.pushCodedOutputStream(); cgs.push(f.getColumnID()); cgs.pushFieldValue(); if (f.getPrimitiveType() == String.class) { cgs.write("writeString", string); } else if (f.getPrimitiveType() == java.sql.Timestamp.class || f.getPrimitiveType() == java.util.Date.class || f.getPrimitiveType() == java.sql.Date.class) { String tsType = Type.getType(f.getPrimitiveType()).getInternalName(); mv.visitMethodInsn(INVOKEVIRTUAL, tsType, "getTime", Type.getMethodDescriptor(Type.LONG_TYPE, new Type[] {})); cgs.write("writeFixed64", Type.LONG_TYPE); } else { throw new OrmException( "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName()); } } mv.visitLabel(end); break; } default: throw new OrmException( "Type " + f.getPrimitiveType() + " not supported for field " + f.getPathToFieldName()); } }
From source file:com.google.gwtorm.protobuf.CodecGen.java
License:Apache License
private static void decodeMessage(final JavaColumnModel[] myFields, final MethodVisitor mv, final DecodeCGS cgs) throws OrmException { final Label nextField = new Label(); final Label end = new Label(); mv.visitLabel(nextField); // while (!ci.isAtEnd) { ... cgs.call("readTag", Type.INT_TYPE); mv.visitInsn(DUP);/*from w w w .ja v a2 s . c o m*/ mv.visitVarInsn(ISTORE, cgs.tagVar); cgs.push(3); mv.visitInsn(IUSHR); final Label badField = new Label(); final int[] caseTags = new int[1 + myFields.length]; final Label[] caseLabels = new Label[caseTags.length]; caseTags[0] = 0; caseLabels[0] = new Label(); int gaps = 0; for (int i = 1; i < caseTags.length; i++) { caseTags[i] = myFields[i - 1].getColumnID(); caseLabels[i] = new Label(); gaps += caseTags[i] - (caseTags[i - 1] + 1); } if (2 * gaps / 3 <= myFields.length) { final int min = 0; final int max = caseTags[caseTags.length - 1]; final Label[] table = new Label[max + 1]; Arrays.fill(table, badField); for (int idx = 0; idx < caseTags.length; idx++) { table[caseTags[idx]] = caseLabels[idx]; } mv.visitTableSwitchInsn(min, max, badField, table); } else { mv.visitLookupSwitchInsn(badField, caseTags, caseLabels); } mv.visitLabel(caseLabels[0]); mv.visitJumpInsn(GOTO, end); for (int idx = 1; idx < caseTags.length; idx++) { final JavaColumnModel f = myFields[idx - 1]; mv.visitLabel(caseLabels[idx]); if (f.isNested()) { final Label load = new Label(); cgs.setFieldReference(f); cgs.pushFieldValue(); mv.visitJumpInsn(IFNONNULL, load); cgs.fieldSetBegin(); mv.visitTypeInsn(NEW, Type.getType(f.getNestedClass()).getInternalName()); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, Type.getType(f.getNestedClass()).getInternalName(), "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] {})); cgs.fieldSetEnd(); // read the length, set a new limit, decode the message, validate // we stopped at the end of it as expected. // mv.visitLabel(load); final int limitVar = cgs.newLocal(); cgs.pushCodedInputStream(); cgs.call("readRawVarint32", Type.INT_TYPE); cgs.ncallInt("pushLimit", Type.INT_TYPE); mv.visitVarInsn(ISTORE, limitVar); decodeMessage(sort(f.getNestedColumns()), mv, cgs); cgs.pushCodedInputStream(); mv.visitVarInsn(ILOAD, limitVar); cgs.ncallInt("popLimit", Type.VOID_TYPE); cgs.freeLocal(limitVar); } else { decodeScalar(mv, cgs, f); } mv.visitJumpInsn(GOTO, nextField); } // default: mv.visitLabel(badField); cgs.pushCodedInputStream(); mv.visitVarInsn(ILOAD, cgs.tagVar); cgs.ncallInt("skipField", Type.BOOLEAN_TYPE); mv.visitInsn(POP); mv.visitJumpInsn(GOTO, nextField); mv.visitLabel(end); cgs.pushCodedInputStream(); cgs.push(0); cgs.ncallInt("checkLastTagWas", Type.VOID_TYPE); }
From source file:com.googlecode.d2j.converter.IR2JConverter.java
License:Apache License
private void reBuildInstructions(IrMethod ir, MethodVisitor asm) { asm = new LdcOptimizeAdapter(asm); int maxLocalIndex = 0; for (Local local : ir.locals) { maxLocalIndex = Math.max(maxLocalIndex, local._ls_index); }//w w w. j a va 2 s.c o m Map<String, Integer> lockMap = new HashMap<String, Integer>(); for (Stmt st : ir.stmts) { switch (st.st) { case LABEL: LabelStmt labelStmt = (LabelStmt) st; Label label = (Label) labelStmt.tag; asm.visitLabel(label); if (labelStmt.lineNumber >= 0) { asm.visitLineNumber(labelStmt.lineNumber, label); } break; case ASSIGN: { E2Stmt e2 = (E2Stmt) st; Value v1 = e2.op1; Value v2 = e2.op2; switch (v1.vt) { case LOCAL: Local local = ((Local) v1); int i = local._ls_index; if (v2.vt == VT.LOCAL && (i == ((Local) v2)._ls_index)) {// continue; } boolean skipOrg = false; if (v1.valueType.charAt(0) == 'I') {// check for IINC if (v2.vt == VT.ADD) { E2Expr e = (E2Expr) v2; if ((e.op1 == local && e.op2.vt == VT.CONSTANT) || (e.op2 == local && e.op1.vt == VT.CONSTANT)) { int increment = (Integer) ((Constant) (e.op1 == local ? e.op2 : e.op1)).value; if (increment >= Short.MIN_VALUE && increment <= Short.MAX_VALUE) { asm.visitIincInsn(i, increment); skipOrg = true; } } } else if (v2.vt == VT.SUB) { E2Expr e = (E2Expr) v2; if (e.op1 == local && e.op2.vt == VT.CONSTANT) { int increment = -(Integer) ((Constant) e.op2).value; if (increment >= Short.MIN_VALUE && increment <= Short.MAX_VALUE) { asm.visitIincInsn(i, increment); skipOrg = true; } } } } if (!skipOrg) { accept(v2, asm); if (i >= 0) { asm.visitVarInsn(getOpcode(v1, ISTORE), i); } else if (!v1.valueType.equals("V")) { // skip void type locals switch (v1.valueType.charAt(0)) { case 'J': case 'D': asm.visitInsn(POP2); break; default: asm.visitInsn(POP); break; } } } break; case STATIC_FIELD: { StaticFieldExpr fe = (StaticFieldExpr) v1; accept(v2, asm); insertI2x(v2.valueType, fe.type, asm); asm.visitFieldInsn(PUTSTATIC, toInternal(fe.owner), fe.name, fe.type); break; } case FIELD: { FieldExpr fe = (FieldExpr) v1; accept(fe.op, asm); accept(v2, asm); insertI2x(v2.valueType, fe.type, asm); asm.visitFieldInsn(PUTFIELD, toInternal(fe.owner), fe.name, fe.type); break; } case ARRAY: ArrayExpr ae = (ArrayExpr) v1; accept(ae.op1, asm); accept(ae.op2, asm); accept(v2, asm); String tp1 = ae.op1.valueType; String tp2 = ae.valueType; if (tp1.charAt(0) == '[') { String arrayElementType = tp1.substring(1); insertI2x(v2.valueType, arrayElementType, asm); asm.visitInsn(getOpcode(arrayElementType, IASTORE)); } else { asm.visitInsn(getOpcode(tp2, IASTORE)); } break; } } break; case IDENTITY: { E2Stmt e2 = (E2Stmt) st; if (e2.op2.vt == VT.EXCEPTION_REF) { int index = ((Local) e2.op1)._ls_index; if (index >= 0) { asm.visitVarInsn(ASTORE, index); } else { asm.visitInsn(POP); } } } break; case FILL_ARRAY_DATA: { E2Stmt e2 = (E2Stmt) st; Object arrayData = ((Constant) e2.getOp2()).value; int arraySize = Array.getLength(arrayData); String arrayValueType = e2.getOp1().valueType; String elementType; if (arrayValueType.charAt(0) == '[') { elementType = arrayValueType.substring(1); } else { elementType = "I"; } int iastoreOP = getOpcode(elementType, IASTORE); accept(e2.getOp1(), asm); for (int i = 0; i < arraySize; i++) { asm.visitInsn(DUP); asm.visitLdcInsn(i); asm.visitLdcInsn(Array.get(arrayData, i)); asm.visitInsn(iastoreOP); } asm.visitInsn(POP); } break; case GOTO: asm.visitJumpInsn(GOTO, (Label) ((GotoStmt) st).target.tag); break; case IF: reBuildJumpInstructions((IfStmt) st, asm); break; case LOCK: { Value v = ((UnopStmt) st).op; accept(v, asm); if (optimizeSynchronized) { switch (v.vt) { case LOCAL: // FIXME do we have to disable local due to OptSyncTest ? // break; case CONSTANT: { String key; if (v.vt == VT.LOCAL) { key = "L" + ((Local) v)._ls_index; } else { key = "C" + ((Constant) v).value; } Integer integer = lockMap.get(key); int nIndex = integer != null ? integer : ++maxLocalIndex; asm.visitInsn(DUP); asm.visitVarInsn(getOpcode(v, ISTORE), nIndex); lockMap.put(key, nIndex); } break; default: throw new RuntimeException(); } } asm.visitInsn(MONITORENTER); } break; case UNLOCK: { Value v = ((UnopStmt) st).op; if (optimizeSynchronized) { switch (v.vt) { case LOCAL: case CONSTANT: { String key; if (v.vt == VT.LOCAL) { key = "L" + ((Local) v)._ls_index; } else { key = "C" + ((Constant) v).value; } Integer integer = lockMap.get(key); if (integer != null) { asm.visitVarInsn(getOpcode(v, ILOAD), integer); } else { accept(v, asm); } } break; // TODO other default: { accept(v, asm); break; } } } else { accept(v, asm); } asm.visitInsn(MONITOREXIT); } break; case NOP: break; case RETURN: { Value v = ((UnopStmt) st).op; accept(v, asm); insertI2x(v.valueType, ir.ret, asm); asm.visitInsn(getOpcode(v, IRETURN)); } break; case RETURN_VOID: asm.visitInsn(RETURN); break; case LOOKUP_SWITCH: { LookupSwitchStmt lss = (LookupSwitchStmt) st; accept(lss.op, asm); Label targets[] = new Label[lss.targets.length]; for (int i = 0; i < targets.length; i++) { targets[i] = (Label) lss.targets[i].tag; } asm.visitLookupSwitchInsn((Label) lss.defaultTarget.tag, lss.lookupValues, targets); } break; case TABLE_SWITCH: { TableSwitchStmt tss = (TableSwitchStmt) st; accept(tss.op, asm); Label targets[] = new Label[tss.targets.length]; for (int i = 0; i < targets.length; i++) { targets[i] = (Label) tss.targets[i].tag; } asm.visitTableSwitchInsn(tss.lowIndex, tss.lowIndex + targets.length - 1, (Label) tss.defaultTarget.tag, targets); } break; case THROW: accept(((UnopStmt) st).op, asm); asm.visitInsn(ATHROW); break; case VOID_INVOKE: InvokeExpr invokeExpr = (InvokeExpr) st.getOp(); accept(invokeExpr, asm); String ret = invokeExpr.ret; if (invokeExpr.vt == VT.INVOKE_NEW) { asm.visitInsn(POP); } else if (!"V".equals(ret)) { switch (ret.charAt(0)) { case 'J': case 'D': asm.visitInsn(POP2); break; default: asm.visitInsn(POP); break; } } break; default: throw new RuntimeException("not support st: " + st.st); } } }
From source file:com.googlecode.ddom.weaver.asm.MethodVisitorTee.java
License:Apache License
public void visitLabel(Label label) { for (MethodVisitor visitor : visitors) { visitor.visitLabel(label); } }