/* * Copyright (c) 2021-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ECMASCRIPT_BUILTINS_H #define ECMASCRIPT_BUILTINS_H #include "ecmascript/builtins/builtins_lazy_callback.h" #include "ecmascript/global_env.h" #include "ecmascript/js_function.h" #include "ecmascript/js_handle.h" #include "ecmascript/js_tagged_value.h" #include "ecmascript/js_thread.h" #include "ecmascript/object_factory.h" namespace panda::ecmascript { struct ErrorParameter { EcmaEntrypoint nativeConstructor{nullptr}; EcmaEntrypoint nativeMethod{nullptr}; std::string_view nativePropertyName{}; JSType nativeJstype{JSType::INVALID}; }; enum FunctionLength : uint8_t { ZERO = 0, ONE, TWO, THREE, FOUR }; class Builtins { public: Builtins() = default; Builtins(JSThread *thread, ObjectFactory *factory, EcmaVM *vm) : thread_(thread), factory_(factory), vm_(vm) {} ~Builtins() = default; NO_COPY_SEMANTIC(Builtins); NO_MOVE_SEMANTIC(Builtins); void Initialize(const JSHandle &env, JSThread *thread, bool lazyInit = false, bool isRealm = false); void InitializeForSnapshot(JSThread *thread); private: JSThread *thread_{nullptr}; ObjectFactory *factory_{nullptr}; EcmaVM *vm_{nullptr}; JSHandle NewBuiltinConstructor(const JSHandle &env, const JSHandle &prototype, EcmaEntrypoint ctorFunc, std::string_view name, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; JSHandle NewBuiltinCjsCtor(const JSHandle &env, const JSHandle &prototype, EcmaEntrypoint ctorFunc, std::string_view name, int length) const; JSHandle NewFunction(const JSHandle &env, const JSHandle &key, EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; void InitializePropertyDetector(const JSHandle &env, bool lazyInit) const; void SetLazyAccessor(const JSHandle &object, const JSHandle &key, const JSHandle &accessor) const; void InitializeCtor(const JSHandle &env, const JSHandle &prototype, const JSHandle &ctor, std::string_view name, int length) const; void InitializeGlobalObject(const JSHandle &env, const JSHandle &globalObject); void InitializeFunction(const JSHandle &env, const JSHandle &emptyFuncClass) const; void InitializeObject(const JSHandle &env, const JSHandle &objFuncPrototype, const JSHandle &objFunc); void InitializeNumber(const JSHandle &env, const JSHandle &globalObject, const JSHandle &primRefObjClass); void InitializeBigInt(const JSHandle &env, const JSHandle &primRefObjClass) const; void InitializeBigIntWithRealm(const JSHandle &realm) const; void InitializeDate(const JSHandle &env, JSHandle objFuncPrototypeVal) const; void LazyInitializeDate(const JSHandle &env) const; void InitializeBoolean(const JSHandle &env, const JSHandle &primRefObjClass) const; void InitializeSymbol(const JSHandle &env, const JSHandle &objFuncClass) const; void InitializeSymbolWithRealm(const JSHandle &realm, const JSHandle &objFuncInstanceHClass); void InitializeArray(const JSHandle &env, const JSHandle &objFuncPrototypeVal) const; void InitializeTypedArray(const JSHandle &env, JSHandle objFuncPrototypeVal) const; void LazyInitializeTypedArray(const JSHandle &env) const; void InitializeInt8Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeInt8Array(const JSHandle &env) const; void InitializeUint8Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeUint8Array(const JSHandle &env) const; void InitializeUint8ClampedArray(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeUint8ClampedArray(const JSHandle &env) const; void InitializeInt16Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeInt16Array(const JSHandle &env) const; void InitializeUint16Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeUint16Array(const JSHandle &env) const; void InitializeInt32Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeInt32Array(const JSHandle &env) const; void InitializeUint32Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeUint32Array(const JSHandle &env) const; void InitializeFloat32Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeFloat32Array(const JSHandle &env) const; void InitializeFloat64Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeFloat64Array(const JSHandle &env) const; void InitializeBigInt64Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeBigInt64Array(const JSHandle &env) const; void InitializeBigUint64Array(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeBigUint64Array(const JSHandle &env) const; void InitializeAllTypeError(const JSHandle &env, const JSHandle &objFuncClass) const; void InitializeAllTypeErrorWithRealm(const JSHandle &realm) const; void InitializeError(const JSHandle &env, const JSHandle &objFuncClass, const JSType &errorTag) const; void SetErrorWithRealm(const JSHandle &realm, const JSType &errorTag) const; void InitializeRegExp(const JSHandle &env); // for Intl. JSHandle NewIntlConstructor(const JSHandle &env, const JSHandle &prototype, EcmaEntrypoint ctorFunc, std::string_view name, int length); void InitializeIntlCtor(const JSHandle &env, const JSHandle &prototype, const JSHandle &ctor, std::string_view name, int length); void InitializeIntl(const JSHandle &env, const JSHandle &objFuncPrototypeValue); void InitializeLocale(const JSHandle &env); void InitializeDateTimeFormat(const JSHandle &env); void InitializeRelativeTimeFormat(const JSHandle &env); void InitializeNumberFormat(const JSHandle &env); void InitializeCollator(const JSHandle &env); void InitializePluralRules(const JSHandle &env); void InitializeDisplayNames(const JSHandle &env); void InitializeListFormat(const JSHandle &env); void LazyInitializeLocale(const JSHandle &env) const; void LazyInitializeDateTimeFormat(const JSHandle &env) const; void LazyInitializeNumberFormat(const JSHandle &env) const; void LazyInitializeRelativeTimeFormat(const JSHandle &env) const; void LazyInitializeCollator(const JSHandle &env) const; void LazyInitializePluralRules(const JSHandle &env) const; void LazyInitializeDisplayNames(const JSHandle &env) const; void LazyInitializeListFormat(const JSHandle &env) const; void GeneralUpdateError(ErrorParameter *error, EcmaEntrypoint constructor, EcmaEntrypoint method, std::string_view name, JSType type) const; void InitializeSet(const JSHandle &env, JSHandle objFuncPrototypeVal) const; void LazyInitializeSet(const JSHandle &env); void InitializeMap(const JSHandle &env, JSHandle objFuncPrototypeVal) const; void LazyInitializeMap(const JSHandle &env) const; void InitializeWeakMap(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeWeakMap(const JSHandle &env) const; void InitializeWeakSet(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeWeakSet(const JSHandle &env) const; void InitializeWeakRef(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeWeakRef(const JSHandle &env) const; void InitializeFinalizationRegistry(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeFinalizationRegistry(const JSHandle &env) const; void InitializeMath(const JSHandle &env, const JSHandle &objFuncPrototypeVal) const; void InitializeAtomics(const JSHandle &env, const JSHandle &objFuncPrototypeVal) const; void InitializeJson(const JSHandle &env, const JSHandle &objFuncPrototypeVal) const; void InitializeString(const JSHandle &env, JSHandle objFuncPrototypeVal) const; void InitializeIterator(const JSHandle &env, const JSHandle &objFuncClass) const; void InitializeRegexpIterator(const JSHandle &env, const JSHandle &iteratorFuncClass) const; void InitializeStringIterator(const JSHandle &env, const JSHandle &iteratorFuncClass) const; void InitializeAsyncFromSyncIterator(const JSHandle &env, const JSHandle &iteratorFuncClass) const; void InitializeForinIterator(const JSHandle &env, const JSHandle &iteratorFuncClass) const; void InitializeMapIterator(const JSHandle &env, const JSHandle &iteratorFuncClass) const; void InitializeSetIterator(const JSHandle &env, const JSHandle &iteratorFuncClass) const; void InitializeArrayIterator(const JSHandle &env, const JSHandle &iteratorFuncClass) const; void InitializeArrayBuffer(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeArrayBuffer(const JSHandle &env) const; void InitializeSharedArrayBuffer(const JSHandle &env, const JSHandle &objFuncClass) const; void LazyInitializeSharedArrayBuffer(const JSHandle &env) const; void InitializeDataView(const JSHandle &env, JSHandle objFuncPrototypeVal) const; void LazyInitializeDataView(const JSHandle &env) const; void InitializeForPromiseFuncClass(const JSHandle &env); void InitializeProxy(const JSHandle &env); void InitializeReflect(const JSHandle &env, const JSHandle &objFuncPrototypeVal) const; void InitializeAsyncFunction(const JSHandle &env, const JSHandle &objFuncClass) const; void InitializeGeneratorFunction(const JSHandle &env, const JSHandle &objFuncClass) const; void InitializeAsyncGeneratorFunction(const JSHandle &env, const JSHandle &objFuncClass) const; void InitializeAsyncGenerator(const JSHandle &env, const JSHandle &objFuncClass) const; void InitializeAsyncIterator(const JSHandle &env, const JSHandle &objFuncClass) const; void InitializeGenerator(const JSHandle &env, const JSHandle &objFuncClass) const; JSHandle InitializeExoticConstructor(const JSHandle &env, EcmaEntrypoint ctorFunc, std::string_view name, int length); void InitializePromise(const JSHandle &env, const JSHandle &promiseFuncClass); void InitializePromiseJob(const JSHandle &env); void InitializeModuleNamespace(const JSHandle &env, const JSHandle &objFuncClass) const; void InitializeCjsModule(const JSHandle &env) const; void InitializeCjsExports(const JSHandle &env) const; void InitializeCjsRequire(const JSHandle &env) const; void InitializeDefaultExportOfScript(const JSHandle &env) const; void SetFunction(const JSHandle &env, const JSHandle &obj, std::string_view key, EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; void SetFunction(const JSHandle &env, const JSHandle &obj, const JSHandle &key, EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; JSHandle SetAndReturnFunction(const JSHandle &env, const JSHandle &obj, const char *key, EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const ; JSHandle SetAndReturnFunction(const JSHandle &env, const JSHandle &obj, const JSHandle &key, EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; void SetFuncToObjAndGlobal(const JSHandle &env, const JSHandle &globalObject, const JSHandle &obj, std::string_view key, EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID); template void SetFunctionAtSymbol(const JSHandle &env, const JSHandle &obj, const JSHandle &symbol, std::string_view name, EcmaEntrypoint func, int length) const; template JSHandle SetAndReturnFunctionAtSymbol(const JSHandle &env, const JSHandle &obj, const JSHandle &symbol, std::string_view name, EcmaEntrypoint func, int length) const; void SetStringTagSymbol(const JSHandle &env, const JSHandle &obj, std::string_view key) const; JSHandle CreateGetter(const JSHandle &env, EcmaEntrypoint func, std::string_view name, int length) const; JSHandle CreateGetter(const JSHandle &env, EcmaEntrypoint func, JSHandle key, int length) const; void SetConstant(const JSHandle &obj, std::string_view key, JSTaggedValue value) const; void SetGlobalThis(const JSHandle &obj, std::string_view key, const JSHandle &globalValue); void SetAttribute(const JSHandle &obj, std::string_view key, std::string_view value) const; void SetNoneAttributeProperty(const JSHandle &obj, std::string_view key, const JSHandle &value) const; void StrictModeForbiddenAccessCallerArguments(const JSHandle &env, const JSHandle &prototype) const; JSHandle CreateSetter(const JSHandle &env, EcmaEntrypoint func, std::string_view name, int length) const; JSHandle CreateSetter(const JSHandle &env, EcmaEntrypoint func, JSHandle key, int length) const; void SetArgumentsSharedAccessor(const JSHandle &env); void SetAccessor(const JSHandle &obj, const JSHandle &key, const JSHandle &getter, const JSHandle &setter) const; void SetGetter(const JSHandle &obj, const JSHandle &key, const JSHandle &getter) const; JSHandle InitializeArkTools(const JSHandle &env) const; void InitializeGlobalRegExp(JSHandle &obj) const; // Using to initialize jsapi container JSHandle InitializeArkPrivate(const JSHandle &env) const; void SetConstantObject(const JSHandle &obj, std::string_view key, JSHandle &value) const; void SetFrozenFunction(const JSHandle &env, const JSHandle &obj, std::string_view key, EcmaEntrypoint func, int length) const; void SetNonConstantObject(const JSHandle &obj, std::string_view key, JSHandle &value) const; void InitializeSObjectAndSFunction(const JSHandle &env); void InitializeSObject(const JSHandle &env, const JSHandle &sObjIHClass, const JSHandle &sObjFuncPrototype) const; void InitializeSFunciton(const JSHandle &env, const JSHandle &sFuncPrototypeHClass) const; void InitializeSCtor(const JSHandle &protoHClass, const JSHandle &ctor, std::string_view name, int length) const; void SetSFunctionName(const JSHandle &ctor, std::string_view name) const; void SetSFunctionName(const JSHandle &ctor, const JSHandle &name) const; void SetSFunctionLength(const JSHandle &ctor, int length) const; JSHandle NewSFunction(const JSHandle &env, const JSHandle &key, EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; void SetSFunction(const JSHandle &env, const JSHandle &obj, std::string_view key, EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; void SetSFunction(const JSHandle &env, const JSHandle &obj, const JSHandle &key, EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; void SetSAccessor(const JSHandle &obj, const JSHandle &key, const JSHandle &getter, const JSHandle &setter) const; JSHandle CreateSGetterSetter(const JSHandle &env, EcmaEntrypoint func, std::string_view name, int length) const; void SharedStrictModeForbiddenAccessCallerArguments(const JSHandle &env, const JSHandle &prototype) const; friend class builtins::BuiltinsLazyCallback; }; } // namespace panda::ecmascript #endif // ECMASCRIPT_BUILTINS_H