Refactor prop routines to use common template

This commit is contained in:
Cary R 2020-08-13 22:28:49 -07:00
parent 52c3b901e0
commit f3e4287d0a
1 changed files with 35 additions and 31 deletions

View File

@ -4806,9 +4806,7 @@ bool of_POP_OBJ(vthread_t thr, vvp_code_t cp)
bool of_POP_REAL(vthread_t thr, vvp_code_t cp) bool of_POP_REAL(vthread_t thr, vvp_code_t cp)
{ {
unsigned cnt = cp->number; unsigned cnt = cp->number;
for (unsigned idx = 0 ; idx < cnt ; idx += 1) { thr->pop_real(cnt);
(void) thr->pop_real();
}
return true; return true;
} }
@ -4940,6 +4938,37 @@ bool of_PROP_OBJ(vthread_t thr, vvp_code_t cp)
return true; return true;
} }
static void get_from_obj(unsigned pid, vvp_cobject*cobj, double&val)
{
val = cobj->get_real(pid);
}
static void get_from_obj(unsigned pid, vvp_cobject*cobj, string&val)
{
val = cobj->get_string(pid);
}
static void get_from_obj(unsigned pid, vvp_cobject*cobj, vvp_vector4_t&val)
{
cobj->get_vec4(pid, val);
}
template <typename ELEM>
static bool prop(vthread_t thr, vvp_code_t cp)
{
unsigned pid = cp->number;
vvp_object_t&obj = thr->peek_object();
vvp_cobject*cobj = obj.peek<vvp_cobject>();
assert(cobj);
ELEM val;
get_from_obj(pid, cobj, val);
vthread_push(thr, val);
return true;
}
/* /*
* %prop/r <pid> * %prop/r <pid>
* *
@ -4948,15 +4977,7 @@ bool of_PROP_OBJ(vthread_t thr, vvp_code_t cp)
*/ */
bool of_PROP_R(vthread_t thr, vvp_code_t cp) bool of_PROP_R(vthread_t thr, vvp_code_t cp)
{ {
unsigned pid = cp->number; return prop<double>(thr, cp);
vvp_object_t&obj = thr->peek_object();
vvp_cobject*cobj = obj.peek<vvp_cobject>();
double val = cobj->get_real(pid);
thr->push_real(val);
return true;
} }
/* /*
@ -4967,15 +4988,7 @@ bool of_PROP_R(vthread_t thr, vvp_code_t cp)
*/ */
bool of_PROP_STR(vthread_t thr, vvp_code_t cp) bool of_PROP_STR(vthread_t thr, vvp_code_t cp)
{ {
unsigned pid = cp->number; return prop<string>(thr, cp);
vvp_object_t&obj = thr->peek_object();
vvp_cobject*cobj = obj.peek<vvp_cobject>();
string val = cobj->get_string(pid);
thr->push_str(val);
return true;
} }
/* /*
@ -4986,16 +4999,7 @@ bool of_PROP_STR(vthread_t thr, vvp_code_t cp)
*/ */
bool of_PROP_V(vthread_t thr, vvp_code_t cp) bool of_PROP_V(vthread_t thr, vvp_code_t cp)
{ {
unsigned pid = cp->number; return prop<vvp_vector4_t>(thr, cp);
vvp_object_t&obj = thr->peek_object();
vvp_cobject*cobj = obj.peek<vvp_cobject>();
vvp_vector4_t val;
cobj->get_vec4(pid, val);
thr->push_vec4(val);
return true;
} }
bool of_PUSHI_REAL(vthread_t thr, vvp_code_t cp) bool of_PUSHI_REAL(vthread_t thr, vvp_code_t cp)