Copy in compile_atom instead of macroexpand_1
This copying is what keeps all the mutating code in the compiler methods (e.g., `expr.pop(0)`) from breaking cases in which Hy model objects are compiled more than once or inspected after compilation.
This commit is contained in:
parent
4a6b633ad2
commit
116d7fa6ec
@ -423,6 +423,8 @@ class HyASTCompiler(object):
|
|||||||
# pass in `atom_type`.
|
# pass in `atom_type`.
|
||||||
atom_compiler = _compile_table[atom_type]
|
atom_compiler = _compile_table[atom_type]
|
||||||
arity = hy.inspect.get_arity(atom_compiler)
|
arity = hy.inspect.get_arity(atom_compiler)
|
||||||
|
# Compliation methods may mutate the atom, so copy it first.
|
||||||
|
atom = copy.copy(atom)
|
||||||
ret = (atom_compiler(self, atom, atom_type)
|
ret = (atom_compiler(self, atom, atom_type)
|
||||||
if arity == 3
|
if arity == 3
|
||||||
else atom_compiler(self, atom))
|
else atom_compiler(self, atom))
|
||||||
|
@ -181,8 +181,6 @@ def macroexpand_1(tree, compiler):
|
|||||||
fn = tree[0]
|
fn = tree[0]
|
||||||
if fn in ("quote", "quasiquote"):
|
if fn in ("quote", "quasiquote"):
|
||||||
return tree
|
return tree
|
||||||
ntree = HyExpression(tree[:])
|
|
||||||
ntree.replace(tree)
|
|
||||||
|
|
||||||
opts = {}
|
opts = {}
|
||||||
|
|
||||||
@ -197,14 +195,14 @@ def macroexpand_1(tree, compiler):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
m_copy = make_empty_fn_copy(m)
|
m_copy = make_empty_fn_copy(m)
|
||||||
m_copy(compiler.module_name, *ntree[1:], **opts)
|
m_copy(compiler.module_name, *tree[1:], **opts)
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
msg = "expanding `" + str(tree[0]) + "': "
|
msg = "expanding `" + str(tree[0]) + "': "
|
||||||
msg += str(e).replace("<lambda>()", "", 1).strip()
|
msg += str(e).replace("<lambda>()", "", 1).strip()
|
||||||
raise HyMacroExpansionError(tree, msg)
|
raise HyMacroExpansionError(tree, msg)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
obj = m(compiler.module_name, *ntree[1:], **opts)
|
obj = m(compiler.module_name, *tree[1:], **opts)
|
||||||
except HyTypeError as e:
|
except HyTypeError as e:
|
||||||
if e.expression is None:
|
if e.expression is None:
|
||||||
e.expression = tree
|
e.expression = tree
|
||||||
@ -214,7 +212,6 @@ def macroexpand_1(tree, compiler):
|
|||||||
raise HyMacroExpansionError(tree, msg)
|
raise HyMacroExpansionError(tree, msg)
|
||||||
replace_hy_obj(obj, tree)
|
replace_hy_obj(obj, tree)
|
||||||
return obj
|
return obj
|
||||||
return ntree
|
|
||||||
return tree
|
return tree
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user