diff --git a/module/json.cpp b/module/json.cpp index 3771206..04d2feb 100644 --- a/module/json.cpp +++ b/module/json.cpp @@ -51,6 +51,7 @@ private: usize line = 1; usize ptr = 0; token this_token; + var temp_stack = nil; private: std::string var_generate(var&); @@ -72,7 +73,7 @@ private: } void next(); void match(token_type); - var vector_member(gc*); + void vector_member(nas_vec&, gc*); var vector_object_generate(gc*); void hash_member(nas_hash&, gc*); var hash_object_generate(gc*); @@ -224,34 +225,31 @@ void json::match(token_type type) { return; } -var json::vector_member(gc* ngc) { - auto result = nil; +void json::vector_member(nas_vec& vec, gc* ngc) { 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) { - result = vector_object_generate(ngc); + vec.elems.push_back(vector_object_generate(ngc)); } 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(); } 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(); } - return result; } var json::vector_object_generate(gc* ngc) { auto vect_object = ngc->alloc(vm_type::vm_vec); - auto& vec = vect_object.vec().elems; - ngc->temp = vect_object; + temp_stack.vec().elems.push_back(vect_object); 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) { match(token_type::tok_comma); - vec.push_back(vector_member(ngc)); + vector_member(vect_object.vec(), ngc); } match(token_type::tok_rbrkt); - ngc->temp = nil; + temp_stack.vec().elems.pop_back(); return vect_object; } @@ -282,7 +280,7 @@ void json::hash_member(nas_hash& hash, gc* ngc) { var json::hash_object_generate(gc* ngc) { 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); hash_member(hash_object.hash(), ngc); 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); } match(token_type::tok_rbrace); - ngc->temp = nil; + temp_stack.vec().elems.pop_back(); return hash_object; } @@ -308,9 +306,17 @@ var json::parse(const std::string& input, gc* ngc) { text = input; next(); 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 { - 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; } diff --git a/test/json.nas b/test/json.nas index c8f3167..263c4be 100644 --- a/test/json.nas +++ b/test/json.nas @@ -1,4 +1,5 @@ use std.json; +use module.libjson; use std.process_bar; var ss = json.stringify({ @@ -18,6 +19,7 @@ var ss = json.stringify({ println(ss, "\n"); println(json.parse(ss), "\n"); +println(libjson.parse(ss), "\n"); var ss = json.stringify([{ vec:[0,1,2,3], @@ -35,8 +37,9 @@ var ss = json.stringify([{ println(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 tmp = [ {t0:nil}, @@ -50,18 +53,25 @@ func { ]; srand(); - foreach(var h; tmp) { - var name = keys(h)[0]; - h[name] = []; + foreach(var hash; tmp) { + var name = keys(hash)[0]; + hash[name] = []; print("\e[1000D", bar.bar(0)); 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(1), " executing...\n"); } print("\e[1000D", "\e["~str(size(tmp))~"A"); - foreach(var h; json.parse(json.stringify(tmp))) { - println("\e[1000D", bar.bar(1), " parse done ", keys(h)[0], " ", size(h[keys(h)[0]])); + foreach(var hash; json.parse(json.stringify(tmp))) { + println("\e[1000D", bar.bar(1), " parse done ", keys(hash)[0], " ", size(hash[keys(hash)[0]])); } -}(); \ No newline at end of file +}; + +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");