diff --git a/src/lib/js/json.rs b/src/lib/js/json.rs index 98cfc679cf..b7494c9882 100644 --- a/src/lib/js/json.rs +++ b/src/lib/js/json.rs @@ -1,35 +1,33 @@ +use js::function::Function; /// The JSON Object /// https://tc39.github.io/ecma262/#sec-json-object -use gc::GcCell; -use js::value::{to_value, ResultValue, Value, ValueData}; -use serde_json; +use js::value::{to_value, ResultValue, Value}; +use serde_json::{self, to_string_pretty, Value as JSONValue}; /// Parse a JSON string into a Javascript object /// https://tc39.github.io/ecma262/#sec-json.parse -pub fn parse(args: Vec) -> ResultValue { - match serde_json::from_str(&args.get(0).unwrap().clone().to_string()) { +pub fn parse(args: Vec, _: Value, _: Value, _: Value) -> ResultValue { + match serde_json::from_str::(&args.get(0).unwrap().clone().to_string()) { Ok(json) => Ok(to_value(json)), Err(err) => Err(to_value(err.to_string())), } } /// Process a Javascript object into a JSON string -pub fn stringify(args: Vec) -> ResultValue { - let obj = args.get(0); - let json = serde_json::to_string_pretty(obj.clone()).unwrap(); - Ok(to_value(json.to_pretty_str())) +pub fn stringify(args: Vec, _: Value, _: Value, _: Value) -> ResultValue { + let obj = args.get(0).unwrap(); + let json = obj.to_json(); + Ok(to_value(to_string_pretty(&json).unwrap())) } /// Create a new `JSON` object pub fn _create(global: Value) -> Value { - let object = ValueData::new_obj(Some(global)); - let object_ptr = object.borrow(); - object_ptr.set_field_slice("stringify", to_value(stringify)); - object_ptr.set_field_slice("parse", to_value(parse)); + let object = Value::new_obj(Some(global)); + object.set_field_slice("stringify", Function::make(stringify, &["JSON"])); + object.set_field_slice("parse", Function::make(parse, &["JSON_string"])); object } /// Initialise the global object with the `JSON` object pub fn init(global: Value) { - let global_ptr = global.borrow(); - global_ptr.set_field_slice("JSON", _create(global)); + global.set_field_slice("JSON", _create(global.clone())); } diff --git a/src/lib/js/value.rs b/src/lib/js/value.rs index 409fb8d1c8..2cecc847aa 100644 --- a/src/lib/js/value.rs +++ b/src/lib/js/value.rs @@ -257,7 +257,7 @@ impl Value { } } - fn to_json(&self) -> JSONValue { + pub fn to_json(&self) -> JSONValue { match *self.ptr { ValueData::Null | ValueData::Undefined => JSONValue::Null, ValueData::Boolean(b) => JSONValue::Bool(b),