From dfbd53e558523c96ae267f561da1210053046cf5 Mon Sep 17 00:00:00 2001 From: lirismankarina Date: Fri, 2 Jun 2023 17:53:25 +0300 Subject: [PATCH 1/3] [ets] Interface subtyping fix Signed-off-by: lirismankarina --- checker/types/ets/etsObjectType.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/checker/types/ets/etsObjectType.cpp b/checker/types/ets/etsObjectType.cpp index c5512013c..2422a2f8e 100644 --- a/checker/types/ets/etsObjectType.cpp +++ b/checker/types/ets/etsObjectType.cpp @@ -561,7 +561,7 @@ void ETSObjectType::Cast(TypeRelation *const relation, Type *const target) void ETSObjectType::IsSubtype(TypeRelation *relation, Type *source) { - // TODO(mmartin): need check for interface types + ASSERT(this->IsETSObjectType()); // 3.8.3 Subtyping among Array Types if (this == relation->GetChecker()->AsETSChecker()->GlobalETSObjectType() && source->IsETSArrayType()) { @@ -569,10 +569,17 @@ void ETSObjectType::IsSubtype(TypeRelation *relation, Type *source) return; } + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + relation->Result(true); + return; + } + if (!source->IsETSObjectType() || !source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::CLASS)) { return; } + ASSERT(source->IsETSObjectType()); + ETSObjectType *const source_obj = source->AsETSObjectType(); if (!(source->HasTypeFlag(TypeFlag::GENERIC) || HasTypeFlag(TypeFlag::GENERIC))) { -- Gitee From 4b931bfd67bf8ec5fffc482fda3bd65b49e70f75 Mon Sep 17 00:00:00 2001 From: lirismankarina Date: Fri, 2 Jun 2023 17:53:25 +0300 Subject: [PATCH 2/3] [ets] Interface subtyping fix Signed-off-by: lirismankarina --- checker/types/ets/etsObjectType.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/checker/types/ets/etsObjectType.cpp b/checker/types/ets/etsObjectType.cpp index c5512013c..2422a2f8e 100644 --- a/checker/types/ets/etsObjectType.cpp +++ b/checker/types/ets/etsObjectType.cpp @@ -561,7 +561,7 @@ void ETSObjectType::Cast(TypeRelation *const relation, Type *const target) void ETSObjectType::IsSubtype(TypeRelation *relation, Type *source) { - // TODO(mmartin): need check for interface types + ASSERT(this->IsETSObjectType()); // 3.8.3 Subtyping among Array Types if (this == relation->GetChecker()->AsETSChecker()->GlobalETSObjectType() && source->IsETSArrayType()) { @@ -569,10 +569,17 @@ void ETSObjectType::IsSubtype(TypeRelation *relation, Type *source) return; } + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + relation->Result(true); + return; + } + if (!source->IsETSObjectType() || !source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::CLASS)) { return; } + ASSERT(source->IsETSObjectType()); + ETSObjectType *const source_obj = source->AsETSObjectType(); if (!(source->HasTypeFlag(TypeFlag::GENERIC) || HasTypeFlag(TypeFlag::GENERIC))) { -- Gitee From bea1f0297a36962be7df27391c20bcfc6642d717 Mon Sep 17 00:00:00 2001 From: lirismankarina Date: Mon, 5 Jun 2023 19:26:55 +0300 Subject: [PATCH 3/3] help --- checker/types/ets/etsObjectType.cpp | 98 ++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/checker/types/ets/etsObjectType.cpp b/checker/types/ets/etsObjectType.cpp index 2422a2f8e..a37001159 100644 --- a/checker/types/ets/etsObjectType.cpp +++ b/checker/types/ets/etsObjectType.cpp @@ -361,6 +361,18 @@ void ETSObjectType::AssignmentTarget(TypeRelation *relation, Type *source) return; } +/* +Failed (new failures): 6 + FailKind.ES2PANDA_FAIL: 1 + FailKind.RUNTIME_FAIL: 2 + FailKind.VERIFIER_FAIL: 3 + same when adding last condition to if statement + */ + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE) && !source->HasTypeFlag(TypeFlag::GENERIC) && !this->HasTypeFlag(TypeFlag::GENERIC)) { + relation->Result(true); + return; + } + IsSubtype(relation, source); } @@ -569,10 +581,94 @@ void ETSObjectType::IsSubtype(TypeRelation *relation, Type *source) return; } + + +/* +Failed (new failures): 13 + FailKind.ES2PANDA_FAIL: 1 + FailKind.RUNTIME_FAIL: 9 + FailKind.VERIFIER_FAIL: 3 + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (source->HasTypeFlag(TypeFlag::GENERIC) || HasTypeFlag(TypeFlag::GENERIC)) { + return; + } relation->Result(true); return; } +*/ + + +/* +Failed (new failures): 6 + FailKind.ES2PANDA_FAIL: 6 + мои новые открытые тесты! + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (!(source->HasTypeFlag(TypeFlag::GENERIC) || HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { + return; + } + + relation->Result(true); + return; + } + + if (!(source->HasTypeFlag(TypeFlag::GENERIC) && HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { + return; + } + relation->Result(true); + return; + } + } +*/ + +/* +Failed (new failures): 6 + FailKind.ES2PANDA_FAIL: 6 + более короткая версия предыдущих улучшений + тоже только вновь открытые тесты падают + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (!(source->HasTypeFlag(TypeFlag::GENERIC) && HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { + return; + } + relation->Result(true); + return; + } + } +*/ + +/* +полная херня вариант +не работает даже для мною открытых тестов +то есть мои тесты выпдают на строке про sup == nullptr + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (!(source->HasTypeFlag(TypeFlag::GENERIC) && HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { // то есть тут + return; + } + } + relation->Result(true); + return; + } +*/ + +/* +Failed (new failures): 6 + FailKind.ES2PANDA_FAIL: 6 + + удивительно но тут тоже только мои тесты, хотя замена && -> || + if (source->IsETSObjectType() && source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::INTERFACE)) { + if (!(source->HasTypeFlag(TypeFlag::GENERIC) || HasTypeFlag(TypeFlag::GENERIC))) { + if (const Type *const sup = source->AsETSObjectType()->AsSuper(relation->GetChecker(), variable_); sup == nullptr) { + return; + } + relation->Result(true); + return; + } + } +*/ if (!source->IsETSObjectType() || !source->AsETSObjectType()->HasObjectFlag(ETSObjectFlags::CLASS)) { return; @@ -633,6 +729,7 @@ Type *ETSObjectType::AsSuper(Checker *checker, binder::Variable *source_var) return this; } + // возможно надо чинить это место для суперов интерфейса if (HasObjectFlag(ETSObjectFlags::INTERFACE)) { Type *res = nullptr; for (auto *const it : checker->AsETSChecker()->GetInterfaces(this)) { @@ -668,7 +765,6 @@ Type *ETSObjectType::AsSuper(Checker *checker, binder::Variable *source_var) } } } - return nullptr; } -- Gitee