copy arg arrays before passing to macro/form functions

This commit is contained in:
2022-06-01 17:03:57 +00:00
parent c961f63e37
commit e3d7365d75

View File

@@ -355,20 +355,20 @@ class Kiss {
case StrExp(s): case StrExp(s):
EConst(CString(s)).withMacroPosOf(exp); EConst(CString(s)).withMacroPosOf(exp);
case CallExp({pos: _, def: Symbol(ff)}, args) if (fieldForms.exists(ff)): case CallExp({pos: _, def: Symbol(ff)}, args) if (fieldForms.exists(ff)):
var field = fieldForms[ff](exp, args, k); var field = fieldForms[ff](exp, args.copy(), k);
k.fieldList.push(field); k.fieldList.push(field);
k.fieldDict[field.name] = field; k.fieldDict[field.name] = field;
none; // Field forms are no-ops none; // Field forms are no-ops
case CallExp({pos: _, def: Symbol(mac)}, args) if (macros.exists(mac)): case CallExp({pos: _, def: Symbol(mac)}, args) if (macros.exists(mac)):
macroUsed = true; macroUsed = true;
var expanded = macros[mac](exp, args, k); var expanded = macros[mac](exp, args.copy(), k);
if (expanded != null) { if (expanded != null) {
convert(expanded); convert(expanded);
} else { } else {
none; none;
}; };
case CallExp({pos: _, def: Symbol(specialForm)}, args) if (specialForms.exists(specialForm)): case CallExp({pos: _, def: Symbol(specialForm)}, args) if (specialForms.exists(specialForm)):
specialForms[specialForm](exp, args, k); specialForms[specialForm](exp, args.copy(), k);
case CallExp({pos: _, def: Symbol(alias)}, args) if (k.callAliases.exists(alias)): case CallExp({pos: _, def: Symbol(alias)}, args) if (k.callAliases.exists(alias)):
convert(CallExp(k.callAliases[alias].withPosOf(exp), args).withPosOf(exp)); convert(CallExp(k.callAliases[alias].withPosOf(exp), args).withPosOf(exp));
case CallExp(func, args): case CallExp(func, args):