public override Et Walk(EtGenerator etgen) { etgen.EnterFunctionScope(); etgen.LambdaTuples.Add( Tuple.Create( Et.Lambda<LambdaType>( Et.Block( // lambda body Body.Walk(etgen), Et.Label( etgen.FunctionScope.ReturnLabel, Undefined.Expr // 12.9 ) ), etgen.FunctionScope.ScopeExpr ), // parameter names Args.Select(x => x.Name).ToList() ) ); etgen.ExitFunctionScope(); return Context.EtCreateFunction( etgen.Context, etgen.FunctionScope.ScopeExpr, FunctionTable.EtPull( etgen.FuncTableExpr, etgen.LambdaId ) ); }
public override Et Walk(EtGenerator etgen) { etgen.EnterFunctionScope(); etgen.LambdaTuples.Add( Tuple.Create( Et.Lambda<LambdaType>( Et.Block( // lambda body Body.Walk(etgen), Et.Label( etgen.FunctionScope.ReturnLabel, Undefined.Expr // 12.9 ) ), etgen.FunctionScope.ScopeExpr ), // parameter names Args.Select(x => x.Name).ToList() ) ); etgen.ExitFunctionScope(); if (Name == null) { return Et.Call( Et.Constant(etgen.Context), Context.MiCreateFunction, etgen.FunctionScope.ScopeExpr, FunctionTable.EtPull( etgen.FuncTableExpr, etgen.LambdaId ) ); } else { var tmp = Et.Parameter(typeof(IFunction), "#tmp"); return Et.Block( new[] { tmp }, Et.Assign( tmp, Et.Call( Et.Constant(etgen.Context), Context.MiCreateFunction, etgen.FunctionScope.ScopeExpr, FunctionTable.EtPull( etgen.FuncTableExpr, etgen.LambdaId ) ) ), Et.Call( etgen.FunctionScope.ScopeExpr, Scope.MiLocal, Et.Constant(Name, typeof(object)), tmp ), tmp ); } }