mirror of
https://github.com/denoland/deno.git
synced 2025-01-08 15:19:40 -05:00
fix(serde_v8): serialize objects with numeric keys correctly (#15946)
Signed-off-by: Darshan Sen <raisinten@gmail.com>
This commit is contained in:
parent
e07b62d74a
commit
bac3a1210f
3 changed files with 113 additions and 2 deletions
|
@ -3216,6 +3216,90 @@ assertEquals(1, notify_return_value);
|
||||||
runtime.run_event_loop(false).await.unwrap();
|
runtime.run_event_loop(false).await.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_sync_op_serialize_object_with_numbers_as_keys() {
|
||||||
|
#[op]
|
||||||
|
fn op_sync_serialize_object_with_numbers_as_keys(
|
||||||
|
value: serde_json::Value,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
assert_eq!(
|
||||||
|
value.to_string(),
|
||||||
|
r#"{"lines":{"100":{"unit":"m"},"200":{"unit":"cm"}}}"#
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
let extension = Extension::builder()
|
||||||
|
.ops(vec![op_sync_serialize_object_with_numbers_as_keys::decl()])
|
||||||
|
.build();
|
||||||
|
|
||||||
|
let mut runtime = JsRuntime::new(RuntimeOptions {
|
||||||
|
extensions: vec![extension],
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
|
||||||
|
runtime
|
||||||
|
.execute_script(
|
||||||
|
"op_sync_serialize_object_with_numbers_as_keys.js",
|
||||||
|
r#"
|
||||||
|
Deno.core.ops.op_sync_serialize_object_with_numbers_as_keys({
|
||||||
|
lines: {
|
||||||
|
100: {
|
||||||
|
unit: "m"
|
||||||
|
},
|
||||||
|
200: {
|
||||||
|
unit: "cm"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
runtime.run_event_loop(false).await.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_async_op_serialize_object_with_numbers_as_keys() {
|
||||||
|
#[op]
|
||||||
|
async fn op_async_serialize_object_with_numbers_as_keys(
|
||||||
|
value: serde_json::Value,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
assert_eq!(
|
||||||
|
value.to_string(),
|
||||||
|
r#"{"lines":{"100":{"unit":"m"},"200":{"unit":"cm"}}}"#
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
let extension = Extension::builder()
|
||||||
|
.ops(vec![op_async_serialize_object_with_numbers_as_keys::decl()])
|
||||||
|
.build();
|
||||||
|
|
||||||
|
let mut runtime = JsRuntime::new(RuntimeOptions {
|
||||||
|
extensions: vec![extension],
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
|
||||||
|
runtime
|
||||||
|
.execute_script(
|
||||||
|
"op_async_serialize_object_with_numbers_as_keys.js",
|
||||||
|
r#"
|
||||||
|
Deno.core.opAsync('op_async_serialize_object_with_numbers_as_keys', {
|
||||||
|
lines: {
|
||||||
|
100: {
|
||||||
|
unit: "m"
|
||||||
|
},
|
||||||
|
200: {
|
||||||
|
unit: "cm"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
runtime.run_event_loop(false).await.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_set_macrotask_callback_set_next_tick_callback() {
|
async fn test_set_macrotask_callback_set_next_tick_callback() {
|
||||||
#[op]
|
#[op]
|
||||||
|
|
|
@ -325,8 +325,12 @@ impl<'de, 'a, 'b, 's, 'x> de::Deserializer<'de>
|
||||||
};
|
};
|
||||||
visitor.visit_map(map)
|
visitor.visit_map(map)
|
||||||
} else {
|
} else {
|
||||||
let prop_names =
|
let prop_names = obj.get_own_property_names(
|
||||||
obj.get_own_property_names(self.scope, Default::default());
|
self.scope,
|
||||||
|
v8::GetPropertyNamesArgsBuilder::new()
|
||||||
|
.key_conversion(v8::KeyConversionMode::ConvertToString)
|
||||||
|
.build(),
|
||||||
|
);
|
||||||
let keys: Vec<magic::Value> = match prop_names {
|
let keys: Vec<magic::Value> = match prop_names {
|
||||||
Some(names) => from_v8(self.scope, names.into()).unwrap(),
|
Some(names) => from_v8(self.scope, names.into()).unwrap(),
|
||||||
None => vec![],
|
None => vec![],
|
||||||
|
|
|
@ -184,6 +184,29 @@ fn de_map() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn de_obj_with_numeric_keys() {
|
||||||
|
dedo(
|
||||||
|
r#"({
|
||||||
|
lines: {
|
||||||
|
100: {
|
||||||
|
unit: "m"
|
||||||
|
},
|
||||||
|
200: {
|
||||||
|
unit: "cm"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})"#,
|
||||||
|
|scope, v| {
|
||||||
|
let json: serde_json::Value = serde_v8::from_v8(scope, v).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
json.to_string(),
|
||||||
|
r#"{"lines":{"100":{"unit":"m"},"200":{"unit":"cm"}}}"#
|
||||||
|
);
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn de_string_or_buffer() {
|
fn de_string_or_buffer() {
|
||||||
dedo("'hello'", |scope, v| {
|
dedo("'hello'", |scope, v| {
|
||||||
|
|
Loading…
Reference in a new issue