From d905d9744344da7376ae56e7dc270a81da33d15f Mon Sep 17 00:00:00 2001 From: Li Jin Date: Wed, 7 May 2025 18:16:22 +0800 Subject: Updated. --- src/yuescript/yue_compiler.cpp | 66 ++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 06f0d6d..bc4574b 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -2814,19 +2814,19 @@ private: if (!varDefOnly) throw e; } if (!assignable && !varDefOnly) { - if (optional) { - if (defVal) { - throw CompileError("default value is not supported here"sv, defVal); - } - auto exp = static_cast(pair); - auto chain = exp->new_ptr(); - auto indexItem = toAst(std::to_string(index), exp); - chain->items.push_back(indexItem); - pairs.push_back({exp, Empty, chain, nullptr}); - break; - } else { - throw CompileError("can't destructure value"sv, pair); + if (optional) break; + throw CompileError("can't destructure value"sv, pair); + } + if (optional && varDefOnly && !assignable) { + if (defVal) { + throw CompileError("default value is not supported here"sv, defVal); } + auto exp = static_cast(pair); + auto chain = exp->new_ptr(); + auto indexItem = toAst(std::to_string(index), exp); + chain->items.push_back(indexItem); + pairs.push_back({exp, Empty, chain, nullptr}); + break; } auto value = singleValueFrom(pair); auto item = value->item.get(); @@ -2914,17 +2914,17 @@ private: if (!varDefOnly) throw e; } if (!assignable && !varDefOnly) { - if (optional) { - if (defVal) { - throw CompileError("default value is not supported here"sv, defVal); - } - auto chain = exp->new_ptr(); - if (keyIndex) chain->items.push_back(keyIndex); - pairs.push_back({exp, Empty, chain, nullptr}); - break; - } else { - throw CompileError("can't destructure value"sv, exp); + if (optional) break; + throw CompileError("can't destructure value"sv, pair); + } + if (optional && varDefOnly && !assignable) { + if (defVal) { + throw CompileError("default value is not supported here"sv, defVal); } + auto chain = exp->new_ptr(); + if (keyIndex) chain->items.push_back(keyIndex); + pairs.push_back({exp, Empty, chain, nullptr}); + break; } auto item = singleValueFrom(exp)->item.get(); ast_node* subExp = ast_cast(item); @@ -10652,16 +10652,26 @@ private: for (const auto& item : destruct.items) { if (!item.defVal) { if (!isAssignable(item.target)) { - transformExp(item.target, conds, ExpUsage::Closure); auto callable = chainValue->items.front(); auto chain = callable->new_ptr(); chain->items.push_back(callable); chain->items.dup(item.structure->items); - transformChainValue(chain, conds, ExpUsage::Closure); - auto vStr = conds.back(); - conds.pop_back(); - conds.back().append(" == "s); - conds.back().append(vStr); + if (specialChainValue(chain) == ChainType::Common) { + transformChainValue(chain, conds, ExpUsage::Closure); + auto vStr = conds.back(); + conds.pop_back(); + transformExp(item.target, conds, ExpUsage::Closure); + conds.back().append(" == "s); + conds.back().append(vStr); + } else { + auto varName = getUnusedName("_val_"sv); + auto vExp = toAst(varName, chain); + auto asmt = assignmentFrom(vExp, newExp(chain, chain), chain); + transformAssignment(asmt, temp); + transformExp(item.target, conds, ExpUsage::Closure); + conds.back().append(" == "s); + conds.back().append(varName); + } } else { transformExp(item.target, conds, ExpUsage::Closure); conds.back().append(" ~= nil"s); -- cgit v1.2.3-55-g6feb