UNPKG

6.62 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.prepackSources = prepackSources;
7exports.prepackVersion = void 0;
8
9var _index = _interopRequireDefault(require("./serializer/index.js"));
10
11var _construct_realm = _interopRequireDefault(require("./construct_realm.js"));
12
13var _globals = _interopRequireDefault(require("./globals.js"));
14
15var _index2 = require("./methods/index.js");
16
17var _prepackOptions = require("./prepack-options");
18
19var _errors = require("./errors.js");
20
21var _completions = require("./completions.js");
22
23var _options = require("./options");
24
25var _invariant = _interopRequireDefault(require("./invariant.js"));
26
27var _package = require("../package.json");
28
29var _statistics = require("./serializer/statistics.js");
30
31var _ResidualHeapVisitor = require("./serializer/ResidualHeapVisitor.js");
32
33var _modules = require("./utils/modules.js");
34
35var _logger = require("./utils/logger.js");
36
37var _generator = require("./utils/generator.js");
38
39var _index3 = require("./values/index.js");
40
41function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
42
43function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
44
45function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
46
47function prepackSources(sources, options = _options.defaultOptions, debuggerConfigArgs, statistics = undefined) {
48 let realmOptions = (0, _prepackOptions.getRealmOptions)(options);
49 realmOptions.errorHandler = options.errorHandler;
50 let realm = (0, _construct_realm.default)(realmOptions, debuggerConfigArgs, statistics || new _statistics.SerializerStatistics());
51 (0, _globals.default)(realm);
52
53 if (typeof options.additionalGlobals === "function") {
54 options.additionalGlobals(realm);
55 }
56
57 if (options.check) {
58 realm.generator = new _generator.Generator(realm, "main", realm.pathConditions);
59 let logger = new _logger.Logger(realm, !!options.internalDebug);
60 let modules = new _modules.Modules(realm, logger, !!options.logModules, !!options.delayUnsupportedRequires, !!options.accelerateUnsupportedRequires);
61 let [result] = realm.$GlobalEnv.executeSources(sources);
62 if (result instanceof _completions.AbruptCompletion) throw result;
63 (0, _invariant.default)(options.check);
64 checkResidualFunctions(modules, options.check[0], options.check[1]);
65 return {
66 code: "",
67 map: undefined
68 };
69 } else if (options.serialize === true || options.residual !== true) {
70 let serializer = new _index.default(realm, (0, _prepackOptions.getSerializerOptions)(options));
71 let serialized = serializer.init(sources, options.sourceMaps, options.onParse); //Turn off the debugger if there is one
72
73 if (realm.debuggerInstance) {
74 realm.debuggerInstance.shutdown();
75 }
76
77 if (!serialized) {
78 throw new _errors.FatalError("serializer failed");
79 }
80
81 if (!options.residual) return serialized;
82 let residualSources = [{
83 filePath: options.outputFilename || "unknown",
84 fileContents: serialized.code,
85 sourceMapContents: serialized.map && JSON.stringify(serialized.map)
86 }];
87 let debugChannel = debuggerConfigArgs ? debuggerConfigArgs.debugChannel : undefined;
88 realm = (0, _construct_realm.default)(realmOptions, debugChannel);
89 (0, _globals.default)(realm);
90
91 if (typeof options.additionalGlobals === "function") {
92 options.additionalGlobals(realm);
93 }
94
95 realm.generator = new _generator.Generator(realm, "main", realm.pathConditions);
96 let result = realm.$GlobalEnv.executePartialEvaluator(residualSources, options);
97 if (result instanceof _completions.AbruptCompletion) throw result;
98 return _objectSpread({}, result);
99 } else {
100 (0, _invariant.default)(options.residual);
101 realm.generator = new _generator.Generator(realm, "main", realm.pathConditions);
102 let result = realm.$GlobalEnv.executePartialEvaluator(sources, options);
103 if (result instanceof _completions.AbruptCompletion) throw result;
104 return _objectSpread({}, result);
105 }
106}
107
108function checkResidualFunctions(modules, startFunc, totalToAnalyze) {
109 let realm = modules.realm;
110 let env = realm.$GlobalEnv;
111 realm.$GlobalObject.makeSimple();
112 let errorHandler = realm.errorHandler;
113 if (!errorHandler) errorHandler = (diag, suppressDiagnostics) => realm.handleError(diag);
114
115 realm.errorHandler = (diag, suppressDiagnostics) => {
116 (0, _invariant.default)(errorHandler);
117 if (diag.severity === "FatalError") return errorHandler(diag, realm.suppressDiagnostics);else return "Recover";
118 };
119
120 modules.resolveInitializedModules();
121 let residualHeapVisitor = new _ResidualHeapVisitor.ResidualHeapVisitor(realm, modules.logger, modules, new Map(), "NO_REFERENTIALIZE");
122 residualHeapVisitor.visitRoots();
123 if (modules.logger.hasErrors()) return;
124 let totalFunctions = 0;
125 let nonFatalFunctions = 0;
126
127 for (let fi of residualHeapVisitor.functionInstances.values()) {
128 totalFunctions++;
129 if (totalFunctions <= startFunc) continue;
130 let fv = fi.functionValue;
131 console.log("analyzing: " + totalFunctions);
132 let thisValue = realm.intrinsics.null;
133 let n = fv.getLength() || 0;
134 let args = [];
135
136 for (let i = 0; i < n; i++) {
137 let name = "dummy parameter";
138
139 let ob = _index3.AbstractValue.createFromType(realm, _index3.ObjectValue, name);
140
141 ob.makeSimple("transitive");
142 ob.intrinsicName = name;
143 args[i] = ob;
144 } // todo: eventually join these effects, apply them to the global state and iterate to a fixed point
145
146
147 try {
148 realm.evaluateForEffectsInGlobalEnv(() => (0, _index2.EvaluateDirectCallWithArgList)(modules.realm, true, env, fv, fv, thisValue, args));
149 nonFatalFunctions++;
150 } catch (e) {}
151
152 if (totalFunctions >= startFunc + totalToAnalyze) break;
153 }
154
155 console.log(`Analyzed ${totalToAnalyze} functions starting at ${startFunc} of which ${nonFatalFunctions} did not have fatal errors.`);
156}
157
158const prepackVersion = _package.version;
159exports.prepackVersion = prepackVersion;
160//# sourceMappingURL=prepack-standalone.js.map
\No newline at end of file