🐛 fix generation bug in json module
This commit is contained in:
parent
f2ae974e1f
commit
135665a5df
|
@ -51,6 +51,7 @@ private:
|
||||||
usize line = 1;
|
usize line = 1;
|
||||||
usize ptr = 0;
|
usize ptr = 0;
|
||||||
token this_token;
|
token this_token;
|
||||||
|
var temp_stack = nil;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string var_generate(var&);
|
std::string var_generate(var&);
|
||||||
|
@ -72,7 +73,7 @@ private:
|
||||||
}
|
}
|
||||||
void next();
|
void next();
|
||||||
void match(token_type);
|
void match(token_type);
|
||||||
var vector_member(gc*);
|
void vector_member(nas_vec&, gc*);
|
||||||
var vector_object_generate(gc*);
|
var vector_object_generate(gc*);
|
||||||
void hash_member(nas_hash&, gc*);
|
void hash_member(nas_hash&, gc*);
|
||||||
var hash_object_generate(gc*);
|
var hash_object_generate(gc*);
|
||||||
|
@ -224,34 +225,31 @@ void json::match(token_type type) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var json::vector_member(gc* ngc) {
|
void json::vector_member(nas_vec& vec, gc* ngc) {
|
||||||
auto result = nil;
|
|
||||||
if (this_token.type==token_type::tok_lbrace) {
|
if (this_token.type==token_type::tok_lbrace) {
|
||||||
result = hash_object_generate(ngc);
|
vec.elems.push_back(hash_object_generate(ngc));
|
||||||
} else if (this_token.type==token_type::tok_lbrkt) {
|
} else if (this_token.type==token_type::tok_lbrkt) {
|
||||||
result = vector_object_generate(ngc);
|
vec.elems.push_back(vector_object_generate(ngc));
|
||||||
} else if (this_token.type==token_type::tok_str) {
|
} else if (this_token.type==token_type::tok_str) {
|
||||||
result = ngc->newstr(this_token.content);
|
vec.elems.push_back(ngc->newstr(this_token.content));
|
||||||
next();
|
next();
|
||||||
} else if (this_token.type==token_type::tok_num) {
|
} else if (this_token.type==token_type::tok_num) {
|
||||||
result = var::num(str2num(this_token.content.c_str()));
|
vec.elems.push_back(var::num(str2num(this_token.content.c_str())));
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var json::vector_object_generate(gc* ngc) {
|
var json::vector_object_generate(gc* ngc) {
|
||||||
auto vect_object = ngc->alloc(vm_type::vm_vec);
|
auto vect_object = ngc->alloc(vm_type::vm_vec);
|
||||||
auto& vec = vect_object.vec().elems;
|
temp_stack.vec().elems.push_back(vect_object);
|
||||||
ngc->temp = vect_object;
|
|
||||||
match(token_type::tok_lbrkt);
|
match(token_type::tok_lbrkt);
|
||||||
vec.push_back(vector_member(ngc));
|
vector_member(vect_object.vec(), ngc);
|
||||||
while(this_token.type==token_type::tok_comma) {
|
while(this_token.type==token_type::tok_comma) {
|
||||||
match(token_type::tok_comma);
|
match(token_type::tok_comma);
|
||||||
vec.push_back(vector_member(ngc));
|
vector_member(vect_object.vec(), ngc);
|
||||||
}
|
}
|
||||||
match(token_type::tok_rbrkt);
|
match(token_type::tok_rbrkt);
|
||||||
ngc->temp = nil;
|
temp_stack.vec().elems.pop_back();
|
||||||
return vect_object;
|
return vect_object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,7 +280,7 @@ void json::hash_member(nas_hash& hash, gc* ngc) {
|
||||||
|
|
||||||
var json::hash_object_generate(gc* ngc) {
|
var json::hash_object_generate(gc* ngc) {
|
||||||
auto hash_object = ngc->alloc(vm_type::vm_hash);
|
auto hash_object = ngc->alloc(vm_type::vm_hash);
|
||||||
ngc->temp = hash_object; // cause problem
|
temp_stack.vec().elems.push_back(hash_object);
|
||||||
match(token_type::tok_lbrace);
|
match(token_type::tok_lbrace);
|
||||||
hash_member(hash_object.hash(), ngc);
|
hash_member(hash_object.hash(), ngc);
|
||||||
while(this_token.type==token_type::tok_comma) {
|
while(this_token.type==token_type::tok_comma) {
|
||||||
|
@ -290,7 +288,7 @@ var json::hash_object_generate(gc* ngc) {
|
||||||
hash_member(hash_object.hash(), ngc);
|
hash_member(hash_object.hash(), ngc);
|
||||||
}
|
}
|
||||||
match(token_type::tok_rbrace);
|
match(token_type::tok_rbrace);
|
||||||
ngc->temp = nil;
|
temp_stack.vec().elems.pop_back();
|
||||||
return hash_object;
|
return hash_object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -308,9 +306,17 @@ var json::parse(const std::string& input, gc* ngc) {
|
||||||
text = input;
|
text = input;
|
||||||
next();
|
next();
|
||||||
if (this_token.type==token_type::tok_lbrkt) {
|
if (this_token.type==token_type::tok_lbrkt) {
|
||||||
return vector_object_generate(ngc);
|
ngc->temp = temp_stack = ngc->alloc(vm_type::vm_vec);
|
||||||
|
auto result = vector_object_generate(ngc);
|
||||||
|
ngc->temp = nil;
|
||||||
|
temp_stack = nil;
|
||||||
|
return result;
|
||||||
} else {
|
} else {
|
||||||
return hash_object_generate(ngc);
|
ngc->temp = temp_stack = ngc->alloc(vm_type::vm_vec);
|
||||||
|
auto result = hash_object_generate(ngc);
|
||||||
|
ngc->temp = nil;
|
||||||
|
temp_stack = nil;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use std.json;
|
use std.json;
|
||||||
|
use module.libjson;
|
||||||
use std.process_bar;
|
use std.process_bar;
|
||||||
|
|
||||||
var ss = json.stringify({
|
var ss = json.stringify({
|
||||||
|
@ -18,6 +19,7 @@ var ss = json.stringify({
|
||||||
|
|
||||||
println(ss, "\n");
|
println(ss, "\n");
|
||||||
println(json.parse(ss), "\n");
|
println(json.parse(ss), "\n");
|
||||||
|
println(libjson.parse(ss), "\n");
|
||||||
|
|
||||||
var ss = json.stringify([{
|
var ss = json.stringify([{
|
||||||
vec:[0,1,2,3],
|
vec:[0,1,2,3],
|
||||||
|
@ -35,8 +37,9 @@ var ss = json.stringify([{
|
||||||
|
|
||||||
println(ss, "\n");
|
println(ss, "\n");
|
||||||
println(json.parse(ss), "\n");
|
println(json.parse(ss), "\n");
|
||||||
|
println(libjson.parse(ss), "\n");
|
||||||
|
|
||||||
func {
|
var test_json = func(json) {
|
||||||
var bar = process_bar.high_resolution_bar(30);
|
var bar = process_bar.high_resolution_bar(30);
|
||||||
var tmp = [
|
var tmp = [
|
||||||
{t0:nil},
|
{t0:nil},
|
||||||
|
@ -50,18 +53,25 @@ func {
|
||||||
];
|
];
|
||||||
|
|
||||||
srand();
|
srand();
|
||||||
foreach(var h; tmp) {
|
foreach(var hash; tmp) {
|
||||||
var name = keys(h)[0];
|
var name = keys(hash)[0];
|
||||||
h[name] = [];
|
hash[name] = [];
|
||||||
print("\e[1000D", bar.bar(0));
|
print("\e[1000D", bar.bar(0));
|
||||||
for(var i = 0; i<500; i+=1) {
|
for(var i = 0; i<500; i+=1) {
|
||||||
append(h[name], {id:i, content:int(rand()*1e7)});
|
append(hash[name], {id:i, content:int(rand()*1e7)});
|
||||||
print("\e[1000D", bar.bar((i+1)/500));
|
print("\e[1000D", bar.bar((i+1)/500));
|
||||||
}
|
}
|
||||||
print("\e[1000D", bar.bar(1), " executing...\n");
|
print("\e[1000D", bar.bar(1), " executing...\n");
|
||||||
}
|
}
|
||||||
print("\e[1000D", "\e["~str(size(tmp))~"A");
|
print("\e[1000D", "\e["~str(size(tmp))~"A");
|
||||||
foreach(var h; json.parse(json.stringify(tmp))) {
|
foreach(var hash; json.parse(json.stringify(tmp))) {
|
||||||
println("\e[1000D", bar.bar(1), " parse done ", keys(h)[0], " ", size(h[keys(h)[0]]));
|
println("\e[1000D", bar.bar(1), " parse done ", keys(hash)[0], " ", size(hash[keys(hash)[0]]));
|
||||||
}
|
}
|
||||||
}();
|
};
|
||||||
|
|
||||||
|
var stamp = maketimestamp();
|
||||||
|
test_json(libjson);
|
||||||
|
println("time usage: ", stamp.elapsedUSec()/1000, " ms");
|
||||||
|
stamp.stamp();
|
||||||
|
test_json(json);
|
||||||
|
println("time usage: ", stamp.elapsedUSec()/1000, " ms");
|
||||||
|
|
Loading…
Reference in New Issue