Files
RustPython/vm/src/obj/objnone.rs
Jeong YunWon 58744df1d5 Revert 08e66b5002
which is not required anymore
2020-02-06 03:56:40 +09:00

74 lines
1.8 KiB
Rust

use super::objtype::PyClassRef;
use crate::pyobject::{
IntoPyObject, PyClassImpl, PyContext, PyObjectRef, PyRef, PyResult, PyValue, TypeProtocol,
};
use crate::vm::VirtualMachine;
#[pyclass(name = "NoneType")]
#[derive(Debug)]
pub struct PyNone;
pub type PyNoneRef = PyRef<PyNone>;
impl PyValue for PyNone {
fn class(vm: &VirtualMachine) -> PyClassRef {
vm.ctx.none().class()
}
}
// This allows a built-in function to not return a value, mapping to
// Python's behavior of returning `None` in this situation.
impl IntoPyObject for () {
fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
Ok(vm.ctx.none())
}
}
impl<T: IntoPyObject> IntoPyObject for Option<T> {
fn into_pyobject(self, vm: &VirtualMachine) -> PyResult {
match self {
Some(x) => x.into_pyobject(vm),
None => Ok(vm.ctx.none()),
}
}
}
#[pyimpl]
impl PyNone {
#[pyslot]
fn tp_new(_: PyClassRef, vm: &VirtualMachine) -> PyNoneRef {
vm.ctx.none.clone()
}
#[pymethod(name = "__repr__")]
fn repr(&self, _vm: &VirtualMachine) -> PyResult<String> {
Ok("None".to_owned())
}
#[pymethod(name = "__bool__")]
fn bool(&self, _vm: &VirtualMachine) -> PyResult<bool> {
Ok(false)
}
#[pymethod(name = "__eq__")]
fn eq(&self, rhs: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
if vm.is_none(&rhs) {
vm.ctx.new_bool(true)
} else {
vm.ctx.not_implemented()
}
}
#[pymethod(name = "__ne__")]
fn ne(&self, rhs: PyObjectRef, vm: &VirtualMachine) -> PyObjectRef {
if vm.is_none(&rhs) {
vm.ctx.new_bool(false)
} else {
vm.ctx.not_implemented()
}
}
}
pub fn init(context: &PyContext) {
PyNone::extend_class(context, &context.none.class());
}