put all the execute funcs into the state struct

master
Daniel Kolesa 2015-08-06 02:02:06 +01:00
parent 580b41ded5
commit bc50f30d22
2 changed files with 64 additions and 60 deletions

View File

@ -3052,15 +3052,17 @@ ostd::String CsState::run_str(ostd::ConstCharRange code) {
return ret; return ret;
} }
char *executestr(Ident *id, TaggedValue *args, int numargs) { ostd::String CsState::run_str(Ident *id, ostd::PointerRange<TaggedValue> args) {
TaggedValue result; TaggedValue result;
executeret(id, args, numargs, result); executeret(id, args.data(), int(args.size()), result);
if (result.type == VAL_NULL) return nullptr; if (result.type == VAL_NULL) return nullptr;
result.force_str(); result.force_str();
return result.s; ostd::String ret(result.s);
delete[] result.s;
return ret;
} }
int execute(const ostd::uint *code) { int CsState::run_int(const ostd::uint *code) {
TaggedValue result; TaggedValue result;
runcode(code, result); runcode(code, result);
int i = result.get_int(); int i = result.get_int();
@ -3068,10 +3070,10 @@ int execute(const ostd::uint *code) {
return i; return i;
} }
int execute(const char *p) { int CsState::run_int(ostd::ConstCharRange p) {
ostd::Vector<ostd::uint> code; ostd::Vector<ostd::uint> code;
code.reserve(64); code.reserve(64);
compilemain(code, p, VAL_INT); compilemain(code, p.data(), VAL_INT);
TaggedValue result; TaggedValue result;
runcode(code.data() + 1, result); runcode(code.data() + 1, result);
if (int(code[0]) >= 0x100) code.disown(); if (int(code[0]) >= 0x100) code.disown();
@ -3080,15 +3082,15 @@ int execute(const char *p) {
return i; return i;
} }
int execute(Ident *id, TaggedValue *args, int numargs) { int CsState::run_int(Ident *id, ostd::PointerRange<TaggedValue> args) {
TaggedValue result; TaggedValue result;
executeret(id, args, numargs, result); executeret(id, args.data(), int(args.size()), result);
int i = result.get_int(); int i = result.get_int();
result.cleanup(); result.cleanup();
return i; return i;
} }
float executefloat(const ostd::uint *code) { float CsState::run_float(const ostd::uint *code) {
TaggedValue result; TaggedValue result;
runcode(code, result); runcode(code, result);
float f = result.get_float(); float f = result.get_float();
@ -3096,23 +3098,23 @@ float executefloat(const ostd::uint *code) {
return f; return f;
} }
float executefloat(const char *p) { float CsState::run_float(ostd::ConstCharRange code) {
TaggedValue result; TaggedValue result;
executeret(p, result); executeret(code.data(), result);
float f = result.get_float(); float f = result.get_float();
result.cleanup(); result.cleanup();
return f; return f;
} }
float executefloat(Ident *id, TaggedValue *args, int numargs) { float CsState::run_float(Ident *id, ostd::PointerRange<TaggedValue> args) {
TaggedValue result; TaggedValue result;
executeret(id, args, numargs, result); executeret(id, args.data(), int(args.size()), result);
float f = result.get_float(); float f = result.get_float();
result.cleanup(); result.cleanup();
return f; return f;
} }
bool executebool(const ostd::uint *code) { bool CsState::run_bool(const ostd::uint *code) {
TaggedValue result; TaggedValue result;
runcode(code, result); runcode(code, result);
bool b = getbool(result); bool b = getbool(result);
@ -3120,17 +3122,17 @@ bool executebool(const ostd::uint *code) {
return b; return b;
} }
bool executebool(const char *p) { bool CsState::run_bool(ostd::ConstCharRange code) {
TaggedValue result; TaggedValue result;
executeret(p, result); executeret(code.data(), result);
bool b = getbool(result); bool b = getbool(result);
result.cleanup(); result.cleanup();
return b; return b;
} }
bool executebool(Ident *id, TaggedValue *args, int numargs) { bool CsState::run_bool(Ident *id, ostd::PointerRange<TaggedValue> args) {
TaggedValue result; TaggedValue result;
executeret(id, args, numargs, result); executeret(id, args.data(), int(args.size()), result);
bool b = getbool(result); bool b = getbool(result);
result.cleanup(); result.cleanup();
return b; return b;
@ -3154,7 +3156,7 @@ bool execfile(const char *cfgfile, bool msg) {
sourcefile = cfgfile; sourcefile = cfgfile;
sourcestr = buf; sourcestr = buf;
execute(buf); cstate.run_int(buf);
sourcefile = oldsourcefile; sourcefile = oldsourcefile;
sourcestr = oldsourcestr; sourcestr = oldsourcestr;
delete[] buf; delete[] buf;
@ -3323,36 +3325,36 @@ static inline void setiter(Ident &id, int i, IdentStack &stack) {
} }
} }
static inline void doloop(Ident &id, int offset, int n, int step, ostd::uint *body) { static inline void doloop(CsState &cs, Ident &id, int offset, int n, int step, ostd::uint *body) {
if (n <= 0 || id.type != ID_ALIAS) return; if (n <= 0 || id.type != ID_ALIAS) return;
IdentStack stack; IdentStack stack;
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
setiter(id, offset + i * step, stack); setiter(id, offset + i * step, stack);
execute(body); cs.run_int(body);
} }
poparg(id); poparg(id);
} }
ICOMMAND(loop, "rie", (CsState &, Ident *id, int *n, ostd::uint *body), doloop(*id, 0, *n, 1, body)); ICOMMAND(loop, "rie", (CsState &cs, Ident *id, int *n, ostd::uint *body), doloop(cs, *id, 0, *n, 1, body));
ICOMMAND(loop+, "riie", (CsState &, Ident *id, int *offset, int *n, ostd::uint *body), doloop(*id, *offset, *n, 1, body)); ICOMMAND(loop+, "riie", (CsState &cs, Ident *id, int *offset, int *n, ostd::uint *body), doloop(cs, *id, *offset, *n, 1, body));
ICOMMAND(loop*, "riie", (CsState &, Ident *id, int *step, int *n, ostd::uint *body), doloop(*id, 0, *n, *step, body)); ICOMMAND(loop*, "riie", (CsState &cs, Ident *id, int *step, int *n, ostd::uint *body), doloop(cs, *id, 0, *n, *step, body));
ICOMMAND(loop+*, "riiie", (CsState &, Ident *id, int *offset, int *step, int *n, ostd::uint *body), doloop(*id, *offset, *n, *step, body)); ICOMMAND(loop+*, "riiie", (CsState &cs, Ident *id, int *offset, int *step, int *n, ostd::uint *body), doloop(cs, *id, *offset, *n, *step, body));
static inline void loopwhile(Ident &id, int offset, int n, int step, ostd::uint *cond, ostd::uint *body) { static inline void loopwhile(CsState &cs, Ident &id, int offset, int n, int step, ostd::uint *cond, ostd::uint *body) {
if (n <= 0 || id.type != ID_ALIAS) return; if (n <= 0 || id.type != ID_ALIAS) return;
IdentStack stack; IdentStack stack;
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
setiter(id, offset + i * step, stack); setiter(id, offset + i * step, stack);
if (!executebool(cond)) break; if (!cs.run_bool(cond)) break;
execute(body); cs.run_int(body);
} }
poparg(id); poparg(id);
} }
ICOMMAND(loopwhile, "riee", (CsState &, Ident *id, int *n, ostd::uint *cond, ostd::uint *body), loopwhile(*id, 0, *n, 1, cond, body)); ICOMMAND(loopwhile, "riee", (CsState &cs, Ident *id, int *n, ostd::uint *cond, ostd::uint *body), loopwhile(cs, *id, 0, *n, 1, cond, body));
ICOMMAND(loopwhile+, "riiee", (CsState &, Ident *id, int *offset, int *n, ostd::uint *cond, ostd::uint *body), loopwhile(*id, *offset, *n, 1, cond, body)); ICOMMAND(loopwhile+, "riiee", (CsState &cs, Ident *id, int *offset, int *n, ostd::uint *cond, ostd::uint *body), loopwhile(cs, *id, *offset, *n, 1, cond, body));
ICOMMAND(loopwhile*, "riiee", (CsState &, Ident *id, int *step, int *n, ostd::uint *cond, ostd::uint *body), loopwhile(*id, 0, *n, *step, cond, body)); ICOMMAND(loopwhile*, "riiee", (CsState &cs, Ident *id, int *step, int *n, ostd::uint *cond, ostd::uint *body), loopwhile(cs, *id, 0, *n, *step, cond, body));
ICOMMAND(loopwhile+*, "riiiee", (CsState &, Ident *id, int *offset, int *step, int *n, ostd::uint *cond, ostd::uint *body), loopwhile(*id, *offset, *n, *step, cond, body)); ICOMMAND(loopwhile+*, "riiiee", (CsState &cs, Ident *id, int *offset, int *step, int *n, ostd::uint *cond, ostd::uint *body), loopwhile(cs, *id, *offset, *n, *step, cond, body));
ICOMMAND(while, "ee", (CsState &, ostd::uint *cond, ostd::uint *body), while (executebool(cond)) execute(body)); ICOMMAND(while, "ee", (CsState &cs, ostd::uint *cond, ostd::uint *body), while (cs.run_bool(cond)) cs.run_int(body));
static inline void loopconc(Ident &id, int offset, int n, int step, ostd::uint *body, bool space) { static inline void loopconc(Ident &id, int offset, int n, int step, ostd::uint *body, bool space) {
if (n <= 0 || id.type != ID_ALIAS) return; if (n <= 0 || id.type != ID_ALIAS) return;
@ -3589,7 +3591,7 @@ void listfind(CsState &cs, Ident *id, const char *list, const ostd::uint *body)
for (const char *s = list, *start, *end; parselist(s, start, end);) { for (const char *s = list, *start, *end; parselist(s, start, end);) {
++n; ++n;
setiter(*id, dup_ostr(ostd::ConstCharRange(start, end - start)), stack); setiter(*id, dup_ostr(ostd::ConstCharRange(start, end - start)), stack);
if (executebool(body)) { if (cs.run_bool(body)) {
cs.result->set_int(n); cs.result->set_int(n);
goto found; goto found;
} }
@ -3600,14 +3602,14 @@ found:
} }
COMMAND(listfind, "rse"); COMMAND(listfind, "rse");
void listassoc(CsState &, Ident *id, const char *list, const ostd::uint *body) { void listassoc(CsState &cs, Ident *id, const char *list, const ostd::uint *body) {
if (id->type != ID_ALIAS) return; if (id->type != ID_ALIAS) return;
IdentStack stack; IdentStack stack;
int n = -1; int n = -1;
for (const char *s = list, *start, *end, *qstart; parselist(s, start, end);) { for (const char *s = list, *start, *end, *qstart; parselist(s, start, end);) {
++n; ++n;
setiter(*id, dup_ostr(ostd::ConstCharRange(start, end - start)), stack); setiter(*id, dup_ostr(ostd::ConstCharRange(start, end - start)), stack);
if (executebool(body)) { if (cs.run_bool(body)) {
if (parselist(s, start, end, qstart)) stringret(listelem(start, end, qstart)); if (parselist(s, start, end, qstart)) stringret(listelem(start, end, qstart));
break; break;
} }
@ -3648,26 +3650,26 @@ LISTASSOC(listassoc=, "i", int, , parseint(start) == *val);
LISTASSOC(listassoc=f, "f", float, , parsefloat(start) == *val); LISTASSOC(listassoc=f, "f", float, , parsefloat(start) == *val);
LISTASSOC(listassoc=s, "s", char, int len = (int)strlen(val), int(end - start) == len && !memcmp(start, val, len)); LISTASSOC(listassoc=s, "s", char, int len = (int)strlen(val), int(end - start) == len && !memcmp(start, val, len));
void looplist(CsState &, Ident *id, const char *list, const ostd::uint *body) { void looplist(CsState &cs, Ident *id, const char *list, const ostd::uint *body) {
if (id->type != ID_ALIAS) return; if (id->type != ID_ALIAS) return;
IdentStack stack; IdentStack stack;
int n = 0; int n = 0;
for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n++) { for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n++) {
setiter(*id, listelem(start, end, qstart), stack); setiter(*id, listelem(start, end, qstart), stack);
execute(body); cs.run_int(body);
} }
if (n) poparg(*id); if (n) poparg(*id);
} }
COMMAND(looplist, "rse"); COMMAND(looplist, "rse");
void looplist2(CsState &, Ident *id, Ident *id2, const char *list, const ostd::uint *body) { void looplist2(CsState &cs, Ident *id, Ident *id2, const char *list, const ostd::uint *body) {
if (id->type != ID_ALIAS || id2->type != ID_ALIAS) return; if (id->type != ID_ALIAS || id2->type != ID_ALIAS) return;
IdentStack stack, stack2; IdentStack stack, stack2;
int n = 0; int n = 0;
for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n += 2) { for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n += 2) {
setiter(*id, listelem(start, end, qstart), stack); setiter(*id, listelem(start, end, qstart), stack);
setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack2); setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack2);
execute(body); cs.run_int(body);
} }
if (n) { if (n) {
poparg(*id); poparg(*id);
@ -3676,7 +3678,7 @@ void looplist2(CsState &, Ident *id, Ident *id2, const char *list, const ostd::u
} }
COMMAND(looplist2, "rrse"); COMMAND(looplist2, "rrse");
void looplist3(CsState &, Ident *id, Ident *id2, Ident *id3, const char *list, const ostd::uint *body) { void looplist3(CsState &cs, Ident *id, Ident *id2, Ident *id3, const char *list, const ostd::uint *body) {
if (id->type != ID_ALIAS || id2->type != ID_ALIAS || id3->type != ID_ALIAS) return; if (id->type != ID_ALIAS || id2->type != ID_ALIAS || id3->type != ID_ALIAS) return;
IdentStack stack, stack2, stack3; IdentStack stack, stack2, stack3;
int n = 0; int n = 0;
@ -3684,7 +3686,7 @@ void looplist3(CsState &, Ident *id, Ident *id2, Ident *id3, const char *list, c
setiter(*id, listelem(start, end, qstart), stack); setiter(*id, listelem(start, end, qstart), stack);
setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack2); setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack2);
setiter(*id3, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack3); setiter(*id3, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack3);
execute(body); cs.run_int(body);
} }
if (n) { if (n) {
poparg(*id); poparg(*id);
@ -3728,7 +3730,7 @@ void listfilter(CsState &cs, Ident *id, const char *list, const ostd::uint *body
char *val = dup_ostr(ostd::ConstCharRange(start, end - start)); char *val = dup_ostr(ostd::ConstCharRange(start, end - start));
setiter(*id, val, stack); setiter(*id, val, stack);
if (executebool(body)) { if (cs.run_bool(body)) {
if (r.size()) r.push(' '); if (r.size()) r.push(' ');
r.push_n(qstart, qend - qstart); r.push_n(qstart, qend - qstart);
} }
@ -3746,7 +3748,7 @@ void listcount(CsState &cs, Ident *id, const char *list, const ostd::uint *body)
for (const char *s = list, *start, *end; parselist(s, start, end); n++) { for (const char *s = list, *start, *end; parselist(s, start, end); n++) {
char *val = dup_ostr(ostd::ConstCharRange(start, end - start)); char *val = dup_ostr(ostd::ConstCharRange(start, end - start));
setiter(*id, val, stack); setiter(*id, val, stack);
if (executebool(body)) r++; if (cs.run_bool(body)) r++;
} }
if (n) poparg(*id); if (n) poparg(*id);
cs.result->set_int(r); cs.result->set_int(r);
@ -3844,6 +3846,7 @@ struct sortitem {
}; };
struct sortfun { struct sortfun {
CsState &cs;
Ident *x, *y; Ident *x, *y;
ostd::uint *body; ostd::uint *body;
@ -3854,7 +3857,7 @@ struct sortfun {
if (y->valtype != VAL_CSTR) y->valtype = VAL_CSTR; if (y->valtype != VAL_CSTR) y->valtype = VAL_CSTR;
y->clean_code(); y->clean_code();
y->val.code = (const ostd::uint *)yval.str; y->val.code = (const ostd::uint *)yval.str;
return executebool(body); return cs.run_bool(body);
} }
}; };
@ -3885,7 +3888,7 @@ void sortlist(CsState &cs, char *list, Ident *x, Ident *y, ostd::uint *body, ost
int totalunique = total, numunique = items.size(); int totalunique = total, numunique = items.size();
if (body) { if (body) {
sortfun f = { x, y, body }; sortfun f = { cs, x, y, body };
ostd::sort(items.iter(), f); ostd::sort(items.iter(), f);
if ((*unique & CODE_OP_MASK) != CODE_EXIT) { if ((*unique & CODE_OP_MASK) != CODE_EXIT) {
f.body = unique; f.body = unique;
@ -3901,7 +3904,7 @@ void sortlist(CsState &cs, char *list, Ident *x, Ident *y, ostd::uint *body, ost
} }
} }
} else { } else {
sortfun f = { x, y, unique }; sortfun f = { cs, x, y, unique };
totalunique = items[0].quotelength(); totalunique = items[0].quotelength();
numunique = 1; numunique = 1;
for (ostd::Size i = 1; i < items.size(); i++) { for (ostd::Size i = 1; i < items.size(); i++) {
@ -4127,7 +4130,7 @@ ICOMMAND(round, "ff", (CsState &cs, float *n, float *k), {
ICOMMAND(cond, "ee2V", (CsState &cs, TaggedValue *args, int numargs), { ICOMMAND(cond, "ee2V", (CsState &cs, TaggedValue *args, int numargs), {
for (int i = 0; i < numargs; i += 2) { for (int i = 0; i < numargs; i += 2) {
if (i + 1 < numargs) { if (i + 1 < numargs) {
if (executebool(args[i].code)) { if (cs.run_bool(args[i].code)) {
executeret(args[i + 1].code, *cs.result); executeret(args[i + 1].code, *cs.result);
break; break;
} }

View File

@ -322,6 +322,19 @@ struct CsState {
ostd::String run_str(const ostd::uint *code); ostd::String run_str(const ostd::uint *code);
ostd::String run_str(ostd::ConstCharRange code); ostd::String run_str(ostd::ConstCharRange code);
ostd::String run_str(Ident *id, ostd::PointerRange<TaggedValue> args);
int run_int(const ostd::uint *code);
int run_int(ostd::ConstCharRange code);
int run_int(Ident *id, ostd::PointerRange<TaggedValue> args);
float run_float(const ostd::uint *code);
float run_float(ostd::ConstCharRange code);
float run_float(Ident *id, ostd::PointerRange<TaggedValue> args);
bool run_bool(const ostd::uint *code);
bool run_bool(ostd::ConstCharRange code);
bool run_bool(Ident *id, ostd::PointerRange<TaggedValue> args);
}; };
extern CsState cstate; extern CsState cstate;
@ -478,18 +491,6 @@ extern void freecode(ostd::uint *p);
extern void executeret(const ostd::uint *code, TaggedValue &result = *cstate.result); extern void executeret(const ostd::uint *code, TaggedValue &result = *cstate.result);
extern void executeret(const char *p, TaggedValue &result = *cstate.result); extern void executeret(const char *p, TaggedValue &result = *cstate.result);
extern void executeret(Ident *id, TaggedValue *args, int numargs, TaggedValue &result = *cstate.result); extern void executeret(Ident *id, TaggedValue *args, int numargs, TaggedValue &result = *cstate.result);
extern char *executestr(const ostd::uint *code);
extern char *executestr(const char *p);
extern char *executestr(Ident *id, TaggedValue *args, int numargs);
extern int execute(const ostd::uint *code);
extern int execute(const char *p);
extern int execute(Ident *id, TaggedValue *args, int numargs);
extern float executefloat(const ostd::uint *code);
extern float executefloat(const char *p);
extern float executefloat(Ident *id, TaggedValue *args, int numargs);
extern bool executebool(const ostd::uint *code);
extern bool executebool(const char *p);
extern bool executebool(Ident *id, TaggedValue *args, int numargs);
extern bool execfile(const char *cfgfile, bool msg = true); extern bool execfile(const char *cfgfile, bool msg = true);
extern void alias(const char *name, const char *action); extern void alias(const char *name, const char *action);
extern void alias(const char *name, TaggedValue &v); extern void alias(const char *name, TaggedValue &v);