From a84cceb93812992888b40f4fac70de8e131f9919 Mon Sep 17 00:00:00 2001 From: n00b87 Date: Mon, 22 Apr 2024 02:37:09 -0500 Subject: [PATCH] Added new redim instructions to runtime --- rcbasic_build/parser.h | 33 +++-- rcbasic_build/rc_global.h | 2 +- rcbasic_build/rc_vm_asm.h | 4 + rcbasic_build/vm_asm | 2 + rcbasic_runtime/main.cpp | 256 +++++++++++++++++++++++++++++++++++++- 5 files changed, 282 insertions(+), 15 deletions(-) diff --git a/rcbasic_build/parser.h b/rcbasic_build/parser.h index 30185a1..dd00be2 100644 --- a/rcbasic_build/parser.h +++ b/rcbasic_build/parser.h @@ -1480,6 +1480,12 @@ bool pre_parse(int start_token = 0, int end_token = -1, int pp_flags, bool eval_ type_redim_dim[0] = args[0]; type_redim_dim[1] = args[1]; type_redim_dim[2] = args[2]; + + if(arg_count != id[tmp_id].num_args) + { + rc_setError("Expected " + rc_intToString(id[tmp_id].num_args) + " dimensions but found " + rc_intToString(arg_count)); + return false; + } } else if(type_delete_flag && (!has_child)) { @@ -3767,9 +3773,7 @@ bool check_rule() //cout << "M_ARG[2] = " << multi_arg[2] << endl; dimensions = multi_arg_count; } - token_index = end_token+1; - - type_redim_flag = false; + token_index = end_token+1; //cout << "debug 3: " << id_index << endl; } @@ -3793,7 +3797,18 @@ bool check_rule() //if the next token is not an id then the syntax is incorrect and false is returned rc_setError("Expected Identifier name"); return false; - } + } + + if(!type_redim_flag) //if type_redim_flag is set, then this error will get raised in the pre_parse step + { + if(dimensions != id[id_index].num_args) // no longer allowing the user to change dimensions since it can lead to unnecessary confusion + { + rc_setError("Expected " + rc_intToString(id[id_index].num_args) + " dimensions but found " + rc_intToString(dimensions)); + return false; + } + } + + type_redim_flag = false; if(dimensions > 0) { @@ -3810,10 +3825,10 @@ bool check_rule() //cout << "debug 6: " << id_index << endl; - if(id[id_index].num_args != dimensions) - { - id[id_index].num_args = dimensions; - } + //if(id[id_index].num_args != dimensions) + //{ + // id[id_index].num_args = dimensions; + //} //cout << "debug 7: " << id_index << " -- " << id[id_index].type << endl; @@ -3873,6 +3888,8 @@ bool check_rule() } else if(id[id_index].type == ID_TYPE_USER) { + vm_asm.push_back("redim_top"); //This will set the top level flag for redim_type + //cout << "debug 8" << endl; switch(dimensions) { diff --git a/rcbasic_build/rc_global.h b/rcbasic_build/rc_global.h index f47bfd6..4b61fee 100644 --- a/rcbasic_build/rc_global.h +++ b/rcbasic_build/rc_global.h @@ -168,7 +168,7 @@ public: s.substr(0,s.find_first_of(" ")).compare("clear_stack$")==0 || s.substr(0,s.find_first_of(" ")).compare("do")==0 || s.substr(0,s.find_first_of(" ")).compare("pop_loop_stack")==0 || s.substr(0,s.find_first_of(" ")).compare("return")==0 || s.substr(0,s.find_first_of(" ")).compare("println")==0 || s.substr(0,s.find_first_of(" ")).compare("for_offset_0")==0 || - s.substr(0,s.find_first_of(" ")).compare("push_t_null")==0) + s.substr(0,s.find_first_of(" ")).compare("push_t_null")==0 || s.substr(0,s.find_first_of(" ")).compare("redim_top")==0) { current_address[current_segment] += 1; //1 byte for instruction and no arguments } diff --git a/rcbasic_build/rc_vm_asm.h b/rcbasic_build/rc_vm_asm.h index eda9820..aa5aa6b 100644 --- a/rcbasic_build/rc_vm_asm.h +++ b/rcbasic_build/rc_vm_asm.h @@ -1271,6 +1271,10 @@ namespace rc_cbc_assembler { writeSegment(203); } + else if(line_arg[0].compare("redim_top")==0) + { + writeSegment(208); + } else { cout << "unrecognized cmd: " << line_arg[0] << endl; diff --git a/rcbasic_build/vm_asm b/rcbasic_build/vm_asm index 75aa469..fe1af5d 100644 --- a/rcbasic_build/vm_asm +++ b/rcbasic_build/vm_asm @@ -305,3 +305,5 @@ OBJ_CURRENT_TYPE 205 - redim_type1 !id !id (user type) n# (dim1) 206 - redim_type2 !id !id (user type) n# (dim1) n# (dim2) 207 - redim_type3 !id !id (user type) n# (dim1) n# (dim2) n# (dim3) + +208 - redim_top diff --git a/rcbasic_runtime/main.cpp b/rcbasic_runtime/main.cpp index 2567828..ea05f45 100644 --- a/rcbasic_runtime/main.cpp +++ b/rcbasic_runtime/main.cpp @@ -290,7 +290,9 @@ stack gosub_return_addr; rc_int readint_val; rc_double readdouble_val; -vector arr_ref_id(2); +vector arr_ref_id(2); + +bool redim_toplevel_flag = false; int rcbasic_exit_code = 0; @@ -4465,7 +4467,7 @@ void push_t_null_173() void delete_t_174(uint64_t oid, uint64_t top_level_flag, uint64_t obj_type) { - cout << "DEBUG: " << oid << ", " << top_level_flag << ", " << obj_type << endl; + //cout << "DEBUG: " << oid << ", " << top_level_flag << ", " << obj_type << endl; //cout << "Delete Object: " << usr_object.obj_ref->str_var[1].dim[0] << endl; if(top_level_flag == 0) { @@ -4478,7 +4480,7 @@ void delete_t_174(uint64_t oid, uint64_t top_level_flag, uint64_t obj_type) switch(obj_type) { case 0: - cout << "DBG NDATA: " << usr_object.obj_ref->num_var[oid].dim[0] << endl; + //cout << "DBG NDATA: " << usr_object.obj_ref->num_var[oid].dim[0] << endl; usr_object.obj_ref->num_var[oid].nid_value.value.clear(); usr_object.obj_ref->num_var[oid].nid_value.value.shrink_to_fit(); usr_object.obj_ref->num_var[oid].dimensions = 0; @@ -4488,7 +4490,7 @@ void delete_t_174(uint64_t oid, uint64_t top_level_flag, uint64_t obj_type) break; case 1: - cout << "DBG SDATA: " << usr_object.obj_ref->str_var[oid].dim[0] << endl; + //cout << "DBG SDATA: " << usr_object.obj_ref->str_var[oid].dim[0] << endl; usr_object.obj_ref->str_var[oid].sid_value.value.clear(); usr_object.obj_ref->str_var[oid].sid_value.value.shrink_to_fit(); usr_object.obj_ref->str_var[oid].dimensions = 0; @@ -4498,7 +4500,7 @@ void delete_t_174(uint64_t oid, uint64_t top_level_flag, uint64_t obj_type) break; case 2: - cout << "DBG UDATA: " << usr_object.obj_ref->uid_value[oid].dim[0] << endl; + //cout << "DBG UDATA: " << usr_object.obj_ref->uid_value[oid].dim[0] << endl; rc_free_type(&usr_object.obj_ref->uid_value[oid]); break; } @@ -4701,7 +4703,150 @@ void preset_t3_191(uint64_t uid, uint64_t utype, int n1, int n2, int n3) { rc_preset_type(&usr_var[uid]); } -} +} + + +void redim_type_192(int u1, int udt_index) +{ + // Currently unused +} + +void redim_type1_193(int u1, int udt_index, int n1) +{ + // Currently unused +} + +void redim_type2_194(int u1, int udt_index, int n1, int n2) +{ + // Currently unused +} + +void redim_type3_195(int u1, int udt_index, int n1, int n2, int n3) +{ + // Currently unused +} + + +void redim_type_n_196(uint64_t nid) +{ + usr_object.obj_ref->num_var[nid].nid_value.value.resize(1); + usr_object.obj_ref->num_var[nid].dimensions = 0; + usr_object.obj_ref->num_var[nid].dim[0] = 0; + usr_object.obj_ref->num_var[nid].dim[1] = 0; + usr_object.obj_ref->num_var[nid].dim[2] = 0; +} + +void redim_type_n1_197(uint64_t nid, int n1) +{ + usr_object.obj_ref->num_var[nid].nid_value.value.resize((uint64_t)vm_n[n1].value); + usr_object.obj_ref->num_var[nid].dimensions = 1; + usr_object.obj_ref->num_var[nid].dim[0] = (uint64_t)vm_n[n1].value; + usr_object.obj_ref->num_var[nid].dim[1] = 0; + usr_object.obj_ref->num_var[nid].dim[2] = 0; +} + +void redim_type_n2_198(uint64_t nid, int n1, int n2) +{ + usr_object.obj_ref->num_var[nid].nid_value.value.resize((uint64_t)(vm_n[n1].value * vm_n[n2].value)); + usr_object.obj_ref->num_var[nid].dimensions = 2; + usr_object.obj_ref->num_var[nid].dim[0] = (uint64_t)vm_n[n1].value; + usr_object.obj_ref->num_var[nid].dim[1] = (uint64_t)vm_n[n2].value; + usr_object.obj_ref->num_var[nid].dim[2] = 0; +} + +void redim_type_n3_199(uint64_t nid, int n1, int n2, int n3) +{ + usr_object.obj_ref->num_var[nid].nid_value.value.resize((uint64_t)(vm_n[n1].value * vm_n[n2].value * vm_n[n3].value)); + usr_object.obj_ref->num_var[nid].dimensions = 3; + usr_object.obj_ref->num_var[nid].dim[0] = (uint64_t)vm_n[n1].value; + usr_object.obj_ref->num_var[nid].dim[1] = (uint64_t)vm_n[n2].value; + usr_object.obj_ref->num_var[nid].dim[2] = (uint64_t)vm_n[n3].value; +} + + +void redim_type_s_200(uint64_t sid) +{ + usr_object.obj_ref->str_var[sid].sid_value.value.resize(1); + usr_object.obj_ref->str_var[sid].dimensions = 0; + usr_object.obj_ref->str_var[sid].dim[0] = 0; + usr_object.obj_ref->str_var[sid].dim[1] = 0; + usr_object.obj_ref->str_var[sid].dim[2] = 0; +} + +void redim_type_s1_201(uint64_t sid, int n1) +{ + usr_object.obj_ref->str_var[sid].sid_value.value.resize((uint64_t)vm_n[n1].value); + usr_object.obj_ref->str_var[sid].dimensions = 1; + usr_object.obj_ref->str_var[sid].dim[0] = (uint64_t)vm_n[n1].value; + usr_object.obj_ref->str_var[sid].dim[1] = 0; + usr_object.obj_ref->str_var[sid].dim[2] = 0; +} + +void redim_type_s2_202(uint64_t sid, int n1, int n2) +{ + usr_object.obj_ref->str_var[sid].sid_value.value.resize((uint64_t)(vm_n[n1].value * vm_n[n2].value)); + usr_object.obj_ref->str_var[sid].dimensions = 2; + usr_object.obj_ref->str_var[sid].dim[0] = (uint64_t)vm_n[n1].value; + usr_object.obj_ref->str_var[sid].dim[1] = (uint64_t)vm_n[n2].value; + usr_object.obj_ref->str_var[sid].dim[2] = 0; +} + +void redim_type_s3_203(uint64_t sid, int n1, int n2, int n3) +{ + usr_object.obj_ref->str_var[sid].sid_value.value.resize((uint64_t)(vm_n[n1].value * vm_n[n2].value * vm_n[n3].value)); + usr_object.obj_ref->str_var[sid].dimensions = 3; + usr_object.obj_ref->str_var[sid].dim[0] = (uint64_t)vm_n[n1].value; + usr_object.obj_ref->str_var[sid].dim[1] = (uint64_t)vm_n[n2].value; + usr_object.obj_ref->str_var[sid].dim[2] = (uint64_t)vm_n[n3].value; +} + +void redim_type_204(uint64_t uid, int udt_index) +{ + if(redim_toplevel_flag) + rc_dim_type(&usr_var[uid], udt_index, 0, 0, 0, 0, 0); + else + rc_dim_type(&usr_object.obj_ref->uid_value[uid], udt_index, 0, 0, 0, 0, 0); + + redim_toplevel_flag = false; +} + +void redim_type1_205(uint64_t uid, int udt_index, int n1) +{ + if(redim_toplevel_flag) + rc_dim_type(&usr_var[uid], udt_index, 1, (uint64_t)vm_n[n1].value, 0, 0, usr_var[uid].uid_value.size()); + else + rc_dim_type(&usr_object.obj_ref->uid_value[uid], udt_index, 1, (uint64_t)vm_n[n1].value, 0, 0, usr_object.obj_ref->uid_value[uid].uid_value.size()); + + redim_toplevel_flag = false; +} + +void redim_type2_206(uint64_t uid, int udt_index, int n1, int n2) +{ + if(redim_toplevel_flag) + rc_dim_type(&usr_var[uid], udt_index, 2, (uint64_t)vm_n[n1].value, (uint64_t)vm_n[n2].value, 0, usr_var[uid].uid_value.size()); + else + rc_dim_type(&usr_object.obj_ref->uid_value[uid], udt_index, 2, (uint64_t)vm_n[n1].value, (uint64_t)vm_n[n2].value, 0, usr_object.obj_ref->uid_value[uid].uid_value.size()); + + cout << "test tl: " << redim_toplevel_flag << " -- " << usr_var[uid].uid_value.size() << endl; + + redim_toplevel_flag = false; +} + +void redim_type3_207(uint64_t uid, int udt_index, int n1, int n2, int n3) +{ + if(redim_toplevel_flag) + rc_dim_type(&usr_var[uid], udt_index, 3, (uint64_t)vm_n[n1].value, (uint64_t)vm_n[n2].value, (uint64_t)vm_n[n3].value, usr_var[uid].uid_value.size()); + else + rc_dim_type(&usr_object.obj_ref->uid_value[uid], udt_index, 3, (uint64_t)vm_n[n1].value, (uint64_t)vm_n[n2].value, (uint64_t)vm_n[n3].value, usr_object.obj_ref->uid_value[uid].uid_value.size()); + + redim_toplevel_flag = false; +} + +void redim_top_208() +{ + redim_toplevel_flag = true; +} + bool rcbasic_run() { @@ -5518,6 +5663,105 @@ bool rcbasic_run() i[3] = readInt(); i[4] = readInt(); preset_t3_191(i[0], i[1], i[2], i[3], i[4]); + break; + case 192: + i[0] = readInt(); + i[1] = readInt(); + redim_type_192(i[0], i[1]); + break; + case 193: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + redim_type1_193(i[0], i[1], i[2]); + break; + case 194: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + i[3] = readInt(); + redim_type2_194(i[0], i[1], i[2], i[3]); + break; + case 195: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + i[3] = readInt(); + i[4] = readInt(); + redim_type3_195(i[0], i[1], i[2], i[3], i[4]); + break; + case 196: + i[0] = readInt(); + redim_type_n_196(i[0]); + break; + case 197: + i[0] = readInt(); + i[1] = readInt(); + redim_type_n1_197(i[0], i[1]); + break; + case 198: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + redim_type_n2_198(i[0], i[1], i[2]); + break; + case 199: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + i[3] = readInt(); + redim_type_n3_199(i[0], i[1], i[2], i[3]); + break; + case 200: + i[0] = readInt(); + redim_type_s_200(i[0]); + break; + case 201: + i[0] = readInt(); + i[1] = readInt(); + redim_type_s1_201(i[0], i[1]); + break; + case 202: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + redim_type_s2_202(i[0], i[1], i[2]); + break; + case 203: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + i[3] = readInt(); + redim_type_s3_203(i[0], i[1], i[2], i[3]); + break; + case 204: + i[0] = readInt(); + i[1] = readInt(); + redim_type_204(i[0], i[1]); + break; + case 205: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + redim_type1_205(i[0], i[1], i[2]); + break; + case 206: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + i[3] = readInt(); + redim_type2_206(i[0], i[1], i[2], i[3]); + break; + case 207: + i[0] = readInt(); + i[1] = readInt(); + i[2] = readInt(); + i[3] = readInt(); + i[4] = readInt(); + redim_type3_207(i[0], i[1], i[2], i[3], i[4]); + break; + case 208: + redim_top_208(); break; default: cout << "invalid cmd: " << rcbasic_cmd << endl;