+++ /dev/null
-package org.simantics.scl.compiler.tests.experimentation;\r
-\r
-import java.io.PrintWriter;\r
-import java.lang.reflect.Method;\r
-import java.util.concurrent.atomic.AtomicReference;\r
-\r
-import org.objectweb.asm.ClassVisitor;\r
-import org.objectweb.asm.ClassWriter;\r
-import org.objectweb.asm.MethodVisitor;\r
-import org.objectweb.asm.Opcodes;\r
-import org.objectweb.asm.util.TraceClassVisitor;\r
-\r
-public class RecursiveInitialization {\r
-\r
- public static void main(String[] args) throws Exception {\r
- ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);\r
- ClassVisitor classVisitor = new TraceClassVisitor(classWriter, new PrintWriter(System.out));\r
- classVisitor.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "test/Test", null, "java/lang/Object", new String[0]);\r
- MethodVisitor methodWriter = classVisitor.visitMethod(\r
- Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC,\r
- "main", "()Ljava/lang/Object;", null, null);\r
- \r
- methodWriter.visitCode(); \r
- methodWriter.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicReference");\r
- methodWriter.visitVarInsn(Opcodes.ASTORE, 2);\r
-\r
- methodWriter.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicReference");\r
- methodWriter.visitVarInsn(Opcodes.ASTORE, 1);\r
- \r
- methodWriter.visitVarInsn(Opcodes.ALOAD, 2);\r
- methodWriter.visitVarInsn(Opcodes.ALOAD, 1);\r
- //methodWriter.visitInsn(Opcodes.ACONST_NULL);\r
- methodWriter.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicReference", "<init>", "(Ljava/lang/Object;)V", false);\r
- \r
- methodWriter.visitVarInsn(Opcodes.ALOAD, 1);\r
- methodWriter.visitVarInsn(Opcodes.ALOAD, 2);\r
- methodWriter.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicReference", "<init>", "(Ljava/lang/Object;)V", false);\r
-\r
- methodWriter.visitVarInsn(Opcodes.ALOAD, 2);\r
- methodWriter.visitInsn(Opcodes.ARETURN);\r
- methodWriter.visitMaxs(0, 0);\r
- methodWriter.visitEnd();\r
- \r
- byte[] bytes = classWriter.toByteArray();\r
- ClassLoader classLoader = new ClassLoader() {\r
- @Override\r
- protected Class<?> findClass(String name) throws ClassNotFoundException {\r
- if(!name.equals("test.Test"))\r
- throw new ClassNotFoundException();\r
- return defineClass("test.Test", bytes, 0, bytes.length);\r
- }\r
- };\r
- Class<?> clazz = classLoader.loadClass("test.Test");\r
- Method method = clazz.getMethod("main");\r
- AtomicReference<Object> result = (AtomicReference<Object>)method.invoke(null);\r
- System.out.println(result.hashCode());\r
- //System.out.println(result.get().hashCode());\r
- }\r
- \r
-}\r