-simplified error codes, removed some of them.

This commit is contained in:
Wang Renxin 2017-11-18 20:23:42 +08:00
parent 347867e42b
commit e2492be76e
2 changed files with 75 additions and 118 deletions

View File

@ -260,50 +260,43 @@ typedef struct _ht_node_t {
MBCONST static const char* const _ERR_DESC[] = { MBCONST static const char* const _ERR_DESC[] = {
"No error", "No error",
/** Common */ /** Common */
"A function with the same name already exists", "Function already exists",
"A function with the name does not exists", "Function not exists",
"Not supported", "Not supported",
/** Parsing */ /** Parsing */
"Open file failed", "Open file failed",
"Symbol too long", "Symbol too long",
"Invalid character", "Invalid character",
"Invalid module",
/** Running */ /** Running */
"Empty program", "Empty program",
"Program too long", "Program too long",
"Syntax error", "Syntax error",
"Out of memory", "Out of memory",
"Invalid data type", "Overflow",
"Type does not match", "Unexpected type",
"Number overflow",
"Invalid string", "Invalid string",
"Number expected",
"Integer expected", "Integer expected",
"Number expected",
"String expected", "String expected",
"Variable expected",
"Index out of bound", "Index out of bound",
"Cannot find with given index", "Cannot find with given index",
"Illegal bound",
"Too many dimensions", "Too many dimensions",
"Dimension count out of bound",
"Rank out of bound", "Rank out of bound",
"Complex array required",
"Array identifier expected",
"Array subscript expected",
"Variable expected",
"Variable or array expected",
"Invalid identifier usage", "Invalid identifier usage",
"Duplicate identifier", "Duplicate identifier",
"Label does not exist", "Incomplete structure",
"Label not exists",
"No return point", "No return point",
"Colon expected", "Colon expected",
"Comma expected", "Comma expected",
"Comma or semicolon expected", "Comma or semicolon expected",
"Open bracket expected", "Open bracket expected",
"Close bracket expected", "Close bracket expected",
"Nested too deep", "Nested too much",
"Incomplete structure",
"Operation failed", "Operation failed",
"Operator expected", "Operator expected",
"Invalid operation usage",
"Assign operator expected", "Assign operator expected",
"ELSE statement expected", "ELSE statement expected",
"ENDIF statement expected", "ENDIF statement expected",
@ -315,38 +308,24 @@ MBCONST static const char* const _ERR_DESC[] = {
"Calculation error", "Calculation error",
"Invalid expression", "Invalid expression",
"Divide by zero", "Divide by zero",
"MOD by zero",
"Module not match",
"Wrong function reached", "Wrong function reached",
"Do not suspend in a routine", "Cannot suspend in a routine",
"Do not mix instructional and structured sub routines", "Cannot mix instructional and structured sub routines",
"Invalid routine", "Invalid routine",
"Incomplete routine",
"Routine expected", "Routine expected",
"Duplicate routine", "Duplicate routine",
"Too many routines",
"Invalid class", "Invalid class",
"Incomplete class",
"Class expected", "Class expected",
"Duplicate class", "Duplicate class",
"Wrong meta class", "HASH and COMPARE must be provided together",
"HASH and COMPARE must come together",
"Cannot change ME",
"Invalid lambda", "Invalid lambda",
"Empty collection", "Empty collection",
"List expected", "List expected",
"Invalid iterator",
"Iterable expected",
"Collection expected", "Collection expected",
"Collection or iterator expected", "Collection or iterator expected",
"Iterator expected",
"Invalid iterator",
"Invalid iterator usage",
"Iterable expected",
"Referenced usertype expected",
"Referenced type expected", "Referenced type expected",
"Reference count overflow",
"Weak reference count overflow",
"Debug identifier not found",
"Stack trace disabled",
/** Extended abort */ /** Extended abort */
"Extended abort" "Extended abort"
}; };
@ -1191,7 +1170,7 @@ static _object_t* _exp_assign = 0;
#define _using_jump_set_of_instructional(__s, __obj, __exit, __result) \ #define _using_jump_set_of_instructional(__s, __obj, __exit, __result) \
do { \ do { \
if((__s)->jump_set & (~_JMP_INS)) { \ if((__s)->jump_set & (~_JMP_INS)) { \
_handle_error_on_obj(__s, SE_RN_DO_NOT_MIX_INSTRUCTIONAL_AND_STRUCTURED, (__s)->source_file, DON(__obj), MB_FUNC_ERR, __exit, __result); \ _handle_error_on_obj(__s, SE_RN_CANNOT_MIX_INSTRUCTIONAL_AND_STRUCTURED, (__s)->source_file, DON(__obj), MB_FUNC_ERR, __exit, __result); \
} else { \ } else { \
(__s)->jump_set |= _JMP_INS; \ (__s)->jump_set |= _JMP_INS; \
} \ } \
@ -1199,7 +1178,7 @@ static _object_t* _exp_assign = 0;
#define _using_jump_set_of_structured(__s, __obj, __exit, __result) \ #define _using_jump_set_of_structured(__s, __obj, __exit, __result) \
do { \ do { \
if((__s)->jump_set & (~_JMP_STR)) { \ if((__s)->jump_set & (~_JMP_STR)) { \
_handle_error_on_obj(__s, SE_RN_DO_NOT_MIX_INSTRUCTIONAL_AND_STRUCTURED, (__s)->source_file, DON(__obj), MB_FUNC_ERR, __exit, __result); \ _handle_error_on_obj(__s, SE_RN_CANNOT_MIX_INSTRUCTIONAL_AND_STRUCTURED, (__s)->source_file, DON(__obj), MB_FUNC_ERR, __exit, __result); \
} else { \ } else { \
(__s)->jump_set |= _JMP_STR; \ (__s)->jump_set |= _JMP_STR; \
} \ } \
@ -4139,7 +4118,7 @@ _var:
break; break;
case ' ': case ' ':
_handle_error_on_obj(s, SE_RN_INVALID_OPERATION_USAGE, s->source_file, errn ? DON(errn) : DON(ast), MB_FUNC_ERR, _error, result); _handle_error_on_obj(s, SE_RN_OPERATION_FAILED, s->source_file, errn ? DON(errn) : DON(ast), MB_FUNC_ERR, _error, result);
break; break;
} }
@ -4152,7 +4131,7 @@ _var:
c = (_object_t*)(_ls_popback(opnd)); c = (_object_t*)(_ls_popback(opnd));
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_UNEXPECTED_TYPE, s->source_file, DON(ast), MB_FUNC_ERR, _error, result);
} }
#ifdef MB_PREFER_SPEED #ifdef MB_PREFER_SPEED
if(ast && ast->prev == *l) { if(ast && ast->prev == *l) {
@ -4309,7 +4288,7 @@ static int _proc_args(mb_interpreter_t* s, _ls_node_t** l, _running_context_t* r
mb_check(_pop_arg(s, l, va, ca, &ia, r, pop_arg, args, &arg)); mb_check(_pop_arg(s, l, va, ca, &ia, r, pop_arg, args, &arg));
#ifdef MB_ENABLE_COLLECTION_LIB #ifdef MB_ENABLE_COLLECTION_LIB
if(_try_purge_it(s, &arg, 0)) { if(_try_purge_it(s, &arg, 0)) {
_handle_error_on_obj(s, SE_RN_INVALID_ITERATOR_USAGE, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ITERATOR, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
#endif /* MB_ENABLE_COLLECTION_LIB */ #endif /* MB_ENABLE_COLLECTION_LIB */
} }
@ -4516,7 +4495,7 @@ static int _eval_script_routine(mb_interpreter_t* s, _ls_node_t** l, mb_value_t*
break; break;
} }
if(result == MB_FUNC_SUSPEND) { if(result == MB_FUNC_SUSPEND) {
_handle_error_now(s, SE_RN_DO_NOT_SUSPEND_IN_A_ROUTINE, s->last_error_file, result); _handle_error_now(s, SE_RN_CANNOT_SUSPEND_HERE, s->last_error_file, result);
goto _exit; goto _exit;
} }
@ -4627,7 +4606,7 @@ static int _eval_lambda_routine(mb_interpreter_t* s, _ls_node_t** l, mb_value_t*
break; break;
} }
if(result == MB_FUNC_SUSPEND) { if(result == MB_FUNC_SUSPEND) {
_handle_error_now(s, SE_RN_DO_NOT_SUSPEND_IN_A_ROUTINE, s->last_error_file, result); _handle_error_now(s, SE_RN_CANNOT_SUSPEND_HERE, s->last_error_file, result);
goto _exit; goto _exit;
} }
@ -5328,7 +5307,7 @@ static int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object
} else { } else {
#ifdef MB_ENABLE_CLASS #ifdef MB_ENABLE_CLASS
if(strcmp(sym, _CLASS_ME) == 0) { if(strcmp(sym, _CLASS_ME) == 0) {
_handle_error_now(s, SE_RN_CANNOT_CHANGE_ME, s->source_file, MB_FUNC_ERR); _handle_error_now(s, SE_RN_INVALID_ID_USAGE, s->source_file, MB_FUNC_ERR);
(*obj)->is_ref = true; (*obj)->is_ref = true;
*delsym = true; *delsym = true;
@ -6222,7 +6201,7 @@ static _ref_count_t _ref(_ref_t* ref, void* data) {
if(before > *ref->count) { if(before > *ref->count) {
mb_assert(0 && "Too many referencing, count overflow, please redefine _ref_count_t."); mb_assert(0 && "Too many referencing, count overflow, please redefine _ref_count_t.");
_handle_error_now(ref->s, SE_RN_REFERENCE_COUNT_OVERFLOW, ref->s->last_error_file, MB_FUNC_ERR); _handle_error_now(ref->s, SE_RN_OVERFLOW, ref->s->last_error_file, MB_FUNC_ERR);
} }
return *ref->count; return *ref->count;
@ -6263,7 +6242,7 @@ static _ref_count_t _weak_ref(_ref_t* ref, void* data, _ref_t* weak) {
if(before > *ref->weak_count) { if(before > *ref->weak_count) {
mb_assert(0 && "Too many referencing, weak count overflow, please redefine _ref_count_t."); mb_assert(0 && "Too many referencing, weak count overflow, please redefine _ref_count_t.");
_handle_error_now(ref->s, SE_RN_WEAK_REFERENCE_COUNT_OVERFLOW, ref->s->last_error_file, MB_FUNC_ERR); _handle_error_now(ref->s, SE_RN_OVERFLOW, ref->s->last_error_file, MB_FUNC_ERR);
} }
memcpy(weak, ref, sizeof(_ref_t)); memcpy(weak, ref, sizeof(_ref_t));
@ -7139,7 +7118,7 @@ static int _get_array_index(mb_interpreter_t* s, _ls_node_t** l, _object_t* c, u
if(!c && ast && _is_array(ast->data)) if(!c && ast && _is_array(ast->data))
c = (_object_t*)ast->data; c = (_object_t*)ast->data;
if(!_is_array(c)) { if(!_is_array(c)) {
_handle_error_on_obj(s, SE_RN_ARRAY_IDENTIFIER_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
} }
if(((_object_t*)c)->type == _DT_ARRAY) if(((_object_t*)c)->type == _DT_ARRAY)
arr = (_object_t*)c; arr = (_object_t*)c;
@ -7162,7 +7141,7 @@ static int _get_array_index(mb_interpreter_t* s, _ls_node_t** l, _object_t* c, u
ast = ast->next; ast = ast->next;
/* Array subscript */ /* Array subscript */
if(!ast->next) { if(!ast->next) {
_handle_error_on_obj(s, SE_RN_ARRAY_SUBSCRIPT_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
} }
ast = ast->next; ast = ast->next;
while(((_object_t*)ast->data)->type != _DT_FUNC || ((_object_t*)ast->data)->data.func->pointer != _core_close_bracket) { while(((_object_t*)ast->data)->type != _DT_FUNC || ((_object_t*)ast->data)->data.func->pointer != _core_close_bracket) {
@ -7172,13 +7151,13 @@ static int _get_array_index(mb_interpreter_t* s, _ls_node_t** l, _object_t* c, u
goto _exit; goto _exit;
len = subscript_ptr; len = subscript_ptr;
if(!_try_get_value(len, &val, _DT_INT)) { if(!_try_get_value(len, &val, _DT_INT)) {
_handle_error_on_obj(s, SE_RN_TYPE_NOT_MATCH, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_UNEXPECTED_TYPE, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
} }
if(val.integer < 0) { if(val.integer < 0) {
_handle_error_on_obj(s, SE_RN_ILLEGAL_BOUND, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INDEX_OUT_OF_BOUND, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
} }
if(dcount + 1 > arr->data.array->dimension_count) { if(dcount + 1 > arr->data.array->dimension_count) {
_handle_error_on_obj(s, SE_RN_DIMENSION_COUNT_OUT_OF_BOUND, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_TOO_MANY_DIMENSIONS, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
} }
if((unsigned)val.integer >= arr->data.array->dimensions[dcount]) { if((unsigned)val.integer >= arr->data.array->dimensions[dcount]) {
_handle_error_on_obj(s, SE_RN_INDEX_OUT_OF_BOUND, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INDEX_OUT_OF_BOUND, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
@ -8271,7 +8250,7 @@ static bool_t _link_meta_class(mb_interpreter_t* s, _class_t* derived, _class_t*
mb_assert(s && derived && base); mb_assert(s && derived && base);
if(_ls_find(derived->meta_list, base, (_ls_compare_t)_ht_cmp_intptr, 0)) { if(_ls_find(derived->meta_list, base, (_ls_compare_t)_ht_cmp_intptr, 0)) {
_handle_error_now(s, SE_RN_WRONG_META_CLASS, s->source_file, MB_FUNC_ERR); _handle_error_now(s, SE_RN_INVALID_CLASS, s->source_file, MB_FUNC_ERR);
return false; return false;
} }
@ -8637,7 +8616,7 @@ static int _begin_routine(mb_interpreter_t* s) {
if(before > context->routine_state) { if(before > context->routine_state) {
context->routine_state--; context->routine_state--;
result = MB_FUNC_ERR; result = MB_FUNC_ERR;
_handle_error_now(s, SE_RN_TOO_MANY_ROUTINES, s->last_error_file, result); _handle_error_now(s, SE_RN_INVALID_ROUTINE, s->last_error_file, result);
} }
return result; return result;
@ -11413,7 +11392,7 @@ static int _skip_if_chunk(mb_interpreter_t* s, _ls_node_t** l) {
if(_skip_single_line_struct(&ast, _core_then)) if(_skip_single_line_struct(&ast, _core_then))
continue; continue;
if(++nested > sizeof(mask) * 8) { if(++nested > sizeof(mask) * 8) {
_handle_error_on_obj(s, SE_RN_NESTED_TOO_DEEP, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_NESTED_TOO_MUCH, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
} else if(ast && nested && _IS_FUNC((_object_t*)ast->data, _core_then)) { } else if(ast && nested && _IS_FUNC((_object_t*)ast->data, _core_then)) {
if(!(ast && ast->next && _IS_EOS(ast->next->data))) if(!(ast && ast->next && _IS_EOS(ast->next->data)))
@ -12315,7 +12294,7 @@ int mb_begin_module(struct mb_interpreter_t* s, const char* n) {
#ifdef MB_ENABLE_MODULE #ifdef MB_ENABLE_MODULE
if(s->with_module) { if(s->with_module) {
_handle_error_on_obj(s, SE_RN_MODULE_NOT_MATCH, s->source_file, (_object_t*)0, MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_PS_INVALID_MODULE, s->source_file, (_object_t*)0, MB_FUNC_ERR, _exit, result);
} else { } else {
s->with_module = mb_strdup(n, strlen(n) + 1); s->with_module = mb_strdup(n, strlen(n) + 1);
} }
@ -12341,7 +12320,7 @@ int mb_end_module(struct mb_interpreter_t* s) {
if(s->with_module) { if(s->with_module) {
safe_free(s->with_module); safe_free(s->with_module);
} else { } else {
_handle_error_on_obj(s, SE_RN_MODULE_NOT_MATCH, s->source_file, (_object_t*)0, MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_PS_INVALID_MODULE, s->source_file, (_object_t*)0, MB_FUNC_ERR, _exit, result);
} }
#else /* MB_ENABLE_MODULE */ #else /* MB_ENABLE_MODULE */
@ -13194,7 +13173,7 @@ int mb_init_array(struct mb_interpreter_t* s, void** l, mb_data_e t, int* d, int
for(j = 0; j < c; j++) { for(j = 0; j < c; j++) {
n = d[j]; n = d[j];
if(n <= 0) { if(n <= 0) {
_handle_error_on_obj(s, SE_RN_ILLEGAL_BOUND, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INDEX_OUT_OF_BOUND, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
} }
@ -13204,7 +13183,7 @@ int mb_init_array(struct mb_interpreter_t* s, void** l, mb_data_e t, int* d, int
} else if(t == MB_DT_STRING) { } else if(t == MB_DT_STRING) {
type = _DT_STRING; type = _DT_STRING;
} else { } else {
_handle_error_on_obj(s, SE_RN_COMPLEX_ARRAY_REQUIRED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_UNEXPECTED_TYPE, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
#else /* MB_SIMPLE_ARRAY */ #else /* MB_SIMPLE_ARRAY */
mb_unrefvar(t); mb_unrefvar(t);
@ -13269,7 +13248,7 @@ int mb_get_array_elem(struct mb_interpreter_t* s, void** l, void* a, int* d, int
arr = (_array_t*)a; arr = (_array_t*)a;
if(c < 0 || c > arr->dimension_count) { if(c < 0 || c > arr->dimension_count) {
_handle_error_on_obj(s, SE_RN_DIMENSION_COUNT_OUT_OF_BOUND, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_TOO_MANY_DIMENSIONS, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
if(!val) if(!val)
goto _exit; goto _exit;
@ -13301,7 +13280,7 @@ int mb_set_array_elem(struct mb_interpreter_t* s, void** l, void* a, int* d, int
arr = (_array_t*)a; arr = (_array_t*)a;
if(c < 0 || c > arr->dimension_count) { if(c < 0 || c > arr->dimension_count) {
_handle_error_on_obj(s, SE_RN_DIMENSION_COUNT_OUT_OF_BOUND, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_TOO_MANY_DIMENSIONS, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
index = _get_array_pos(s, arr, d, c); index = _get_array_pos(s, arr, d, c);
@ -13653,7 +13632,7 @@ int mb_get_ref_value(struct mb_interpreter_t* s, void** l, mb_value_t val, void*
} }
if(val.type != MB_DT_USERTYPE_REF) { if(val.type != MB_DT_USERTYPE_REF) {
_handle_error_on_obj(s, SE_RN_TYPE_NOT_MATCH, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_UNEXPECTED_TYPE, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
if(out) { if(out) {
@ -13776,7 +13755,7 @@ int mb_set_alive_checker_of_value(struct mb_interpreter_t* s, void** l, mb_value
} }
if(val.type != MB_DT_USERTYPE_REF) { if(val.type != MB_DT_USERTYPE_REF) {
_handle_error_on_obj(s, SE_RN_REFERENCED_USERTYPE_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_REFERENCED_TYPE_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
_MAKE_NIL(&obj); _MAKE_NIL(&obj);
@ -14153,7 +14132,7 @@ int mb_run(struct mb_interpreter_t* s, bool_t clear_parser) {
if(s->parsing_context->routine_state) { if(s->parsing_context->routine_state) {
s->parsing_context->routine_state = 0; 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_STRUCTURE, s->source_file, result);
_tidy_scope_chain(s); _tidy_scope_chain(s);
goto _exit; goto _exit;
@ -14162,7 +14141,7 @@ int mb_run(struct mb_interpreter_t* s, bool_t clear_parser) {
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; 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_STRUCTURE, s->source_file, result);
_tidy_scope_chain(s); _tidy_scope_chain(s);
goto _exit; goto _exit;
@ -14297,7 +14276,7 @@ int mb_debug_get(struct mb_interpreter_t* s, const char* n, mb_value_t* val) {
if(val) { if(val) {
mb_make_nil(*val); mb_make_nil(*val);
} }
_handle_error_on_obj(s, SE_RN_DEBUG_ID_NOT_FOUND, s->source_file, (_object_t*)0, MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, (_object_t*)0, MB_FUNC_ERR, _exit, result);
} }
_exit: _exit:
@ -14325,7 +14304,7 @@ int mb_debug_set(struct mb_interpreter_t* s, const char* n, mb_value_t val) {
mb_assert(obj->type == _DT_VAR); mb_assert(obj->type == _DT_VAR);
result = _public_value_to_internal_object(&val, obj->data.variable->data); result = _public_value_to_internal_object(&val, obj->data.variable->data);
} else { } else {
_handle_error_on_obj(s, SE_RN_DEBUG_ID_NOT_FOUND, s->source_file, (_object_t*)0, MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, (_object_t*)0, MB_FUNC_ERR, _exit, result);
} }
_exit: _exit:
@ -14361,13 +14340,12 @@ int mb_debug_get_stack_trace(struct mb_interpreter_t* s, void** l, char** fs, un
_exit: _exit:
return result; return result;
#else /* MB_ENABLE_STACK_TRACE */ #else /* MB_ENABLE_STACK_TRACE */
int result = MB_FUNC_OK; int result = MB_FUNC_ERR;
mb_unrefvar(s);
mb_unrefvar(l);
mb_unrefvar(fs); mb_unrefvar(fs);
mb_unrefvar(fc); mb_unrefvar(fc);
_handle_error_on_obj(s, SE_RN_STACK_TRACE_DISABLED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
_exit:
return result; return result;
#endif /* MB_ENABLE_STACK_TRACE */ #endif /* MB_ENABLE_STACK_TRACE */
} }
@ -14749,7 +14727,7 @@ static int _core_mod(mb_interpreter_t* s, void** l) {
mb_assert(s && l); mb_assert(s && l);
_proc_div_by_zero(s, l, _exit, result, SE_RN_MOD_BY_ZERO); _proc_div_by_zero(s, l, _exit, result, SE_RN_DIVIDE_BY_ZERO);
_instruct_int_op_int(%, l); _instruct_int_op_int(%, l);
_exit: _exit:
@ -15258,7 +15236,7 @@ static int _core_let(mb_interpreter_t* s, void** l) {
goto _exit; goto _exit;
} else if(obj->type == _DT_VAR) { } else if(obj->type == _DT_VAR) {
if(_IS_ME(obj->data.variable)) { if(_IS_ME(obj->data.variable)) {
_handle_error_on_obj(s, SE_RN_CANNOT_CHANGE_ME, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
} else { } else {
evar = obj->data.variable; evar = obj->data.variable;
var = _search_var_in_scope_chain(s, obj->data.variable); var = _search_var_in_scope_chain(s, obj->data.variable);
@ -15271,7 +15249,7 @@ static int _core_let(mb_interpreter_t* s, void** l) {
} }
} }
} else { } else {
_handle_error_on_obj(s, SE_RN_VAR_OR_ARRAY_EXPECTED, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
} }
ast = ast->next; ast = ast->next;
@ -15476,7 +15454,7 @@ static int _core_dim(mb_interpreter_t* s, void** l) {
/* Array name */ /* Array name */
ast = (_ls_node_t*)*l; ast = (_ls_node_t*)*l;
if(!ast->next || ((_object_t*)ast->next->data)->type != _DT_ARRAY) { if(!ast->next || ((_object_t*)ast->next->data)->type != _DT_ARRAY) {
_handle_error_on_obj(s, SE_RN_ARRAY_IDENTIFIER_EXPECTED, s->source_file, (ast && ast->next) ? ((_object_t*)ast->next->data) : 0, MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, (ast && ast->next) ? ((_object_t*)ast->next->data) : 0, MB_FUNC_ERR, _exit, result);
} }
ast = ast->next; ast = ast->next;
arr = (_object_t*)ast->data; arr = (_object_t*)ast->data;
@ -15490,17 +15468,17 @@ static int _core_dim(mb_interpreter_t* s, void** l) {
ast = ast->next; ast = ast->next;
/* Array subscript */ /* Array subscript */
if(!ast->next) { if(!ast->next) {
_handle_error_on_obj(s, SE_RN_ARRAY_SUBSCRIPT_EXPECTED, s->source_file, (ast && ast->next) ? ((_object_t*)ast->next->data) : 0, MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ID_USAGE, s->source_file, (ast && ast->next) ? ((_object_t*)ast->next->data) : 0, MB_FUNC_ERR, _exit, result);
} }
ast = ast->next; ast = ast->next;
while(((_object_t*)ast->data)->type != _DT_FUNC || ((_object_t*)ast->data)->data.func->pointer != _core_close_bracket) { while(((_object_t*)ast->data)->type != _DT_FUNC || ((_object_t*)ast->data)->data.func->pointer != _core_close_bracket) {
/* Get an integer value */ /* Get an integer value */
len = (_object_t*)ast->data; len = (_object_t*)ast->data;
if(!_try_get_value(len, &val, _DT_INT)) { if(!_try_get_value(len, &val, _DT_INT)) {
_handle_error_on_obj(s, SE_RN_TYPE_NOT_MATCH, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_UNEXPECTED_TYPE, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
} }
if(val.integer <= 0) { if(val.integer <= 0) {
_handle_error_on_obj(s, SE_RN_ILLEGAL_BOUND, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INDEX_OUT_OF_BOUND, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
} }
if(dummy.dimension_count >= MB_MAX_DIMENSION_COUNT) { if(dummy.dimension_count >= MB_MAX_DIMENSION_COUNT) {
_handle_error_on_obj(s, SE_RN_TOO_MANY_DIMENSIONS, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_TOO_MANY_DIMENSIONS, s->source_file, DON(ast), MB_FUNC_ERR, _exit, result);
@ -16445,7 +16423,7 @@ static int _core_class(mb_interpreter_t* s, void** l) {
/* Search for meta functions */ /* Search for meta functions */
if(_search_class_hash_and_compare_functions(s, instance) != MB_FUNC_OK) { if(_search_class_hash_and_compare_functions(s, instance) != MB_FUNC_OK) {
_handle_error_on_obj(s, SE_RN_HASH_AND_COMPARE_MUST_COME_TOGETHER, s->source_file, DON(ast), MB_FUNC_WARNING, _exit, result); _handle_error_on_obj(s, SE_RN_HASH_AND_COMPARE_MUST_BE_PROVIDED_TOGETHER, s->source_file, DON(ast), MB_FUNC_WARNING, _exit, result);
} }
/* Finished */ /* Finished */
@ -17124,7 +17102,7 @@ static int _std_rnd(mb_interpreter_t* s, void** l) {
mb_check(mb_attempt_close_bracket(s, l)); mb_check(mb_attempt_close_bracket(s, l));
if(lw >= hg) { if(lw >= hg) {
_handle_error_on_obj(s, SE_RN_ILLEGAL_BOUND, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INDEX_OUT_OF_BOUND, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
rnd = (real_t)rand() / RAND_MAX * (hg - lw + (real_t)0.99999f) + lw; /* [LOW, HIGH] */ rnd = (real_t)rand() / RAND_MAX * (hg - lw + (real_t)0.99999f) + lw; /* [LOW, HIGH] */
@ -17354,7 +17332,7 @@ static int _std_asc(mb_interpreter_t* s, void** l) {
sz = (size_t)mb_uu_ischar(arg); sz = (size_t)mb_uu_ischar(arg);
if(sizeof(int_t) < sz) { if(sizeof(int_t) < sz) {
sz = sizeof(int_t); sz = sizeof(int_t);
_handle_error_on_obj(s, SE_RN_NUMBER_OVERFLOW, s->source_file, DON2(l), MB_FUNC_WARNING, _exit, result); _handle_error_on_obj(s, SE_RN_OVERFLOW, s->source_file, DON2(l), MB_FUNC_WARNING, _exit, result);
} }
memcpy(&val, arg, sz); memcpy(&val, arg, sz);
#else /* MB_ENABLE_UNICODE */ #else /* MB_ENABLE_UNICODE */
@ -17621,7 +17599,7 @@ static int _std_val(mb_interpreter_t* s, void** l) {
#ifdef MB_ENABLE_COLLECTION_LIB #ifdef MB_ENABLE_COLLECTION_LIB
ast = (_ls_node_t*)*l; ast = (_ls_node_t*)*l;
if(ast && _IS_FUNC(ast->data, _coll_iterator)) { if(ast && _IS_FUNC(ast->data, _coll_iterator)) {
_handle_error_on_obj(s, SE_RN_INVALID_ITERATOR_USAGE, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ITERATOR, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
#endif /* MB_ENABLE_COLLECTION_LIB */ #endif /* MB_ENABLE_COLLECTION_LIB */
mb_check(mb_pop_value(s, l, &arg)); mb_check(mb_pop_value(s, l, &arg));
@ -17650,7 +17628,7 @@ static int _std_val(mb_interpreter_t* s, void** l) {
case MB_DT_LIST_IT: case MB_DT_LIST_IT:
_MAKE_NIL(&ocoi); _MAKE_NIL(&ocoi);
_public_value_to_internal_object(&arg, &ocoi); _public_value_to_internal_object(&arg, &ocoi);
_handle_error_on_obj(s, SE_RN_TYPE_NOT_MATCH, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_UNEXPECTED_TYPE, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
break; break;
case MB_DT_DICT_IT: case MB_DT_DICT_IT:
@ -17667,7 +17645,7 @@ static int _std_val(mb_interpreter_t* s, void** l) {
#endif /* MB_ENABLE_COLLECTION_LIB */ #endif /* MB_ENABLE_COLLECTION_LIB */
default: default:
_assign_public_value(s, &arg, 0, true); _assign_public_value(s, &arg, 0, true);
_handle_error_on_obj(s, SE_RN_TYPE_NOT_MATCH, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_UNEXPECTED_TYPE, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
break; break;
} }
@ -18967,7 +18945,7 @@ static int _coll_move_next(mb_interpreter_t* s, void** l) {
ast = (_ls_node_t*)*l; ast = (_ls_node_t*)*l;
if(ast && _IS_FUNC(ast->data, _coll_iterator)) { if(ast && _IS_FUNC(ast->data, _coll_iterator)) {
_handle_error_on_obj(s, SE_RN_INVALID_ITERATOR_USAGE, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_INVALID_ITERATOR, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
} }
_mb_check_mark_exit(mb_pop_value(s, l, &it), result, _exit); _mb_check_mark_exit(mb_pop_value(s, l, &it), result, _exit);
os = _try_overridden(s, l, &it, _COLL_ID_MOVE_NEXT, MB_MF_COLL); os = _try_overridden(s, l, &it, _COLL_ID_MOVE_NEXT, MB_MF_COLL);
@ -19003,7 +18981,7 @@ static int _coll_move_next(mb_interpreter_t* s, void** l) {
break; break;
default: default:
_assign_public_value(s, &it, 0, true); _assign_public_value(s, &it, 0, true);
_handle_error_on_obj(s, SE_RN_ITERATOR_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_ITERABLE_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
break; break;
} }

View File

@ -403,31 +403,26 @@ typedef enum mb_error_e {
SE_PS_OPEN_FILE_FAILED, SE_PS_OPEN_FILE_FAILED,
SE_PS_SYMBOL_TOO_LONG, SE_PS_SYMBOL_TOO_LONG,
SE_PS_INVALID_CHAR, SE_PS_INVALID_CHAR,
SE_PS_INVALID_MODULE,
/** Running */ /** Running */
SE_RN_EMPTY_PROGRAM, SE_RN_EMPTY_PROGRAM,
SE_RN_PROGRAM_TOO_LONG, SE_RN_PROGRAM_TOO_LONG,
SE_RN_SYNTAX_ERROR, SE_RN_SYNTAX_ERROR,
SE_RN_OUT_OF_MEMORY, SE_RN_OUT_OF_MEMORY,
SE_RN_INVALID_DATA_TYPE, SE_RN_OVERFLOW,
SE_RN_TYPE_NOT_MATCH, SE_RN_UNEXPECTED_TYPE,
SE_RN_NUMBER_OVERFLOW,
SE_RN_INVALID_STRING, SE_RN_INVALID_STRING,
SE_RN_NUMBER_EXPECTED,
SE_RN_INTEGER_EXPECTED, SE_RN_INTEGER_EXPECTED,
SE_RN_NUMBER_EXPECTED,
SE_RN_STRING_EXPECTED, SE_RN_STRING_EXPECTED,
SE_RN_VAR_EXPECTED,
SE_RN_INDEX_OUT_OF_BOUND, SE_RN_INDEX_OUT_OF_BOUND,
SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX, SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX,
SE_RN_ILLEGAL_BOUND,
SE_RN_TOO_MANY_DIMENSIONS, SE_RN_TOO_MANY_DIMENSIONS,
SE_RN_DIMENSION_COUNT_OUT_OF_BOUND,
SE_RN_RANK_OUT_OF_BOUND, SE_RN_RANK_OUT_OF_BOUND,
SE_RN_COMPLEX_ARRAY_REQUIRED,
SE_RN_ARRAY_IDENTIFIER_EXPECTED,
SE_RN_ARRAY_SUBSCRIPT_EXPECTED,
SE_RN_VAR_EXPECTED,
SE_RN_VAR_OR_ARRAY_EXPECTED,
SE_RN_INVALID_ID_USAGE, SE_RN_INVALID_ID_USAGE,
SE_RN_DUPLICATE_ID, SE_RN_DUPLICATE_ID,
SE_RN_INCOMPLETE_STRUCTURE,
SE_RN_LABEL_NOT_EXISTS, SE_RN_LABEL_NOT_EXISTS,
SE_RN_NO_RETURN_POINT, SE_RN_NO_RETURN_POINT,
SE_RN_COLON_EXPECTED, SE_RN_COLON_EXPECTED,
@ -435,11 +430,9 @@ typedef enum mb_error_e {
SE_RN_COMMA_OR_SEMICOLON_EXPECTED, SE_RN_COMMA_OR_SEMICOLON_EXPECTED,
SE_RN_OPEN_BRACKET_EXPECTED, SE_RN_OPEN_BRACKET_EXPECTED,
SE_RN_CLOSE_BRACKET_EXPECTED, SE_RN_CLOSE_BRACKET_EXPECTED,
SE_RN_NESTED_TOO_DEEP, SE_RN_NESTED_TOO_MUCH,
SE_RN_INCOMPLETE_STRUCTURE,
SE_RN_OPERATION_FAILED, SE_RN_OPERATION_FAILED,
SE_RN_OPERATOR_EXPECTED, SE_RN_OPERATOR_EXPECTED,
SE_RN_INVALID_OPERATION_USAGE,
SE_RN_ASSIGN_OPERATOR_EXPECTED, SE_RN_ASSIGN_OPERATOR_EXPECTED,
SE_RN_ELSE_EXPECTED, SE_RN_ELSE_EXPECTED,
SE_RN_ENDIF_EXPECTED, SE_RN_ENDIF_EXPECTED,
@ -451,38 +444,24 @@ typedef enum mb_error_e {
SE_RN_CALCULATION_ERROR, SE_RN_CALCULATION_ERROR,
SE_RN_INVALID_EXPRESSION, SE_RN_INVALID_EXPRESSION,
SE_RN_DIVIDE_BY_ZERO, SE_RN_DIVIDE_BY_ZERO,
SE_RN_MOD_BY_ZERO,
SE_RN_MODULE_NOT_MATCH,
SE_RN_WRONG_FUNCTION_REACHED, SE_RN_WRONG_FUNCTION_REACHED,
SE_RN_DO_NOT_SUSPEND_IN_A_ROUTINE, SE_RN_CANNOT_SUSPEND_HERE,
SE_RN_DO_NOT_MIX_INSTRUCTIONAL_AND_STRUCTURED, SE_RN_CANNOT_MIX_INSTRUCTIONAL_AND_STRUCTURED,
SE_RN_INVALID_ROUTINE, SE_RN_INVALID_ROUTINE,
SE_RN_INCOMPLETE_ROUTINE,
SE_RN_ROUTINE_EXPECTED, SE_RN_ROUTINE_EXPECTED,
SE_RN_DUPLICATE_ROUTINE, SE_RN_DUPLICATE_ROUTINE,
SE_RN_TOO_MANY_ROUTINES,
SE_RN_INVALID_CLASS, SE_RN_INVALID_CLASS,
SE_RN_INCOMPLETE_CLASS,
SE_RN_CLASS_EXPECTED, SE_RN_CLASS_EXPECTED,
SE_RN_DUPLICATE_CLASS, SE_RN_DUPLICATE_CLASS,
SE_RN_WRONG_META_CLASS, SE_RN_HASH_AND_COMPARE_MUST_BE_PROVIDED_TOGETHER,
SE_RN_HASH_AND_COMPARE_MUST_COME_TOGETHER,
SE_RN_CANNOT_CHANGE_ME,
SE_RN_INVALID_LAMBDA, SE_RN_INVALID_LAMBDA,
SE_RN_EMPTY_COLLECTION, SE_RN_EMPTY_COLLECTION,
SE_RN_LIST_EXPECTED, SE_RN_LIST_EXPECTED,
SE_RN_INVALID_ITERATOR,
SE_RN_ITERABLE_EXPECTED,
SE_RN_COLLECTION_EXPECTED, SE_RN_COLLECTION_EXPECTED,
SE_RN_COLLECTION_OR_ITERATOR_EXPECTED, SE_RN_COLLECTION_OR_ITERATOR_EXPECTED,
SE_RN_ITERATOR_EXPECTED,
SE_RN_INVALID_ITERATOR,
SE_RN_INVALID_ITERATOR_USAGE,
SE_RN_ITERABLE_EXPECTED,
SE_RN_REFERENCED_USERTYPE_EXPECTED,
SE_RN_REFERENCED_TYPE_EXPECTED, SE_RN_REFERENCED_TYPE_EXPECTED,
SE_RN_REFERENCE_COUNT_OVERFLOW,
SE_RN_WEAK_REFERENCE_COUNT_OVERFLOW,
SE_RN_DEBUG_ID_NOT_FOUND,
SE_RN_STACK_TRACE_DISABLED,
/** Extended abort */ /** Extended abort */
SE_EA_EXTENDED_ABORT, SE_EA_EXTENDED_ABORT,
/** Extra */ /** Extra */