private static void createShortObj(MethodVisitor mv, int argsPostion) { mv.visitTypeInsn(Opcodes.NEW, "java/lang/Short"); mv.visitInsn(Opcodes.DUP); mv.visitVarInsn(Opcodes.ILOAD, argsPostion); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Short", "<init>", "(S)V"); mv.visitInsn(Opcodes.AASTORE); }
private void visitMethodStub(MethodVisitor mv) { mv.visitTypeInsn(Opcodes.NEW, "java/lang/RuntimeException"); mv.visitInsn(Opcodes.DUP); mv.visitLdcInsn("Stub!"); String owner = "java/lang/RuntimeException"; String name = "<init>"; String desc = "(Ljava/lang/String;)V"; mv.visitMethodInsn(Opcodes.INVOKESPECIAL, owner, name, desc, false); mv.visitInsn(Opcodes.ATHROW); }
mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Boolean");//强制转化类型 mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z"); return true; mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Byte");//强制转化类型 mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B"); return true; mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Character");//强制转化类型 mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Character", "intValue", "()C"); return true; mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Short");//强制转化类型 mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S"); return true; mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Integer");//强制转化类型 mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I"); return true; mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Float");//强制转化类型 mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F"); return true; mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Double");//强制转化类型 mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D"); return true; mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Long");//强制转化类型
private void loadAndStoreArgument(MethodVisitor mv, int loadIdx, int storeIdx, String castName) { mv.visitVarInsn(ALOAD, 1); //loads the 1st argument addConst(mv, loadIdx); mv.visitMethodInsn(INVOKEINTERFACE, "org/apache/pig/data/Tuple", "get", "(I)Ljava/lang/Object;"); mv.visitTypeInsn(CHECKCAST, castName); mv.visitVarInsn(ASTORE, storeIdx); }
mv.visitIntInsn(Opcodes.BIPUSH, argsCount); } else { mv.visitInsn(Opcodes.ICONST_0 + argsCount); mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object"); mv.visitInsn(Opcodes.DUP); if (i <= 5) { mv.visitInsn(Opcodes.ICONST_0 + i); } else { mv.visitIntInsn(Opcodes.BIPUSH, i); mv.visitVarInsn(Opcodes.ALOAD, loadIndex); mv.visitInsn(Opcodes.AASTORE);
return; mv.visitTypeInsn(CHECKCAST, TypeDesc.getInternalName(valType)); break; case VMType.TINT: else assert valType == D_BOOLEAN; mv.visitInsn(insn); break; default:
private static void getReference(MethodVisitor methodVisitor, Class<?> parameterType, int localIndexOfArrayReferenceBaseIndex, int arrayReferenceBaseIndexDelta, Class<? extends ProxyChannelRingBuffer> backendType) { methodVisitor.visitVarInsn(Opcodes.ALOAD, LOCALS_INDEX_THIS); loadLocalIndexAndApplyDelta(methodVisitor, localIndexOfArrayReferenceBaseIndex, arrayReferenceBaseIndexDelta); readReference(methodVisitor, backendType); if (parameterType != Object.class) { methodVisitor.visitTypeInsn(Opcodes.CHECKCAST, Type.getInternalName(parameterType)); } }
private static void createCharObj(MethodVisitor mv, int argsPostion) { mv.visitTypeInsn(Opcodes.NEW, "java/lang/Character"); mv.visitInsn(Opcodes.DUP); mv.visitVarInsn(Opcodes.ILOAD, argsPostion); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Character", "<init>", "(C)V"); mv.visitInsn(Opcodes.AASTORE); }
@Override public void handleMethodTranslateException(Method method, DexMethodNode methodNode, MethodVisitor mv, Exception e) { // replace the generated code with // 'return new RuntimeException("D2jFail translate: xxxxxxxxxxxxx");' StringWriter s = new StringWriter(); s.append("d2j fail translate: "); e.printStackTrace(new PrintWriter(s)); String msg = s.toString(); mv.visitTypeInsn(Opcodes.NEW, "java/lang/RuntimeException"); mv.visitInsn(Opcodes.DUP); mv.visitLdcInsn(msg); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V"); mv.visitInsn(Opcodes.ATHROW); } }
public void add(MethodVisitor visitor) throws Exception { // GENERATE ((MixInExtensibleDynamicObject)getAsDynamicObject()).getConvention() visitor.visitVarInsn(Opcodes.ALOAD, 0); visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, generatedType.getInternalName(), "getAsDynamicObject", Type.getMethodDescriptor(getAsDynamicObject), false); visitor.visitTypeInsn(Opcodes.CHECKCAST, EXTENSIBLE_DYNAMIC_OBJECT_HELPER_TYPE.getInternalName()); visitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, EXTENSIBLE_DYNAMIC_OBJECT_HELPER_TYPE.getInternalName(), "getConvention", RETURN_CONVENTION, false); } });
switch (value.vt) { case LOCAL: asm.visitVarInsn(getOpcode(value, ILOAD), ((Local) value)._ls_index); break; case CONSTANT: Constant cst = (Constant) value; if (cst.value.equals(Constant.Null)) { asm.visitInsn(ACONST_NULL); } else if (cst.value instanceof DexType) { asm.visitLdcInsn(Type.getType(((DexType) cst.value).desc)); asm.visitTypeInsn(NEW, toInternal(((NewExpr) value).type)); break; case STATIC_FIELD:
mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false); } else if (type.getSort() == Type.INT) { mv.visitTypeInsn(CHECKCAST, "java/lang/Integer"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false); } else if (type.getSort() == Type.BYTE) { mv.visitTypeInsn(CHECKCAST, "java/lang/Byte"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Byte", "byteValue", "()B", false); } else if (type.getSort() == Type.SHORT) { mv.visitTypeInsn(CHECKCAST, "java/lang/Short"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Short", "shortValue", "()S", false); } else if (type.getSort() == Type.LONG) { mv.visitTypeInsn(CHECKCAST, "java/lang/Long"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false); } else if (type.getSort() == Type.FLOAT) { mv.visitTypeInsn(CHECKCAST, "java/lang/Float"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F", false); } else if (type.getSort() == Type.DOUBLE) { mv.visitTypeInsn(CHECKCAST, "java/lang/Double"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false); } else if (type.getSort() == Type.CHAR) { mv.visitTypeInsn(CHECKCAST, "java/lang/Character"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Character", "charValue", "()C", false); } else { mv.visitTypeInsn(CHECKCAST, type.getInternalName());
case '[': case 'L': asm.visitTypeInsn(ANEWARRAY, toInternal(te.type)); break; case 'Z': case INSTANCE_OF: { TypeExpr te = (TypeExpr) e1; asm.visitTypeInsn(e1.vt == VT.CHECK_CAST ? CHECKCAST : INSTANCEOF, toInternal(te.type)); asm.visitInsn(ARRAYLENGTH); break; case NEG: asm.visitInsn(getOpcode(e1, INEG)); break;
private static void createIntegerObj(MethodVisitor mv, int argsPostion) { mv.visitTypeInsn(Opcodes.NEW, "java/lang/Integer"); mv.visitInsn(Opcodes.DUP); mv.visitVarInsn(Opcodes.ILOAD, argsPostion); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Integer", "<init>", "(I)V"); mv.visitInsn(Opcodes.AASTORE); }
case Type.OBJECT: case Type.ARRAY: mv.visitTypeInsn(CHECKCAST, orgRet.getInternalName()); break; case Type.INT: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "intValue", "()I"); break; case Type.FLOAT: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "floatValue", "()F"); break; case Type.LONG: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Number", "longValue", "()J"); break; case Type.DOUBLE: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); case Type.BYTE: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); case Type.SHORT: mv.visitTypeInsn(CHECKCAST, "java/lang/Number"); case Type.CHAR: mv.visitTypeInsn(CHECKCAST, "java/lang/Character"); case Type.BOOLEAN:
private void emitIntFromAccu(){ mv.visitVarInsn(ALOAD, ACCU); // ((Integer) accu).intValue() mv.visitTypeInsn(CHECKCAST, getInternalName(Integer.class)); mv.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Integer.class), "intValue", getMethodDescriptor(INT_TYPE), false); }
@Override public void emitInstanceInit(MethodVisitor mv) { mv.visitVarInsn(Opcodes.ALOAD, 0); // this mv.visitInsn(Opcodes.ICONST_1); mv.visitTypeInsn(Opcodes.ANEWARRAY, wrapperType.getWrapperType().getInternalName()); mv.visitFieldInsn(Opcodes.PUTFIELD, className, fieldName, fieldDescriptor); }
if (type.isPrimitive()) { if (type.equals(long.class)) { method.visitTypeInsn(CHECKCAST, getInternalName(Long.class)); method.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Long.class), "longValue", "()J", false); return 1; } else if (type.equals(int.class)) { method.visitTypeInsn(CHECKCAST, getInternalName(Integer.class)); method.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Integer.class), "intValue", "()I", false); return 0; } else if (type.equals(double.class)) { method.visitTypeInsn(CHECKCAST, getInternalName(Double.class)); method.visitMethodInsn(INVOKEVIRTUAL, getInternalName(Double.class), "doubleValue", "()D", false); return 1; method.visitTypeInsn(CHECKCAST, getInternalName(type)); return 0;
private static void createLongObj(MethodVisitor mv, int argsPostion) { mv.visitTypeInsn(Opcodes.NEW, "java/lang/Long"); mv.visitInsn(Opcodes.DUP); mv.visitVarInsn(Opcodes.LLOAD, argsPostion); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Long", "<init>", "(J)V"); mv.visitInsn(Opcodes.AASTORE); }
case 'J': case 'D': asm.visitInsn(POP2); break; default: asm.visitInsn(POP); break; asm.visitTypeInsn(CHECKCAST, toInternal(expectedType)); return; asm.visitTypeInsn(CHECKCAST, "java/lang/Boolean"); asm.visitTypeInsn(CHECKCAST, "java/lang/Byte"); asm.visitTypeInsn(CHECKCAST, "java/lang/Short"); asm.visitTypeInsn(CHECKCAST, "java/lang/Character"); asm.visitTypeInsn(CHECKCAST, "java/lang/Integer"); asm.visitTypeInsn(CHECKCAST, "java/lang/Float"); asm.visitTypeInsn(CHECKCAST, "java/lang/Long"); asm.visitTypeInsn(CHECKCAST, "java/lang/Double");