*improved expression evaluation speed.
This commit is contained in:
parent
5fe40e2f52
commit
9049e37909
3
HISTORY
3
HISTORY
@ -1,3 +1,6 @@
|
|||||||
|
Oct. 9 2017
|
||||||
|
Improved expression evaluation speed
|
||||||
|
|
||||||
Oct. 5 2017
|
Oct. 5 2017
|
||||||
Fixed an infinity loop bug with error handling, thanks to Saar for pointing it out
|
Fixed an infinity loop bug with error handling, thanks to Saar for pointing it out
|
||||||
Fixed a wrong error locating bug, thanks to Saar for pointing it out
|
Fixed a wrong error locating bug, thanks to Saar for pointing it out
|
||||||
|
Binary file not shown.
@ -642,6 +642,9 @@ typedef struct _object_t {
|
|||||||
_raw_t raw;
|
_raw_t raw;
|
||||||
} data;
|
} data;
|
||||||
bool_t is_ref _PACK1;
|
bool_t is_ref _PACK1;
|
||||||
|
#ifdef MB_PREFER_SPEED
|
||||||
|
bool_t is_const _PACK1;
|
||||||
|
#endif /* MB_PREFER_SPEED */
|
||||||
#ifdef MB_ENABLE_SOURCE_TRACE
|
#ifdef MB_ENABLE_SOURCE_TRACE
|
||||||
int source_pos;
|
int source_pos;
|
||||||
unsigned short source_row;
|
unsigned short source_row;
|
||||||
@ -3645,6 +3648,16 @@ static int _calc_expression(mb_interpreter_t* s, _ls_node_t** l, _object_t** val
|
|||||||
|
|
||||||
running = s->running_context;
|
running = s->running_context;
|
||||||
ast = *l;
|
ast = *l;
|
||||||
|
|
||||||
|
c = (_object_t*)ast->data;
|
||||||
|
#ifdef MB_PREFER_SPEED
|
||||||
|
if(c->is_const) {
|
||||||
|
ast = ast->next;
|
||||||
|
|
||||||
|
goto _fast;
|
||||||
|
}
|
||||||
|
#endif /* MB_PREFER_SPEED */
|
||||||
|
|
||||||
optr = _ls_create();
|
optr = _ls_create();
|
||||||
opnd = _ls_create();
|
opnd = _ls_create();
|
||||||
|
|
||||||
@ -3654,7 +3667,6 @@ static int _calc_expression(mb_interpreter_t* s, _ls_node_t** l, _object_t** val
|
|||||||
*inep = 0;
|
*inep = 0;
|
||||||
_ls_pushback(s->in_neg_expr, inep);
|
_ls_pushback(s->in_neg_expr, inep);
|
||||||
|
|
||||||
c = (_object_t*)ast->data;
|
|
||||||
do {
|
do {
|
||||||
if(c->type == _DT_STRING) {
|
if(c->type == _DT_STRING) {
|
||||||
if(ast->next) {
|
if(ast->next) {
|
||||||
@ -4045,6 +4057,22 @@ _var:
|
|||||||
if(_is_unexpected_calc_type(s, c)) {
|
if(_is_unexpected_calc_type(s, c)) {
|
||||||
_handle_error_on_obj(s, SE_RN_INVALID_DATA_TYPE, s->source_file, DON(ast), MB_FUNC_ERR, _error, result);
|
_handle_error_on_obj(s, SE_RN_INVALID_DATA_TYPE, s->source_file, DON(ast), MB_FUNC_ERR, _error, result);
|
||||||
}
|
}
|
||||||
|
#ifdef MB_PREFER_SPEED
|
||||||
|
if(ast && ast->prev == *l) {
|
||||||
|
_object_t* obj = (_object_t*)(*l)->data;
|
||||||
|
switch(obj->type) {
|
||||||
|
case _DT_NIL: /* Fall through */
|
||||||
|
case _DT_INT: /* Fall through */
|
||||||
|
case _DT_REAL:
|
||||||
|
obj->is_const = true;
|
||||||
|
|
||||||
|
break;
|
||||||
|
default: /* Do nothing */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* MB_PREFER_SPEED */
|
||||||
|
_fast:
|
||||||
if(c->type == _DT_VAR) {
|
if(c->type == _DT_VAR) {
|
||||||
(*val)->type = c->data.variable->data->type;
|
(*val)->type = c->data.variable->data->type;
|
||||||
(*val)->data = c->data.variable->data->data;
|
(*val)->data = c->data.variable->data->data;
|
||||||
@ -4084,12 +4112,18 @@ _exit:
|
|||||||
_LS_FOREACH(garbage, _destroy_object, _try_clear_intermediate_value, s);
|
_LS_FOREACH(garbage, _destroy_object, _try_clear_intermediate_value, s);
|
||||||
_ls_destroy(garbage);
|
_ls_destroy(garbage);
|
||||||
}
|
}
|
||||||
_ls_foreach(optr, _destroy_object_not_compile_time);
|
if(optr) {
|
||||||
_ls_foreach(opnd, _destroy_object_not_compile_time);
|
_ls_foreach(optr, _destroy_object_not_compile_time);
|
||||||
_ls_destroy(optr);
|
_ls_destroy(optr);
|
||||||
_ls_destroy(opnd);
|
}
|
||||||
|
if(opnd) {
|
||||||
|
_ls_foreach(opnd, _destroy_object_not_compile_time);
|
||||||
|
_ls_destroy(opnd);
|
||||||
|
}
|
||||||
|
if(inep) {
|
||||||
|
mb_free(_ls_popback(s->in_neg_expr));
|
||||||
|
}
|
||||||
*l = ast;
|
*l = ast;
|
||||||
mb_free(_ls_popback(s->in_neg_expr));
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
#undef _LAZY_INIT_GLIST
|
#undef _LAZY_INIT_GLIST
|
||||||
|
@ -169,6 +169,10 @@ extern "C" {
|
|||||||
# define MB_ENABLE_STACK_TRACE
|
# define MB_ENABLE_STACK_TRACE
|
||||||
#endif /* MB_ENABLE_STACK_TRACE */
|
#endif /* MB_ENABLE_STACK_TRACE */
|
||||||
|
|
||||||
|
#ifndef MB_ENABLE_FULL_ERROR
|
||||||
|
# define MB_ENABLE_FULL_ERROR
|
||||||
|
#endif /* MB_ENABLE_FULL_ERROR */
|
||||||
|
|
||||||
#ifndef MB_CONVERT_TO_INT_LEVEL_NONE
|
#ifndef MB_CONVERT_TO_INT_LEVEL_NONE
|
||||||
# define MB_CONVERT_TO_INT_LEVEL_NONE 0
|
# define MB_CONVERT_TO_INT_LEVEL_NONE 0
|
||||||
#endif /* MB_CONVERT_TO_INT_LEVEL_NONE */
|
#endif /* MB_CONVERT_TO_INT_LEVEL_NONE */
|
||||||
@ -180,9 +184,9 @@ extern "C" {
|
|||||||
# define MB_CONVERT_TO_INT_LEVEL MB_CONVERT_TO_INT_LEVEL_ALL
|
# define MB_CONVERT_TO_INT_LEVEL MB_CONVERT_TO_INT_LEVEL_ALL
|
||||||
#endif /* MB_CONVERT_TO_INT_LEVEL */
|
#endif /* MB_CONVERT_TO_INT_LEVEL */
|
||||||
|
|
||||||
#ifndef MB_ENABLE_FULL_ERROR
|
#ifndef MB_PREFER_SPEED
|
||||||
# define MB_ENABLE_FULL_ERROR
|
# define MB_PREFER_SPEED
|
||||||
#endif /* MB_ENABLE_FULL_ERROR */
|
#endif /* MB_PREFER_SPEED */
|
||||||
|
|
||||||
#ifndef MB_COMPACT_MODE
|
#ifndef MB_COMPACT_MODE
|
||||||
# define MB_COMPACT_MODE
|
# define MB_COMPACT_MODE
|
||||||
|
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user