mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-28 17:04:34 +00:00
Merge pull request #5895 from Neirokan/sjson_clone_ident
encoding/json: clone unquoted strings
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user