List of usage examples for org.objectweb.asm MethodVisitor visitLabel
public void visitLabel(final Label label)
From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java
License:Open Source License
private void makeSetMethod(ClassWriter classWriter, Struct struct) { String owner = struct.getPackageAndClass().toJVMType(); MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "set", "(Ljava/lang/String;Ljava/lang/Object;)L" + owner + ";", null, null); visitor.visitCode();/*from w w w . jav a2s. c o m*/ insertPrivateElementCheck(struct, visitor); Label nextCase = new Label(); for (Member member : struct.getMembers()) { visitor.visitLdcInsn(member.getName()); visitor.visitVarInsn(ALOAD, 1); visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); visitor.visitJumpInsn(IFEQ, nextCase); visitor.visitVarInsn(ALOAD, 0); visitor.visitVarInsn(ALOAD, 2); visitor.visitMethodInsn(INVOKEVIRTUAL, owner, member.getName(), "(Ljava/lang/Object;)L" + owner + ";", false); visitor.visitInsn(ARETURN); visitor.visitLabel(nextCase); nextCase = new Label(); } insertUnknowElementCode(struct, visitor); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java
License:Open Source License
private void makeGetMethod(ClassWriter classWriter, Struct struct) { String owner = struct.getPackageAndClass().toJVMType(); MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "get", "(Ljava/lang/String;)Ljava/lang/Object;", null, null);/*from w w w. ja v a 2s . c o m*/ visitor.visitCode(); insertPrivateElementCheck(struct, visitor); Label nextCase = new Label(); for (Member member : struct.getMembers()) { visitor.visitLdcInsn(member.getName()); visitor.visitVarInsn(ALOAD, 1); visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); visitor.visitJumpInsn(IFEQ, nextCase); visitor.visitVarInsn(ALOAD, 0); visitor.visitMethodInsn(INVOKEVIRTUAL, owner, member.getName(), "()Ljava/lang/Object;", false); visitor.visitInsn(ARETURN); visitor.visitLabel(nextCase); nextCase = new Label(); } insertUnknowElementCode(struct, visitor); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java
License:Open Source License
private void insertPrivateElementCheck(Struct struct, MethodVisitor visitor) { Label afterPrivateCheck = new Label(); visitor.visitVarInsn(ALOAD, 1);/* w w w .j a v a 2s .c o m*/ visitor.visitLdcInsn("_"); visitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "startsWith", "(Ljava/lang/String;)Z", false); visitor.visitJumpInsn(IFEQ, afterPrivateCheck); throwLocalized(visitor, "java/lang/IllegalArgumentException", "struct_private_member", struct.getPackageAndClass().toString()); visitor.visitLabel(afterPrivateCheck); }
From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java
License:Open Source License
private void makeEquals(ClassWriter classWriter, Struct struct) { String owner = struct.getPackageAndClass().toJVMType(); MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null); Label notFrozenLabel = new Label(); Label falseLabel = new Label(); Label sameTypeLabel = new Label(); visitor.visitCode();/*w w w . jav a2 s. c om*/ visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, owner, $_frozen, "Z"); visitor.visitJumpInsn(IFNE, notFrozenLabel); // super.equals() visitor.visitVarInsn(ALOAD, 0); visitor.visitVarInsn(ALOAD, 1); visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false); visitor.visitInsn(IRETURN); // The receiver is frozen visitor.visitLabel(notFrozenLabel); visitor.visitVarInsn(ALOAD, 1); visitor.visitTypeInsn(INSTANCEOF, owner); visitor.visitJumpInsn(IFNE, sameTypeLabel); visitor.visitJumpInsn(GOTO, falseLabel); // The argument is of the same type, too visitor.visitLabel(sameTypeLabel); visitor.visitVarInsn(ALOAD, 1); visitor.visitTypeInsn(CHECKCAST, owner); visitor.visitFieldInsn(GETFIELD, owner, $_frozen, "Z"); visitor.visitJumpInsn(IFEQ, falseLabel); // The argument is not frozen for (Member member : struct.getMembers()) { visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, owner, member.getName(), "Ljava/lang/Object;"); visitor.visitVarInsn(ALOAD, 1); visitor.visitTypeInsn(CHECKCAST, owner); visitor.visitFieldInsn(GETFIELD, owner, member.getName(), "Ljava/lang/Object;"); visitor.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "equals", "(Ljava/lang/Object;Ljava/lang/Object;)Z", false); visitor.visitJumpInsn(IFEQ, falseLabel); } visitor.visitInsn(ICONST_1); visitor.visitInsn(IRETURN); // False visitor.visitLabel(falseLabel); visitor.visitInsn(ICONST_0); visitor.visitInsn(IRETURN); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java
License:Open Source License
private void makeHashCode(ClassWriter classWriter, Struct struct) { String owner = struct.getPackageAndClass().toJVMType(); MethodVisitor visitor = classWriter.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null); Label notFrozenLabel = new Label(); visitor.visitCode();//from w w w . java 2 s .c o m visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, owner, $_frozen, "Z"); visitor.visitJumpInsn(IFNE, notFrozenLabel); // super.hashCode() visitor.visitVarInsn(ALOAD, 0); visitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "hashCode", "()I", false); visitor.visitInsn(IRETURN); // The receiver is frozen visitor.visitLabel(notFrozenLabel); loadInteger(visitor, struct.getMembers().size()); visitor.visitTypeInsn(ANEWARRAY, "java/lang/Object"); int i = 0; for (Member member : struct.getMembers()) { visitor.visitInsn(DUP); loadInteger(visitor, i); visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, owner, member.getName(), "Ljava/lang/Object;"); visitor.visitInsn(AASTORE); i++; } visitor.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "hash", "([Ljava/lang/Object;)I", false); visitor.visitInsn(IRETURN); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:org.eclipse.golo.compiler.JavaBytecodeStructGenerator.java
License:Open Source License
private void makeSetter(ClassWriter classWriter, String owner, String name, Struct struct) { int accessFlag = name.startsWith("_") ? ACC_PRIVATE : ACC_PUBLIC; MethodVisitor visitor = classWriter.visitMethod(accessFlag, name, "(Ljava/lang/Object;)L" + struct.getPackageAndClass().toJVMType() + ";", null, null); visitor.visitCode();/*from w ww .j a va 2s . co m*/ visitor.visitVarInsn(ALOAD, 0); visitor.visitFieldInsn(GETFIELD, owner, $_frozen, "Z"); Label setLabel = new Label(); visitor.visitJumpInsn(IFEQ, setLabel); throwLocalized(visitor, "java/lang/IllegalStateException", "frozen_struct", struct.getPackageAndClass().toString()); visitor.visitLabel(setLabel); visitor.visitVarInsn(ALOAD, 0); visitor.visitVarInsn(ALOAD, 1); visitor.visitFieldInsn(PUTFIELD, owner, name, "Ljava/lang/Object;"); visitor.visitVarInsn(ALOAD, 0); visitor.visitInsn(ARETURN); visitor.visitMaxs(0, 0); visitor.visitEnd(); }
From source file:org.eclipse.golo.compiler.JavaBytecodeUnionGenerator.java
License:Open Source License
private void makeMatchlikeTestMethod(ClassWriter classWriter, UnionValue value, boolean result) { String methName = "is" + value.getName(); MethodVisitor mv = classWriter.visitMethod(ACC_PUBLIC, methName, "()Z", null, null); mv.visitCode();/* w w w. j a va 2s .c om*/ mv.visitInsn(result ? ICONST_1 : ICONST_0); mv.visitInsn(IRETURN); mv.visitMaxs(0, 0); mv.visitEnd(); if (value.hasMembers()) { mv = classWriter.visitMethod(ACC_PUBLIC, methName, argsSignature(value.getMembers().size()) + "Z", null, null); for (Member member : value.getMembers()) { mv.visitParameter(member.getName(), ACC_FINAL); } mv.visitCode(); if (!result) { mv.visitInsn(ICONST_0); } else { int i = 1; Label allEquals = new Label(); Label notEqual = new Label(); String target = value.getPackageAndClass().toJVMType(); for (Member member : value.getMembers()) { mv.visitVarInsn(ALOAD, i); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, target, member.getName(), "Ljava/lang/Object;"); mv.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "equals", "(Ljava/lang/Object;Ljava/lang/Object;)Z", false); mv.visitJumpInsn(IFEQ, notEqual); i++; } mv.visitInsn(ICONST_1); mv.visitJumpInsn(GOTO, allEquals); mv.visitLabel(notEqual); mv.visitInsn(ICONST_0); mv.visitLabel(allEquals); } mv.visitInsn(IRETURN); mv.visitMaxs(0, 0); mv.visitEnd(); } }
From source file:org.eclipse.golo.compiler.JavaBytecodeUnionGenerator.java
License:Open Source License
private void makeEquals(ClassWriter cw, UnionValue value) { String target = value.getPackageAndClass().toJVMType(); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null); Label notSameInstance = new Label(); Label notNull = new Label(); Label sameType = new Label(); Label allAttrsEquals = new Label(); Label attrNotEqual = new Label(); mv.visitCode();/*from www. ja v a 2s .c o m*/ // if (other == this) { return true; } mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 0); mv.visitJumpInsn(IF_ACMPNE, notSameInstance); mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); mv.visitLabel(notSameInstance); // if (other == null) { return false; } mv.visitVarInsn(ALOAD, 1); mv.visitJumpInsn(IFNONNULL, notNull); mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(notNull); // if (!(other instanceof <value>)) { return false; } mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(INSTANCEOF, target); mv.visitJumpInsn(IFNE, sameType); mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(sameType); // cast other to <value> mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, target); mv.visitVarInsn(ASTORE, 2); // java.util.Objects.equals(<member>, other.<member>) for (Member member : value.getMembers()) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, target, member.getName(), "Ljava/lang/Object;"); mv.visitVarInsn(ALOAD, 2); mv.visitFieldInsn(GETFIELD, target, member.getName(), "Ljava/lang/Object;"); mv.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "equals", "(Ljava/lang/Object;Ljava/lang/Object;)Z", false); mv.visitJumpInsn(IFEQ, attrNotEqual); } mv.visitInsn(ICONST_1); mv.visitJumpInsn(GOTO, allAttrsEquals); mv.visitLabel(attrNotEqual); mv.visitInsn(ICONST_0); mv.visitLabel(allAttrsEquals); mv.visitInsn(IRETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:org.eclipse.golo.compiler.JavaBytecodeUtils.java
License:Open Source License
static Label visitLine(GoloElement<?> element, MethodVisitor visitor) { Label label = new Label(); visitor.visitLabel(label); if (element.hasPosition()) { visitor.visitLineNumber(element.positionInSourceCode().getStartLine(), label); }/*from w ww . j a v a2s . c o m*/ return label; }
From source file:org.eclipse.m2m.atl.emftvm.jit.CodeBlockJIT.java
License:Open Source License
/** * Generates a constructor for the {@link JITCodeBlock}. * @param init the constructor visitor/*from w w w .ja v a 2s . c o m*/ * @param className the name of the generated class */ protected static void generateConstructor(final MethodVisitor init, final String className) { init.visitCode(); // Generate labels final Label start = new Label(); final Label end = new Label(); // Generate bytecode init.visitLabel(start); init.visitVarInsn(ALOAD, 0); // this init.visitVarInsn(ALOAD, 1); // cb init.visitMethodInsn(INVOKESPECIAL, // super(cb) Type.getInternalName(JITCodeBlock.class), "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.getType(CodeBlock.class) })); init.visitInsn(RETURN); init.visitLabel(end); // Create local variable table init.visitLocalVariable("this", "L" + className + ";", null, start, end, 0); init.visitLocalVariable("cb", Type.getDescriptor(CodeBlock.class), null, start, end, 1); // Finalise init.visitMaxs(2, 2); init.visitEnd(); }