--- /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