1 package org.simantics.scl.compiler.tests;
\r
3 import java.lang.reflect.Method;
\r
5 import org.objectweb.asm.ClassWriter;
\r
6 import org.objectweb.asm.MethodVisitor;
\r
7 import org.objectweb.asm.Opcodes;
\r
9 public class FindAllowedChars {
\r
10 public static class MyClassLoader extends ClassLoader {
\r
11 final String className;
\r
12 final byte[] classBytes;
\r
14 public MyClassLoader(ClassLoader parent, String className, byte[] classBytes) {
\r
16 this.className = className;
\r
17 this.classBytes = classBytes;
\r
20 public MyClassLoader(String className, byte[] classBytes) {
\r
21 this.className = className;
\r
22 this.classBytes = classBytes;
\r
26 protected Class<?> findClass(String name) throws ClassNotFoundException {
\r
27 if(name.equals(name))
\r
28 return defineClass(name, classBytes, 0, classBytes.length);
\r
30 return super.findClass(name);
\r
34 public static void test(String className, String methodName) throws Exception {
\r
35 ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
\r
36 classWriter.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);
\r
38 MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, methodName, "()V", null, null);
\r
39 /*methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
\r
40 methodVisitor.visitLdcInsn("Hello world!");
\r
41 methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);*/
\r
42 methodVisitor.visitInsn(Opcodes.RETURN);
\r
43 methodVisitor.visitMaxs(0, 0);
\r
44 methodVisitor.visitEnd();
\r
45 classWriter.visitEnd();
\r
47 ClassLoader loader = new MyClassLoader(className, classWriter.toByteArray());
\r
48 Class<?> clazz = loader.loadClass(className);
\r
49 Method method = clazz.getMethod(methodName);
\r
50 method.invoke(null);
\r
53 public static void main(String[] args) throws Exception {
\r
54 for(int a=Character.MIN_VALUE;a<Character.MAX_VALUE;++a) {
\r
55 //for(char b=0;b<256;++b) {
\r
56 String name = new String(new char[] {(char)a});
\r
59 } catch(Throwable e) {
\r
60 System.out.println(name + " (" + a + ")");
\r
64 System.out.println((int)Character.MAX_VALUE);
\r