コード例 #1
0
ファイル: Program.cs プロジェクト: fengweijp/esprima-dotnet
 public Program(IEnumerable <StatementListItem> body, SourceType sourceType, HoistingScope hoistingScope, bool strict)
 {
     Type          = Nodes.Program;
     Body          = body;
     SourceType    = sourceType;
     HoistingScope = hoistingScope;
     Strict        = strict;
 }
コード例 #2
0
 public Program(NodeList <IStatementListItem> body, SourceType sourceType, HoistingScope hoistingScope, bool strict) :
     base(Nodes.Program)
 {
     Body          = body;
     SourceType    = sourceType;
     HoistingScope = hoistingScope;
     Strict        = strict;
 }
コード例 #3
0
 public ArrowFunctionExpression(List <INode> parameters, INode body, bool expression, HoistingScope hoistingScope)
 {
     Type          = Nodes.ArrowFunctionExpression;
     Id            = null;
     Params        = parameters;
     Body          = body;
     Generator     = false;
     Expression    = expression;
     HoistingScope = hoistingScope;
 }
コード例 #4
0
            public JintSwitchCase(Engine engine, SwitchCase switchCase)
            {
                Consequent          = new JintStatementList(null, switchCase.Consequent);
                LexicalDeclarations = HoistingScope.GetLexicalDeclarations(switchCase);

                if (switchCase.Test != null)
                {
                    Test = JintExpression.Build(engine, switchCase.Test);
                }
            }
コード例 #5
0
 public FunctionExpression(
     Identifier id,
     NodeList <INode> parameters,
     BlockStatement body,
     bool generator,
     HoistingScope hoistingScope,
     bool strict) :
     base(Nodes.FunctionExpression)
 {
     Id            = id;
     Params        = parameters;
     Body          = body;
     Generator     = generator;
     Expression    = false;
     HoistingScope = hoistingScope;
     Strict        = strict;
 }
コード例 #6
0
 public FunctionExpression(
     Identifier id,
     IEnumerable <INode> parameters,
     BlockStatement body,
     bool generator,
     HoistingScope hoistingScope,
     bool strict
     )
 {
     Type          = Nodes.FunctionExpression;
     Id            = id;
     Params        = parameters;
     Body          = body;
     Generator     = generator;
     Expression    = false;
     HoistingScope = hoistingScope;
     Strict        = strict;
 }
コード例 #7
0
    internal SourceTextModuleRecord(Engine engine, Realm realm, Module source, string location, bool async)
        : base(engine, realm, source, location, async)
    {
        _source = source;

        // https://tc39.es/ecma262/#sec-parsemodule
        _importMeta = _realm.Intrinsics.Object.Construct(1);
        _importMeta.DefineOwnProperty("url", new PropertyDescriptor(location, PropertyFlag.ConfigurableEnumerableWritable));

        HoistingScope.GetImportsAndExports(
            _source,
            out _requestedModules,
            out _importEntries,
            out _localExportEntries,
            out _indirectExportEntries,
            out _starExportEntries);

        //ToDo async modules
    }
