From 5d47390e5031cfe107a25c4815ec3930f6053e86 Mon Sep 17 00:00:00 2001 From: songqi Date: Tue, 25 Apr 2023 21:55:07 +0800 Subject: [PATCH] Optimize transformer for stobjbyname Issue: I6YVSR Test: test262/compiler/tsc/parser Signed-off-by: songqi Change-Id: I0a0be18ddc25f1f5d409e0ac838ae24185362ab5 --- es2panda/parser/transformer/transformer.cpp | 40 ++++++++++++++----- es2panda/parser/transformer/transformer.h | 3 +- ...-export-classes-1-transformed-expected.txt | 6 +-- ...-export-classes-2-transformed-expected.txt | 6 +-- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/es2panda/parser/transformer/transformer.cpp b/es2panda/parser/transformer/transformer.cpp index 56c11da461..d1b20892a8 100644 --- a/es2panda/parser/transformer/transformer.cpp +++ b/es2panda/parser/transformer/transformer.cpp @@ -580,10 +580,18 @@ std::vector Transformer::VisitInstanceProperty(ir::Cl if (it->IsComputed()) { computedProps.push_back(AllocNode(it->Key())); } - auto *member = GetClassMemberName(it->Key(), it->IsComputed(), it); - auto *left = AllocNode(AllocNode(), member, - ir::MemberExpression::MemberExpressionKind::ELEMENT_ACCESS, - true, false); + + ir::MemberExpression *left = nullptr; + auto *member = GetClassMemberName(it->Key(), it->IsComputed(), it, false); + if (member->IsIdentifier() && !it->IsComputed()) { + left = AllocNode(AllocNode(), member, + ir::MemberExpression::MemberExpressionKind::PROPERTY_ACCESS, + false, false); + } else { + left = AllocNode(AllocNode(), member, + ir::MemberExpression::MemberExpressionKind::ELEMENT_ACCESS, + true, false); + } auto assignment = AllocNode(left, it->Value(), lexer::TokenType::PUNCTUATOR_SUBSTITUTION); @@ -683,9 +691,18 @@ std::vector Transformer::VisitStaticProperty(ir::Clas if (right == nullptr) { continue; } - auto *member = GetClassMemberName(classProperty->Key(), classProperty->IsComputed(), classProperty); - auto left = AllocNode(CreateReferenceIdentifier(name), member, - ir::MemberExpression::MemberExpressionKind::ELEMENT_ACCESS, true, false); + + ir::MemberExpression *left = nullptr; + auto *member = GetClassMemberName(classProperty->Key(), classProperty->IsComputed(), classProperty, false); + if (member->IsIdentifier() && !classProperty->IsComputed()) { + left = AllocNode(CreateReferenceIdentifier(name), member, + ir::MemberExpression::MemberExpressionKind::PROPERTY_ACCESS, + false, false); + } else { + left = AllocNode(CreateReferenceIdentifier(name), member, + ir::MemberExpression::MemberExpressionKind::ELEMENT_ACCESS, + true, false); + } auto assignment = AllocNode(left, right, lexer::TokenType::PUNCTUATOR_SUBSTITUTION); res.push_back(AllocNode(assignment)); } @@ -939,14 +956,19 @@ ir::CallExpression *Transformer::CreateGetOwnPropertyDescriptorCall(ir::Expressi return AllocNode(caller, std::move(arguments), nullptr, false); } -ir::Expression *Transformer::GetClassMemberName(ir::Expression *key, bool isComputed, ir::Statement *node) +ir::Expression *Transformer::GetClassMemberName(ir::Expression *key, bool isComputed, + ir::Statement *node, bool inDecorator) { if (isComputed) { auto name = GetComputedPropertyBinding(node); return AllocNode(name); } if (key->IsIdentifier()) { - return AllocNode(key->AsIdentifier()->Name()); + if (inDecorator) { + return AllocNode(key->AsIdentifier()->Name()); + } else { + return AllocNode(key->AsIdentifier()->Name()); + } } else if (key->IsStringLiteral()) { return AllocNode(key->AsStringLiteral()->Str()); } else if (key->IsNumberLiteral()) { diff --git a/es2panda/parser/transformer/transformer.h b/es2panda/parser/transformer/transformer.h index 80dab1af87..856ae31ec8 100644 --- a/es2panda/parser/transformer/transformer.h +++ b/es2panda/parser/transformer/transformer.h @@ -146,7 +146,8 @@ private: util::StringView GetNameFromModuleDeclaration(ir::TSModuleDeclaration *node) const; util::StringView GetParamName(ir::AstNode *node, util::StringView name) const; - ir::Expression *GetClassMemberName(ir::Expression *key, bool isComputed, ir::Statement *node); + ir::Expression *GetClassMemberName(ir::Expression *key, bool isComputed, + ir::Statement *node, bool inDecorator = true); binder::Scope *FindExportVariableInTsModuleScope(util::StringView name) const; binder::Variable *FindTSModuleVariable(const ir::Expression *node, binder::Scope *scope) const; util::StringView FindPrivatePropertyBindName(util::StringView name); diff --git a/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-1-transformed-expected.txt b/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-1-transformed-expected.txt index 867daffd1e..f4a1ec63e4 100644 --- a/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-1-transformed-expected.txt +++ b/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-1-transformed-expected.txt @@ -193,8 +193,8 @@ } }, "property": { - "type": "StringLiteral", - "value": "a", + "type": "Identifier", + "name": "a", "loc": { "start": { "line": 1, @@ -206,7 +206,7 @@ } } }, - "computed": true, + "computed": false, "optional": false, "loc": { "start": { diff --git a/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-2-transformed-expected.txt b/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-2-transformed-expected.txt index 94d0ab435a..afd286b70d 100644 --- a/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-2-transformed-expected.txt +++ b/es2panda/test/parser/ts/transformed_cases/test-ts-export-classes-2-transformed-expected.txt @@ -208,8 +208,8 @@ } }, "property": { - "type": "StringLiteral", - "value": "a", + "type": "Identifier", + "name": "a", "loc": { "start": { "line": 1, @@ -221,7 +221,7 @@ } } }, - "computed": true, + "computed": false, "optional": false, "loc": { "start": { -- Gitee