1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef ECMASCRIPT_BUILTINS_H 17 #define ECMASCRIPT_BUILTINS_H 18 19 #include "ecmascript/builtins/builtins_lazy_callback.h" 20 #include "ecmascript/global_env.h" 21 #include "ecmascript/js_function.h" 22 #include "ecmascript/js_handle.h" 23 #include "ecmascript/js_tagged_value.h" 24 #include "ecmascript/js_thread.h" 25 #include "ecmascript/object_factory.h" 26 27 namespace panda::ecmascript { 28 struct ErrorParameter { 29 EcmaEntrypoint nativeConstructor{nullptr}; 30 EcmaEntrypoint nativeMethod{nullptr}; 31 std::string_view nativePropertyName{}; 32 JSType nativeJstype{JSType::INVALID}; 33 }; 34 35 enum FunctionLength : uint8_t { ZERO = 0, ONE, TWO, THREE, FOUR }; 36 37 class Builtins { 38 public: 39 Builtins() = default; Builtins(JSThread * thread,ObjectFactory * factory,EcmaVM * vm)40 Builtins(JSThread *thread, ObjectFactory *factory, EcmaVM *vm) 41 : thread_(thread), factory_(factory), vm_(vm) {} 42 ~Builtins() = default; 43 NO_COPY_SEMANTIC(Builtins); 44 NO_MOVE_SEMANTIC(Builtins); 45 46 void Initialize(const JSHandle<GlobalEnv> &env, JSThread *thread, bool lazyInit = false, bool isRealm = false); 47 void InitializeForSnapshot(JSThread *thread); 48 49 private: 50 JSThread *thread_{nullptr}; 51 ObjectFactory *factory_{nullptr}; 52 EcmaVM *vm_{nullptr}; 53 54 JSHandle<JSFunction> NewBuiltinConstructor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 55 EcmaEntrypoint ctorFunc, std::string_view name, int length, 56 kungfu::BuiltinsStubCSigns::ID builtinId = 57 kungfu::BuiltinsStubCSigns::INVALID) const; 58 59 JSHandle<JSFunction> NewBuiltinCjsCtor(const JSHandle<GlobalEnv> &env, 60 const JSHandle<JSObject> &prototype, EcmaEntrypoint ctorFunc, 61 std::string_view name, int length) const; 62 63 JSHandle<JSFunction> NewFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &key, 64 EcmaEntrypoint func, int length, 65 kungfu::BuiltinsStubCSigns::ID builtinId = 66 kungfu::BuiltinsStubCSigns::INVALID) const; 67 68 void InitializePropertyDetector(const JSHandle<GlobalEnv> &env, bool lazyInit) const; 69 70 void SetLazyAccessor(const JSHandle<JSObject> &object, const JSHandle<JSTaggedValue> &key, 71 const JSHandle<AccessorData> &accessor) const; 72 73 void InitializeCtor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 74 const JSHandle<JSFunction> &ctor, std::string_view name, int length) const; 75 76 void InitializeGlobalObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject); 77 78 void InitializeFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &emptyFuncClass) const; 79 80 void InitializeObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &objFuncPrototype, 81 const JSHandle<JSObject> &objFunc); 82 83 void InitializeNumber(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject, 84 const JSHandle<JSHClass> &primRefObjClass); 85 86 void InitializeBigInt(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &primRefObjClass) const; 87 88 void InitializeBigIntWithRealm(const JSHandle<GlobalEnv> &realm) const; 89 90 void InitializeDate(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 91 void LazyInitializeDate(const JSHandle<GlobalEnv> &env) const; 92 93 void InitializeBoolean(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &primRefObjClass) const; 94 95 void InitializeSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 96 97 void InitializeSymbolWithRealm(const JSHandle<GlobalEnv> &realm, const JSHandle<JSHClass> &objFuncInstanceHClass); 98 99 void InitializeArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 100 101 void InitializeTypedArray(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 102 void LazyInitializeTypedArray(const JSHandle<GlobalEnv> &env) const; 103 104 void InitializeInt8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 105 void LazyInitializeInt8Array(const JSHandle<GlobalEnv> &env) const; 106 107 void InitializeUint8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 108 void LazyInitializeUint8Array(const JSHandle<GlobalEnv> &env) const; 109 110 void InitializeUint8ClampedArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 111 void LazyInitializeUint8ClampedArray(const JSHandle<GlobalEnv> &env) const; 112 113 void InitializeInt16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 114 void LazyInitializeInt16Array(const JSHandle<GlobalEnv> &env) const; 115 116 void InitializeUint16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 117 void LazyInitializeUint16Array(const JSHandle<GlobalEnv> &env) const; 118 119 void InitializeInt32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 120 void LazyInitializeInt32Array(const JSHandle<GlobalEnv> &env) const; 121 122 void InitializeUint32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 123 void LazyInitializeUint32Array(const JSHandle<GlobalEnv> &env) const; 124 125 void InitializeFloat32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 126 void LazyInitializeFloat32Array(const JSHandle<GlobalEnv> &env) const; 127 128 void InitializeFloat64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 129 void LazyInitializeFloat64Array(const JSHandle<GlobalEnv> &env) const; 130 131 void InitializeBigInt64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 132 void LazyInitializeBigInt64Array(const JSHandle<GlobalEnv> &env) const; 133 134 void InitializeBigUint64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 135 void LazyInitializeBigUint64Array(const JSHandle<GlobalEnv> &env) const; 136 137 void InitializeAllTypeError(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 138 139 void InitializeAllTypeErrorWithRealm(const JSHandle<GlobalEnv> &realm) const; 140 141 void InitializeError(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass, 142 const JSType &errorTag) const; 143 144 void SetErrorWithRealm(const JSHandle<GlobalEnv> &realm, const JSType &errorTag) const; 145 146 void InitializeRegExp(const JSHandle<GlobalEnv> &env); 147 148 // for Intl. 149 JSHandle<JSFunction> NewIntlConstructor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 150 EcmaEntrypoint ctorFunc, std::string_view name, int length); 151 void InitializeIntlCtor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 152 const JSHandle<JSFunction> &ctor, std::string_view name, int length); 153 void InitializeIntl(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeValue); 154 void InitializeLocale(const JSHandle<GlobalEnv> &env); 155 void InitializeDateTimeFormat(const JSHandle<GlobalEnv> &env); 156 void InitializeRelativeTimeFormat(const JSHandle<GlobalEnv> &env); 157 void InitializeNumberFormat(const JSHandle<GlobalEnv> &env); 158 void InitializeCollator(const JSHandle<GlobalEnv> &env); 159 void InitializePluralRules(const JSHandle<GlobalEnv> &env); 160 void InitializeDisplayNames(const JSHandle<GlobalEnv> &env); 161 void InitializeListFormat(const JSHandle<GlobalEnv> &env); 162 163 void LazyInitializeLocale(const JSHandle<GlobalEnv> &env) const; 164 void LazyInitializeDateTimeFormat(const JSHandle<GlobalEnv> &env) const; 165 void LazyInitializeNumberFormat(const JSHandle<GlobalEnv> &env) const; 166 void LazyInitializeRelativeTimeFormat(const JSHandle<GlobalEnv> &env) const; 167 void LazyInitializeCollator(const JSHandle<GlobalEnv> &env) const; 168 void LazyInitializePluralRules(const JSHandle<GlobalEnv> &env) const; 169 void LazyInitializeDisplayNames(const JSHandle<GlobalEnv> &env) const; 170 void LazyInitializeListFormat(const JSHandle<GlobalEnv> &env) const; 171 172 void GeneralUpdateError(ErrorParameter *error, EcmaEntrypoint constructor, EcmaEntrypoint method, 173 std::string_view name, JSType type) const; 174 175 void InitializeSet(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 176 void LazyInitializeSet(const JSHandle<GlobalEnv> &env); 177 178 void InitializeMap(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 179 void LazyInitializeMap(const JSHandle<GlobalEnv> &env) const; 180 181 void InitializeWeakMap(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 182 void LazyInitializeWeakMap(const JSHandle<GlobalEnv> &env) const; 183 184 void InitializeWeakSet(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 185 void LazyInitializeWeakSet(const JSHandle<GlobalEnv> &env) const; 186 187 void InitializeWeakRef(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 188 void LazyInitializeWeakRef(const JSHandle<GlobalEnv> &env) const; 189 190 void InitializeFinalizationRegistry(const JSHandle<GlobalEnv> &env, 191 const JSHandle<JSHClass> &objFuncClass) const; 192 void LazyInitializeFinalizationRegistry(const JSHandle<GlobalEnv> &env) const; 193 194 void InitializeMath(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 195 196 void InitializeAtomics(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 197 198 void InitializeJson(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 199 200 void InitializeString(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 201 202 void InitializeIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 203 204 void InitializeRegexpIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 205 206 void InitializeStringIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 207 208 void InitializeAsyncFromSyncIterator(const JSHandle<GlobalEnv> &env, 209 const JSHandle<JSHClass> &iteratorFuncClass) const; 210 211 void InitializeForinIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 212 213 void InitializeMapIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 214 215 void InitializeSetIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 216 217 void InitializeArrayIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 218 219 void InitializeArrayBuffer(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 220 void LazyInitializeArrayBuffer(const JSHandle<GlobalEnv> &env) const; 221 222 void InitializeSharedArrayBuffer(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 223 void LazyInitializeSharedArrayBuffer(const JSHandle<GlobalEnv> &env) const; 224 225 void InitializeDataView(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 226 void LazyInitializeDataView(const JSHandle<GlobalEnv> &env) const; 227 228 void InitializeForPromiseFuncClass(const JSHandle<GlobalEnv> &env); 229 230 void InitializeProxy(const JSHandle<GlobalEnv> &env); 231 232 void InitializeReflect(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 233 234 void InitializeAsyncFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 235 236 void InitializeGeneratorFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 237 238 void InitializeAsyncGeneratorFunction(const JSHandle<GlobalEnv> &env, 239 const JSHandle<JSHClass> &objFuncClass) const; 240 241 void InitializeAsyncGenerator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 242 243 void InitializeAsyncIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 244 245 void InitializeGenerator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 246 247 JSHandle<JSFunction> InitializeExoticConstructor(const JSHandle<GlobalEnv> &env, EcmaEntrypoint ctorFunc, 248 std::string_view name, int length); 249 250 void InitializePromise(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &promiseFuncClass); 251 252 void InitializePromiseJob(const JSHandle<GlobalEnv> &env); 253 254 void InitializeModuleNamespace(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 255 256 void InitializeCjsModule(const JSHandle<GlobalEnv> &env) const; 257 258 void InitializeCjsExports(const JSHandle<GlobalEnv> &env) const; 259 260 void InitializeCjsRequire(const JSHandle<GlobalEnv> &env) const; 261 262 void InitializeDefaultExportOfScript(const JSHandle<GlobalEnv> &env) const; 263 264 void SetFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, std::string_view key, 265 EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = 266 kungfu::BuiltinsStubCSigns::INVALID) const; 267 268 void SetFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 269 EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = 270 kungfu::BuiltinsStubCSigns::INVALID) const; 271 272 JSHandle<JSFunction> SetAndReturnFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 273 const char *key, EcmaEntrypoint func, int length, 274 kungfu::BuiltinsStubCSigns::ID builtinId = 275 kungfu::BuiltinsStubCSigns::INVALID) const ; 276 277 JSHandle<JSFunction> SetAndReturnFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 278 const JSHandle<JSTaggedValue> &key, EcmaEntrypoint func, int length, 279 kungfu::BuiltinsStubCSigns::ID builtinId = 280 kungfu::BuiltinsStubCSigns::INVALID) const; 281 282 void SetFuncToObjAndGlobal(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject, 283 const JSHandle<JSObject> &obj, std::string_view key, EcmaEntrypoint func, int length, 284 kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID); 285 286 template<int type = JSSymbol::SYMBOL_DEFAULT_TYPE> 287 void SetFunctionAtSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 288 const JSHandle<JSTaggedValue> &symbol, std::string_view name, EcmaEntrypoint func, 289 int length) const; 290 291 template<int type = JSSymbol::SYMBOL_DEFAULT_TYPE> 292 JSHandle<JSTaggedValue> SetAndReturnFunctionAtSymbol(const JSHandle<GlobalEnv> &env, 293 const JSHandle<JSObject> &obj, 294 const JSHandle<JSTaggedValue> &symbol, 295 std::string_view name, 296 EcmaEntrypoint func, 297 int length) const; 298 299 void SetStringTagSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 300 std::string_view key) const; 301 JSHandle<JSTaggedValue> CreateGetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 302 std::string_view name, int length) const; 303 JSHandle<JSTaggedValue> CreateGetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 304 JSHandle<JSTaggedValue> key, int length) const; 305 306 void SetConstant(const JSHandle<JSObject> &obj, std::string_view key, JSTaggedValue value) const; 307 308 void SetGlobalThis(const JSHandle<JSObject> &obj, std::string_view key, 309 const JSHandle<JSTaggedValue> &globalValue); 310 311 void SetAttribute(const JSHandle<JSObject> &obj, std::string_view key, std::string_view value) const; 312 313 void SetNoneAttributeProperty(const JSHandle<JSObject> &obj, std::string_view key, 314 const JSHandle<JSTaggedValue> &value) const; 315 316 void StrictModeForbiddenAccessCallerArguments(const JSHandle<GlobalEnv> &env, 317 const JSHandle<JSObject> &prototype) const; 318 319 JSHandle<JSTaggedValue> CreateSetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 320 std::string_view name, int length) const; 321 JSHandle<JSTaggedValue> CreateSetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 322 JSHandle<JSTaggedValue> key, int length) const; 323 324 void SetArgumentsSharedAccessor(const JSHandle<GlobalEnv> &env); 325 void SetAccessor(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 326 const JSHandle<JSTaggedValue> &getter, const JSHandle<JSTaggedValue> &setter) const; 327 void SetGetter(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 328 const JSHandle<JSTaggedValue> &getter) const; 329 JSHandle<JSObject> InitializeArkTools(const JSHandle<GlobalEnv> &env) const; 330 void InitializeGlobalRegExp(JSHandle<JSObject> &obj) const; 331 // Using to initialize jsapi container 332 JSHandle<JSObject> InitializeArkPrivate(const JSHandle<GlobalEnv> &env) const; 333 void SetConstantObject(const JSHandle<JSObject> &obj, std::string_view key, 334 JSHandle<JSTaggedValue> &value) const; 335 void SetFrozenFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, std::string_view key, 336 EcmaEntrypoint func, int length) const; 337 void SetNonConstantObject(const JSHandle<JSObject> &obj, std::string_view key, 338 JSHandle<JSTaggedValue> &value) const; 339 void InitializeSObjectAndSFunction(const JSHandle<GlobalEnv> &env); 340 void InitializeSObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &sObjIHClass, 341 const JSHandle<JSObject> &sObjFuncPrototype) const; 342 void InitializeSFunciton(const JSHandle<GlobalEnv> &env, 343 const JSHandle<JSHClass> &sFuncPrototypeHClass) const; 344 void InitializeSCtor(const JSHandle<JSHClass> &protoHClass, const JSHandle<JSFunction> &ctor, 345 std::string_view name, int length) const; 346 347 void SetSFunctionName(const JSHandle<JSFunction> &ctor, std::string_view name) const; 348 void SetSFunctionName(const JSHandle<JSFunction> &ctor, const JSHandle<JSTaggedValue> &name) const; 349 void SetSFunctionLength(const JSHandle<JSFunction> &ctor, int length) const; 350 351 JSHandle<JSFunction> NewSFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &key, 352 EcmaEntrypoint func, int length, 353 kungfu::BuiltinsStubCSigns::ID builtinId = 354 kungfu::BuiltinsStubCSigns::INVALID) const; 355 356 void SetSFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, std::string_view key, 357 EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = 358 kungfu::BuiltinsStubCSigns::INVALID) const; 359 360 void SetSFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 361 const JSHandle<JSTaggedValue> &key, EcmaEntrypoint func, int length, 362 kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; 363 void SetSAccessor(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 364 const JSHandle<JSTaggedValue> &getter, const JSHandle<JSTaggedValue> &setter) const; 365 366 JSHandle<JSTaggedValue> CreateSGetterSetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 367 std::string_view name, int length) const; 368 void SharedStrictModeForbiddenAccessCallerArguments(const JSHandle<GlobalEnv> &env, 369 const JSHandle<JSObject> &prototype) const; 370 friend class builtins::BuiltinsLazyCallback; 371 }; 372 } // namespace panda::ecmascript 373 #endif // ECMASCRIPT_BUILTINS_H 374