コード例 #8
0
        private State DoInitialize(FunctionInstance functionInstance)
        {
            var state = new State();

            ProcessParameters(Function, state, out var hasArguments);

            var hoistingScope        = HoistingScope.GetFunctionLevelDeclarations(Function, collectVarNames: true, collectLexicalNames: true);
            var functionDeclarations = hoistingScope._functionDeclarations;
            var lexicalNames         = hoistingScope._lexicalNames;

            state.VarNames = hoistingScope._varNames;

            LinkedList <JintFunctionDefinition> functionsToInitialize = null;

            if (functionDeclarations != null)
            {
                functionsToInitialize = new LinkedList <JintFunctionDefinition>();
                for (var i = functionDeclarations.Count - 1; i >= 0; i--)
                {
                    var d  = functionDeclarations[i];
                    var fn = d.Id.Name;
                    if (state.FunctionNames.Add(fn))
                    {
                        functionsToInitialize.AddFirst(new JintFunctionDefinition(_engine, d));
                    }
                }
            }

            state.FunctionsToInitialize = functionsToInitialize;

            const string ParameterNameArguments = "arguments";

            state.ArgumentsObjectNeeded = true;
            if (functionInstance._thisMode == FunctionThisMode.Lexical)
            {
                state.ArgumentsObjectNeeded = false;
            }
            else if (hasArguments)
            {
                state.ArgumentsObjectNeeded = false;
            }
            else if (!state.HasParameterExpressions)
            {
                if (state.FunctionNames.Contains(ParameterNameArguments) ||
                    lexicalNames?.Contains(ParameterNameArguments) == true)
                {
                    state.ArgumentsObjectNeeded = false;
                }
            }

            var parameterBindings = new HashSet <Key>(state.ParameterNames);

            if (state.ArgumentsObjectNeeded)
            {
                parameterBindings.Add(KnownKeys.Arguments);
            }

            state.ParameterBindings = parameterBindings;


            var varsToInitialize = new List <State.VariableValuePair>();

            if (!state.HasParameterExpressions)
            {
                var instantiatedVarNames = state.VarNames != null
                    ? new HashSet <Key>(state.ParameterBindings)
                    : new HashSet <Key>();

                for (var i = 0; i < state.VarNames?.Count; i++)
                {
                    var n = state.VarNames[i];
                    if (instantiatedVarNames.Add(n))
                    {
                        varsToInitialize.Add(new State.VariableValuePair
                        {
                            Name = n
                        });
                    }
                }
            }
            else
            {
                var instantiatedVarNames = state.VarNames != null
                    ? new HashSet <Key>(state.ParameterBindings)
                    : null;

                for (var i = 0; i < state.VarNames?.Count; i++)
                {
                    var n = state.VarNames[i];
                    if (instantiatedVarNames.Add(n))
                    {
                        JsValue initialValue = null;
                        if (!state.ParameterBindings.Contains(n) || state.FunctionNames.Contains(n))
                        {
                            initialValue = JsValue.Undefined;
                        }

                        varsToInitialize.Add(new State.VariableValuePair
                        {
                            Name         = n,
                            InitialValue = initialValue
                        });
                    }
                }
            }

            state.VarsToInitialize = varsToInitialize;

            if (hoistingScope._lexicalDeclarations != null)
            {
                var _lexicalDeclarations     = hoistingScope._lexicalDeclarations;
                var lexicalDeclarationsCount = _lexicalDeclarations.Count;
                var declarations             = new State.LexicalVariableDeclaration[lexicalDeclarationsCount];
                for (var i = 0; i < lexicalDeclarationsCount; i++)
                {
                    var d          = _lexicalDeclarations[i];
                    var boundNames = new List <string>();
                    d.GetBoundNames(boundNames);
                    declarations[i] = new State.LexicalVariableDeclaration
                    {
                        IsConstantDeclaration = d.IsConstantDeclaration(),
                        BoundNames            = boundNames
                    };
                }
                state.LexicalDeclarations = declarations;
            }

            return(state);
        }
コード例 #9
0
 protected override void Initialize()
 {
     _statementList       = new JintStatementList(_engine, _statement, _statement.Body);
     _lexicalDeclarations = HoistingScope.GetLexicalDeclarations(_statement);
 }
コード例 #10
0
 protected override void Initialize(EvaluationContext context)
 {
     _statementList       = new JintStatementList(_statement, _statement.Body);
     _lexicalDeclarations = HoistingScope.GetLexicalDeclarations(_statement);
 }
