protected internal override void PutLoadedModule(string moduleId, ModuleScript moduleScript, object validator) { modules.Put(moduleId, new CachingModuleScriptProviderBase.CachedModuleScript(moduleScript, validator)); }
private Scriptable ExecuteModuleScript(Context cx, string id, Scriptable exports, ModuleScript moduleScript, bool isMain) { ScriptableObject moduleObject = (ScriptableObject)cx.NewObject(nativeScope); Uri uri = moduleScript.GetUri(); Uri @base = moduleScript.GetBase(); DefineReadOnlyProperty(moduleObject, "id", id); if (!sandboxed) { DefineReadOnlyProperty(moduleObject, "uri", uri.ToString()); } Scriptable executionScope = new ModuleScope(nativeScope, uri, @base); // Set this so it can access the global JS environment objects. // This means we're currently using the "MGN" approach (ModuleScript // with Global Natives) as specified here: // <http://wiki.commonjs.org/wiki/Modules/ProposalForNativeExtension> executionScope.Put("exports", executionScope, exports); executionScope.Put("module", executionScope, moduleObject); moduleObject.Put("exports", moduleObject, exports); Install(executionScope); if (isMain) { DefineReadOnlyProperty(this, "main", moduleObject); } ExecuteOptionalScript(preExec, cx, executionScope); moduleScript.GetScript().Exec(cx, executionScope); ExecuteOptionalScript(postExec, cx, executionScope); return ScriptRuntime.ToObject(nativeScope, ScriptableObject.GetProperty(moduleObject, "exports")); }
/// <summary>Creates a new cached module script.</summary> /// <remarks>Creates a new cached module script.</remarks> /// <param name="moduleScript">the module script itself</param> /// <param name="validator"> /// a validator for the moduleScript's source text /// entity. /// </param> public CachedModuleScript(ModuleScript moduleScript, object validator) { this.moduleScript = moduleScript; this.validator = validator; }
/// <exception cref="System.Exception"></exception> public virtual ModuleScript GetModuleScript(Context cx, string moduleId, Uri moduleUri, Uri baseUri, Scriptable paths) { CachingModuleScriptProviderBase.CachedModuleScript cachedModule1 = GetLoadedModule(moduleId); object validator1 = GetValidator(cachedModule1); ModuleSource moduleSource = (moduleUri == null) ? moduleSourceProvider.LoadSource(moduleId, paths, validator1) : moduleSourceProvider.LoadSource(moduleUri, baseUri, validator1); if (moduleSource == ModuleSourceProviderConstants.NOT_MODIFIED) { return cachedModule1.GetModule(); } if (moduleSource == null) { return null; } TextReader reader = moduleSource.GetReader(); try { int idHash = moduleId.GetHashCode(); lock (loadLocks[((int)(((uint)idHash) >> loadLockShift)) & loadLockMask]) { CachingModuleScriptProviderBase.CachedModuleScript cachedModule2 = GetLoadedModule(moduleId); if (cachedModule2 != null) { if (!Equal(validator1, GetValidator(cachedModule2))) { return cachedModule2.GetModule(); } } Uri sourceUri = moduleSource.GetUri(); ModuleScript moduleScript = new ModuleScript(cx.CompileReader(reader, sourceUri.ToString(), 1, moduleSource.GetSecurityDomain()), sourceUri, moduleSource.GetBase()); PutLoadedModule(moduleId, moduleScript, moduleSource.GetValidator()); return moduleScript; } } finally { reader.Close(); } }
/// <summary> /// Store a loaded module script for later retrieval using /// <see cref="GetLoadedModule(string)">GetLoadedModule(string)</see> /// . /// </summary> /// <param name="moduleId">the ID of the module</param> /// <param name="moduleScript">the module script</param> /// <param name="validator">the validator for the module's source text entity</param> protected internal abstract void PutLoadedModule(string moduleId, ModuleScript moduleScript, object validator);