Example #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);
        }
Example #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);
        }
Example #3
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);
        }
Example #4
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);
        }