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_BUILTINS_OBJECT_STUB_BUILDER_H 17 #define ECMASCRIPT_COMPILER_BUILTINS_OBJECT_STUB_BUILDER_H 18 #include "ecmascript/compiler/builtins/builtins_stubs.h" 19 20 namespace panda::ecmascript::kungfu { 21 class BuiltinsObjectStubBuilder : public BuiltinsStubBuilder { 22 public: BuiltinsObjectStubBuilder(StubBuilder * parent)23 explicit BuiltinsObjectStubBuilder(StubBuilder *parent) 24 : BuiltinsStubBuilder(parent) {} BuiltinsObjectStubBuilder(BuiltinsStubBuilder * parent,GateRef glue,GateRef thisValue,GateRef numArgs)25 BuiltinsObjectStubBuilder(BuiltinsStubBuilder *parent, GateRef glue, GateRef thisValue, GateRef numArgs) 26 : BuiltinsStubBuilder(parent), glue_(glue), thisValue_(thisValue), numArgs_(numArgs) {} BuiltinsObjectStubBuilder(Environment * env,GateRef glue)27 BuiltinsObjectStubBuilder(Environment *env, GateRef glue) 28 : BuiltinsStubBuilder(env), glue_(glue) {} 29 ~BuiltinsObjectStubBuilder() override = default; 30 NO_MOVE_SEMANTIC(BuiltinsObjectStubBuilder); 31 NO_COPY_SEMANTIC(BuiltinsObjectStubBuilder); GenerateCircuit()32 void GenerateCircuit() override {} 33 34 #define DECLARE_BUILTINS_OBJECT_STUB_BUILDER(method, ...) \ 35 void method(Variable *result, Label *exit, Label *slowPath); 36 BUILTINS_WITH_OBJECT_STUB_BUILDER(DECLARE_BUILTINS_OBJECT_STUB_BUILDER) 37 #undef DECLARE_BUILTINS_OBJECT_STUB_BUILDER 38 39 GateRef CreateListFromArrayLike(GateRef glue, GateRef arrayObj); 40 GateRef CreateArrayFromList(GateRef glue, GateRef elements); 41 void HasOwnProperty(Variable *result, Label *exit, Label *slowPath, GateRef thisValue, GateRef prop, 42 GateRef hir = Circuit::NullGate()); 43 44 private: 45 GateRef GetNumKeysFromLayoutInfo(GateRef object, GateRef end, GateRef layoutInfo); 46 GateRef IsUninitializedProperty(GateRef object, GateRef index, GateRef layoutInfo); 47 GateRef GetNumKeysFromDictionary(GateRef array); 48 GateRef CopyFromEnumCache(GateRef glue, GateRef elements); 49 GateRef GetAllEnumKeys(GateRef glue, GateRef obj); 50 GateRef GetEnumElementKeys(GateRef glue, GateRef obj); 51 GateRef GetAllElementKeys(GateRef glue, GateRef obj, GateRef offset, GateRef array); 52 GateRef GetAllPropertyKeys(GateRef glue, GateRef obj, GateRef offset, GateRef array); 53 GateRef GetEnumElementEntries(GateRef glue, GateRef obj, Label *slowPath); 54 GateRef GetEnumPropertyEntries(GateRef glue, GateRef obj, Label *slowPath); 55 GateRef TestIntegrityLevel(GateRef glue, GateRef obj, GateRef level, Label *slowPath); 56 GateRef ObjectSetPrototype(GateRef glue, GateRef obj, GateRef proto); 57 GateRef IsNotSlowObjectKey(GateRef obj); 58 void LayoutInfoGetAllEnumKeys(GateRef end, GateRef offset, GateRef array, GateRef object, GateRef layoutInfo); 59 void AssignEnumElementProperty(Variable *res, Label *funcExit, GateRef toAssign, GateRef source); 60 void LayoutInfoAssignAllEnumProperty(Variable *res, Label *funcExit, GateRef toAssign, GateRef source); 61 void NameDictionaryAssignAllEnumProperty(Variable *res, Label *funcExit, GateRef toAssign, GateRef source, 62 GateRef properties); 63 void SlowAssign(Variable *res, Label *funcExit, GateRef toAssign, GateRef source); 64 void FastAssign(Variable *res, Label *funcExit, GateRef toAssign, GateRef source); 65 void AssignAllEnumProperty(Variable *res, Label *funcExit, GateRef toAssign, GateRef source); 66 void Assign(Variable *res, Label *nextIt, Label *funcExit, GateRef toAssign, GateRef source); 67 68 GateRef glue_ {Circuit::NullGate()}; 69 GateRef thisValue_ {Circuit::NullGate()}; 70 GateRef numArgs_ {Circuit::NullGate()}; 71 }; 72 } // namespace panda::ecmascript::kungfu 73 #endif // ECMASCRIPT_COMPILER_BUILTINS_OBJECT_STUB_BUILDER_H 74