--- /dev/null
+package org.simantics.scl.compiler.tests;\r
+\r
+import java.lang.reflect.Method;\r
+\r
+import org.objectweb.asm.ClassWriter;\r
+import org.objectweb.asm.MethodVisitor;\r
+import org.objectweb.asm.Opcodes;\r
+\r
+public class FindAllowedChars {\r
+ public static class MyClassLoader extends ClassLoader {\r
+ final String className;\r
+ final byte[] classBytes;\r
+ \r
+ public MyClassLoader(ClassLoader parent, String className, byte[] classBytes) {\r
+ super(parent);\r
+ this.className = className;\r
+ this.classBytes = classBytes;\r
+ }\r
+ \r
+ public MyClassLoader(String className, byte[] classBytes) {\r
+ this.className = className;\r
+ this.classBytes = classBytes;\r
+ }\r
+\r
+ @Override\r
+ protected Class<?> findClass(String name) throws ClassNotFoundException {\r
+ if(name.equals(name))\r
+ return defineClass(name, classBytes, 0, classBytes.length);\r
+ else\r
+ return super.findClass(name);\r
+ }\r
+ }\r
+ \r
+ public static void test(String className, String methodName) throws Exception {\r
+ ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);\r
+ classWriter.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);\r
+ \r
+ MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, methodName, "()V", null, null);\r
+ /*methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");\r
+ methodVisitor.visitLdcInsn("Hello world!");\r
+ methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);*/\r
+ methodVisitor.visitInsn(Opcodes.RETURN);\r
+ methodVisitor.visitMaxs(0, 0);\r
+ methodVisitor.visitEnd();\r
+ classWriter.visitEnd();\r
+ \r
+ ClassLoader loader = new MyClassLoader(className, classWriter.toByteArray());\r
+ Class<?> clazz = loader.loadClass(className);\r
+ Method method = clazz.getMethod(methodName);\r
+ method.invoke(null);\r
+ }\r
+ \r
+ public static void main(String[] args) throws Exception {\r
+ for(int a=Character.MIN_VALUE;a<Character.MAX_VALUE;++a) {\r
+ //for(char b=0;b<256;++b) {\r
+ String name = new String(new char[] {(char)a});\r
+ try {\r
+ test(name, "test");\r
+ } catch(Throwable e) {\r
+ System.out.println(name + " (" + a + ")");\r
+ }\r
+ //} \r
+ }\r
+ System.out.println((int)Character.MAX_VALUE);\r
+ }\r
+}\r