@@ -111,13 +111,14 @@ pub fn py_to_js(vm: &mut VirtualMachine, py_obj: PyObjectRef) -> JsValue {
111111
112112 return func;
113113 }
114- // the browser module might not be injected
115- if let Ok ( promise_type ) = browser_module :: import_promise_type ( vm ) {
116- if objtype :: isinstance ( & py_obj , & promise_type ) {
117- return browser_module :: get_promise_value ( & py_obj) . into ( ) ;
118- }
114+ }
115+ // the browser module might not be injected
116+ if let Ok ( promise_type ) = browser_module :: import_promise_type ( vm ) {
117+ if objtype :: isinstance ( & py_obj, & promise_type ) {
118+ return browser_module :: get_promise_value ( & py_obj ) . into ( ) ;
119119 }
120120 }
121+
121122 if objtype:: isinstance ( & py_obj, & vm. ctx . bytes_type ( ) )
122123 || objtype:: isinstance ( & py_obj, & vm. ctx . bytearray_type ( ) )
123124 {
@@ -129,15 +130,8 @@ pub fn py_to_js(vm: &mut VirtualMachine, py_obj: PyObjectRef) -> JsValue {
129130 }
130131 arr. into ( )
131132 } else {
132- let dumps = rustpython_vm:: import:: import_module ( vm, std:: path:: PathBuf :: default ( ) , "json" )
133- . expect ( "Couldn't get json module" )
134- . get_attr ( "dumps" . into ( ) )
135- . expect ( "Couldn't get json dumps" ) ;
136- match vm. invoke ( dumps, PyFuncArgs :: new ( vec ! [ py_obj] , vec ! [ ] ) ) {
137- Ok ( value) => {
138- let json = vm. to_pystr ( & value) . unwrap ( ) ;
139- js_sys:: JSON :: parse ( & json) . unwrap_or ( JsValue :: UNDEFINED )
140- }
133+ match rustpython_vm:: stdlib:: json:: ser_pyobject ( vm, & py_obj) {
134+ Ok ( json) => js_sys:: JSON :: parse ( & json) . unwrap_or ( JsValue :: UNDEFINED ) ,
141135 Err ( _) => JsValue :: UNDEFINED ,
142136 }
143137 }
@@ -229,19 +223,10 @@ pub fn js_to_py(vm: &mut VirtualMachine, js_val: JsValue) -> PyObjectRef {
229223 // Because `JSON.stringify(undefined)` returns undefined
230224 vm. get_none ( )
231225 } else {
232- let loads = rustpython_vm:: import:: import_module ( vm, std:: path:: PathBuf :: default ( ) , "json" )
233- . expect ( "Couldn't get json module" )
234- . get_attr ( "loads" . into ( ) )
235- . expect ( "Couldn't get json dumps" ) ;
236-
237226 let json = match js_sys:: JSON :: stringify ( & js_val) {
238227 Ok ( json) => String :: from ( json) ,
239228 Err ( _) => return vm. get_none ( ) ,
240229 } ;
241- let py_json = vm. new_str ( json) ;
242-
243- vm. invoke ( loads, PyFuncArgs :: new ( vec ! [ py_json] , vec ! [ ] ) )
244- // can safely unwrap because we know it's valid JSON
245- . unwrap ( )
230+ rustpython_vm:: stdlib:: json:: de_pyobject ( vm, & json) . unwrap_or_else ( |_| vm. get_none ( ) )
246231 }
247232}
0 commit comments