def nonlocally_immutable(self):
# Returns whether this variable is a safe reference, i.e.
# can't be modified as part of globals or closures.
- return self.is_temp
+ return self.is_temp or self.type.is_array or self.type.is_cfunction
# --------------- Type Analysis ------------------
return 1
def nonlocally_immutable(self):
+ if ExprNode.nonlocally_immutable(self):
+ return True
entry = self.entry
return entry and (entry.is_local or entry.is_arg) and not entry.in_closure
if i == 0 and self.self is not None:
continue # self is ok
arg = self.args[i]
- if arg.is_name and arg.entry and (
- (arg.entry.is_local and not arg.entry.in_closure)
- or arg.entry.type.is_cfunction):
- # local variables and C functions are safe
+ if arg.nonlocally_immutable():
+ # locals, C functions, unassignable types are safe.
pass
elif arg.type.is_cpp_class:
# Assignment has side effects, avoid.