+added comparison between string and nil;
*fixed a multiple disposing bug with retrieved routine object; *fixed a bug with uncleared parsing context.
This commit is contained in:
parent
9c21333949
commit
8aa2028011
17
HISTORY
17
HISTORY
@ -1,3 +1,8 @@
|
|||||||
|
Oct. 17 2017
|
||||||
|
Added comparison between string and nil
|
||||||
|
Fixed a multiple disposing bug with retrieved routine object
|
||||||
|
Fixed a bug with uncleared parsing context
|
||||||
|
|
||||||
Oct. 14 2017
|
Oct. 14 2017
|
||||||
Fixed a multiple disposing bug with the PRINT statement
|
Fixed a multiple disposing bug with the PRINT statement
|
||||||
Fixed an error prompting bug with the INPUT statement
|
Fixed an error prompting bug with the INPUT statement
|
||||||
@ -110,7 +115,7 @@ Mar. 17 2017
|
|||||||
Added storing of different types support for array
|
Added storing of different types support for array
|
||||||
|
|
||||||
Mar. 8 2017
|
Mar. 8 2017
|
||||||
Fixed a processing bug when printing with a native routine of a class instance
|
Fixed a processing bug when printing with native routine of a class instance
|
||||||
|
|
||||||
Feb. 28 2017
|
Feb. 28 2017
|
||||||
Fixed an issue with reference count manipulation of a value
|
Fixed an issue with reference count manipulation of a value
|
||||||
@ -362,7 +367,7 @@ Refactored platform dependent macros
|
|||||||
|
|
||||||
Feb. 29 2016
|
Feb. 29 2016
|
||||||
Added multi-line comment support
|
Added multi-line comment support
|
||||||
Fixed a crash bug with an invalid expression
|
Fixed a crash bug with invalid expression
|
||||||
|
|
||||||
Feb. 26 2016
|
Feb. 26 2016
|
||||||
Added a ME keyword to represent a class instance itself
|
Added a ME keyword to represent a class instance itself
|
||||||
@ -452,7 +457,7 @@ Added an mb_gc function
|
|||||||
Added a SET_IMPORTING_DIRS statement to the shell
|
Added a SET_IMPORTING_DIRS statement to the shell
|
||||||
Added friendly error prompting when memory overflow
|
Added friendly error prompting when memory overflow
|
||||||
Added source file information to stepped handler
|
Added source file information to stepped handler
|
||||||
Fixed a wrong argument processing bug with a variable argument list
|
Fixed a wrong argument processing bug with variable argument list
|
||||||
Fixed a wrong hash bug with string object
|
Fixed a wrong hash bug with string object
|
||||||
Fixed a memory corruption bug with importing directory setting
|
Fixed a memory corruption bug with importing directory setting
|
||||||
Optimized cached list accessing
|
Optimized cached list accessing
|
||||||
@ -647,7 +652,7 @@ Developing class, added accessing by identifier
|
|||||||
Developing class, added a VAR statement to declare a member variable
|
Developing class, added a VAR statement to declare a member variable
|
||||||
Developing class, added routine evaluation in a class
|
Developing class, added routine evaluation in a class
|
||||||
Developing class, added reference count for class
|
Developing class, added reference count for class
|
||||||
Fixed a crash bug when exiting with a parsing error
|
Fixed a crash bug when exiting with parsing error
|
||||||
Fixed a multiple disposing bug when doing GC
|
Fixed a multiple disposing bug when doing GC
|
||||||
|
|
||||||
Dec. 8 2015
|
Dec. 8 2015
|
||||||
@ -835,7 +840,7 @@ Added referencable data type size constants
|
|||||||
|
|
||||||
Aug. 11 2015
|
Aug. 11 2015
|
||||||
Fixed a wrong IF trunk processing bug, thanks to irony for pointing it out
|
Fixed a wrong IF trunk processing bug, thanks to irony for pointing it out
|
||||||
Fixed a crash bug with an invalid IF statement
|
Fixed a crash bug with invalid IF statement
|
||||||
|
|
||||||
Jul. 27 2015
|
Jul. 27 2015
|
||||||
Fixed a memory leak with mb_pop_xxx, thanks to Daniel Haensse for pointing it out
|
Fixed a memory leak with mb_pop_xxx, thanks to Daniel Haensse for pointing it out
|
||||||
@ -888,7 +893,7 @@ Apr. 10 2015
|
|||||||
Improved compatibility with PellesC
|
Improved compatibility with PellesC
|
||||||
Fixed a double precision float parsing bug on all 32bit systems, thanks to Pito for pointing it out
|
Fixed a double precision float parsing bug on all 32bit systems, thanks to Pito for pointing it out
|
||||||
Fixed an exponential number parsing bug, thanks to Pito for pointing it out
|
Fixed an exponential number parsing bug, thanks to Pito for pointing it out
|
||||||
Fixed a crash bug when a script begins with a meaningless negtive number
|
Fixed a crash bug when a script begins with meaningless negtive number
|
||||||
|
|
||||||
Mar. 25 2015
|
Mar. 25 2015
|
||||||
Changed _strupr macro to mb_strupr function
|
Changed _strupr macro to mb_strupr function
|
||||||
|
@ -1469,6 +1469,7 @@ static char* _post_import(mb_interpreter_t* s, char* lf, int* pos, unsigned shor
|
|||||||
static int_t _get_size_of(_data_e type);
|
static int_t _get_size_of(_data_e type);
|
||||||
static bool_t _try_get_value(_object_t* obj, mb_value_u* val, _data_e expected);
|
static bool_t _try_get_value(_object_t* obj, mb_value_u* val, _data_e expected);
|
||||||
|
|
||||||
|
static bool_t _is_nil(void* obj);
|
||||||
static bool_t _is_number(void* obj);
|
static bool_t _is_number(void* obj);
|
||||||
static bool_t _is_string(void* obj);
|
static bool_t _is_string(void* obj);
|
||||||
static char* _extract_string(_object_t* obj);
|
static char* _extract_string(_object_t* obj);
|
||||||
@ -3671,7 +3672,7 @@ static int _calc_expression(mb_interpreter_t* s, _ls_node_t** l, _object_t** val
|
|||||||
if(c->type == _DT_STRING) {
|
if(c->type == _DT_STRING) {
|
||||||
if(ast->next) {
|
if(ast->next) {
|
||||||
_object_t* _fsn = (_object_t*)ast->next->data;
|
_object_t* _fsn = (_object_t*)ast->next->data;
|
||||||
if(_IS_FUNC(_fsn, _core_add) || _IS_FUNC(_fsn, _core_and) || _IS_FUNC(_fsn, _core_or) || _IS_FUNC(_fsn, _core_is))
|
if(_IS_FUNC(_fsn, _core_add) || _IS_FUNC(_fsn, _core_equal) || _IS_FUNC(_fsn, _core_not_equal) || _IS_FUNC(_fsn, _core_and) || _IS_FUNC(_fsn, _core_or) || _IS_FUNC(_fsn, _core_is))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3790,8 +3791,15 @@ _array:
|
|||||||
_LAZY_INIT_GLIST;
|
_LAZY_INIT_GLIST;
|
||||||
_ls_pushback(garbage, c);
|
_ls_pushback(garbage, c);
|
||||||
result = _public_value_to_internal_object(&running->intermediate_value, c);
|
result = _public_value_to_internal_object(&running->intermediate_value, c);
|
||||||
if(c->type == _DT_STRING)
|
switch(c->type) {
|
||||||
|
case _DT_ROUTINE:
|
||||||
|
if(c->data.routine->type != MB_RT_SCRIPT)
|
||||||
|
break;
|
||||||
|
mb_make_nil(running->intermediate_value);
|
||||||
|
/* Fall through */
|
||||||
|
case _DT_STRING:
|
||||||
c->is_ref = true;
|
c->is_ref = true;
|
||||||
|
}
|
||||||
if(result != MB_FUNC_OK)
|
if(result != MB_FUNC_OK)
|
||||||
goto _error;
|
goto _error;
|
||||||
if(f) {
|
if(f) {
|
||||||
@ -5949,6 +5957,22 @@ static bool_t _try_get_value(_object_t* obj, mb_value_u* val, _data_e expected)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Determine if an object is a nil */
|
||||||
|
static bool_t _is_nil(void* obj) {
|
||||||
|
bool_t result = false;
|
||||||
|
_object_t* o = 0;
|
||||||
|
|
||||||
|
mb_assert(obj);
|
||||||
|
|
||||||
|
o = (_object_t*)obj;
|
||||||
|
if(o->type == _DT_NIL)
|
||||||
|
result = true;
|
||||||
|
else if(o->type == _DT_VAR)
|
||||||
|
result = o->data.variable->data->type == _DT_NIL;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/* Determine if an object is a number */
|
/* Determine if an object is a number */
|
||||||
static bool_t _is_number(void* obj) {
|
static bool_t _is_number(void* obj) {
|
||||||
bool_t result = false;
|
bool_t result = false;
|
||||||
@ -13628,6 +13652,7 @@ int mb_run(struct mb_interpreter_t* s, bool_t clear_parser) {
|
|||||||
|
|
||||||
if(s->parsing_context) {
|
if(s->parsing_context) {
|
||||||
if(s->parsing_context->routine_state) {
|
if(s->parsing_context->routine_state) {
|
||||||
|
s->parsing_context->routine_state = 0;
|
||||||
result = MB_FUNC_ERR;
|
result = MB_FUNC_ERR;
|
||||||
_handle_error_now(s, SE_RN_INCOMPLETE_ROUTINE, s->source_file, result);
|
_handle_error_now(s, SE_RN_INCOMPLETE_ROUTINE, s->source_file, result);
|
||||||
|
|
||||||
@ -13635,6 +13660,7 @@ int mb_run(struct mb_interpreter_t* s, bool_t clear_parser) {
|
|||||||
}
|
}
|
||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
if(s->parsing_context->class_state != _CLASS_STATE_NONE) {
|
if(s->parsing_context->class_state != _CLASS_STATE_NONE) {
|
||||||
|
s->parsing_context->class_state = _CLASS_STATE_NONE;
|
||||||
result = MB_FUNC_ERR;
|
result = MB_FUNC_ERR;
|
||||||
_handle_error_now(s, SE_RN_INCOMPLETE_CLASS, s->source_file, result);
|
_handle_error_now(s, SE_RN_INCOMPLETE_CLASS, s->source_file, result);
|
||||||
|
|
||||||
@ -13692,9 +13718,14 @@ int mb_run(struct mb_interpreter_t* s, bool_t clear_parser) {
|
|||||||
} while(ast);
|
} while(ast);
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
_destroy_edge_objects(s);
|
if(s) {
|
||||||
|
if(clear_parser)
|
||||||
|
_destroy_parsing_context(&s->parsing_context);
|
||||||
|
|
||||||
s->has_run = true;
|
_destroy_edge_objects(s);
|
||||||
|
|
||||||
|
s->has_run = true;
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -14348,6 +14379,10 @@ static int _core_equal(mb_interpreter_t* s, void** l) {
|
|||||||
if(_is_string(((_tuple3_t*)*l)->e1) || _is_string(((_tuple3_t*)*l)->e2)) {
|
if(_is_string(((_tuple3_t*)*l)->e1) || _is_string(((_tuple3_t*)*l)->e2)) {
|
||||||
if(_is_string(((_tuple3_t*)*l)->e1) && _is_string(((_tuple3_t*)*l)->e2)) {
|
if(_is_string(((_tuple3_t*)*l)->e1) && _is_string(((_tuple3_t*)*l)->e2)) {
|
||||||
_instruct_compare_strings(==, l);
|
_instruct_compare_strings(==, l);
|
||||||
|
} else if(_is_nil(((_tuple3_t*)*l)->e1) || _is_nil(((_tuple3_t*)*l)->e2)) {
|
||||||
|
tpr = (_tuple3_t*)*l;
|
||||||
|
((_object_t*)tpr->e3)->type = _DT_INT;
|
||||||
|
((_object_t*)tpr->e3)->data.integer = false;
|
||||||
} else {
|
} else {
|
||||||
_set_tuple3_result(l, 0);
|
_set_tuple3_result(l, 0);
|
||||||
_handle_error_on_obj(s, SE_RN_STRING_EXPECTED, s->source_file, TON(l), MB_FUNC_WARNING, _exit, result);
|
_handle_error_on_obj(s, SE_RN_STRING_EXPECTED, s->source_file, TON(l), MB_FUNC_WARNING, _exit, result);
|
||||||
@ -14509,6 +14544,10 @@ static int _core_not_equal(mb_interpreter_t* s, void** l) {
|
|||||||
if(_is_string(((_tuple3_t*)*l)->e1) || _is_string(((_tuple3_t*)*l)->e2)) {
|
if(_is_string(((_tuple3_t*)*l)->e1) || _is_string(((_tuple3_t*)*l)->e2)) {
|
||||||
if(_is_string(((_tuple3_t*)*l)->e1) && _is_string(((_tuple3_t*)*l)->e2)) {
|
if(_is_string(((_tuple3_t*)*l)->e1) && _is_string(((_tuple3_t*)*l)->e2)) {
|
||||||
_instruct_compare_strings(!=, l);
|
_instruct_compare_strings(!=, l);
|
||||||
|
} else if(_is_nil(((_tuple3_t*)*l)->e1) || _is_nil(((_tuple3_t*)*l)->e2)) {
|
||||||
|
tpr = (_tuple3_t*)*l;
|
||||||
|
((_object_t*)tpr->e3)->type = _DT_INT;
|
||||||
|
((_object_t*)tpr->e3)->data.integer = true;
|
||||||
} else {
|
} else {
|
||||||
_set_tuple3_result(l, 1);
|
_set_tuple3_result(l, 1);
|
||||||
_handle_error_on_obj(s, SE_RN_STRING_EXPECTED, s->source_file, TON(l), MB_FUNC_WARNING, _exit, result);
|
_handle_error_on_obj(s, SE_RN_STRING_EXPECTED, s->source_file, TON(l), MB_FUNC_WARNING, _exit, result);
|
||||||
@ -15009,10 +15048,12 @@ _elseif:
|
|||||||
_handle_error_on_obj(s, SE_RN_INTEGER_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
|
_handle_error_on_obj(s, SE_RN_INTEGER_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ast && ast->next && _IS_EOS(ast->next->data))
|
if(ast && ast->next && _IS_EOS(ast->next->data)) {
|
||||||
multi_line = true;
|
multi_line = true;
|
||||||
else
|
} else {
|
||||||
s->skip_to_eoi = _ls_back(s->sub_stack);
|
if(!s->jump_set || (s->jump_set & _JMP_INS))
|
||||||
|
s->skip_to_eoi = _ls_back(s->sub_stack);
|
||||||
|
}
|
||||||
do {
|
do {
|
||||||
ast = ast->next;
|
ast = ast->next;
|
||||||
while(ast && _IS_EOS(ast->data))
|
while(ast && _IS_EOS(ast->data))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user