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); }
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); }