1/*
2 * Copyright (c) 2023 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_COMPILER_BUILTIN_INLINE_H
17#define ECMASCRIPT_COMPILER_BUILTIN_INLINE_H
18
19#include "ecmascript/compiler/builtins/builtins_call_signature.h"
20#include "ecmascript/compiler/circuit_builder.h"
21#include "ecmascript/compiler/gate_accessor.h"
22#include "ecmascript/compiler/graph_linearizer.h"
23#include "ecmascript/compiler/pass_manager.h"
24#include "ecmascript/compiler/share_gate_meta_data.h"
25#include "ecmascript/compiler/type_info_accessors.h"
26#include "ecmascript/js_dataview.h"
27
28namespace panda::ecmascript::kungfu {
29class NativeInlineLowering {
30public:
31    explicit NativeInlineLowering(Circuit *circuit, CompilationConfig* cmpCfg, PassContext *ctx, bool enableLog,
32                                  const std::string& name, Chunk *chunk)
33        : circuit_(circuit),
34          builder_(circuit, cmpCfg),
35          acc_(circuit),
36          glue_(acc_.GetGlueFromArgList()),
37          enableLog_(enableLog),
38          methodName_(name),
39          nocheck_(ctx->GetCompilationEnv()->GetJSOptions().IsCompilerNoCheck()),
40          traceInline_(ctx->GetCompilationEnv()->GetJSOptions().GetTraceInline()),
41          compilationEnv_(ctx->GetCompilationEnv()),
42          chunk_(chunk) {}
43    ~NativeInlineLowering() = default;
44    void RunNativeInlineLowering();
45
46private:
47    enum IncludesOrIndexOf : uint8_t { INCLUDES = 0, INDEXOF };
48    std::optional<std::pair<size_t, bool>> GetCallInfo(GateRef gate);
49    void TryInlineStringFromCharCode(GateRef gate, size_t argc, bool skipThis);
50    void TryInlineStringCharCodeAt(GateRef gate, size_t argc, bool skipThis);
51    void TryInlineStringSubstring(GateRef gate, size_t argc, bool skipThis);
52    void TryInlineStringSubStr(GateRef gate, size_t argc, bool skipThis);
53    void TryInlineStringSlice(GateRef gate, size_t argc, bool skipThis);
54    void TryInlineNumberIsFinite(GateRef gate, size_t argc, bool skipThis);
55    void TryInlineNumberIsInteger(GateRef gate, size_t argc, bool skipThis);
56    void TryInlineNumberIsNaN(GateRef gate, size_t argc, bool skipThis);
57    void TryInlineNumberParseFloat(GateRef gate, size_t argc, bool skipThis);
58    void TryInlineNumberParseInt(GateRef gate, size_t argc, bool skipThis);
59    void TryInlineNumberIsSafeInteger(GateRef gate, size_t argc, bool skipThis);
60    void TryInlineTypedArrayIteratorBuiltin(GateRef gate, BuiltinsStubCSigns::ID id,
61                                            const GateMetaData* op, bool skipThis);
62    void TryInlineMathUnaryBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op,
63                                   bool skipThis);
64    void TryInlineMathBinaryBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op,
65                                    bool skipThis);
66    void TryInlineMathImulBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op,
67                                  bool skipThis);
68    void TryInlineGlobalFiniteBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op,
69                                      bool skipThis);
70    void TryInlineGlobalNanBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op,
71                                   bool skipThis);
72    void TryInlineMathMinMaxBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, const GateMetaData* op,
73                                    double defaultValue, bool skipThis);
74    void TryInlineMathAbsBuiltin(GateRef gate, size_t argc, bool skipThis);
75    void TryInlineMathClz32Builtin(GateRef gate, size_t argc, bool skipThis);
76    void TryInlineArrayBufferIsView(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
77    void TryInlineBigIntAsIntN(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
78    void TryInlineDataViewGet(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
79    void TryInlineDataViewSet(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
80    void InlineStubBuiltin(GateRef gate, size_t builtinArgc, size_t realArgc, BuiltinsStubCSigns::ID id,
81        const GateMetaData* op, bool skipThis);
82    void TryInlineDateGetTime(GateRef gate, size_t argc, bool skipThis);
83    void TryInlineWhitoutParamBuiltin(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id,
84                                      const GateMetaData* op, bool skipThis);
85    void TryInlineObjectIs(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
86    void TryInlineObjectGetPrototypeOf(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
87    void TryInlineObjectGetProto(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
88    void TryInlineObjectCreate(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
89    void TryInlineObjectIsPrototypeOf(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
90    void TryInlineObjectHasOwnProperty(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
91    void TryInlineReflectGetPrototypeOf(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
92    void TryInlineReflectGet(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
93    void TryInlineReflectHas(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
94    void TryInlineReflectConstruct(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
95    void TryInlineReflectApply(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
96    void TryInlineFunctionPrototypeApply(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
97    void TryInlineFunctionPrototypeBind(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
98    void TryInlineFunctionPrototypeCall(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
99    void TryInlineFunctionPrototypeHasInstance(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
100
101    void TryInlineBigIntConstructor(GateRef gate, size_t argc, bool skipThis);
102    void ReplaceGateWithPendingException(GateRef hirGate, GateRef value);
103    void AddTraceLogs(GateRef gate, BuiltinsStubCSigns::ID id);
104    void TryInlineIndexOfIncludes(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
105    void TryInlineArrayIterator(GateRef gate, BuiltinsStubCSigns::ID id, bool skipThis);
106    void TryInlineArrayForEach(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
107    void TryInlineArrayFindOrFindIndex(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
108    void TryInlineArrayFilter(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
109    void TryInlineArrayMap(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
110    void TryInlineArraySome(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
111    void TryInlineArrayEvery(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
112    void TryInlineArrayPop(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
113    void TryInlineArraySlice(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
114    void TryInlineArraySort(GateRef gate, size_t argc, BuiltinsStubCSigns::ID id, bool skipThis);
115
116    bool EnableLog() const
117    {
118        return enableLog_;
119    }
120
121    const std::string& GetMethodName() const
122    {
123        return methodName_;
124    }
125
126    bool Uncheck() const
127    {
128        return nocheck_;
129    }
130
131    bool EnableTrace() const
132    {
133        return traceInline_;
134    }
135
136private:
137    Circuit *circuit_ {nullptr};
138    CircuitBuilder builder_;
139    GateAccessor acc_;
140    GateRef glue_;
141    bool enableLog_;
142    std::string methodName_;
143    bool nocheck_;
144    bool traceInline_;
145    const CompilationEnv *compilationEnv_ {nullptr};
146    Chunk* chunk_ {nullptr};
147};
148}
149#endif // ECMASCRIPT_COMPILER_BUILTIN_INLINE_H
150