GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing rustpython.github.io — objweakref.rs.html -- source 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 use super::objtype::PyClassRef; use crate::function::{OptionalArg, PyFuncArgs}; use crate::pyobject::{ PyClassImpl, PyContext, PyObject, PyObjectPayload, PyObjectRef, PyRef, PyResult, PyValue, }; use crate::slots::SlotCall; use crate::vm::VirtualMachine; use std::rc::{Rc, Weak}; #[pyclass] #[derive(Debug)] pub struct PyWeak { referent: Weak<PyObject<dyn PyObjectPayload>>, } impl PyWeak { pub fn downgrade(obj: &PyObjectRef) -> PyWeak { PyWeak { referent: Rc::downgrade(obj), } } pub fn upgrade(&self) -> Option<PyObjectRef> { self.referent.upgrade() } } impl PyValue for PyWeak { fn class(vm: &VirtualMachine) -> PyClassRef { vm.ctx.weakref_type() } } pub type PyWeakRef = PyRef<PyWeak>; impl SlotCall for PyWeak { fn call(&self, args: PyFuncArgs, vm: &VirtualMachine) -> PyResult { args.bind::<()>(vm)?; Ok(self.referent.upgrade().unwrap_or_else(|| vm.get_none())) } } #[pyimpl(with(SlotCall), flags(BASETYPE))] impl PyWeak { // TODO callbacks #[pyslot] fn tp_new( cls: PyClassRef, referent: PyObjectRef, _callback: OptionalArg<PyObjectRef>, vm: &VirtualMachine, ) -> PyResult<PyRef<Self>> { PyWeak::downgrade(&referent).into_ref_with_type(vm, cls) } } pub fn init(context: &PyContext) { PyWeak::extend_class(context, &context.types.weakref_type); } |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |