2015-02-24 14:51:39 +01:00
|
|
|
//
|
|
|
|
void eval(void)
|
|
|
|
{
|
|
|
|
MIN_ARGUMENTS(1);
|
|
|
|
if (IS_ARG_TYPE(0, cmd_symbol))
|
|
|
|
{
|
|
|
|
// recall a variable
|
|
|
|
void* obj;
|
|
|
|
unsigned int size;
|
|
|
|
int type;
|
2015-02-24 16:50:01 +01:00
|
|
|
string& variable = *((symbol*)_stack->back())->_value;
|
|
|
|
if (_heap->get(variable, obj, size, type))
|
|
|
|
{
|
|
|
|
_stack->pop_back();
|
2015-02-24 14:51:39 +01:00
|
|
|
_stack->push_back(obj, size, type);
|
2015-02-24 16:50:01 +01:00
|
|
|
}
|
2015-02-24 14:51:39 +01:00
|
|
|
else
|
|
|
|
ERR_CONTEXT(ret_unknown_variable);
|
|
|
|
}
|
|
|
|
else if (IS_ARG_TYPE(0, cmd_program))
|
|
|
|
{
|
2015-02-24 16:50:01 +01:00
|
|
|
// eval a program
|
2015-02-24 14:51:39 +01:00
|
|
|
string& entry = *((oprogram*)_stack->back())->_value;
|
|
|
|
_stack->pop_back();
|
|
|
|
|
|
|
|
program prog;
|
|
|
|
|
|
|
|
// make program from string in stack level 1
|
|
|
|
if (program::parse(entry, prog) == ret_ok)
|
|
|
|
{
|
|
|
|
// run it
|
|
|
|
prog.run(*_stack, *_heap);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ERR_CONTEXT(ret_bad_operand_type);
|
|
|
|
}
|