コード例 #1
0
ファイル: Execute.cs プロジェクト: sammoorhouse/aplusdotnet
        internal static DLR.Expression<Func<Aplus, AType>> BuildExecuteMethod(
            string sourceCode, Aplus environment
        )
        {
            DLR.Expression codebody;
            // TODO: fix the third function info argument
            AplusCore.Compiler.AST.Node tree = Compiler.Parse.String(sourceCode, environment.LexerMode, null);

            AplusScope scope = new AplusScope(null, "__EVAL__", environment,
                DLR.Expression.Parameter(typeof(Aplus), "__EVAL_RUNTIME__"),
                DLR.Expression.Parameter(typeof(DYN.IDynamicMetaObjectProvider), "__EVAL_MODULE__"),
                //DLR.Expression.Parameter(typeof(Aplus), "__EVAL_ENVIRONMENT__"),
                DLR.Expression.Label(typeof(AType), "__EVAL_EXIT__"),
                isEval: true
            );

            if (tree == null)
            {
                codebody = DLR.Expression.Constant(null);
            }
            else if (environment.FunctionScope != null)
            {
                AplusScope functionScope = new AplusScope(scope, "__EVAL_IN_FUNCTION__",
                    moduleParam: DLR.Expression.Parameter(typeof(DYN.ExpandoObject), "__EVAL_FUNCTION_SCOPE__"),
                    returnTarget: scope.ReturnTarget,
                    isMethod: true
                );

                codebody = DLR.Expression.Block(
                    new DLR.ParameterExpression[] {
                        //scope.RuntimeExpression,         // runtime
                        scope.ModuleExpression,          // root context
                        functionScope.ModuleExpression   // Function local scope
                    },
                    //DLR.Expression.Assign(
                    //    scope.RuntimeExpression, scope.RuntimeExpression
                    //),
                    DLR.Expression.Assign(
                        scope.ModuleExpression, DLR.Expression.PropertyOrField(scope.RuntimeExpression, "Context")
                    ),
                    DLR.Expression.Assign(
                        functionScope.ModuleExpression, DLR.Expression.PropertyOrField(scope.RuntimeExpression, "FunctionScope")
                    ),
                    DLR.Expression.Label(
                        scope.ReturnTarget,
                        tree.Generate(functionScope)
                    )
                );
            }
            else
            {
                codebody = DLR.Expression.Block(
                    new DLR.ParameterExpression[] {
                        //scope.RuntimeExpression,         // runtime
                        scope.ModuleExpression          // root context
                    },
                    //DLR.Expression.Assign(
                    //   scope.RuntimeExpression, scope.RuntimeExpression
                    //),
                    DLR.Expression.Assign(
                        scope.ModuleExpression, DLR.Expression.PropertyOrField(scope.RuntimeExpression, "Context")
                    ),
                    DLR.Expression.Label(
                        scope.ReturnTarget,
                        tree.Generate(scope)
                    )
               );
            }

            DLR.Expression<Func<Aplus, AType>> lambda = DLR.Expression.Lambda<Func<Aplus, AType>>(
                codebody,
                scope.GetRuntimeExpression()
            );

            return lambda;
        }