-
Notifications
You must be signed in to change notification settings - Fork 71
/
get-anonymous-intrinsics.js
138 lines (109 loc) · 4.28 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
import {
FERAL_FUNCTION,
Float32Array,
Map,
Set,
String,
getOwnPropertyDescriptor,
getPrototypeOf,
iterateArray,
iterateMap,
iterateSet,
iterateString,
matchAllRegExp,
matchAllSymbol,
regexpPrototype,
} from './commons.js';
import { InertCompartment } from './compartment-shim.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 ThrowTypeError = getOwnPropertyDescriptor(makeArguments(), 'callee')
.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,
};
return intrinsics;
};