generic types, any -> opaque
This commit is contained in:
42
std/json.zr
42
std/json.zr
@@ -9,33 +9,33 @@ const json.BOOL = 5
|
||||
|
||||
struct json.Value
|
||||
type: i64
|
||||
value: any
|
||||
value: opaque
|
||||
|
||||
func json.Value.dump[v: json.Value] : str
|
||||
s := new str.Builder
|
||||
|
||||
if v->type == json.OBJECT
|
||||
map := v->value as HashMap
|
||||
map := v->value as HashMap<json.Value>
|
||||
keys := map->keys()
|
||||
s->append_char('{')
|
||||
for i in 0..keys->size
|
||||
if i > 0
|
||||
s->append_char(',')
|
||||
s->append_char('"')
|
||||
s->append(keys->nth(i) as str)
|
||||
s->append(keys->nth(i))
|
||||
s->append_char('"')
|
||||
s->append_char(':')
|
||||
value, _ := map->get(keys->nth(i) as str)
|
||||
s->append((value as json.Value)->dump())
|
||||
value, _ := map->get(keys->nth(i))
|
||||
s->append(value->dump())
|
||||
s->append_char('}')
|
||||
keys->free()
|
||||
else if v->type == json.ARRAY
|
||||
arr := v->value as Array
|
||||
arr := v->value as Array<json.Value>
|
||||
s->append_char('[')
|
||||
for i in 0..arr->size
|
||||
if i > 0
|
||||
s->append_char(',')
|
||||
s->append((arr->nth(i) as json.Value)->dump())
|
||||
s->append(arr->nth(i)->dump())
|
||||
s->append_char(']')
|
||||
else if v->type == json.STRING
|
||||
// TODO: escape sequences
|
||||
@@ -58,25 +58,25 @@ func json.Value.dump[v: json.Value] : str
|
||||
|
||||
func json.Value.free[v: json.Value] : void
|
||||
if v->type == json.OBJECT
|
||||
map := v->value as HashMap
|
||||
map := v->value as HashMap<json.Value>
|
||||
keys := map->keys()
|
||||
for i in 0..keys->size
|
||||
value, _ := map->get(keys->nth(i) as str)
|
||||
(value as json.Value)->free()
|
||||
value, _ := map->get(keys->nth(i))
|
||||
value->free()
|
||||
keys->free()
|
||||
|
||||
map->free_with_keys()
|
||||
else if v->type == json.ARRAY
|
||||
arr := v->value as Array
|
||||
arr := v->value as Array<json.Value>
|
||||
for i in 0..arr->size
|
||||
(arr->nth(i) as json.Value)->free()
|
||||
arr->nth(i)->free()
|
||||
arr->free()
|
||||
else if v->type == json.STRING
|
||||
(v->value as str)->free()
|
||||
|
||||
(v as ptr)->free()
|
||||
|
||||
func json.val[x: any] : any
|
||||
func json.val[x: opaque] : opaque
|
||||
return (x as json.Value)->value
|
||||
|
||||
func json.parse[s: str] : json.Value
|
||||
@@ -96,7 +96,7 @@ func json._parse_value[s: str, i: ptr] : json.Value
|
||||
json._skip_whitespace(s, i)
|
||||
|
||||
out->type = json.OBJECT
|
||||
out->value = HashMap.new()
|
||||
out->value = HashMap.new() as opaque
|
||||
|
||||
if s[mem.read64(i)] != '}'
|
||||
while true
|
||||
@@ -110,7 +110,7 @@ func json._parse_value[s: str, i: ptr] : json.Value
|
||||
json._skip_whitespace(s, i)
|
||||
|
||||
value := json._parse_value(s, i)
|
||||
(out->value as HashMap)->insert(key, value)
|
||||
(out->value as HashMap<json.Value>)->insert(key, value)
|
||||
key->free()
|
||||
|
||||
json._skip_whitespace(s, i)
|
||||
@@ -128,12 +128,12 @@ func json._parse_value[s: str, i: ptr] : json.Value
|
||||
json._skip_whitespace(s, i)
|
||||
|
||||
out->type = json.ARRAY
|
||||
out->value = []
|
||||
out->value = [] as opaque
|
||||
|
||||
while s[mem.read64(i)] != ']'
|
||||
json._skip_whitespace(s, i)
|
||||
|
||||
(out->value as Array)->push(json._parse_value(s, i))
|
||||
(out->value as Array<json.Value>)->push(json._parse_value(s, i))
|
||||
json._skip_whitespace(s, i)
|
||||
|
||||
if s[mem.read64(i)] == ','
|
||||
@@ -147,7 +147,7 @@ func json._parse_value[s: str, i: ptr] : json.Value
|
||||
mem.write64(i, mem.read64(i) + 1)
|
||||
else if s[mem.read64(i)] == '"'
|
||||
out->type = json.STRING
|
||||
out->value = json._parse_string(s, i)
|
||||
out->value = json._parse_string(s, i) as opaque
|
||||
else if s[mem.read64(i)]->is_digit() || s[mem.read64(i)] == '-'
|
||||
start := mem.read64(i)
|
||||
|
||||
@@ -164,18 +164,18 @@ func json._parse_value[s: str, i: ptr] : json.Value
|
||||
|
||||
num_str := s->substr_n(start, len)
|
||||
out->type = json.NUMBER
|
||||
out->value = num_str->parse_i64()
|
||||
out->value = num_str->parse_i64() as opaque
|
||||
num_str->free()
|
||||
else if s[mem.read64(i)] == 'n' && s[mem.read64(i)+1] == 'u' && s[mem.read64(i)+2] == 'l' && s[mem.read64(i)+3] == 'l'
|
||||
out->type = json.NULL
|
||||
mem.write64(i, mem.read64(i) + 4)
|
||||
else if s[mem.read64(i)] == 't' && s[mem.read64(i)+1] == 'r' && s[mem.read64(i)+2] == 'u' && s[mem.read64(i)+3] == 'e'
|
||||
out->type = json.BOOL
|
||||
out->value = true
|
||||
out->value = true as opaque
|
||||
mem.write64(i, mem.read64(i) + 4)
|
||||
else if s[mem.read64(i)] == 'f' && s[mem.read64(i)+1] == 'a' && s[mem.read64(i)+2] == 'l' && s[mem.read64(i)+3] == 's' && s[mem.read64(i)+4] == 'e'
|
||||
out->type = json.BOOL
|
||||
out->value = false
|
||||
out->value = false as opaque
|
||||
mem.write64(i, mem.read64(i) + 5)
|
||||
else
|
||||
panic("json.parse: unexpected character")
|
||||
|
||||
Reference in New Issue
Block a user