-
Notifications
You must be signed in to change notification settings - Fork 72
/
get-anonymous-intrinsics.js
161 lines (130 loc) · 5.13 KB
/
get-anonymous-intrinsics.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import {
FERAL_FUNCTION,
Float32Array,
Map,
Set,
String,
getOwnPropertyDescriptor,
getPrototypeOf,
iterateArray,
iterateMap,
iterateSet,
iterateString,
matchAllRegExp,
matchAllSymbol,
regexpPrototype,
globalThis,
} from './commons.js';
import { InertCompartment } from './compartment.js';
/**
* Object.getConstructorOf()
* Helper function to improve readability, similar to Object.getPrototypeOf().
*
* @param {object} obj
*/
function getConstructorOf(obj) {
return getPrototypeOf(obj).constructor;
}
// getAnonymousIntrinsics uses a utility function to construct an arguments
// object, since it cannot have one of its own and also be a const export.
function makeArguments() {
// eslint-disable-next-line prefer-rest-params
return arguments;
}
/**
* getAnonymousIntrinsics()
* Get the intrinsics not otherwise reachable by named own property
* traversal from the global object.
*
* @returns {object}
*/
export const getAnonymousIntrinsics = () => {
const InertFunction = FERAL_FUNCTION.prototype.constructor;
// 9.2.4.1 %ThrowTypeError%
const argsCalleeDesc = getOwnPropertyDescriptor(makeArguments(), 'callee');
const ThrowTypeError = argsCalleeDesc && argsCalleeDesc.get;
// 21.1.5.2 The %StringIteratorPrototype% Object
// eslint-disable-next-line no-new-wrappers
const StringIteratorObject = iterateString(new String());
const StringIteratorPrototype = getPrototypeOf(StringIteratorObject);
// 21.2.7.1 The %RegExpStringIteratorPrototype% Object
const RegExpStringIterator =
regexpPrototype[matchAllSymbol] && matchAllRegExp(/./);
const RegExpStringIteratorPrototype =
RegExpStringIterator && getPrototypeOf(RegExpStringIterator);
// 22.1.5.2 The %ArrayIteratorPrototype% Object
// eslint-disable-next-line no-array-constructor
const ArrayIteratorObject = iterateArray([]);
const ArrayIteratorPrototype = getPrototypeOf(ArrayIteratorObject);
// 22.2.1 The %TypedArray% Intrinsic Object
const TypedArray = getPrototypeOf(Float32Array);
// 23.1.5.2 The %MapIteratorPrototype% Object
const MapIteratorObject = iterateMap(new Map());
const MapIteratorPrototype = getPrototypeOf(MapIteratorObject);
// 23.2.5.2 The %SetIteratorPrototype% Object
const SetIteratorObject = iterateSet(new Set());
const SetIteratorPrototype = getPrototypeOf(SetIteratorObject);
// 25.1.2 The %IteratorPrototype% Object
const IteratorPrototype = getPrototypeOf(ArrayIteratorPrototype);
// 25.2.1 The GeneratorFunction Constructor
// eslint-disable-next-line no-empty-function
function* GeneratorFunctionInstance() {}
const GeneratorFunction = getConstructorOf(GeneratorFunctionInstance);
// 25.2.3 Properties of the GeneratorFunction Prototype Object
const Generator = GeneratorFunction.prototype;
// 25.3.1 The AsyncGeneratorFunction Constructor
// eslint-disable-next-line no-empty-function
async function* AsyncGeneratorFunctionInstance() {}
const AsyncGeneratorFunction = getConstructorOf(
AsyncGeneratorFunctionInstance,
);
// 25.3.2.2 AsyncGeneratorFunction.prototype
const AsyncGenerator = AsyncGeneratorFunction.prototype;
// 25.5.1 Properties of the AsyncGenerator Prototype Object
const AsyncGeneratorPrototype = AsyncGenerator.prototype;
const AsyncIteratorPrototype = getPrototypeOf(AsyncGeneratorPrototype);
// 25.7.1 The AsyncFunction Constructor
// eslint-disable-next-line no-empty-function
async function AsyncFunctionInstance() {}
const AsyncFunction = getConstructorOf(AsyncFunctionInstance);
const intrinsics = {
'%InertFunction%': InertFunction,
'%ArrayIteratorPrototype%': ArrayIteratorPrototype,
'%InertAsyncFunction%': AsyncFunction,
'%AsyncGenerator%': AsyncGenerator,
'%InertAsyncGeneratorFunction%': AsyncGeneratorFunction,
'%AsyncGeneratorPrototype%': AsyncGeneratorPrototype,
'%AsyncIteratorPrototype%': AsyncIteratorPrototype,
'%Generator%': Generator,
'%InertGeneratorFunction%': GeneratorFunction,
'%IteratorPrototype%': IteratorPrototype,
'%MapIteratorPrototype%': MapIteratorPrototype,
'%RegExpStringIteratorPrototype%': RegExpStringIteratorPrototype,
'%SetIteratorPrototype%': SetIteratorPrototype,
'%StringIteratorPrototype%': StringIteratorPrototype,
'%ThrowTypeError%': ThrowTypeError,
'%TypedArray%': TypedArray,
'%InertCompartment%': InertCompartment,
};
if (globalThis.Iterator) {
intrinsics['%IteratorHelperPrototype%'] = getPrototypeOf(
// eslint-disable-next-line @endo/no-polymorphic-call
globalThis.Iterator.from([]).take(0),
);
intrinsics['%WrapForValidIteratorPrototype%'] = getPrototypeOf(
// eslint-disable-next-line @endo/no-polymorphic-call
globalThis.Iterator.from({ next() {} }),
);
}
if (globalThis.AsyncIterator) {
intrinsics['%AsyncIteratorHelperPrototype%'] = getPrototypeOf(
// eslint-disable-next-line @endo/no-polymorphic-call
globalThis.AsyncIterator.from([]).take(0),
);
intrinsics['%WrapForValidAsyncIteratorPrototype%'] = getPrototypeOf(
// eslint-disable-next-line @endo/no-polymorphic-call
globalThis.AsyncIterator.from({ next() {} }),
);
}
return intrinsics;
};