Search in sources :

Example 1 with SymbolArgument

use of stanhebben.zenscript.symbols.SymbolArgument in project ZenScript by CraftTweaker.

the class ExpressionFunction method compile.

@Override
public void compile(boolean result, IEnvironmentMethod environment) {
    if (!result)
        return;
    ClassWriter cw = new ZenClassWriter(ClassWriter.COMPUTE_FRAMES);
    cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", new String[0]);
    MethodOutput constructor = new MethodOutput(cw, Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
    constructor.start();
    constructor.loadObject(0);
    constructor.invokeSpecial("java/lang/Object", "<init>", "()V");
    constructor.ret();
    constructor.end();
    MethodOutput output = new MethodOutput(cw, Opcodes.ACC_PUBLIC, "accept", makeDescriptor(), null, null);
    IEnvironmentClass environmentClass = new EnvironmentClass(cw, environment);
    IEnvironmentMethod environmentMethod = new EnvironmentMethod(output, environmentClass);
    for (int i = 0; i < arguments.size(); i++) {
        environmentMethod.putValue(arguments.get(i).getName(), new SymbolArgument(i + 1, arguments.get(i).getType()), getPosition());
    }
    output.start();
    for (Statement statement : statements) {
        statement.compile(environmentMethod);
    }
    output.ret();
    output.end();
    environment.putClass(className, cw.toByteArray());
    // make class instance
    environment.getOutput().newObject(className);
    environment.getOutput().dup();
    environment.getOutput().construct(className);
}
Also used : SymbolArgument(stanhebben.zenscript.symbols.SymbolArgument) Statement(stanhebben.zenscript.statements.Statement)

Example 2 with SymbolArgument

use of stanhebben.zenscript.symbols.SymbolArgument in project ZenScript by CraftTweaker.

the class ExpressionJavaLambdaSimpleGeneric method compile.

@Override
public void compile(boolean result, IEnvironmentMethod environment) {
    if (!result)
        return;
    Method method = interfaceClass.getMethods()[0];
    // generate class
    String clsName = environment.makeClassName();
    ClassWriter cw = new ZenClassWriter(ClassWriter.COMPUTE_FRAMES);
    cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC, clsName, createMethodSignature(), "java/lang/Object", new String[] { internal(interfaceClass) });
    MethodOutput constructor = new MethodOutput(cw, Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
    constructor.start();
    constructor.loadObject(0);
    constructor.invokeSpecial("java/lang/Object", "<init>", "()V");
    constructor.ret();
    constructor.end();
    MethodOutput output = new MethodOutput(cw, Opcodes.ACC_PUBLIC, method.getName(), descriptor, null, null);
    IEnvironmentClass environmentClass = new EnvironmentClass(cw, environment);
    IEnvironmentMethod environmentMethod = new EnvironmentMethod(output, environmentClass);
    for (int i = 0; i < arguments.size(); i++) {
        ZenType typeToPut = arguments.get(i).getType();
        if (typeToPut.equals(ZenType.ANY))
            typeToPut = environment.getType(method.getGenericParameterTypes()[i]);
        if (typeToPut == null)
            typeToPut = environment.getType(method.getParameterTypes()[i]);
        environmentMethod.putValue(arguments.get(i).getName(), new SymbolArgument(i + 1, typeToPut), getPosition());
    }
    output.start();
    for (Statement statement : statements) {
        statement.compile(environmentMethod);
    }
    output.ret();
    output.end();
    if (!Objects.equals(genericClass, Object.class)) {
        MethodOutput bridge = new MethodOutput(cw, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_BRIDGE, method.getName(), ZenTypeUtil.descriptor(method), null, null);
        bridge.loadObject(0);
        bridge.loadObject(1);
        bridge.checkCast(internal(genericClass));
        if (arguments.size() > 1) {
            for (int i = 1; i < arguments.size(); ) {
                bridge.load(org.objectweb.asm.Type.getType(method.getParameterTypes()[i]), ++i);
            }
        }
        bridge.invokeVirtual(clsName, method.getName(), descriptor);
        bridge.returnType(org.objectweb.asm.Type.getReturnType(method));
        bridge.end();
    }
    environment.putClass(clsName, cw.toByteArray());
    // make class instance
    environment.getOutput().newObject(clsName);
    environment.getOutput().dup();
    environment.getOutput().construct(clsName);
}
Also used : SymbolArgument(stanhebben.zenscript.symbols.SymbolArgument) Statement(stanhebben.zenscript.statements.Statement) MethodOutput(stanhebben.zenscript.util.MethodOutput) Method(java.lang.reflect.Method) ClassWriter(org.objectweb.asm.ClassWriter) ZenType(stanhebben.zenscript.type.ZenType)

Example 3 with SymbolArgument

use of stanhebben.zenscript.symbols.SymbolArgument in project ZenScript by CraftTweaker.

the class ExpressionJavaLambda method compile.

@Override
public void compile(boolean result, IEnvironmentMethod environment) {
    if (!result)
        return;
    Method method = interfaceClass.getMethods()[0];
    // generate class
    String clsName = environment.makeClassName();
    ClassWriter cw = new ZenClassWriter(ClassWriter.COMPUTE_FRAMES);
    cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC, clsName, null, "java/lang/Object", new String[] { internal(interfaceClass) });
    MethodOutput constructor = new MethodOutput(cw, Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
    constructor.start();
    constructor.loadObject(0);
    constructor.invokeSpecial("java/lang/Object", "<init>", "()V");
    constructor.ret();
    constructor.end();
    MethodOutput output = new MethodOutput(cw, Opcodes.ACC_PUBLIC, method.getName(), descriptor(method), null, null);
    IEnvironmentClass environmentClass = new EnvironmentClass(cw, environment);
    IEnvironmentMethod environmentMethod = new EnvironmentMethod(output, environmentClass);
    for (int i = 0; i < arguments.size(); i++) {
        environmentMethod.putValue(arguments.get(i).getName(), new SymbolArgument(i + 1, environment.getType(method.getGenericParameterTypes()[i])), getPosition());
    }
    output.start();
    for (Statement statement : statements) {
        statement.compile(environmentMethod);
    }
    output.ret();
    output.end();
    environment.putClass(clsName, cw.toByteArray());
    // make class instance
    environment.getOutput().newObject(clsName);
    environment.getOutput().dup();
    environment.getOutput().construct(clsName);
}
Also used : SymbolArgument(stanhebben.zenscript.symbols.SymbolArgument) Statement(stanhebben.zenscript.statements.Statement) Method(java.lang.reflect.Method)

Aggregations

Statement (stanhebben.zenscript.statements.Statement)3 SymbolArgument (stanhebben.zenscript.symbols.SymbolArgument)3 Method (java.lang.reflect.Method)2 ClassWriter (org.objectweb.asm.ClassWriter)1 ZenType (stanhebben.zenscript.type.ZenType)1 MethodOutput (stanhebben.zenscript.util.MethodOutput)1