internal override PythonVariable BindReference(PythonNameBinder binder, PythonReference reference) {
PythonVariable variable;
// Python semantics: The variables bound local in the class
// scope are accessed by name - the dictionary behavior of classes
if (TryGetVariable(reference.Name, out variable)) {
// TODO: This results in doing a dictionary lookup to get/set the local,
// when it should probably be an uninitialized check / global lookup for gets
// and a direct set
if (variable.Kind == VariableKind.Global) {
AddReferencedGlobal(reference.Name);
} else if (variable.Kind == VariableKind.Local) {
return null;
}
return variable;
}
// Try to bind in outer scopes, if we have an unqualified exec we need to leave the
// variables as free for the same reason that locals are accessed by name.
for (ScopeStatement parent = Parent; parent != null; parent = parent.Parent) {
if (parent.TryBindOuter(this, reference, out variable)) {
return variable;
}
}
return null;
}