1 /*
2 * Copyright (c) 2022-2024 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 #include "ecmascript/compiler/builtins/builtins_call_signature.h"
16 #include "ecmascript/compiler/builtins/builtins_stubs.h"
17 #include "ecmascript/compiler/call_signature.h"
18 #include "ecmascript/global_env_fields.h"
19
20 namespace panda::ecmascript::kungfu {
21 CallSignature BuiltinsStubCSigns::callSigns_[BuiltinsStubCSigns::NUM_OF_BUILTINS_STUBS];
22 CallSignature BuiltinsStubCSigns::builtinsCSign_;
23 CallSignature BuiltinsStubCSigns::builtinsWithArgvCSign_;
24
Initialize()25 void BuiltinsStubCSigns::Initialize()
26 {
27 #define COMMON_INIT(name) \
28 callSigns_[name].SetID(name); \
29 callSigns_[name].SetName(std::string("BuiltinStub_") + #name); \
30 callSigns_[name].SetConstructor( \
31 [](void* env) { \
32 return static_cast<void*>( \
33 new name##StubBuilder(&callSigns_[name], \
34 static_cast<Environment*>(env))); \
35 });
36
37 #define INIT_BUILTINS_METHOD(name) \
38 BuiltinsCallSignature::Initialize(&callSigns_[name]); \
39 COMMON_INIT(name)
40
41 #define INIT_BUILTINS_METHOD_DYN(name, type, ...) \
42 BuiltinsCallSignature::Initialize(&callSigns_[type##name]); \
43 COMMON_INIT(type##name)
44
45 #define INIT_BUILTINS_CONSTRUCTOR_METHOD(name) \
46 BuiltinsWithArgvCallSignature::Initialize(&callSigns_[name]); \
47 COMMON_INIT(name)
48
49 BUILTINS_STUB_LIST(INIT_BUILTINS_METHOD, INIT_BUILTINS_METHOD_DYN, INIT_BUILTINS_CONSTRUCTOR_METHOD)
50 #undef INIT_BUILTINS_METHOD_DYN
51 #undef INIT_BUILTINS_METHOD
52
53 #undef COMMON_INIT
54 BuiltinsCallSignature::Initialize(&builtinsCSign_);
55 BuiltinsWithArgvCallSignature::Initialize(&builtinsWithArgvCSign_);
56 }
57
GetCSigns(std::vector<const CallSignature * > & outCSigns)58 void BuiltinsStubCSigns::GetCSigns(std::vector<const CallSignature*>& outCSigns)
59 {
60 const size_t firstStubId = BUILTINS_STUB_ID(NONE) + 1;
61 for (size_t i = firstStubId; i < NUM_OF_BUILTINS_STUBS; i++) {
62 outCSigns.push_back(&callSigns_[i]);
63 }
64 }
65
GetGlobalEnvIndex(ID builtinId)66 size_t BuiltinsStubCSigns::GetGlobalEnvIndex(ID builtinId)
67 {
68 switch (builtinId) {
69 case BuiltinsStubCSigns::ID::NumberConstructor:
70 return static_cast<size_t>(GlobalEnvField::NUMBER_FUNCTION_INDEX);
71 case BuiltinsStubCSigns::ID::BigIntConstructor:
72 return static_cast<size_t>(GlobalEnvField::BIGINT_FUNCTION_INDEX);
73 default:
74 LOG_COMPILER(FATAL) << "this branch is unreachable";
75 UNREACHABLE();
76 }
77 }
78 } // namespace panda::ecmascript::kungfu
79