]> gerrit.simantics Code Review - simantics/platform.git/blob - tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/experimentation/RecursiveInitialization.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / tests / org.simantics.scl.compiler.tests / src / org / simantics / scl / compiler / tests / experimentation / RecursiveInitialization.java
1 package org.simantics.scl.compiler.tests.experimentation;
2
3 import java.io.PrintWriter;
4 import java.lang.reflect.Method;
5 import java.util.concurrent.atomic.AtomicReference;
6
7 import org.objectweb.asm.ClassVisitor;
8 import org.objectweb.asm.ClassWriter;
9 import org.objectweb.asm.MethodVisitor;
10 import org.objectweb.asm.Opcodes;
11 import org.objectweb.asm.util.TraceClassVisitor;
12
13 public class RecursiveInitialization {
14
15     public static void main(String[] args) throws Exception {
16         ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
17         ClassVisitor classVisitor = new TraceClassVisitor(classWriter, new PrintWriter(System.out));
18         classVisitor.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "test/Test", null, "java/lang/Object", new String[0]);
19         MethodVisitor methodWriter = classVisitor.visitMethod(
20                 Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC,
21                 "main", "()Ljava/lang/Object;", null, null);
22         
23         methodWriter.visitCode();        
24         methodWriter.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicReference");
25         methodWriter.visitVarInsn(Opcodes.ASTORE, 2);
26
27         methodWriter.visitTypeInsn(Opcodes.NEW, "java/util/concurrent/atomic/AtomicReference");
28         methodWriter.visitVarInsn(Opcodes.ASTORE, 1);
29         
30         methodWriter.visitVarInsn(Opcodes.ALOAD, 2);
31         methodWriter.visitVarInsn(Opcodes.ALOAD, 1);
32         //methodWriter.visitInsn(Opcodes.ACONST_NULL);
33         methodWriter.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicReference", "<init>", "(Ljava/lang/Object;)V", false);
34         
35         methodWriter.visitVarInsn(Opcodes.ALOAD, 1);
36         methodWriter.visitVarInsn(Opcodes.ALOAD, 2);
37         methodWriter.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/concurrent/atomic/AtomicReference", "<init>", "(Ljava/lang/Object;)V", false);
38
39         methodWriter.visitVarInsn(Opcodes.ALOAD, 2);
40         methodWriter.visitInsn(Opcodes.ARETURN);
41         methodWriter.visitMaxs(0, 0);
42         methodWriter.visitEnd();
43         
44         byte[] bytes = classWriter.toByteArray();
45         ClassLoader classLoader = new ClassLoader() {
46             @Override
47             protected Class<?> findClass(String name) throws ClassNotFoundException {
48                 if(!name.equals("test.Test"))
49                     throw new ClassNotFoundException();
50                 return defineClass("test.Test", bytes, 0, bytes.length);
51             }
52         };
53         Class<?> clazz = classLoader.loadClass("test.Test");
54         Method method = clazz.getMethod("main");
55         AtomicReference<Object> result = (AtomicReference<Object>)method.invoke(null);
56         System.out.println(result.hashCode());
57         //System.out.println(result.get().hashCode());
58     }
59     
60 }