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); }
internal static extern JsErrorCode JsParseModuleSource( JsModuleRecord requestModule, JsSourceContext sourceContext, byte[] script, uint scriptLength, JsParseModuleSourceFlags sourceFlag, out JsValue exception);
private static string GetModuleFullPath(JsModuleRecord referencingModule, string modulePath) { string parentModulePath = "/"; if (referencingModule.IsValid) { JsValue parentModuleUrl = referencingModule.Url; parentModulePath = parentModuleUrl.IsValid && parentModuleUrl.ValueType == JsValueType.String ? parentModuleUrl.ToString() : string.Empty; } string moduleFullPath = PathHelpers.MakeAbsolutePath(parentModulePath, modulePath); return(moduleFullPath); }
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); }
private JsErrorCode NotifyModuleReady(JsModuleRecord referencingModule, JsValue exception) { if (!exception.IsValid) { ModuleJob job = new ModuleJob { Module = referencingModule, Script = string.Empty, SourceUrl = string.Empty, IsParsed = true }; _moduleJobQueue.Enqueue(job); } return(JsErrorCode.NoError); }
private JsValue EvaluateModulesTree(out JsValue moduleNamespace) { JsValue result = JsValue.Invalid; moduleNamespace = JsValue.Invalid; while (_moduleJobQueue.Count > 0) { ModuleJob job = _moduleJobQueue.Dequeue(); JsModuleRecord module = job.Module; if (job.IsParsed) { result = module.Evaluate(); if (result.IsValid) { moduleNamespace = module.Namespace; } } else { string code = job.Script; if (code.Length == 0) { string path = job.SourceUrl; try { code = File.ReadAllText(path.TrimStart('/')); } catch (IOException e) when(e is FileNotFoundException || e is DirectoryNotFoundException) { string errorMessage = string.Format(Strings.Runtime_ModuleNotFound, path); JsValue errorValue = JsErrorHelpers.CreateError(errorMessage); module.Exception = errorValue; break; } catch (Exception e) { string errorMessage = string.Format(Strings.Runtime_ModuleNotLoaded, path, e.Message); JsValue errorValue = JsErrorHelpers.CreateError(e.Message); module.Exception = errorValue; break; } } JsValue exception; module.ParseSource(code, _getNextSourceContext(), out exception); if (exception.IsValid) { break; } } } return(result); }
internal static extern JsErrorCode JsModuleEvaluation( JsModuleRecord requestModule, out JsValue result);
internal static extern JsErrorCode JsSetModuleHostInfo(JsModuleRecord requestModule, JsModuleHostInfoKind moduleHostInfo, JsFetchImportedModuleFromScriptCallback callback);
internal static extern JsErrorCode JsSetModuleHostInfo(JsModuleRecord requestModule, JsModuleHostInfoKind moduleHostInfo, JsNotifyModuleReadyCallback callback);
internal static extern JsErrorCode JsInitializeModuleRecord( JsModuleRecord referencingModule, JsValue normalizedSpecifier, out JsModuleRecord moduleRecord);