From 76df8773e7f727447dd43dd9ec394fa849840847 Mon Sep 17 00:00:00 2001 From: Noah <33094578+coolreader18@users.noreply.github.com> Date: Tue, 21 Jul 2020 10:41:40 -0500 Subject: [PATCH] Use PyRc in rustpython_wasm --- Cargo.lock | 6 ++++++ wasm/lib/Cargo.toml | 2 ++ wasm/lib/src/browser_module.rs | 4 ++-- wasm/lib/src/js_module.rs | 4 ++-- wasm/lib/src/vm_class.rs | 8 ++++---- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fe3dddafd..fbb71e5d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -682,6 +682,11 @@ name = "instant" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b141fdc7836c525d4d594027d318c84161ca17aaf8113ab1f81ab93ae897485" +dependencies = [ + "js-sys", + "wasm-bindgen", + "web-sys", +] [[package]] name = "is-macro" @@ -1681,6 +1686,7 @@ dependencies = [ "futures", "generational-arena", "js-sys", + "parking_lot", "rustpython-compiler", "rustpython-parser", "rustpython-vm", diff --git a/wasm/lib/Cargo.toml b/wasm/lib/Cargo.toml index d5f104f57..9f74c5a98 100644 --- a/wasm/lib/Cargo.toml +++ b/wasm/lib/Cargo.toml @@ -27,6 +27,8 @@ serde = "1.0" js-sys = "0.3" futures = "0.1" generational-arena = "0.2" +# make parking_lot use wasm-bingden for instant +parking_lot = { version = "0.11", features = ["wasm-bindgen"] } [dependencies.web-sys] version = "0.3" diff --git a/wasm/lib/src/browser_module.rs b/wasm/lib/src/browser_module.rs index a58d3f11b..d3b14fa20 100644 --- a/wasm/lib/src/browser_module.rs +++ b/wasm/lib/src/browser_module.rs @@ -1,10 +1,10 @@ use futures::Future; use js_sys::Promise; -use std::sync::Arc; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use wasm_bindgen_futures::{future_to_promise, JsFuture}; +use rustpython_vm::common::rc::PyRc; use rustpython_vm::function::{OptionalArg, PyFuncArgs}; use rustpython_vm::import::import_file; use rustpython_vm::obj::{objdict::PyDictRef, objstr::PyStringRef, objtype::PyClassRef}; @@ -377,7 +377,7 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef { } pub fn setup_browser_module(vm: &mut VirtualMachine) { - let state = Arc::get_mut(&mut vm.state).unwrap(); + let state = PyRc::get_mut(&mut vm.state).unwrap(); state .stdlib_inits .insert("_browser".to_owned(), Box::new(make_module)); diff --git a/wasm/lib/src/js_module.rs b/wasm/lib/src/js_module.rs index 9e39e7296..d84a8cadd 100644 --- a/wasm/lib/src/js_module.rs +++ b/wasm/lib/src/js_module.rs @@ -1,11 +1,11 @@ use js_sys::{Array, Object, Reflect}; +use rustpython_vm::common::rc::PyRc; use rustpython_vm::exceptions::PyBaseExceptionRef; use rustpython_vm::function::Args; use rustpython_vm::obj::{objfloat::PyFloatRef, objstr::PyStringRef, objtype::PyClassRef}; use rustpython_vm::pyobject::{PyClassImpl, PyObjectRef, PyRef, PyResult, PyValue, TryFromObject}; use rustpython_vm::types::create_type; use rustpython_vm::VirtualMachine; -use std::sync::Arc; use wasm_bindgen::{prelude::*, JsCast}; #[wasm_bindgen(inline_js = " @@ -259,7 +259,7 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef { } pub fn setup_js_module(vm: &mut VirtualMachine) { - let state = Arc::get_mut(&mut vm.state).unwrap(); + let state = PyRc::get_mut(&mut vm.state).unwrap(); state .stdlib_inits .insert("_js".to_owned(), Box::new(make_module)); diff --git a/wasm/lib/src/vm_class.rs b/wasm/lib/src/vm_class.rs index afc6bb1a8..7e20a2bff 100644 --- a/wasm/lib/src/vm_class.rs +++ b/wasm/lib/src/vm_class.rs @@ -1,12 +1,12 @@ use std::cell::RefCell; use std::collections::HashMap; use std::rc::{Rc, Weak}; -use std::sync::Arc; use js_sys::{Object, TypeError}; use wasm_bindgen::prelude::*; use rustpython_compiler::compile; +use rustpython_vm::common::rc::{PyRc, PyWeak}; use rustpython_vm::pyobject::{ItemProtocol, PyObject, PyObjectPayload, PyObjectRef, PyValue}; use rustpython_vm::scope::{NameProtocol, Scope}; use rustpython_vm::{InitParameter, PySettings, VirtualMachine}; @@ -39,7 +39,7 @@ impl StoredVirtualMachine { js_module::setup_js_module(&mut vm); if inject_browser_module { - Arc::get_mut(&mut vm.state).unwrap().stdlib_inits.insert( + PyRc::get_mut(&mut vm.state).unwrap().stdlib_inits.insert( "_window".to_owned(), Box::new(|vm| { py_module!(vm, "_window", { @@ -177,9 +177,9 @@ impl WASMVirtualMachine { pub(crate) fn push_held_rc( &self, obj: PyObjectRef, - ) -> Result>, JsValue> { + ) -> Result>, JsValue> { self.with(|stored_vm| { - let weak = std::sync::Arc::downgrade(&obj); + let weak = PyRc::downgrade(&obj); stored_vm.held_objects.borrow_mut().push(obj); weak })