diff --git a/aot/options.cpp b/aot/options.cpp index fc52aed9d99f8a484503ce2a6203ff28e24b10a5..0ee6c366ca597754f641a7ef39ac12bd4e010450 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 a7c0a73d20b69646d22abefd7e0aeb2f49a035c3..99ecac201e0430ce1f4665fce043e8e3dde2f034 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 b8bfc9670d8140199b9c2d46cf6d8f62db0e23d0..ccfbaca1ea218c540a0fda1d4a72d1b475c23209 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 0eae7cfd5d7da98ee94a965229c35f307b9c93b6..96387965b2c87bd6704c9d2920ad19dc4c081ed7 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 50dff800db1e23d1260c0a1951e2401d14cd3873..4268e1d950af8ff4d58372b13d5e51d1f84b6e9c 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; }