Skip to content

Commit 83ea419

Browse files
committed
Add load and store of global to name protocol.
1 parent 76c597f commit 83ea419

File tree

2 files changed

+50
-15
lines changed

2 files changed

+50
-15
lines changed

vm/src/frame.rs

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ pub trait NameProtocol {
129129
fn store_name(&self, vm: &VirtualMachine, name: &str, value: PyObjectRef);
130130
fn delete_name(&self, vm: &VirtualMachine, name: &str);
131131
fn load_cell(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>;
132+
fn load_global(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef>;
133+
fn store_global(&self, vm: &VirtualMachine, name: &str, value: PyObjectRef);
132134
}
133135

134136
impl NameProtocol for Scope {
@@ -162,6 +164,14 @@ impl NameProtocol for Scope {
162164
fn delete_name(&self, vm: &VirtualMachine, key: &str) {
163165
self.get_locals().del_item(key, vm).unwrap();
164166
}
167+
168+
fn load_global(&self, vm: &VirtualMachine, name: &str) -> Option<PyObjectRef> {
169+
self.globals.get_item_option(name, vm).unwrap()
170+
}
171+
172+
fn store_global(&self, vm: &VirtualMachine, name: &str, value: PyObjectRef) {
173+
self.globals.set_item(name, value, vm).unwrap();
174+
}
165175
}
166176

167177
#[derive(Clone, Debug)]
@@ -994,12 +1004,12 @@ impl Frame {
9941004
&self,
9951005
vm: &VirtualMachine,
9961006
name: &str,
997-
scope: &bytecode::NameScope,
1007+
name_scope: &bytecode::NameScope,
9981008
) -> FrameResult {
9991009
let obj = self.pop_value();
1000-
match scope {
1010+
match name_scope {
10011011
bytecode::NameScope::Global => {
1002-
self.scope.globals.set_item(name, obj, vm)?;
1012+
self.scope.store_global(vm, name, obj);
10031013
}
10041014
bytecode::NameScope::Local => {
10051015
self.scope.store_name(&vm, name, obj);
@@ -1017,19 +1027,21 @@ impl Frame {
10171027
&self,
10181028
vm: &VirtualMachine,
10191029
name: &str,
1020-
scope: &bytecode::NameScope,
1030+
name_scope: &bytecode::NameScope,
10211031
) -> FrameResult {
1022-
let value = match scope {
1023-
bytecode::NameScope::Global => self.scope.globals.get_item(name, vm)?,
1024-
bytecode::NameScope::Local => match self.scope.load_name(&vm, name) {
1025-
Some(value) => value,
1026-
None => {
1027-
let name_error_type = vm.ctx.exceptions.name_error.clone();
1028-
let msg = format!("name '{}' is not defined", name);
1029-
let name_error = vm.new_exception(name_error_type, msg);
1030-
return Err(name_error);
1031-
}
1032-
},
1032+
let optional_value = match name_scope {
1033+
bytecode::NameScope::Global => self.scope.load_global(vm, name),
1034+
bytecode::NameScope::Local => self.scope.load_name(&vm, name),
1035+
};
1036+
1037+
let value = match optional_value {
1038+
Some(value) => value,
1039+
None => {
1040+
let name_error_type = vm.ctx.exceptions.name_error.clone();
1041+
let msg = format!("name '{}' is not defined", name);
1042+
let name_error = vm.new_exception(name_error_type, msg);
1043+
return Err(name_error);
1044+
}
10331045
};
10341046

10351047
self.push_value(value);

vm/src/symboltable.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,17 @@ impl SymbolTableBuilder {
111111
}
112112

113113
fn scan_parameter(&mut self, parameter: &ast::Parameter) -> SymbolTableResult {
114+
self.register_name(&parameter.arg, SymbolRole::Assigned)
115+
}
116+
117+
fn scan_parameters_annotations(&mut self, parameters: &[ast::Parameter]) -> SymbolTableResult {
118+
for parameter in parameters {
119+
self.scan_parameter_annotation(parameter)?;
120+
}
121+
Ok(())
122+
}
123+
124+
fn scan_parameter_annotation(&mut self, parameter: &ast::Parameter) -> SymbolTableResult {
114125
if let Some(annotation) = &parameter.annotation {
115126
self.scan_expression(&annotation)?;
116127
}
@@ -394,7 +405,19 @@ impl SymbolTableBuilder {
394405
}
395406
}
396407

408+
// Annotations are scanned in outer scope:
409+
self.scan_parameters_annotations(&args.args)?;
410+
self.scan_parameters_annotations(&args.kwonlyargs)?;
411+
if let ast::Varargs::Named(name) = &args.vararg {
412+
self.scan_parameter_annotation(name)?;
413+
}
414+
if let ast::Varargs::Named(name) = &args.kwarg {
415+
self.scan_parameter_annotation(name)?;
416+
}
417+
397418
self.enter_scope();
419+
420+
// Fill scope with parameter names:
398421
self.scan_parameters(&args.args)?;
399422
self.scan_parameters(&args.kwonlyargs)?;
400423
if let ast::Varargs::Named(name) = &args.vararg {

0 commit comments

Comments
 (0)