From 8c9408bde7735065447891999042369ff64c95af Mon Sep 17 00:00:00 2001 From: Li Jin Date: Sat, 10 Aug 2024 00:13:26 +0800 Subject: fix macro function line number handling. --- src/yuescript/yue_compiler.cpp | 19 ++----------------- src/yuescript/yuescript.h | 7 ++----- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index a5b6666..9e778d7 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -5117,22 +5117,7 @@ private: newArgs.emplace_back(_parser.toString(argsDef->varArg)); } } - std::string macroCodes; - { - auto funLit = toAst("("s + join(newArgs, ","sv) + ")->"s, macroLit); - auto block = macroLit->new_ptr(); - if (auto stmt = macroLit->body->content.as()) { - block->statements.push_back(stmt); - } else { - auto blk = macroLit->body->content.to(); - block->statements.dup(blk->statements); - } - block->statements.push_front(toAst("_ENV=yue:require('yue'),:_G,:(k, v)=>_G[k]=v"sv, macroLit)); - auto body = macroLit->new_ptr(); - body->content.set(block); - funLit->body.set(body); - macroCodes = YueFormat{}.toString(funLit); - } + std::string macroCodes = "_ENV=yue:require('yue'),:_G,:(k,v)=>_G[k]=v\n("s + join(newArgs, ","sv) + ")->"s + _parser.toString(macroLit->body); auto chunkName = "=(macro "s + macroName + ')'; pushCurrentModule(); // cur int top = lua_gettop(L) - 1; @@ -5140,7 +5125,7 @@ private: pushYue("loadstring"sv); // cur loadstring lua_pushlstring(L, macroCodes.c_str(), macroCodes.size()); // cur loadstring codes lua_pushlstring(L, chunkName.c_str(), chunkName.size()); // cur loadstring codes chunk - pushOptions(macro->m_begin.m_line - 1); // cur loadstring codes chunk options + pushOptions(macro->m_begin.m_line - 2); // cur loadstring codes chunk options if (lua_pcall(L, 3, 2, 0) != 0) { // loadstring(codes,chunk,options), cur f err std::string err = lua_tostring(L, -1); throw CompileError("failed to load macro codes\n"s + err, macroLit); diff --git a/src/yuescript/yuescript.h b/src/yuescript/yuescript.h index a160f55..97ebdef 100644 --- a/src/yuescript/yuescript.h +++ b/src/yuescript/yuescript.h @@ -114,7 +114,7 @@ local function yue_call(f, ...) end) end yue_loadstring = function(...) - local options, str, chunk_name, mode, env = get_options(...) + local options, str, chunk_name, env = get_options(...) chunk_name = chunk_name or "=(yuescript.loadstring)" options.module = chunk_name local code, err = yue.to_lua(str, options) @@ -124,10 +124,7 @@ yue_loadstring = function(...) if chunk_name then yue.yue_compiled["@" .. chunk_name] = code end - return (loadstring or load)(code, chunk_name, unpack({ - mode, - env - })) + return (loadstring or load)(code, chunk_name, "t", unpack({env})) end local function yue_loadfile(fname, ...) local res, err = yue.read_file(fname) -- cgit v1.2.3-55-g6feb