Search in sources :

Example 1 with ClassCode

use of com.github.anba.es6draft.compiler.assembler.Code.ClassCode in project es6draft by anba.

the class Compiler method defineAndLoad.

private <T> T defineAndLoad(Code code, String clazzName) {
    boolean printCode = isEnabled(Option.PrintCode);
    boolean printSimple = printCode && !isEnabled(Option.PrintFullCode);
    boolean debugInfo = isEnabled(Option.DebugInfo);
    CodeLoader loader = new CodeLoader();
    for (ClassCode classCode : code.getClasses()) {
        String className = Type.className(classCode.className);
        if (debugInfo) {
            classCode.addField(Modifier.PRIVATE | Modifier.STATIC, "classBytes", Type.of(byte[].class), null);
        }
        byte[] bytes = classCode.toByteArray();
        if (printCode) {
            System.out.println(Code.toByteCode(bytes, printSimple));
        }
        // System.out.printf("define class '%s'%n", className);
        Class<?> c = loader.defineClass(className, bytes);
        if (debugInfo) {
            try {
                Field classBytes = c.getDeclaredField("classBytes");
                classBytes.setAccessible(true);
                classBytes.set(null, bytes);
            } catch (ReflectiveOperationException e) {
                throw new RuntimeException(e);
            }
        }
    }
    try {
        Class<?> c = loader.loadClass(Type.className(clazzName));
        @SuppressWarnings("unchecked") T instance = (T) c.newInstance();
        return instance;
    } catch (ReflectiveOperationException e) {
        throw new RuntimeException(e);
    }
}
Also used : Field(java.lang.reflect.Field) ClassCode(com.github.anba.es6draft.compiler.assembler.Code.ClassCode)

Example 2 with ClassCode

use of com.github.anba.es6draft.compiler.assembler.Code.ClassCode in project es6draft by anba.

the class Compiler method defineAndLoad.

private <T> T defineAndLoad(Program program, Code code, AnonymousCodeLoader loader) {
    assert code.getClasses().size() == 1;
    Source source = program.getSource();
    ClassCode classCode = code.getClasses().get(0);
    boolean printCode = isEnabled(Option.PrintCode);
    boolean printSimple = printCode && !isEnabled(Option.PrintFullCode);
    boolean debugInfo = isEnabled(Option.DebugInfo);
    String className = Type.className(classCode.className);
    if (debugInfo) {
        addClassBytesField(classCode);
    }
    byte[] bytes = classCode.toByteArray();
    if (printCode) {
        System.out.println(Code.toByteCode(bytes, printSimple));
    }
    // System.out.printf("define class '%s'%n", className);
    Class<?> c = loader.defineClass(className, bytes);
    if (debugInfo) {
        initializeClassBytes(c, bytes);
    }
    if (COUNT_CLASSES) {
        STATISTICS.anonymousClasses.increment();
    }
    try {
        @SuppressWarnings("unchecked") T instance = (T) c.getDeclaredConstructor(Source.class).newInstance(source);
        return instance;
    } catch (ReflectiveOperationException e) {
        throw new RuntimeException(e);
    }
}
Also used : ClassCode(com.github.anba.es6draft.compiler.assembler.Code.ClassCode) Source(com.github.anba.es6draft.runtime.internal.Source)

Example 3 with ClassCode

use of com.github.anba.es6draft.compiler.assembler.Code.ClassCode in project es6draft by anba.

the class Compiler method defineAndLoad.

private <T> T defineAndLoad(Program program, Code code, String mainClassName) {
    Source source = program.getSource();
    boolean printCode = isEnabled(Option.PrintCode);
    boolean printSimple = printCode && !isEnabled(Option.PrintFullCode);
    boolean debugInfo = isEnabled(Option.DebugInfo);
    CodeLoader loader = new CodeLoader();
    for (ClassCode classCode : code.getClasses()) {
        String className = Type.className(classCode.className);
        if (debugInfo) {
            addClassBytesField(classCode);
        }
        byte[] bytes = classCode.toByteArray();
        if (printCode) {
            System.out.println(Code.toByteCode(bytes, printSimple));
        }
        // System.out.printf("define class '%s'%n", className);
        Class<?> c = loader.defineClass(className, bytes);
        if (debugInfo) {
            initializeClassBytes(c, bytes);
        }
    }
    if (COUNT_CLASSES) {
        STATISTICS.defaultClasses.increment();
    }
    try {
        Class<?> c = loader.loadClass(Type.className(mainClassName));
        @SuppressWarnings("unchecked") T instance = (T) c.getDeclaredConstructor(Source.class).newInstance(source);
        return instance;
    } catch (InvocationTargetException e) {
        Throwable cause = e.getCause();
        if (cause instanceof StackOverflowError) {
            throw (StackOverflowError) cause;
        }
        throw new RuntimeException(e);
    } catch (ReflectiveOperationException e) {
        throw new RuntimeException(e);
    }
}
Also used : Source(com.github.anba.es6draft.runtime.internal.Source) InvocationTargetException(java.lang.reflect.InvocationTargetException) ClassCode(com.github.anba.es6draft.compiler.assembler.Code.ClassCode)

Aggregations

ClassCode (com.github.anba.es6draft.compiler.assembler.Code.ClassCode)3 Source (com.github.anba.es6draft.runtime.internal.Source)2 Field (java.lang.reflect.Field)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1