Skip to content

Commit 01ddcdd

Browse files
committed
Use upstream writer for Windows
1 parent 2a1923c commit 01ddcdd

File tree

7 files changed

+82
-56
lines changed

7 files changed

+82
-56
lines changed

data/issue331_1.json.xz

592 Bytes
Binary file not shown.

data/issue331_2.json.xz

592 Bytes
Binary file not shown.

src/serialize/json.rs

Lines changed: 1 addition & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,11 @@
11
// SPDX-License-Identifier: (Apache-2.0 OR MIT)
22
// This is an adaptation of `src/value/ser.rs` from serde-json.
33

4+
use crate::serialize::writer::WriteExt;
45
use serde::ser::{self, Impossible, Serialize};
56
use serde_json::error::{Error, Result};
67
use std::io;
78

8-
#[allow(missing_docs)]
9-
// hack based on saethlin's research and patch in https://github.com/serde-rs/json/issues/766
10-
pub trait WriteExt: io::Write {
11-
#[inline]
12-
fn as_mut_buffer_ptr(&mut self) -> *mut u8 {
13-
std::ptr::null_mut()
14-
}
15-
16-
#[inline]
17-
fn reserve(&mut self, len: usize) {
18-
let _ = len;
19-
}
20-
21-
#[inline]
22-
fn set_written(&mut self, len: usize) {
23-
let _ = len;
24-
}
25-
26-
#[inline]
27-
fn write_str(&mut self, val: &str) -> std::result::Result<(), std::io::Error> {
28-
let _ = val;
29-
Ok(())
30-
}
31-
32-
#[inline]
33-
unsafe fn write_reserved_fragment(
34-
&mut self,
35-
val: &[u8],
36-
) -> std::result::Result<(), std::io::Error> {
37-
let _ = val;
38-
Ok(())
39-
}
40-
41-
#[inline]
42-
unsafe fn write_reserved_punctuation(
43-
&mut self,
44-
val: u8,
45-
) -> std::result::Result<(), std::io::Error> {
46-
let _ = val;
47-
Ok(())
48-
}
49-
50-
#[inline]
51-
unsafe fn write_reserved_indent(
52-
&mut self,
53-
len: usize,
54-
) -> std::result::Result<(), std::io::Error> {
55-
let _ = len;
56-
Ok(())
57-
}
58-
}
59-
609
pub struct Serializer<W, F = CompactFormatter> {
6110
writer: W,
6211
formatter: F,

src/serialize/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ mod dict;
99
mod error;
1010
mod float;
1111
mod int;
12-
mod json;
1312
mod list;
1413
mod numpy;
1514
mod pyenum;
@@ -19,4 +18,7 @@ mod tuple;
1918
mod uuid;
2019
mod writer;
2120

21+
#[cfg(not(target_os = "windows"))]
22+
mod json;
23+
2224
pub use serializer::serialize;

src/serialize/serializer.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ use serde::ser::{Serialize, SerializeMap, Serializer};
2121
use std::io::Write;
2222
use std::ptr::NonNull;
2323

24+
#[cfg(target_os = "windows")]
25+
use serde_json::{to_writer, to_writer_pretty};
26+
27+
#[cfg(not(target_os = "windows"))]
28+
use crate::serialize::json::{to_writer, to_writer_pretty};
29+
2430
pub const RECURSION_LIMIT: u8 = 255;
2531

2632
pub fn serialize(
@@ -31,9 +37,9 @@ pub fn serialize(
3137
let mut buf = BytesWriter::default();
3238
let obj = PyObjectSerializer::new(ptr, opts, 0, 0, default);
3339
let res = if opts & INDENT_2 != INDENT_2 {
34-
crate::serialize::json::to_writer(&mut buf, &obj)
40+
to_writer(&mut buf, &obj)
3541
} else {
36-
crate::serialize::json::to_writer_pretty(&mut buf, &obj)
42+
to_writer_pretty(&mut buf, &obj)
3743
};
3844
match res {
3945
Ok(_) => {

src/serialize/writer.rs

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// SPDX-License-Identifier: (Apache-2.0 OR MIT)
22

33
use crate::ffi::PyBytesObject;
4-
use crate::serialize::json::WriteExt;
54
use pyo3_ffi::*;
65
use std::os::raw::c_char;
76
use std::ptr::NonNull;
@@ -94,6 +93,59 @@ impl std::io::Write for BytesWriter {
9493
}
9594
}
9695

96+
#[allow(dead_code)]
97+
// hack based on saethlin's research and patch in https://github.com/serde-rs/json/issues/766
98+
pub trait WriteExt: std::io::Write {
99+
#[inline]
100+
fn as_mut_buffer_ptr(&mut self) -> *mut u8 {
101+
std::ptr::null_mut()
102+
}
103+
104+
#[inline]
105+
fn reserve(&mut self, len: usize) {
106+
let _ = len;
107+
}
108+
109+
#[inline]
110+
fn set_written(&mut self, len: usize) {
111+
let _ = len;
112+
}
113+
114+
#[inline]
115+
fn write_str(&mut self, val: &str) -> std::result::Result<(), std::io::Error> {
116+
let _ = val;
117+
Ok(())
118+
}
119+
120+
#[inline]
121+
unsafe fn write_reserved_fragment(
122+
&mut self,
123+
val: &[u8],
124+
) -> std::result::Result<(), std::io::Error> {
125+
let _ = val;
126+
Ok(())
127+
}
128+
129+
#[inline]
130+
unsafe fn write_reserved_punctuation(
131+
&mut self,
132+
val: u8,
133+
) -> std::result::Result<(), std::io::Error> {
134+
let _ = val;
135+
Ok(())
136+
}
137+
138+
#[inline]
139+
unsafe fn write_reserved_indent(
140+
&mut self,
141+
len: usize,
142+
) -> std::result::Result<(), std::io::Error> {
143+
let _ = len;
144+
Ok(())
145+
}
146+
}
147+
148+
#[allow(dead_code)]
97149
impl WriteExt for &mut BytesWriter {
98150
#[inline(always)]
99151
fn as_mut_buffer_ptr(&mut self) -> *mut u8 {

test/test_issue331.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
2+
3+
import orjson
4+
5+
from .util import read_fixture_bytes
6+
7+
def test_issue331_1():
8+
as_bytes = read_fixture_bytes("issue331_1.json.xz")
9+
as_obj = orjson.loads(as_bytes)
10+
for i in range(1000):
11+
assert orjson.loads(orjson.dumps(as_obj)) == as_obj
12+
13+
def test_issue331_2():
14+
as_bytes = read_fixture_bytes("issue331_2.json.xz")
15+
as_obj = orjson.loads(as_bytes)
16+
for i in range(1000):
17+
assert orjson.loads(orjson.dumps(as_obj)) == as_obj

0 commit comments

Comments
 (0)