コード例 #11
0
    /// <summary>
    /// https://tc39.es/ecma262/#sec-source-text-module-record-initialize-environment
    /// </summary>
    protected override void InitializeEnvironment()
    {
        for (var i = 0; i < _indirectExportEntries.Count; i++)
        {
            var e          = _indirectExportEntries[i];
            var resolution = ResolveExport(e.ExportName);
            if (resolution is null || resolution == ResolvedBinding.Ambiguous)
            {
                ExceptionHelper.ThrowSyntaxError(_realm, "Ambiguous import statement for identifier: " + e.ExportName);
            }
        }

        var realm = _realm;
        var env   = JintEnvironment.NewModuleEnvironment(_engine, realm.GlobalEnv);

        _environment = env;

        if (_importEntries != null)
        {
            for (var i = 0; i < _importEntries.Count; i++)
            {
                var ie             = _importEntries[i];
                var importedModule = _engine._host.ResolveImportedModule(this, ie.ModuleRequest);
                if (ie.ImportName == "*")
                {
                    var ns = GetModuleNamespace(importedModule);
                    env.CreateImmutableBinding(ie.LocalName, true);
                    env.InitializeBinding(ie.LocalName, ns);
                }
                else
                {
                    var resolution = importedModule.ResolveExport(ie.ImportName);
                    if (resolution is null || resolution == ResolvedBinding.Ambiguous)
                    {
                        ExceptionHelper.ThrowSyntaxError(_realm, "Ambiguous import statement for identifier " + ie.ImportName);
                    }

                    if (resolution.BindingName == "*namespace*")
                    {
                        var ns = GetModuleNamespace(resolution.Module);
                        env.CreateImmutableBinding(ie.LocalName, true);
                        env.InitializeBinding(ie.LocalName, ns);
                    }
                    else
                    {
                        env.CreateImportBinding(ie.LocalName, resolution.Module, resolution.BindingName);
                    }
                }
            }
        }

        var moduleContext = new ExecutionContext(this, _environment, _environment, null, realm, null);

        _context = moduleContext;

        _engine.EnterExecutionContext(_context);

        var hoistingScope = HoistingScope.GetModuleLevelDeclarations(_source);

        var varDeclarations  = hoistingScope._variablesDeclarations;
        var declaredVarNames = new HashSet <string>();

        if (varDeclarations != null)
        {
            var boundNames = new List <string>();
            for (var i = 0; i < varDeclarations.Count; i++)
            {
                var d = varDeclarations[i];
                boundNames.Clear();
                d.GetBoundNames(boundNames);
                for (var j = 0; j < boundNames.Count; j++)
                {
                    var dn = boundNames[j];
                    if (declaredVarNames.Add(dn))
                    {
                        env.CreateMutableBinding(dn, false);
                        env.InitializeBinding(dn, Undefined);
                    }
                }
            }
        }

        var lexDeclarations = hoistingScope._lexicalDeclarations;

        if (lexDeclarations != null)
        {
            var boundNames = new List <string>();
            for (var i = 0; i < lexDeclarations.Count; i++)
            {
                var d = lexDeclarations[i];
                boundNames.Clear();
                d.GetBoundNames(boundNames);
                for (var j = 0; j < boundNames.Count; j++)
                {
                    var dn = boundNames[j];
                    if (d.IsConstantDeclaration())
                    {
                        env.CreateImmutableBinding(dn, true);
                    }
                    else
                    {
                        env.CreateMutableBinding(dn, false);
                    }
                }
            }
        }

        var functionDeclarations = hoistingScope._functionDeclarations;

        if (functionDeclarations != null)
        {
            for (var i = 0; i < functionDeclarations.Count; i++)
            {
                var d  = functionDeclarations[i];
                var fn = d.Id?.Name ?? "*default*";
                var fd = new JintFunctionDefinition(_engine, d);
                env.CreateMutableBinding(fn, true);
                var fo = realm.Intrinsics.Function.InstantiateFunctionObject(fd, env);
                if (fn == "*default*")
                {
                    fo.SetFunctionName("default");
                }
                env.InitializeBinding(fn, fo);
            }
        }

        _engine.LeaveExecutionContext();
    }