aboutsummaryrefslogtreecommitdiff
path: root/core/encoding
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2025-11-06 18:26:46 +0100
committerGitHub <noreply@github.com>2025-11-06 18:26:46 +0100
commit40437b52ebca62b787337e1ddb684cbb92ff5b97 (patch)
tree569884596c70a41c06c3aa6b8e363402157decc6 /core/encoding
parent91409cb37ee075a380eacdcccf26a37bf93687e0 (diff)
parent8cdf7ade48a966df0a739ef1bb752dfe9b3032d3 (diff)
Merge pull request #5895 from Neirokan/sjson_clone_ident
encoding/json: clone unquoted strings
Diffstat (limited to 'core/encoding')
-rw-r--r--core/encoding/json/parser.odin2
-rw-r--r--core/encoding/json/unmarshal.odin30
2 files changed, 17 insertions, 15 deletions
diff --git a/core/encoding/json/parser.odin b/core/encoding/json/parser.odin
index 38f71edf6..d6c3df7c6 100644
--- a/core/encoding/json/parser.odin
+++ b/core/encoding/json/parser.odin
@@ -137,7 +137,7 @@ parse_value :: proc(p: ^Parser, loc := #caller_location) -> (value: Value, err:
case .Ident:
if p.spec == .MJSON {
advance_token(p)
- return string(token.text), nil
+ return clone_string(token.text, p.allocator, loc)
}
case .String:
diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin
index 0b65adaac..3cdc6429d 100644
--- a/core/encoding/json/unmarshal.odin
+++ b/core/encoding/json/unmarshal.odin
@@ -188,8 +188,18 @@ assign_float :: proc(val: any, f: $T) -> bool {
@(private)
-unmarshal_string_token :: proc(p: ^Parser, val: any, str: string, ti: ^reflect.Type_Info) -> (ok: bool, err: Error) {
- val := val
+unmarshal_string_token :: proc(p: ^Parser, val: any, token: Token, ti: ^reflect.Type_Info) -> (ok: bool, err: Error) {
+ str: string
+ switch {
+ case token.kind == .String:
+ str = unquote_string(token, p.spec, p.allocator) or_return
+ case:
+ str = clone_string(token.text, p.allocator) or_return
+ }
+ defer if !ok || (val.id != string && val.id != cstring) {
+ delete(str, p.allocator)
+ }
+
switch &dst in val {
case string:
dst = str
@@ -339,7 +349,7 @@ unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) {
case .Ident:
advance_token(p)
if p.spec == .MJSON {
- if unmarshal_string_token(p, any{v.data, ti.id}, token.text, ti) or_return {
+ if unmarshal_string_token(p, any{v.data, ti.id}, token, ti) or_return {
return nil
}
}
@@ -347,18 +357,10 @@ unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) {
case .String:
advance_token(p)
- str := unquote_string(token, p.spec, p.allocator) or_return
- dest := any{v.data, ti.id}
- if !(unmarshal_string_token(p, dest, str, ti) or_return) {
- delete(str, p.allocator)
- return UNSUPPORTED_TYPE
+ if unmarshal_string_token(p, any{v.data, ti.id}, token, ti) or_return {
+ return nil
}
-
- switch destv in dest {
- case string, cstring:
- case: delete(str, p.allocator)
- }
- return nil
+ return UNSUPPORTED_TYPE
case .Open_Brace:
return unmarshal_object(p, v, .Close_Brace)