@engine262/engine262 0.0.1-093c8cb33fc82c295390da3d9e124c21ad7e6281

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,133 @@
1
+ 'use strict';
2
+
3
+ const path = require('path');
4
+ const fs = require('fs');
5
+ const {
6
+ Value,
7
+ CreateBuiltinFunction,
8
+ CreateDataProperty,
9
+ DetachArrayBuffer,
10
+ OrdinaryObjectCreate,
11
+ ToString,
12
+ Type,
13
+ Throw,
14
+ AbruptCompletion,
15
+ ManagedRealm,
16
+ inspect,
17
+ gc,
18
+ } = require('..');
19
+
20
+ const createRealm = ({ printCompatMode = false } = {}) => {
21
+ const resolverCache = new Map();
22
+ const trackedPromises = new Set();
23
+
24
+ const realm = new ManagedRealm({
25
+ promiseRejectionTracker(promise, operation) {
26
+ switch (operation) {
27
+ case 'reject':
28
+ trackedPromises.add(promise);
29
+ break;
30
+ case 'handle':
31
+ trackedPromises.delete(promise);
32
+ break;
33
+ /* c8 ignore next */
34
+ default:
35
+ throw new RangeError('promiseRejectionTracker', operation);
36
+ }
37
+ },
38
+ resolveImportedModule(referencingScriptOrModule, specifier) {
39
+ try {
40
+ const base = path.dirname(referencingScriptOrModule.HostDefined.specifier);
41
+ const resolved = path.resolve(base, specifier);
42
+ if (resolverCache.has(resolved)) {
43
+ return resolverCache.get(resolved);
44
+ }
45
+ const source = fs.readFileSync(resolved, 'utf8');
46
+ const m = resolved.endsWith('.json')
47
+ ? realm.createJSONModule(resolved, source)
48
+ : realm.createSourceTextModule(resolved, source);
49
+ resolverCache.set(resolved, m);
50
+ return m;
51
+ } catch (e) {
52
+ return Throw(e.name, 'Raw', e.message);
53
+ }
54
+ },
55
+ });
56
+
57
+ return realm.scope(() => {
58
+ const $262 = OrdinaryObjectCreate(realm.Intrinsics['%Object.prototype%']);
59
+
60
+ let printHandle;
61
+ const setPrintHandle = (f) => {
62
+ printHandle = f;
63
+ };
64
+ CreateDataProperty(realm.GlobalObject, new Value('print'), CreateBuiltinFunction((args) => {
65
+ /* c8 ignore next */
66
+ if (printHandle !== undefined) {
67
+ printHandle(...args);
68
+ } else {
69
+ if (printCompatMode) {
70
+ for (let i = 0; i < args.length; i += 1) {
71
+ const arg = args[i];
72
+ const s = ToString(arg);
73
+ if (s instanceof AbruptCompletion) {
74
+ return s;
75
+ }
76
+ process.stdout.write(s.stringValue());
77
+ if (i !== args.length - 1) {
78
+ process.stdout.write(' ');
79
+ }
80
+ }
81
+ process.stdout.write('\n');
82
+ return Value.undefined;
83
+ } else {
84
+ const formatted = args.map((a, i) => {
85
+ if (i === 0 && Type(a) === 'String') {
86
+ return a.stringValue();
87
+ }
88
+ return inspect(a, realm);
89
+ }).join(' ');
90
+ console.log(formatted); // eslint-disable-line no-console
91
+ }
92
+ }
93
+ return Value.undefined;
94
+ }, 0, new Value('print'), []));
95
+
96
+ [
97
+ ['global', realm.GlobalObject],
98
+ ['createRealm', () => {
99
+ const info = createRealm();
100
+ return info.$262;
101
+ }],
102
+ ['evalScript', ([sourceText]) => realm.evaluateScript(sourceText.stringValue()), 1],
103
+ ['detachArrayBuffer', ([arrayBuffer]) => DetachArrayBuffer(arrayBuffer), 1],
104
+ ['gc', () => {
105
+ gc();
106
+ return Value.undefined;
107
+ }],
108
+ ['spec', ([v]) => {
109
+ if (v.nativeFunction && v.nativeFunction.section) {
110
+ return new Value(v.nativeFunction.section);
111
+ }
112
+ return Value.undefined;
113
+ }, 1],
114
+ ].forEach(([name, value, length = 0]) => {
115
+ const v = value instanceof Value ? value
116
+ : CreateBuiltinFunction(value, length, new Value(name), []);
117
+ CreateDataProperty($262, new Value(name), v);
118
+ });
119
+
120
+ CreateDataProperty(realm.GlobalObject, new Value('$262'), $262);
121
+ CreateDataProperty(realm.GlobalObject, new Value('$'), $262);
122
+
123
+ return {
124
+ realm,
125
+ $262,
126
+ resolverCache,
127
+ trackedPromises,
128
+ setPrintHandle,
129
+ };
130
+ });
131
+ };
132
+
133
+ module.exports = { createRealm };