Skip to content

Commit 8503a80

Browse files
committed
Add initial types module
1 parent d3b0c87 commit 8503a80

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

vm/src/stdlib/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ mod keyword;
55
mod math;
66
mod pystruct;
77
mod re;
8+
mod types;
89
use std::collections::HashMap;
910

1011
use super::pyobject::{PyContext, PyObjectRef};
@@ -13,12 +14,13 @@ pub type StdlibInitFunc = fn(&PyContext) -> PyObjectRef;
1314

1415
pub fn get_module_inits() -> HashMap<String, StdlibInitFunc> {
1516
let mut modules = HashMap::new();
17+
modules.insert("ast".to_string(), ast::mk_module as StdlibInitFunc);
1618
modules.insert("io".to_string(), io::mk_module as StdlibInitFunc);
1719
modules.insert("json".to_string(), json::mk_module as StdlibInitFunc);
18-
modules.insert("ast".to_string(), ast::mk_module as StdlibInitFunc);
1920
modules.insert("keyword".to_string(), keyword::mk_module as StdlibInitFunc);
2021
modules.insert("math".to_string(), math::mk_module as StdlibInitFunc);
2122
modules.insert("re".to_string(), re::mk_module as StdlibInitFunc);
2223
modules.insert("struct".to_string(), pystruct::mk_module as StdlibInitFunc);
24+
modules.insert("types".to_string(), types::mk_module as StdlibInitFunc);
2325
modules
2426
}

vm/src/stdlib/types.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Dynamic type creation and names for built in types.
3+
*/
4+
5+
use super::super::obj::{objstr, objtuple, objtype};
6+
use super::super::pyobject::{
7+
DictProtocol, PyContext, PyFuncArgs, PyObjectRef, PyResult, TypeProtocol,
8+
};
9+
use super::super::VirtualMachine;
10+
11+
fn types_new_class(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
12+
arg_check!(
13+
vm,
14+
args,
15+
required = [(name, Some(vm.ctx.str_type()))],
16+
optional = [(bases, None), (_kwds, None), (_exec_body, None)]
17+
);
18+
19+
let name = objstr::get_value(name);
20+
let dict = vm.ctx.new_dict();
21+
22+
let bases = match bases {
23+
Some(b) => {
24+
if objtype::isinstance(b, vm.ctx.tuple_type()) {
25+
objtuple::get_elements(b)
26+
} else {
27+
return Err(vm.new_type_error("Bases must be a tuple".to_string()));
28+
}
29+
}
30+
None => vec![vm.ctx.object()],
31+
};
32+
33+
objtype::new(vm.ctx.type_type(), &name, bases, dict)
34+
}
35+
36+
pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
37+
let py_mod = ctx.new_module(&"types".to_string(), ctx.new_scope(None));
38+
39+
// Number theory functions:
40+
py_mod.set_item("new_class", ctx.new_rustfunc(types_new_class));
41+
py_mod.set_item("FunctionType", ctx.function_type());
42+
43+
py_mod
44+
}

vm/src/vm.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ impl VirtualMachine {
122122
let ctx = PyContext::new();
123123
let builtins = builtins::make_module(&ctx);
124124
let sysmod = sysmodule::mk_module(&ctx);
125+
// Add builtins as builtins module:
126+
// sysmod.get_attr("modules").unwrap().set_item("builtins", builtins.clone());
125127
let stdlib_inits = stdlib::get_module_inits();
126128
VirtualMachine {
127129
frames: vec![],

0 commit comments

Comments
 (0)