Added new redim instructions to runtime

This commit is contained in:
n00b87
2024-04-22 02:37:09 -05:00
parent 96c8366a4b
commit a84cceb938
5 changed files with 282 additions and 15 deletions

View File

@@ -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)
{

View File

@@ -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
}

View File

@@ -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;

View File

@@ -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

View File

@@ -290,7 +290,9 @@ stack<uint64_t> gosub_return_addr;
rc_int readint_val;
rc_double readdouble_val;
vector<uint64_t> arr_ref_id(2);
vector<uint64_t> 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;