From 81613565e8d649b403ce9cc472933bd507e1d946 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/IAE07B 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 | 24 +++++--- ets2panda/checker/types/signature.h | 2 + ets2panda/compiler/core/ETSCompiler.cpp | 9 +-- ets2panda/compiler/core/ETSGen.h | 57 ++++++++++++------- ets2panda/compiler/core/function.cpp | 54 ++++++++++-------- ets2panda/compiler/core/function.h | 2 + 8 files changed, 119 insertions(+), 70 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..f211a20f12 100644 --- a/ets2panda/checker/types/signature.cpp +++ b/ets2panda/checker/types/signature.cpp @@ -29,15 +29,11 @@ util::StringView Signature::InternalName() const return internalName_.Empty() ? func_->Scope()->InternalName() : internalName_; } -Signature *Signature::Substitute(TypeRelation *relation, const Substitution *substitution) +void Signature::FillNewSigInfo(SignatureInfo *newSigInfo, bool &anyChange, TypeRelation *relation, + const Substitution *substitution) { - if (substitution == nullptr || substitution->empty()) { - return this; - } auto *checker = relation->GetChecker()->AsETSChecker(); auto *allocator = checker->Allocator(); - bool anyChange = false; - SignatureInfo *newSigInfo = allocator->New(allocator); if (!signatureInfo_->typeParams.empty()) { for (auto *tparam : signatureInfo_->typeParams) { @@ -67,6 +63,19 @@ Signature *Signature::Substitute(TypeRelation *relation, const Substitution *sub newSigInfo->restVar->SetTsType(newRestType); } } +} + +Signature *Signature::Substitute(TypeRelation *relation, const Substitution *substitution) +{ + if (substitution == nullptr || substitution->empty()) { + return this; + } + auto *checker = relation->GetChecker()->AsETSChecker(); + auto *allocator = checker->Allocator(); + bool anyChange = false; + SignatureInfo *newSigInfo = allocator->New(allocator); + + FillNewSigInfo(newSigInfo, anyChange, relation, substitution); if (!anyChange) { newSigInfo = signatureInfo_; @@ -79,8 +88,7 @@ Signature *Signature::Substitute(TypeRelation *relation, const Substitution *sub if (!anyChange) { return this; } - auto *result = allocator->New(newSigInfo, newReturnType); - result->func_ = func_; + auto *result = allocator->New(newSigInfo, newReturnType, func_); result->flags_ = flags_; result->internalName_ = internalName_; result->ownerObj_ = ownerObj_; diff --git a/ets2panda/checker/types/signature.h b/ets2panda/checker/types/signature.h index b54035f73e..7682e13ed0 100644 --- a/ets2panda/checker/types/signature.h +++ b/ets2panda/checker/types/signature.h @@ -251,6 +251,8 @@ public: util::StringView InternalName() const; Signature *Copy(ArenaAllocator *allocator, TypeRelation *relation, GlobalTypesHolder *globalTypes); + void FillNewSigInfo(SignatureInfo *newSigInfo, bool &anyChange, TypeRelation *relation, + const Substitution *substitution); Signature *Substitute(TypeRelation *relation, const Substitution *substitution); void ToString(std::stringstream &ss, const varbinder::Variable *variable, bool printAsMethod = false, 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..a7e5e896b7 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; } } @@ -1145,6 +1151,22 @@ private: void ToBinaryResult(const ir::AstNode *node, Label *ifFalse); + std::map &GetTypeMap() + { + static std::map typeMap = { + {checker::TypeFlag::ETS_BOOLEAN, Checker()->GlobalByteType()}, + {checker::TypeFlag::BYTE, Checker()->GlobalByteType()}, + {checker::TypeFlag::CHAR, Checker()->GlobalCharType()}, + {checker::TypeFlag::SHORT, Checker()->GlobalShortType()}, + {checker::TypeFlag::INT, Checker()->GlobalIntType()}, + {checker::TypeFlag::LONG, Checker()->GlobalLongType()}, + {checker::TypeFlag::FLOAT, Checker()->GlobalFloatType()}, + {checker::TypeFlag::DOUBLE, Checker()->GlobalDoubleType()}, + {checker::TypeFlag::ETS_STRING_ENUM, Checker()->GlobalIntType()}, + {checker::TypeFlag::ETS_ENUM, Checker()->GlobalIntType()}, + }; + return typeMap; + } template void LoadAccumulatorNumber(const ir::AstNode *node, T number, checker::TypeFlag targetType); void InitializeContainingClass(); @@ -1171,50 +1193,43 @@ void ETSGen::LoadAccumulatorNumber(const ir::AstNode *node, T number, checker::T case checker::TypeFlag::ETS_BOOLEAN: case checker::TypeFlag::BYTE: { Sa().Emit(node, static_cast(number)); - SetAccumulatorType(Checker()->GlobalByteType()); break; } case checker::TypeFlag::CHAR: { Sa().Emit(node, static_cast(number)); - SetAccumulatorType(Checker()->GlobalCharType()); break; } case checker::TypeFlag::SHORT: { Sa().Emit(node, static_cast(number)); - SetAccumulatorType(Checker()->GlobalShortType()); break; } case checker::TypeFlag::INT: { Sa().Emit(node, static_cast(number)); - SetAccumulatorType(Checker()->GlobalIntType()); break; } case checker::TypeFlag::LONG: { Sa().Emit(node, static_cast(number)); - SetAccumulatorType(Checker()->GlobalLongType()); break; } case checker::TypeFlag::FLOAT: { Sa().Emit(node, static_cast(number)); - SetAccumulatorType(Checker()->GlobalFloatType()); break; } case checker::TypeFlag::DOUBLE: { Sa().Emit(node, static_cast(number)); - SetAccumulatorType(Checker()->GlobalDoubleType()); break; } case checker::TypeFlag::ETS_STRING_ENUM: [[fallthrough]]; case checker::TypeFlag::ETS_ENUM: { Sa().Emit(node, static_cast(number)); - SetAccumulatorType(Checker()->GlobalIntType()); break; } default: { UNREACHABLE(); } } + SetAccumulatorType(GetTypeMap()[typeKind]); 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