diff --git a/HISTORY b/HISTORY index 25ecd5a..a05bb79 100755 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,6 @@ +Jan. 20 2016 +Fixed an unknown type handling bug + Jan. 19 2016 Added support to apply the LEN statement to variable arguments as LEN(...) Polished code diff --git a/core/my_basic.c b/core/my_basic.c index 054ec7d..25be55d 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -3248,7 +3248,7 @@ _routine: } c = (_object_t*)(_ls_popback(opnd)); - if(!c || !(c->type == _DT_TYPE || c->type == _DT_NIL || + if(!c || !(c->type == _DT_NIL || c->type == _DT_UNKNOWN || c->type == _DT_TYPE || c->type == _DT_INT || c->type == _DT_REAL || c->type == _DT_STRING || #ifdef MB_ENABLE_COLLECTION_LIB c->type == _DT_LIST || c->type == _DT_LIST_IT || c->type == _DT_DICT || c->type == _DT_DICT_IT || @@ -7786,10 +7786,10 @@ bool_t _is_internal_object(_object_t* obj) { _data_e _public_type_to_internal_type(mb_data_e t) { /* Convert a public mb_data_e type to an internal _data_e */ switch(t) { - case MB_DT_TYPE: - return _DT_TYPE; case MB_DT_NIL: return _DT_NIL; + case MB_DT_TYPE: + return _DT_TYPE; case MB_DT_INT: return _DT_INT; case MB_DT_REAL: @@ -7828,10 +7828,10 @@ _data_e _public_type_to_internal_type(mb_data_e t) { mb_data_e _internal_type_to_public_type(_data_e t) { /* Convert an internal mb_data_e type to a public _data_e */ switch(t) { - case _DT_TYPE: - return MB_DT_TYPE; case _DT_NIL: return MB_DT_NIL; + case _DT_TYPE: + return MB_DT_TYPE; case _DT_INT: return MB_DT_INT; case _DT_REAL: @@ -7876,15 +7876,20 @@ int _public_value_to_internal_object(mb_value_t* pbl, _object_t* itn) { _UNREF(itn) switch(pbl->type) { - case MB_DT_TYPE: - itn->type = _DT_TYPE; - itn->data.type = pbl->value.type; - - break; case MB_DT_NIL: itn->type = _DT_NIL; itn->data.integer = false; + break; + case MB_DT_UNKNOWN: + itn->type = _DT_UNKNOWN; + itn->data.integer = false; + + break; + case MB_DT_TYPE: + itn->type = _DT_TYPE; + itn->data.type = pbl->value.type; + break; case MB_DT_INT: itn->type = _DT_INT; @@ -7973,15 +7978,20 @@ int _internal_object_to_public_value(_object_t* itn, mb_value_t* pbl) { case _DT_VAR: result = _internal_object_to_public_value(itn->data.variable->data, pbl); + break; + case _DT_NIL: + mb_make_nil(*pbl); + + break; + case _DT_UNKNOWN: + pbl->type = MB_DT_UNKNOWN; + pbl->value.integer = false; + break; case _DT_TYPE: pbl->type = MB_DT_TYPE; pbl->value.type = itn->data.type; - break; - case _DT_NIL: - mb_make_nil(*pbl); - break; case _DT_INT: pbl->type = MB_DT_INT; @@ -10688,6 +10698,8 @@ const char* mb_get_type_string(mb_data_e t) { switch(t) { case MB_DT_NIL: return "NIL"; + case MB_DT_UNKNOWN: + return "UNKNOWN"; case MB_DT_TYPE: return "TYPE"; case MB_DT_INT: @@ -10722,9 +10734,8 @@ const char* mb_get_type_string(mb_data_e t) { #endif /* MB_ENABLE_CLASS */ case MB_DT_ROUTINE: return "ROUTINE"; - case MB_DT_UNKNOWN: /* Fall through */ - default: - return "UNKNOWN"; + default: /* Return a not exist string */ + return ""; } } @@ -11441,62 +11452,60 @@ int _core_let(mb_interpreter_t* s, void** l) { result = _calc_expression(s, &ast, &val); if(var) { - if(val->type != _DT_UNKNOWN) { #ifdef MB_ENABLE_COLLECTION_LIB - if(is_coll) { - switch(var->data->type) { - case _DT_LIST: - if(!_set_list(var->data->data.list, idx, 0, &val)) { - _handle_error_on_obj(s, SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX, s->source_file, TON(l), MB_FUNC_ERR, _exit, result); - } - - break; - case _DT_DICT: - _set_dict(var->data->data.dict, &key, 0, 0, val); - - break; - default: /* Do nothing */ - break; + if(is_coll) { + switch(var->data->type) { + case _DT_LIST: + if(!_set_list(var->data->data.list, idx, 0, &val)) { + _handle_error_on_obj(s, SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX, s->source_file, TON(l), MB_FUNC_ERR, _exit, result); } - goto _exit; + break; + case _DT_DICT: + _set_dict(var->data->data.dict, &key, 0, 0, val); + + break; + default: /* Do nothing */ + break; } + + goto _exit; + } #endif /* MB_ENABLE_COLLECTION_LIB */ #ifdef MB_ENABLE_CLASS _proc_extra_var: #endif /* MB_ENABLE_CLASS */ - _dispose_object(var->data); - var->data->type = val->type; + _dispose_object(var->data); + var->data->type = val->type; #ifdef MB_ENABLE_COLLECTION_LIB - if(val->type == _DT_LIST_IT || val->type == _DT_DICT_IT) - _assign_with_it(var->data, val); - else - var->data->data = val->data; -#else /* MB_ENABLE_COLLECTION_LIB */ + if(val->type == _DT_LIST_IT || val->type == _DT_DICT_IT) + _assign_with_it(var->data, val); + else var->data->data = val->data; +#else /* MB_ENABLE_COLLECTION_LIB */ + var->data->data = val->data; #endif /* MB_ENABLE_COLLECTION_LIB */ - if(val->type == _DT_ROUTINE) { + if(val->type == _DT_ROUTINE) { #ifdef MB_ENABLE_LAMBDA - if(val->data.routine->type == _IT_LAMBDA) - var->data->ref = val->ref; - else - var->data->ref = 1; -#else /* MB_ENABLE_LAMBDA */ - var->data->ref = 1; -#endif /* MB_ENABLE_LAMBDA */ - } else { + if(val->data.routine->type == _IT_LAMBDA) var->data->ref = val->ref; - } -#ifdef MB_ENABLE_CLASS - if(evar && evar->pathing) { - var = evar; - evar = 0; - refc++; - - goto _proc_extra_var; - } -#endif /* MB_ENABLE_CLASS */ + else + var->data->ref = 1; +#else /* MB_ENABLE_LAMBDA */ + var->data->ref = 1; +#endif /* MB_ENABLE_LAMBDA */ + } else { + var->data->ref = val->ref; } +#ifdef MB_ENABLE_CLASS + if(evar && evar->pathing) { + var = evar; + evar = 0; + refc++; + + goto _proc_extra_var; + } +#endif /* MB_ENABLE_CLASS */ } else if(arr && literally) { if(val->type != _DT_UNKNOWN) { #ifdef MB_ENABLE_ARRAY_REF diff --git a/core/my_basic.h b/core/my_basic.h index 54201a6..a946237 100755 --- a/core/my_basic.h +++ b/core/my_basic.h @@ -358,27 +358,27 @@ typedef enum mb_error_e { typedef enum mb_data_e { MB_DT_NIL = 0, - MB_DT_UNKNOWN = 1 << 1, - MB_DT_TYPE = 1 << 2, - MB_DT_INT = 1 << 3, - MB_DT_REAL = 1 << 4, - MB_DT_NUM = 1 << 5, - MB_DT_STRING = 1 << 6, - MB_DT_USERTYPE = 1 << 7, + MB_DT_UNKNOWN = 1 << 0, + MB_DT_TYPE = 1 << 1, + MB_DT_INT = 1 << 2, + MB_DT_REAL = 1 << 3, + MB_DT_NUM = 1 << 4, + MB_DT_STRING = 1 << 5, + MB_DT_USERTYPE = 1 << 6, #ifdef MB_ENABLE_USERTYPE_REF - MB_DT_USERTYPE_REF = 1 << 8, + MB_DT_USERTYPE_REF = 1 << 7, #endif /* MB_ENABLE_USERTYPE_REF */ - MB_DT_ARRAY = 1 << 9, + MB_DT_ARRAY = 1 << 8, #ifdef MB_ENABLE_COLLECTION_LIB - MB_DT_LIST = 1 << 10, - MB_DT_LIST_IT = 1 << 11, - MB_DT_DICT = 1 << 12, - MB_DT_DICT_IT = 1 << 13, + MB_DT_LIST = 1 << 9, + MB_DT_LIST_IT = 1 << 10, + MB_DT_DICT = 1 << 11, + MB_DT_DICT_IT = 1 << 12, #endif /* MB_ENABLE_COLLECTION_LIB */ #ifdef MB_ENABLE_CLASS - MB_DT_CLASS = 1 << 14, + MB_DT_CLASS = 1 << 13, #endif /* MB_ENABLE_CLASS */ - MB_DT_ROUTINE = 1 << 15 + MB_DT_ROUTINE = 1 << 14 } mb_data_e; typedef unsigned char mb_val_bytes_t[sizeof(void*) > sizeof(unsigned long) ? sizeof(void*) : sizeof(unsigned long)]; diff --git a/output/my_basic.exe b/output/my_basic.exe index 16440c0..083e6c7 100755 Binary files a/output/my_basic.exe and b/output/my_basic.exe differ