From 344b497bfdaea8d23c64728040a12bac4aec65a9 Mon Sep 17 00:00:00 2001 From: Daniel Kofanov Date: Wed, 15 Feb 2023 15:17:35 +0300 Subject: [PATCH] Add 'allow-testing-builtins-syntax' option Change-Id: Ia71bd135aea5a3514beaea941560194452e4f2d1 Signed-off-by: Daniel Kofanov --- aot/options.cpp | 11 +++++++++++ binder/scope.cpp | 7 ++++++- compiler/core/emitter.cpp | 2 +- es2panda.h | 3 +++ parser/expressionParser.cpp | 15 +++++++++++++++ 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/aot/options.cpp b/aot/options.cpp index fc52aed9d..0ee6c366c 100644 --- a/aot/options.cpp +++ b/aot/options.cpp @@ -61,6 +61,11 @@ bool Options::Parse(int argc, const char **argv) panda::PandArg stdLib("stdlib", "", "Path to standard library"); panda::PandArg genStdLib("gen-stdlib", false, "Gen standard library"); panda::PandArg arktsConfig("arktsconfig", DEFAULT_ARKTSCONFIG, "Path to arkts configuration file"); +#ifndef PANDA_PRODUCT_BUILD + panda::PandArg allowTestingBuiltinsSyntax( + "allow-testing-builtins-syntax", false, + "Allow testing builtins syntax (i.e. convert `%Foo` to `RuntimeTesting.Foo`)"); +#endif // PANDA_PRODUCT_BUILD // tail arguments panda::PandArg inputFile("input", "", "input file"); @@ -83,6 +88,9 @@ bool Options::Parse(int argc, const char **argv) argparser_->Add(&stdLib); argparser_->Add(&genStdLib); argparser_->Add(&arktsConfig); +#ifndef PANDA_PRODUCT_BUILD + argparser_->Add(&allowTestingBuiltinsSyntax); +#endif // PANDA_PRODUCT_BUILD argparser_->PushBackTail(&inputFile); argparser_->EnableTail(); @@ -196,6 +204,9 @@ bool Options::Parse(int argc, const char **argv) compilerOptions_.std_lib = stdLib.GetValue(); compilerOptions_.gen_std_lib = genStdLib.GetValue(); compilerOptions_.arkts_config = arktsConfig.GetValue(); +#ifndef PANDA_PRODUCT_BUILD + compilerOptions_.allow_testing_builtins_syntax = allowTestingBuiltinsSyntax.GetValue(); +#endif // PANDA_PRODUCT_BUILD return true; } diff --git a/binder/scope.cpp b/binder/scope.cpp index a7c0a73d2..99ecac201 100644 --- a/binder/scope.cpp +++ b/binder/scope.cpp @@ -256,7 +256,7 @@ void VariableScope::CheckDirectEval(compiler::CompilerContext *compilerCtx) } } - std::vector literals(LexicalSlots() + constBindings); + std::vector literals(LexicalSlots() + constBindings, compiler::Literal(util::StringView())); if (constBindings == 0U) { for (const auto &[name, variable] : bindings_) { @@ -280,6 +280,11 @@ void VariableScope::CheckDirectEval(compiler::CompilerContext *compilerCtx) uint32_t buffIndex = 0; for (const auto *variable : bindings) { + if (variable == nullptr) { + ASSERT(literals[buffIndex].GetString() == ""); + buffIndex++; + continue; + } if (variable->Declaration()->IsConstDecl()) { literals[buffIndex++] = compiler::Literal(true); } diff --git a/compiler/core/emitter.cpp b/compiler/core/emitter.cpp index b8bfc9670..ccfbaca1e 100644 --- a/compiler/core/emitter.cpp +++ b/compiler/core/emitter.cpp @@ -98,7 +98,7 @@ static LiteralPair TransformLiteral(const compiler::Literal *literal) break; } default: - break; + UNREACHABLE(); } tagLit.tag = panda_file::LiteralTag::TAGVALUE; diff --git a/es2panda.h b/es2panda.h index 0eae7cfd5..96387965b 100644 --- a/es2panda.h +++ b/es2panda.h @@ -64,6 +64,9 @@ struct CompilerOptions { bool is_eval {}; bool is_direct_eval {}; bool is_function_eval {}; +#ifndef PANDA_PRODUCT_BUILD + bool allow_testing_builtins_syntax {}; +#endif // PANDA_PRODUCT_BUILD bool dump_ast {}; bool dump_asm {}; bool dump_debug_info {}; diff --git a/parser/expressionParser.cpp b/parser/expressionParser.cpp index 50dff800d..4268e1d95 100644 --- a/parser/expressionParser.cpp +++ b/parser/expressionParser.cpp @@ -1012,6 +1012,21 @@ ir::Expression *ParserImpl::ParsePrimaryExpression(ExpressionParseFlags flags) case lexer::TokenType::PUNCTUATOR_LESS_THAN: { return ParsePrefixAssertionExpression(); } +#ifndef PANDA_PRODUCT_BUILD + case lexer::TokenType::PUNCTUATOR_MOD: { + if (options_.allow_testing_builtins_syntax) { + util::UString implicitObject(std::string("RuntimeTesting"), Allocator()); + auto *implicitObj = AllocNode(implicitObject.View(), Allocator()); + implicitObj->SetReference(); + implicitObj->SetRange(lexer_->GetToken().Loc()); + + lexer_->NextToken(); + return ParsePropertyAccess(implicitObj); + } else { + ThrowSyntaxError({"Testing builtins syntax is not allowed"}); + } + } +#endif // PANDA_PRODUCT_BUILD default: { break; } -- Gitee