Search in sources :

Example 1 with LambdaGenerator

use of com.googlecode.aviator.code.LambdaGenerator in project aviatorscript by killme2008.

the class ASMCodeGenerator method onLambdaDefineStart.

@Override
public void onLambdaDefineStart(final Token<?> lookhead) {
    if (this.lambdaGenerator == null) {
        Boolean newLexicalScope = lookhead.getMeta(Constants.SCOPE_META, false);
        Boolean inheritEnv = lookhead.getMeta(Constants.INHERIT_ENV_META, false);
        // TODO cache?
        this.lambdaGenerator = new LambdaGenerator(this.instance, this, this.parser, this.classLoader, this.sourceFile, newLexicalScope, inheritEnv);
        this.lambdaGenerator.setScopeInfo(this.parser.enterScope(newLexicalScope));
    } else {
        throw new CompileExpressionErrorException("Compile lambda error");
    }
}
Also used : LambdaGenerator(com.googlecode.aviator.code.LambdaGenerator) CompileExpressionErrorException(com.googlecode.aviator.exception.CompileExpressionErrorException)

Example 2 with LambdaGenerator

use of com.googlecode.aviator.code.LambdaGenerator in project aviatorscript by killme2008.

the class ASMCodeGeneratorUnitTest method testOnLambdaDefine.

@Test
public void testOnLambdaDefine() throws Exception {
    this.codeGenerator.setParser(new Parser() {

        @Override
        public void setCodeGenerator(final CodeGenerator codeGenerator) {
        }

        @Override
        public void restoreScope(final ScopeInfo info) {
        }

        @Override
        public SymbolTable getSymbolTable() {
            return null;
        }

        @Override
        public CodeGenerator getCodeGenerator() {
            return ASMCodeGeneratorUnitTest.this.codeGenerator;
        }

        @Override
        public ScopeInfo enterScope(final boolean inForLoop) {
            return null;
        }
    });
    assertNull(this.codeGenerator.getLambdaGenerator());
    this.codeGenerator.onLambdaDefineStart(new Variable("lambda", 0, 0));
    LambdaGenerator lambdaGenerator = this.codeGenerator.getLambdaGenerator();
    assertNotNull(lambdaGenerator);
    this.codeGenerator.onLambdaArgument(new Variable("x", 0, 1), new FunctionParam(0, "x", false));
    this.codeGenerator.onLambdaArgument(new Variable("y", 0, 2), new FunctionParam(1, "y", false));
    this.codeGenerator.onLambdaBodyStart(new Variable(">", 0, 3));
    lambdaGenerator.onConstant(new Variable("x", 0, 4));
    lambdaGenerator.onConstant(new Variable("y", 0, 5));
    lambdaGenerator.onAdd(null);
    this.codeGenerator.onLambdaBodyEnd(new Variable("end", 0, 7));
    HashMap<String, Object> env = new HashMap<String, Object>();
    env.put("x", 2);
    env.put("y", 3);
    Object result = eval(env);
    assertTrue(result instanceof LambdaFunction);
    assertEquals(5, ((LambdaFunction) result).call(env, new AviatorJavaType("x"), new AviatorJavaType("y")).getValue(env));
    assertNull(this.codeGenerator.getLambdaGenerator());
}
Also used : LambdaGenerator(com.googlecode.aviator.code.LambdaGenerator) Variable(com.googlecode.aviator.lexer.token.Variable) HashMap(java.util.HashMap) SymbolTable(com.googlecode.aviator.lexer.SymbolTable) ScopeInfo(com.googlecode.aviator.parser.ScopeInfo) LambdaFunction(com.googlecode.aviator.runtime.function.LambdaFunction) CodeGenerator(com.googlecode.aviator.code.CodeGenerator) Parser(com.googlecode.aviator.parser.Parser) AviatorJavaType(com.googlecode.aviator.runtime.type.AviatorJavaType) FunctionParam(com.googlecode.aviator.runtime.FunctionParam) Test(org.junit.Test)

Example 3 with LambdaGenerator

use of com.googlecode.aviator.code.LambdaGenerator in project aviatorscript by killme2008.

the class InterpretCodeGenerator method onLambdaDefineStart.

@Override
public void onLambdaDefineStart(final Token<?> lookhead) {
    if (this.lambdaGenerator == null) {
        Boolean newLexicalScope = lookhead.getMeta(Constants.SCOPE_META, false);
        Boolean inheritEnv = lookhead.getMeta(Constants.INHERIT_ENV_META, false);
        // TODO cache?
        this.lambdaGenerator = new LambdaGenerator(this.instance, this, this.parser, this.classLoader, this.sourceFile, newLexicalScope, inheritEnv);
        this.lambdaGenerator.setScopeInfo(this.parser.enterScope(newLexicalScope));
    } else {
        throw new CompileExpressionErrorException("Compile lambda error");
    }
}
Also used : LambdaGenerator(com.googlecode.aviator.code.LambdaGenerator) CompileExpressionErrorException(com.googlecode.aviator.exception.CompileExpressionErrorException)

Aggregations

LambdaGenerator (com.googlecode.aviator.code.LambdaGenerator)3 CompileExpressionErrorException (com.googlecode.aviator.exception.CompileExpressionErrorException)2 CodeGenerator (com.googlecode.aviator.code.CodeGenerator)1 SymbolTable (com.googlecode.aviator.lexer.SymbolTable)1 Variable (com.googlecode.aviator.lexer.token.Variable)1 Parser (com.googlecode.aviator.parser.Parser)1 ScopeInfo (com.googlecode.aviator.parser.ScopeInfo)1 FunctionParam (com.googlecode.aviator.runtime.FunctionParam)1 LambdaFunction (com.googlecode.aviator.runtime.function.LambdaFunction)1 AviatorJavaType (com.googlecode.aviator.runtime.type.AviatorJavaType)1 HashMap (java.util.HashMap)1 Test (org.junit.Test)1