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; }
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); }