]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/experimentation/RecursiveInitialization.java
Automatic execution of SCL tests in Maven
[simantics/platform.git] / tests / org.simantics.scl.compiler.tests / src / org / simantics / scl / compiler / tests / experimentation / RecursiveInitialization.java
diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/experimentation/RecursiveInitialization.java b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/experimentation/RecursiveInitialization.java
new file mode 100644 (file)
index 0000000..5f5d20d
--- /dev/null
@@ -0,0 +1,60 @@
+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