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
 internal static extern JsErrorCode JsParseModuleSource(
     JsModuleRecord requestModule,
     JsSourceContext sourceContext,
     byte[] script,
     uint scriptLength,
     JsParseModuleSourceFlags sourceFlag,
     out JsValue exception);
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
 internal static extern JsErrorCode JsModuleEvaluation(
     JsModuleRecord requestModule,
     out JsValue result);
Exemplo n.º 8
0
 internal static extern JsErrorCode JsSetModuleHostInfo(JsModuleRecord requestModule,
                                                        JsModuleHostInfoKind moduleHostInfo,
                                                        JsFetchImportedModuleFromScriptCallback callback);
Exemplo n.º 9
0
 internal static extern JsErrorCode JsSetModuleHostInfo(JsModuleRecord requestModule,
                                                        JsModuleHostInfoKind moduleHostInfo,
                                                        JsNotifyModuleReadyCallback callback);
Exemplo n.º 10
0
 internal static extern JsErrorCode JsInitializeModuleRecord(
     JsModuleRecord referencingModule,
     JsValue normalizedSpecifier,
     out JsModuleRecord moduleRecord);