Merge pull request #104 from OddBloke/macro

Use arg_check! in objtype
This commit is contained in:
Windel Bouwman
2018-08-31 19:29:43 +02:00
committed by GitHub

View File

@@ -1,4 +1,5 @@
use super::objdict;
use super::objtype; // Required for arg_check! to use isinstance
use super::pyobject::{
AttributeProtocol, IdProtocol, PyContext, PyFuncArgs, PyObject, PyObjectKind, PyObjectRef,
PyResult, ToRust, TypeProtocol,
@@ -28,7 +29,16 @@ pub fn init(context: &PyContext) {
}
fn type_mro(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
match _mro(args.args[0].clone()) {
println!("{:?}", args);
arg_check!(
vm,
args,
required = [
(cls, Some(vm.ctx.type_type())),
(_typ, Some(vm.ctx.type_type()))
]
);
match _mro(cls.clone()) {
Some(mro) => Ok(vm.context().new_tuple(mro)),
None => Err(vm.new_type_error("Only classes have an MRO.".to_string())),
}
@@ -71,14 +81,29 @@ pub fn get_type_name(typ: &PyObjectRef) -> String {
pub fn type_new(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
debug!("type.__new__{:?}", args);
if args.args.len() == 2 {
Ok(args.args[1].typ())
arg_check!(
vm,
args,
required = [(_typ, Some(vm.ctx.type_type())), (obj, None)]
);
Ok(obj.typ())
} else if args.args.len() == 4 {
let typ = args.args[0].clone();
let name = args.args[1].to_str().unwrap();
arg_check!(
vm,
args,
required = [
(typ, Some(vm.ctx.type_type())),
(name, Some(vm.ctx.str_type())),
// bases needs to be mutable, which arg_check! doesn't support, so we just check
// the type and extract it again below
// TODO: arg_check! should support specifying iterables
(_bases, None),
(dict, Some(vm.ctx.dict_type()))
]
);
let mut bases = args.args[2].to_vec().unwrap();
bases.push(vm.context().object());
let dict = args.args[3].clone();
new(typ, &name, bases, dict)
new(typ.clone(), &name.to_str().unwrap(), bases, dict.clone())
} else {
Err(vm.new_type_error(format!(": type_new: {:?}", args)))
}
@@ -185,9 +210,7 @@ pub fn new(typ: PyObjectRef, name: &str, bases: Vec<PyObjectRef>, dict: PyObject
}
fn type_str(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
// TODO: fix macro:
// arg_check!(vm, args, required = [(obj, Some(vm.ctx.type_type()))]);
let obj = args.args[0].clone();
arg_check!(vm, args, required = [(obj, Some(vm.ctx.type_type()))]);
let type_name = get_type_name(&obj);
Ok(vm.new_str(format!("<class '{}'>", type_name)))
}