From ac82a2c508201a344dd55465435b7d9abb5ec8ff Mon Sep 17 00:00:00 2001 From: Kirill Bychkov Date: Tue, 23 Jul 2024 17:09:19 +0300 Subject: [PATCH] Fix code check warnings Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/IAFBZH Testing: runned all test suites Signed-off-by: Kirill Bychkov --- ets2panda/checker/types/globalTypesHolder.cpp | 38 ++++++++----- ets2panda/checker/types/globalTypesHolder.h | 3 ++ ets2panda/checker/types/signature.cpp | 6 +-- ets2panda/checker/types/ts/interfaceType.cpp | 45 ++++++++++------ ets2panda/checker/types/ts/interfaceType.h | 3 ++ ets2panda/checker/types/ts/objectType.cpp | 42 +++++++++------ ets2panda/checker/types/ts/objectType.h | 1 + ets2panda/compiler/core/ETSCompiler.cpp | 9 ++-- ets2panda/compiler/core/ETSGen.h | 52 +++++++++++------- ets2panda/compiler/core/function.cpp | 54 ++++++++++--------- ets2panda/compiler/core/function.h | 2 + 11 files changed, 159 insertions(+), 96 deletions(-) diff --git a/ets2panda/checker/types/globalTypesHolder.cpp b/ets2panda/checker/types/globalTypesHolder.cpp index afb9eb0ece..1948e5c421 100644 --- a/ets2panda/checker/types/globalTypesHolder.cpp +++ b/ets2panda/checker/types/globalTypesHolder.cpp @@ -50,9 +50,25 @@ #include "util/helpers.h" namespace ark::es2panda::checker { -GlobalTypesHolder::GlobalTypesHolder(ArenaAllocator *allocator) : builtinNameMappings_(allocator->Adapter()) + +void GlobalTypesHolder::AddETSEscompatLayer() +{ + // ETS escompat layer + builtinNameMappings_.emplace("Array", GlobalTypeId::ETS_ARRAY_BUILTIN); + builtinNameMappings_.emplace("Date", GlobalTypeId::ETS_DATE_BUILTIN); + builtinNameMappings_.emplace("Error", GlobalTypeId::ETS_ERROR_BUILTIN); + builtinNameMappings_.emplace("OutOfMemoryError", GlobalTypeId::ETS_OUT_OF_MEMORY_ERROR_BUILTIN); + builtinNameMappings_.emplace("NoSuchMethodError", GlobalTypeId::ETS_NO_SUCH_METHOD_ERROR_BUILTIN); + builtinNameMappings_.emplace("DivideByZeroError", GlobalTypeId::ETS_DIVIDE_BY_ZERO_ERROR_BUILTIN); + builtinNameMappings_.emplace("NullPointerError", GlobalTypeId::ETS_NULL_POINTER_ERROR_BUILTIN); + builtinNameMappings_.emplace("UncaughtExceptionError", GlobalTypeId::ETS_UNCAUGHT_EXCEPTION_ERROR_BUILTIN); + builtinNameMappings_.emplace("Map", GlobalTypeId::ETS_MAP_BUILTIN); + builtinNameMappings_.emplace("RegExp", GlobalTypeId::ETS_REGEXP_BUILTIN); + builtinNameMappings_.emplace("Set", GlobalTypeId::ETS_SET_BUILTIN); +} + +void GlobalTypesHolder::AddTSSpecificTypes(ArenaAllocator *allocator) { - // TS specific types globalTypes_[static_cast(GlobalTypeId::NUMBER)] = allocator->New(); globalTypes_[static_cast(GlobalTypeId::ANY)] = allocator->New(); globalTypes_[static_cast(GlobalTypeId::STRING)] = allocator->New(); @@ -81,6 +97,12 @@ GlobalTypesHolder::GlobalTypesHolder(ArenaAllocator *allocator) : builtinNameMap globalTypes_[static_cast(GlobalTypeId::EMPTY_OBJECT)] = allocator->New(); globalTypes_[static_cast(GlobalTypeId::RESOLVING_RETURN_TYPE)] = allocator->New(); globalTypes_[static_cast(GlobalTypeId::ERROR_TYPE)] = allocator->New(); +} + +GlobalTypesHolder::GlobalTypesHolder(ArenaAllocator *allocator) : builtinNameMappings_(allocator->Adapter()) +{ + // TS specific types + AddTSSpecificTypes(allocator); // ETS specific types globalTypes_[static_cast(GlobalTypeId::BYTE)] = allocator->New(); @@ -137,17 +159,7 @@ GlobalTypesHolder::GlobalTypesHolder(ArenaAllocator *allocator) : builtinNameMap builtinNameMappings_.emplace("never", GlobalTypeId::ETS_NEVER_BUILTIN); // ETS escompat layer - builtinNameMappings_.emplace("Array", GlobalTypeId::ETS_ARRAY_BUILTIN); - builtinNameMappings_.emplace("Date", GlobalTypeId::ETS_DATE_BUILTIN); - builtinNameMappings_.emplace("Error", GlobalTypeId::ETS_ERROR_BUILTIN); - builtinNameMappings_.emplace("OutOfMemoryError", GlobalTypeId::ETS_OUT_OF_MEMORY_ERROR_BUILTIN); - builtinNameMappings_.emplace("NoSuchMethodError", GlobalTypeId::ETS_NO_SUCH_METHOD_ERROR_BUILTIN); - builtinNameMappings_.emplace("DivideByZeroError", GlobalTypeId::ETS_DIVIDE_BY_ZERO_ERROR_BUILTIN); - builtinNameMappings_.emplace("NullPointerError", GlobalTypeId::ETS_NULL_POINTER_ERROR_BUILTIN); - builtinNameMappings_.emplace("UncaughtExceptionError", GlobalTypeId::ETS_UNCAUGHT_EXCEPTION_ERROR_BUILTIN); - builtinNameMappings_.emplace("Map", GlobalTypeId::ETS_MAP_BUILTIN); - builtinNameMappings_.emplace("RegExp", GlobalTypeId::ETS_REGEXP_BUILTIN); - builtinNameMappings_.emplace("Set", GlobalTypeId::ETS_SET_BUILTIN); + AddETSEscompatLayer(); // ETS functional types for (size_t id = static_cast(GlobalTypeId::ETS_FUNCTION0_CLASS), nargs = 0; diff --git a/ets2panda/checker/types/globalTypesHolder.h b/ets2panda/checker/types/globalTypesHolder.h index 6e899448c1..9f6d37f94b 100644 --- a/ets2panda/checker/types/globalTypesHolder.h +++ b/ets2panda/checker/types/globalTypesHolder.h @@ -141,6 +141,9 @@ public: NO_COPY_SEMANTIC(GlobalTypesHolder); NO_MOVE_SEMANTIC(GlobalTypesHolder); + void AddETSEscompatLayer(); + void AddTSSpecificTypes(ArenaAllocator *allocator); + // TS specific types Type *GlobalNumberType(); Type *GlobalAnyType(); diff --git a/ets2panda/checker/types/signature.cpp b/ets2panda/checker/types/signature.cpp index 7587a5c3d1..082bd8e3b2 100644 --- a/ets2panda/checker/types/signature.cpp +++ b/ets2panda/checker/types/signature.cpp @@ -73,12 +73,10 @@ Signature *Signature::Substitute(TypeRelation *relation, const Substitution *sub } auto *newReturnType = returnType_->Substitute(relation, substitution); - if (newReturnType != returnType_) { - anyChange = true; - } - if (!anyChange) { + if (newReturnType == returnType_ && !anyChange) { return this; } + auto *result = allocator->New(newSigInfo, newReturnType); result->func_ = func_; result->flags_ = flags_; diff --git a/ets2panda/checker/types/ts/interfaceType.cpp b/ets2panda/checker/types/ts/interfaceType.cpp index 0fb3122577..4ec9eaf491 100644 --- a/ets2panda/checker/types/ts/interfaceType.cpp +++ b/ets2panda/checker/types/ts/interfaceType.cpp @@ -42,6 +42,29 @@ void InterfaceType::ToString(std::stringstream &ss, [[maybe_unused]] bool precis } } +bool InterfaceType::CheckVarType(TypeRelation *relation, + const ArenaVector &targetProperties, + const ArenaVector &sourceProperties) +{ + for (auto *targetProp : targetProperties) { + bool foundProp = std::any_of(sourceProperties.begin(), sourceProperties.end(), + [targetProp, relation](varbinder::LocalVariable *sourceProp) { + if (targetProp->Name() == sourceProp->Name()) { + Type *targetType = relation->GetChecker()->GetTypeOfVariable(targetProp); + Type *sourceType = relation->GetChecker()->GetTypeOfVariable(sourceProp); + return relation->IsIdenticalTo(targetType, sourceType); + } + + return false; + }); + if (!foundProp) { + relation->Result(false); + return true; + } + } + return false; +} + void InterfaceType::Identical(TypeRelation *relation, Type *other) { if (!other->IsObjectType() || !other->AsObjectType()->IsInterfaceType()) { @@ -58,21 +81,8 @@ void InterfaceType::Identical(TypeRelation *relation, Type *other) return; } - for (auto *targetProp : targetProperties) { - bool foundProp = std::any_of(sourceProperties.begin(), sourceProperties.end(), - [targetProp, relation](varbinder::LocalVariable *sourceProp) { - if (targetProp->Name() == sourceProp->Name()) { - Type *targetType = relation->GetChecker()->GetTypeOfVariable(targetProp); - Type *sourceType = relation->GetChecker()->GetTypeOfVariable(sourceProp); - return relation->IsIdenticalTo(targetType, sourceType); - } - - return false; - }); - if (!foundProp) { - relation->Result(false); - return; - } + if (CheckVarType(relation, targetProperties, sourceProperties)) { + return; } const ArenaVector &targetCallSignatures = CallSignatures(); @@ -111,6 +121,11 @@ void InterfaceType::Identical(TypeRelation *relation, Type *other) relation->IsIdenticalTo(targetNumberInfo, sourceNumberInfo); + CheckStringInfo(relation, otherInterface); +} + +void InterfaceType::CheckStringInfo(TypeRelation *relation, InterfaceType *otherInterface) +{ if (relation->IsTrue()) { IndexInfo *targetStringInfo = StringIndexInfo(); IndexInfo *sourceStringInfo = otherInterface->StringIndexInfo(); diff --git a/ets2panda/checker/types/ts/interfaceType.h b/ets2panda/checker/types/ts/interfaceType.h index e0ff3a1ae1..ced99ea53a 100644 --- a/ets2panda/checker/types/ts/interfaceType.h +++ b/ets2panda/checker/types/ts/interfaceType.h @@ -130,6 +130,9 @@ public: void ToString(std::stringstream &ss, [[maybe_unused]] bool precise) const override; TypeFacts GetTypeFacts() const override; + void CheckStringInfo(TypeRelation *relation, InterfaceType *otherInterface); + bool CheckVarType(TypeRelation *relation, const ArenaVector &targetProperties, + const ArenaVector &sourceProperties); void Identical(TypeRelation *relation, Type *other) override; Type *Instantiate(ArenaAllocator *allocator, TypeRelation *relation, GlobalTypesHolder *globalTypes) override; diff --git a/ets2panda/checker/types/ts/objectType.cpp b/ets2panda/checker/types/ts/objectType.cpp index a50001c4c1..c50eeeb98a 100644 --- a/ets2panda/checker/types/ts/objectType.cpp +++ b/ets2panda/checker/types/ts/objectType.cpp @@ -47,6 +47,29 @@ bool ObjectType::SignatureRelatedToSomeSignature(TypeRelation *relation, Signatu return false; } +bool ObjectType::FindPropertyAndCheckIdentical(TypeRelation *relation, ObjectType *otherObj) +{ + for (auto *it : desc_->properties) { + varbinder::LocalVariable *found = otherObj->Desc()->FindProperty(it->Name()); + if (found == nullptr) { + relation->Result(false); + return true; + } + + relation->IsIdenticalTo(it->TsType(), found->TsType()); + + if (!relation->IsTrue()) { + return true; + } + + if (it->Flags() != found->Flags()) { + relation->Result(false); + return true; + } + } + return false; +} + void ObjectType::Identical(TypeRelation *relation, Type *other) { if (!other->IsObjectType() || kind_ != other->AsObjectType()->Kind()) { @@ -66,23 +89,8 @@ void ObjectType::Identical(TypeRelation *relation, Type *other) return; } - for (auto *it : desc_->properties) { - varbinder::LocalVariable *found = otherObj->Desc()->FindProperty(it->Name()); - if (found == nullptr) { - relation->Result(false); - return; - } - - relation->IsIdenticalTo(it->TsType(), found->TsType()); - - if (!relation->IsTrue()) { - return; - } - - if (it->Flags() != found->Flags()) { - relation->Result(false); - return; - } + if (FindPropertyAndCheckIdentical(relation, otherObj)) { + return; } if (!EachSignatureRelatedToSomeSignature(relation, CallSignatures(), otherObj->CallSignatures()) || diff --git a/ets2panda/checker/types/ts/objectType.h b/ets2panda/checker/types/ts/objectType.h index 15c17683d3..7332231399 100644 --- a/ets2panda/checker/types/ts/objectType.h +++ b/ets2panda/checker/types/ts/objectType.h @@ -193,6 +193,7 @@ public: const ArenaVector &sourceSignatures, const ArenaVector &targetSignatures); + bool FindPropertyAndCheckIdentical(TypeRelation *relation, ObjectType *otherObj); void Identical(TypeRelation *relation, Type *other) override; void AssignmentTarget(TypeRelation *relation, Type *source) override; diff --git a/ets2panda/compiler/core/ETSCompiler.cpp b/ets2panda/compiler/core/ETSCompiler.cpp index 42ab4ece20..2e0e177454 100644 --- a/ets2panda/compiler/core/ETSCompiler.cpp +++ b/ets2panda/compiler/core/ETSCompiler.cpp @@ -300,7 +300,7 @@ static void CreateDynamicObject(const ir::AstNode *node, compiler::ETSGen *etsg, etsg->StoreAccumulator(node, objReg); auto [qnameStart, qnameLen] = LoadDynamicName(etsg, node, callInfo.name, true); - etsg->CallDynamic(node, objReg, qnameStart, qnameLen, signature, arguments); + etsg->CallDynamic(ETSGen::CallDynamicData {node, objReg, qnameStart}, qnameLen, signature, arguments); } static void ConvertRestArguments(checker::ETSChecker *const checker, const ir::ETSNewClassInstanceExpression *expr) @@ -857,7 +857,8 @@ void ETSCompiler::CompileDynamic(const ir::CallExpression *expr, compiler::VReg if (!callInfo.name.empty()) { auto [qnameStart, qnameLen] = LoadDynamicName(etsg, expr, callInfo.name, false); - etsg->CallDynamic(expr, calleeReg, qnameStart, qnameLen, expr->Signature(), expr->Arguments()); + etsg->CallDynamic(ETSGen::CallDynamicData {expr, calleeReg, qnameStart}, qnameLen, expr->Signature(), + expr->Arguments()); } else { compiler::VReg dynParam2 = etsg->AllocReg(); @@ -866,7 +867,7 @@ void ETSCompiler::CompileDynamic(const ir::CallExpression *expr, compiler::VReg : expr->Callee()->TsType()->AsETSDynamicType()->Language(); etsg->LoadUndefinedDynamic(expr, lang); etsg->StoreAccumulator(expr, dynParam2); - etsg->CallDynamic(expr, calleeReg, dynParam2, expr->Signature(), expr->Arguments()); + etsg->CallDynamic(ETSGen::CallDynamicData {expr, calleeReg, dynParam2}, expr->Signature(), expr->Arguments()); } etsg->SetAccumulatorType(expr->Signature()->ReturnType()); @@ -1210,7 +1211,7 @@ void ETSCompiler::Compile(const ir::ObjectExpression *expr) const auto *createObjSig = etsg->Allocator()->New( signatureInfo, nullptr, compiler::Signatures::BUILTIN_JSRUNTIME_CREATE_OBJECT); compiler::VReg dummyReg = compiler::VReg::RegStart(); - etsg->CallDynamic(expr, dummyReg, dummyReg, createObjSig, + etsg->CallDynamic(ETSGen::CallDynamicData {expr, dummyReg, dummyReg}, createObjSig, ArenaVector(etsg->Allocator()->Adapter())); etsg->SetAccumulatorType(expr->TsType()); diff --git a/ets2panda/compiler/core/ETSGen.h b/ets2panda/compiler/core/ETSGen.h index 0d89ea03ca..1b7a2ab00d 100644 --- a/ets2panda/compiler/core/ETSGen.h +++ b/ets2panda/compiler/core/ETSGen.h @@ -609,16 +609,22 @@ public: Ra().Emit(node, name, athis, arg0); } - void CallDynamic(const ir::AstNode *node, VReg obj, VReg param2, checker::Signature *signature, + struct CallDynamicData { + const ir::AstNode *node = nullptr; + VReg obj; + VReg param2; + }; + + void CallDynamic(CallDynamicData data, checker::Signature *signature, const ArenaVector &arguments) { - CallDynamicImpl(node, obj, param2, signature, arguments); + CallDynamicImpl(data, signature, arguments); } - void CallDynamic(const ir::AstNode *node, VReg obj, VReg param2, VReg param3, checker::Signature *signature, + void CallDynamic(CallDynamicData data, VReg param3, checker::Signature *signature, const ArenaVector &arguments) { - CallDynamicImpl(node, obj, param2, param3, signature, arguments); + CallDynamicImpl(data, param3, signature, arguments); } #ifdef PANDA_WITH_ETS @@ -1079,7 +1085,7 @@ private: ApplyConversionAndStoreAccumulator(arguments[idx], arg##idx, paramType##idx) template - void CallDynamicImpl(const ir::AstNode *node, VReg &obj, VReg ¶m2, checker::Signature *signature, + void CallDynamicImpl(CallDynamicData data, checker::Signature *signature, const ArenaVector &arguments) { RegScope rs(this); @@ -1087,18 +1093,18 @@ private: switch (arguments.size()) { case 0U: { - Ra().Emit(node, name, obj, param2); + Ra().Emit(data.node, name, data.obj, data.param2); break; } case 1U: { COMPILE_ARG(0, 2U); - Ra().Emit(node, name, obj, param2, arg0, dummyReg_); + Ra().Emit(data.node, name, data.obj, data.param2, arg0, dummyReg_); break; } case 2U: { COMPILE_ARG(0, 2U); COMPILE_ARG(1, 2U); - Ra().Emit(node, name, obj, param2, arg0, arg1); + Ra().Emit(data.node, name, data.obj, data.param2, arg0, arg1); break; } default: { @@ -1106,14 +1112,14 @@ private: COMPILE_ARG(idx, 2U); } - Rra().Emit(node, obj, arguments.size() + 2U, name, obj); + Rra().Emit(data.node, data.obj, arguments.size() + 2U, name, data.obj); break; } } } template - void CallDynamicImpl(const ir::AstNode *node, VReg obj, VReg param2, VReg param3, checker::Signature *signature, + void CallDynamicImpl(CallDynamicData data, VReg param3, checker::Signature *signature, const ArenaVector &arguments) { RegScope rs(this); @@ -1121,12 +1127,12 @@ private: switch (arguments.size()) { case 0U: { - Ra().Emit(node, name, obj, param2, param3, dummyReg_); + Ra().Emit(data.node, name, data.obj, data.param2, param3, dummyReg_); break; } case 1U: { COMPILE_ARG(0, 3U); - Ra().Emit(node, name, obj, param2, param3, arg0); + Ra().Emit(data.node, name, data.obj, data.param2, param3, arg0); break; } default: { @@ -1134,7 +1140,7 @@ private: COMPILE_ARG(idx, 3U); } - Rra().Emit(node, obj, arguments.size() + 3U, name, obj); + Rra().Emit(data.node, data.obj, arguments.size() + 3U, name, data.obj); break; } } @@ -1147,6 +1153,8 @@ private: template void LoadAccumulatorNumber(const ir::AstNode *node, T number, checker::TypeFlag targetType); + template + void SetAccumulatorTargetType(const ir::AstNode *node, checker::TypeFlag typeKind, T number); void InitializeContainingClass(); util::StringView FormDynamicModulePropReference(const varbinder::Variable *var); @@ -1160,13 +1168,8 @@ private: }; template -void ETSGen::LoadAccumulatorNumber(const ir::AstNode *node, T number, checker::TypeFlag targetType) +void ETSGen::SetAccumulatorTargetType(const ir::AstNode *node, checker::TypeFlag typeKind, T number) { - auto typeKind = targetType_ && (!targetType_->IsETSObjectType() && !targetType_->IsETSUnionType() && - !targetType_->IsETSArrayType()) - ? checker::ETSChecker::TypeKind(targetType_) - : targetType; - switch (typeKind) { case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: { @@ -1215,6 +1218,17 @@ void ETSGen::LoadAccumulatorNumber(const ir::AstNode *node, T number, checker::T UNREACHABLE(); } } +} + +template +void ETSGen::LoadAccumulatorNumber(const ir::AstNode *node, T number, checker::TypeFlag targetType) +{ + auto typeKind = targetType_ && (!targetType_->IsETSObjectType() && !targetType_->IsETSUnionType() && + !targetType_->IsETSArrayType()) + ? checker::ETSChecker::TypeKind(targetType_) + : targetType; + + SetAccumulatorTargetType(node, typeKind, number); if (targetType_ && (targetType_->IsETSObjectType() || targetType_->IsETSUnionType())) { ApplyConversion(node, targetType_); diff --git a/ets2panda/compiler/core/function.cpp b/ets2panda/compiler/core/function.cpp index 98abf21803..9118189783 100644 --- a/ets2panda/compiler/core/function.cpp +++ b/ets2panda/compiler/core/function.cpp @@ -143,32 +143,10 @@ void Function::LoadClassContexts(const ir::AstNode *node, PandaGen *pg, VReg cto } while (classDef != nullptr); } -void Function::CompileInstanceFields(PandaGen *pg, const ir::ScriptFunction *decl) +void Function::IterateOverElements(const ArenaVector &elements, PandaGen *pg, VReg &ctor, VReg &thisReg, + VReg &computedInstanceFieldsArray) { - const auto klass = util::Helpers::GetClassDefiniton(decl); - const auto &elements = klass->Body(); - - RegScope rs(pg); - auto thisReg = pg->AllocReg(); - auto ctor = pg->AllocReg(); - pg->GetThis(decl); - pg->StoreAccumulator(decl, thisReg); - pg->GetFunctionObject(decl); - pg->StoreAccumulator(decl, ctor); - - VReg computedInstanceFieldsArray {}; uint32_t computedInstanceFieldsIndex = 0; - - if (klass->HasPrivateMethod()) { - pg->ClassPrivateMethodOrAccessorAdd(decl, ctor, thisReg); - } - - if (klass->HasComputedInstanceField()) { - computedInstanceFieldsArray = pg->AllocReg(); - pg->LoadClassComputedInstanceFields(klass, ctor); - pg->StoreAccumulator(klass, computedInstanceFieldsArray); - } - for (auto const &element : elements) { if (!element->IsClassProperty()) { continue; @@ -216,6 +194,34 @@ void Function::CompileInstanceFields(PandaGen *pg, const ir::ScriptFunction *dec } } +void Function::CompileInstanceFields(PandaGen *pg, const ir::ScriptFunction *decl) +{ + const auto klass = util::Helpers::GetClassDefiniton(decl); + const auto &elements = klass->Body(); + + RegScope rs(pg); + auto thisReg = pg->AllocReg(); + auto ctor = pg->AllocReg(); + pg->GetThis(decl); + pg->StoreAccumulator(decl, thisReg); + pg->GetFunctionObject(decl); + pg->StoreAccumulator(decl, ctor); + + VReg computedInstanceFieldsArray {}; + + if (klass->HasPrivateMethod()) { + pg->ClassPrivateMethodOrAccessorAdd(decl, ctor, thisReg); + } + + if (klass->HasComputedInstanceField()) { + computedInstanceFieldsArray = pg->AllocReg(); + pg->LoadClassComputedInstanceFields(klass, ctor); + pg->StoreAccumulator(klass, computedInstanceFieldsArray); + } + + IterateOverElements(elements, pg, ctor, thisReg, computedInstanceFieldsArray); +} + static void CompileFunction(PandaGen *pg) { const auto *decl = pg->RootNode()->AsScriptFunction(); diff --git a/ets2panda/compiler/core/function.h b/ets2panda/compiler/core/function.h index 4f642afd4f..1d51abf7cd 100644 --- a/ets2panda/compiler/core/function.h +++ b/ets2panda/compiler/core/function.h @@ -30,6 +30,8 @@ class Function { public: Function() = delete; + static void IterateOverElements(const ArenaVector &elements, PandaGen *pg, VReg &ctor, VReg &thisReg, + VReg &computedInstanceFieldsArray); static void Compile(PandaGen *pg); static void CompileInstanceFields(PandaGen *pg, const ir::ScriptFunction *decl); -- Gitee