aboutsummaryrefslogtreecommitdiff
path: root/core/encoding
diff options
context:
space:
mode:
authorNeirokan <neirokan@gmail.com>2025-11-06 19:24:58 +0300
committerNeirokan <neirokan@gmail.com>2025-11-06 19:24:58 +0300
commit8cdf7ade48a966df0a739ef1bb752dfe9b3032d3 (patch)
treea5c357a2908d3b13cba50337e0c499dc8f0d9958 /core/encoding
parentea5db0e04864f7e453a5b5faa305df22543c4b75 (diff)
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)