*improved error handling with sub routine and class.

This commit is contained in:
paladin-t 2015-12-25 17:40:44 +08:00
parent f543e77446
commit 8d6c315de6
2 changed files with 16 additions and 1 deletions

View File

@ -1,5 +1,6 @@
Dec. 25 2015 Dec. 25 2015
Added support to put a class instance into a variable Added support to put a class instance into a variable
Improved error handling with sub routine and class
Fixed a memory leak in class definition Fixed a memory leak in class definition
Polished code Polished code

View File

@ -534,7 +534,9 @@ typedef struct _parsing_context_t {
_object_t* last_symbol; _object_t* last_symbol;
_parsing_state_e parsing_state; _parsing_state_e parsing_state;
_symbol_state_e symbol_state; _symbol_state_e symbol_state;
#ifdef MB_ENABLE_CLASS
unsigned short class_state; unsigned short class_state;
#endif /* MB_ENABLE_CLASS */
unsigned short routine_state; unsigned short routine_state;
unsigned short routine_params_state; unsigned short routine_params_state;
int parsing_pos; int parsing_pos;
@ -5500,6 +5502,9 @@ bool_t _end_class(mb_interpreter_t* s) {
mb_assert(s); mb_assert(s);
context = s->parsing_context; context = s->parsing_context;
if(context->routine_state) {
_handle_error_now(s, SE_RN_INVALID_ROUTINE, 0, MB_FUNC_ERR);
}
if(!context->class_state) { if(!context->class_state) {
_handle_error_now(s, SE_RN_INVALID_CLASS, 0, MB_FUNC_ERR); _handle_error_now(s, SE_RN_INVALID_CLASS, 0, MB_FUNC_ERR);
@ -5730,6 +5735,11 @@ bool_t _end_routine(mb_interpreter_t* s) {
mb_assert(s); mb_assert(s);
context = s->parsing_context; context = s->parsing_context;
#ifdef MB_ENABLE_CLASS
if(context->class_state) {
_handle_error_now(s, SE_RN_INVALID_CLASS, 0, MB_FUNC_ERR);
}
#endif /* MB_ENABLE_CLASS */
if(!context->routine_state) { if(!context->routine_state) {
_handle_error_now(s, SE_RN_INVALID_ROUTINE, 0, MB_FUNC_ERR); _handle_error_now(s, SE_RN_INVALID_ROUTINE, 0, MB_FUNC_ERR);
@ -5995,12 +6005,16 @@ _running_context_t* _get_scope_for_add_routine(mb_interpreter_t* s) {
/* Get a proper scope to add a routine */ /* Get a proper scope to add a routine */
_parsing_context_t* context = 0; _parsing_context_t* context = 0;
_running_context_t* running = 0; _running_context_t* running = 0;
bool_t class_state = false;
mb_assert(s); mb_assert(s);
context = s->parsing_context; context = s->parsing_context;
running = s->running_context; running = s->running_context;
if(context->class_state) { #ifdef MB_ENABLE_CLASS
class_state = context->class_state;
#endif /* MB_ENABLE_CLASS */
if(class_state) {
if(running) if(running)
running = running->prev; running = running->prev;
} else { } else {