Пример #1
1
  private String execute(final String name, final String code, final String input)
      throws Throwable {
    bc.compile(new StringReader(code), name, name, cw);

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    InputStream is = System.in;
    PrintStream os = System.out;
    System.setIn(new ByteArrayInputStream(input.getBytes()));
    System.setOut(new PrintStream(bos));

    try {
      TestClassLoader cl = new TestClassLoader(getClass().getClassLoader(), name, cw.toByteArray());
      Class<?> c = cl.loadClass(name);
      Method m = c.getDeclaredMethod("main", new Class<?>[] {String[].class});
      m.invoke(null, new Object[] {new String[0]});

    } catch (InvocationTargetException ex) {
      throw ex.getCause();
    } finally {
      System.setIn(is);
      System.setOut(os);
    }

    String output = new String(bos.toByteArray(), "ASCII");

    System.out.println(code + " WITH INPUT '" + input + "' GIVES " + output);

    return output;
  }
 private void END(final int maxStack, final int maxLocals) {
   this.current.visitMaxs(maxStack, maxLocals);
   this.current.visitEnd();
   ClassWriter cw = new ClassWriter(0);
   cw.visit(Opcodes.V1_1, Opcodes.ACC_PUBLIC, "C", null, "java/lang/Object", null);
   MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
   mv.visitCode();
   mv.visitVarInsn(Opcodes.ALOAD, 0);
   mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
   mv.visitInsn(Opcodes.RETURN);
   mv.visitMaxs(1, 1);
   mv.visitEnd();
   ((MethodNode) this.current).accept(cw);
   cw.visitEnd();
   byte[] b = cw.toByteArray();
   try {
     TestClassLoader loader = new TestClassLoader();
     Class<?> c = loader.defineClass("C", b);
     c.newInstance();
   } catch (Throwable t) {
     fail(t.getMessage());
   }
   this.current = null;
 }
Пример #3
0
  public void test() throws Exception {
    ClassWriter cw = new ClassWriter(true);
    ClassVisitor cv = new StaticInitMerger("$clinit$", cw);
    cv.visit(V1_1, ACC_PUBLIC, "A", null, "java/lang/Object", null);
    cv.visitField(ACC_PUBLIC + ACC_STATIC, "counter", "I", null, null);
    for (int i = 0; i < 5; ++i) {
      MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "<clinit>", "()V", null, null);
      mv.visitFieldInsn(GETSTATIC, "A", "counter", "I");
      mv.visitInsn(ICONST_1);
      mv.visitInsn(IADD);
      mv.visitFieldInsn(PUTSTATIC, "A", "counter", "I");
      mv.visitInsn(RETURN);
      mv.visitMaxs(0, 0);
    }
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 0);
    cv.visitEnd();

    Class c = LOADER.defineClass("A", cw.toByteArray());
    assertEquals(c.getField("counter").getInt(c.newInstance()), 5);
  }