Delete DictProtocol. impl ItemProtocol for PyDictRef.

This commit is contained in:
Adam Kelly
2019-04-06 09:41:46 +01:00
parent ee9066a713
commit 7b2d92f495
12 changed files with 78 additions and 59 deletions

View File

@@ -3,8 +3,7 @@ use std::fmt;
use crate::function::{KwArgs, OptionalArg};
use crate::pyobject::{
DictProtocol, IntoPyObject, ItemProtocol, PyAttributes, PyContext, PyObjectRef, PyRef,
PyResult, PyValue,
IntoPyObject, ItemProtocol, PyAttributes, PyContext, PyObjectRef, PyRef, PyResult, PyValue,
};
use crate::vm::{ReprGuard, VirtualMachine};
@@ -174,8 +173,8 @@ impl PyDictRef {
self.entries.borrow().get_items()
}
fn setitem(self, key: PyObjectRef, value: PyObjectRef, vm: &VirtualMachine) {
self.set_item(key, value, vm)
fn setitem(self, key: PyObjectRef, value: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
self.entries.borrow_mut().insert(vm, &key, value)
}
fn getitem(self, key: PyObjectRef, vm: &VirtualMachine) -> PyResult {
@@ -223,21 +222,26 @@ impl PyDictRef {
}
}
impl DictProtocol for PyDictRef {
fn get_item<T: IntoPyObject>(&self, key: T, vm: &VirtualMachine) -> Option<PyObjectRef> {
let key = key.into_pyobject(vm).unwrap();
self.entries.borrow().get(vm, &key).unwrap()
impl ItemProtocol for PyDictRef {
fn get_item<T: IntoPyObject>(&self, key: T, vm: &VirtualMachine) -> PyResult {
vm.call_method(self.as_object(), "__getitem__", key.into_pyobject(vm)?)
}
// Item set/get:
fn set_item<T: IntoPyObject>(&self, key: T, value: PyObjectRef, vm: &VirtualMachine) {
let key = key.into_pyobject(vm).unwrap();
self.entries.borrow_mut().insert(vm, &key, value).unwrap()
fn set_item<T: IntoPyObject>(
&self,
key: T,
value: PyObjectRef,
vm: &VirtualMachine,
) -> PyResult {
vm.call_method(
self.as_object(),
"__setitem__",
vec![key.into_pyobject(vm)?, value],
)
}
fn del_item<T: IntoPyObject>(&self, key: T, vm: &VirtualMachine) {
let key = key.into_pyobject(vm).unwrap();
self.entries.borrow_mut().delete(vm, &key).unwrap();
fn del_item<T: IntoPyObject>(&self, key: T, vm: &VirtualMachine) -> PyResult {
vm.call_method(self.as_object(), "__delitem__", key.into_pyobject(vm)?)
}
}

View File

@@ -6,7 +6,7 @@ use crate::function::PyFuncArgs;
use crate::obj::objproperty::PropertyBuilder;
use crate::obj::objtype::PyClassRef;
use crate::pyobject::{
DictProtocol, IdProtocol, PyAttributes, PyContext, PyObject, PyObjectRef, PyResult, PyValue,
IdProtocol, ItemProtocol, PyAttributes, PyContext, PyObject, PyObjectRef, PyResult, PyValue,
TryFromObject, TypeProtocol,
};
use crate::vm::VirtualMachine;
@@ -77,7 +77,7 @@ fn object_setattr(
}
if let Some(ref dict) = obj.clone().dict {
dict.set_item(attr_name, value, vm);
dict.set_item(attr_name, value, vm)?;
Ok(())
} else {
Err(vm.new_attribute_error(format!(
@@ -98,7 +98,7 @@ fn object_delattr(obj: PyObjectRef, attr_name: PyStringRef, vm: &VirtualMachine)
}
if let Some(ref dict) = obj.dict {
dict.del_item(attr_name, vm);
dict.del_item(attr_name, vm)?;
Ok(())
} else {
Err(vm.new_attribute_error(format!(
@@ -208,7 +208,7 @@ fn object_getattribute(obj: PyObjectRef, name_str: PyStringRef, vm: &VirtualMach
}
}
if let Some(obj_attr) = object_getattr(&obj, &name, &vm) {
if let Some(obj_attr) = object_getattr(&obj, &name, &vm)? {
Ok(obj_attr)
} else if let Some(attr) = objtype::class_get_attr(&cls, &name) {
vm.call_get_descriptor(attr, obj)
@@ -219,11 +219,15 @@ fn object_getattribute(obj: PyObjectRef, name_str: PyStringRef, vm: &VirtualMach
}
}
fn object_getattr(obj: &PyObjectRef, attr_name: &str, vm: &VirtualMachine) -> Option<PyObjectRef> {
fn object_getattr(
obj: &PyObjectRef,
attr_name: &str,
vm: &VirtualMachine,
) -> PyResult<Option<PyObjectRef>> {
if let Some(ref dict) = obj.dict {
dict.get_item(attr_name, vm)
dict.get_item_option(attr_name, vm)
} else {
None
Ok(None)
}
}

View File

@@ -12,7 +12,7 @@ use crate::obj::objfunction::PyMethod;
use crate::obj::objstr;
use crate::obj::objtype::{PyClass, PyClassRef};
use crate::pyobject::{
DictProtocol, PyContext, PyObjectRef, PyRef, PyResult, PyValue, TryFromObject, TypeProtocol,
ItemProtocol, PyContext, PyObjectRef, PyRef, PyResult, PyValue, TryFromObject, TypeProtocol,
};
use crate::vm::VirtualMachine;
@@ -124,7 +124,7 @@ fn super_new(
} else {
let frame = vm.current_frame().expect("no current frame for super()");
if let Some(first_arg) = frame.code.arg_names.get(0) {
match vm.get_locals().get_item(first_arg, vm) {
match vm.get_locals().get_item_option(first_arg, vm)? {
Some(obj) => obj.clone(),
_ => {
return Err(vm