Exemplo n.º 1
0
        private JsErrorCode FetchImportedModule(JsModuleRecord referencingModule, JsValue specifier,
                                                out JsModuleRecord dependentModuleRecord)
        {
            string modulePath = specifier.ValueType == JsValueType.String ?
                                specifier.ToString() : string.Empty;
            string moduleFullPath = GetModuleFullPath(referencingModule, modulePath);

            if (_moduleCache.ContainsKey(moduleFullPath))
            {
                dependentModuleRecord = _moduleCache[moduleFullPath];
            }
            else
            {
                dependentModuleRecord = JsModuleRecord.Create(referencingModule, modulePath, moduleFullPath);
                dependentModuleRecord.AddRef();

                _moduleCache[moduleFullPath] = dependentModuleRecord;

                ModuleJob job = new ModuleJob
                {
                    Module    = dependentModuleRecord,
                    Script    = string.Empty,
                    SourceUrl = moduleFullPath,
                    IsParsed  = false
                };
                _moduleJobQueue.Enqueue(job);
            }

            return(JsErrorCode.NoError);
        }
Exemplo n.º 2
0
        private JsValue EvaluateModuleInternal(string code, string path, out JsValue moduleNamespace)
        {
            JsModuleRecord invalidModule  = JsModuleRecord.Invalid;
            string         modulePath     = path;
            string         moduleFullPath = GetModuleFullPath(invalidModule, modulePath);

            JsValue result;

            lock (_evaluationSynchronizer)
            {
                JsModuleRecord module = JsModuleRecord.Create(invalidModule, modulePath, moduleFullPath);
                module.SetFetchImportedModuleCallback(_fetchImportedModuleCallback);
                module.SetNotifyModuleReadyCallback(_notifyModuleReadyCallback);

                ModuleJob job = new ModuleJob
                {
                    Module    = module,
                    Script    = code,
                    SourceUrl = moduleFullPath,
                    IsParsed  = false
                };
                _moduleJobQueue.Enqueue(job);

                try
                {
                    result = EvaluateModulesTree(out moduleNamespace);
                    JsValue exception = module.Exception;

                    if (exception.IsValid)
                    {
                        JsValue metadata = JsValue.Invalid;
                        if (!JsContext.HasException)
                        {
                            JsErrorHelpers.SetException(exception);
                        }
                        metadata = JsContext.GetAndClearExceptionWithMetadata();

                        throw JsErrorHelpers.CreateScriptExceptionFromMetadata(metadata);
                    }
                }
                finally
                {
                    _moduleJobQueue.Clear();
                    module.Release();
                }
            }

            return(result);
        }