From 9dedf0f5172dd653c1d3f34b303d8bd9f5d427bd Mon Sep 17 00:00:00 2001 From: Li Jin Date: Wed, 15 Nov 2023 16:08:12 +0800 Subject: fix a crash case for import statement. --- src/yuescript/yue_compiler.cpp | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 7fdf45e..8c4afce 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -75,7 +75,7 @@ static std::unordered_set Metamethods = { "close"s // Lua 5.4 }; -const std::string_view version = "0.20.5"sv; +const std::string_view version = "0.20.6"sv; const std::string_view extension = "yue"sv; class CompileError : public std::logic_error { @@ -950,6 +950,9 @@ private: template ast_ptr toAst(std::string_view codes, ast_node* parent) { auto res = _parser.parse(std::string(codes)); + if (res.error) { + throw CompileError(res.error.value().msg, parent); + } res.node->traverse([&](ast_node* node) { node->m_begin.m_line = parent->m_begin.m_line; node->m_begin.m_col = parent->m_begin.m_col; @@ -8808,18 +8811,22 @@ private: return name; } - void transformImportAs(ImportAs_t* import, str_list& out) { - ast_node* x = import; - if (!import->target) { - auto name = moduleNameFrom(import->literal); - import->target.set(toAst(name, x)); + void transformImportAs(ImportAs_t* importNode, str_list& out) { + ast_node* x = importNode; + if (!importNode->target) { + auto name = moduleNameFrom(importNode->literal); + if (_parser.match(name)) { + importNode->target.set(toAst(name, x)); + } else { + throw CompileError("import module name can not be used as a variable name, try renaming it with \"as newName\" clause"sv, importNode->literal); + } } - if (ast_is(import->target)) { - x = import->target.get(); - bool importAllMacro = import->target.is(); + if (ast_is(importNode->target)) { + x = importNode->target.get(); + bool importAllMacro = importNode->target.is(); std::list> macroPairs; auto newTab = x->new_ptr(); - if (auto tabLit = import->target.as()) { + if (auto tabLit = importNode->target.as()) { for (auto item : tabLit->items.objects()) { switch (item->get_id()) { #ifdef YUE_NO_MACRO @@ -8859,7 +8866,7 @@ private: } #ifndef YUE_NO_MACRO if (importAllMacro || !macroPairs.empty()) { - auto moduleName = _parser.toString(import->literal); + auto moduleName = _parser.toString(importNode->literal); Utils::replace(moduleName, "'"sv, ""sv); Utils::replace(moduleName, "\""sv, ""sv); Utils::trim(moduleName); @@ -8935,10 +8942,10 @@ private: out.push_back(Empty); return; } else { - import->target.set(newTab); + importNode->target.set(newTab); } } - auto target = import->target.get(); + auto target = importNode->target.get(); x = target; auto value = x->new_ptr(); if (auto var = ast_cast(target)) { @@ -8994,7 +9001,7 @@ private: auto assignList = x->new_ptr(); assignList->exprs.push_back(exp); auto assign = x->new_ptr(); - assign->values.push_back(toAst("require "s + _parser.toString(import->literal), x)); + assign->values.push_back(toAst("require "s + _parser.toString(importNode->literal), x)); auto assignment = x->new_ptr(); assignment->expList.set(assignList); assignment->action.set(assign); -- cgit v1.2.3-55-g6feb