+added an error type; *optimized expression calculation; *refactored code.

This commit is contained in:
paladin-t 2016-05-13 10:18:27 +08:00
parent 0cc549d870
commit 6634864eda
3 changed files with 83 additions and 74 deletions

View File

@ -1,3 +1,6 @@
May. 13 2016
Added an error type
May. 5 2016 May. 5 2016
Fixed a column counting bug with UTF8 Fixed a column counting bug with UTF8

View File

@ -280,6 +280,7 @@ static const char* _ERR_DESC[] = {
"Collection expected", "Collection expected",
"Iterator expected", "Iterator expected",
"Collection or iterator expected", "Collection or iterator expected",
"Collection or iterator or class expected",
"Invalid iterator", "Invalid iterator",
"Empty collection", "Empty collection",
"Referenced type expected", "Referenced type expected",
@ -1865,6 +1866,7 @@ static int _std_str(mb_interpreter_t* s, void** l);
static int _std_val(mb_interpreter_t* s, void** l); static int _std_val(mb_interpreter_t* s, void** l);
static int _std_len(mb_interpreter_t* s, void** l); static int _std_len(mb_interpreter_t* s, void** l);
static int _std_get(mb_interpreter_t* s, void** l); static int _std_get(mb_interpreter_t* s, void** l);
static int _std_set(mb_interpreter_t* s, void** l);
static int _std_print(mb_interpreter_t* s, void** l); static int _std_print(mb_interpreter_t* s, void** l);
static int _std_input(mb_interpreter_t* s, void** l); static int _std_input(mb_interpreter_t* s, void** l);
@ -1880,7 +1882,6 @@ static int _coll_insert(mb_interpreter_t* s, void** l);
static int _coll_sort(mb_interpreter_t* s, void** l); static int _coll_sort(mb_interpreter_t* s, void** l);
static int _coll_exist(mb_interpreter_t* s, void** l); static int _coll_exist(mb_interpreter_t* s, void** l);
static int _coll_index_of(mb_interpreter_t* s, void** l); static int _coll_index_of(mb_interpreter_t* s, void** l);
static int _coll_set(mb_interpreter_t* s, void** l);
static int _coll_remove(mb_interpreter_t* s, void** l); static int _coll_remove(mb_interpreter_t* s, void** l);
static int _coll_clear(mb_interpreter_t* s, void** l); static int _coll_clear(mb_interpreter_t* s, void** l);
static int _coll_clone(mb_interpreter_t* s, void** l); static int _coll_clone(mb_interpreter_t* s, void** l);
@ -1997,6 +1998,7 @@ static const _func_t _std_libs[] = {
{ "LEN", _std_len }, { "LEN", _std_len },
{ "GET", _std_get }, { "GET", _std_get },
{ "SET", _std_set },
{ "PRINT", _std_print }, { "PRINT", _std_print },
{ "INPUT", _std_input } { "INPUT", _std_input }
@ -2013,7 +2015,6 @@ static const _func_t _coll_libs[] = {
{ "SORT", _coll_sort }, { "SORT", _coll_sort },
{ "EXIST", _coll_exist }, { "EXIST", _coll_exist },
{ "INDEX_OF", _coll_index_of }, { "INDEX_OF", _coll_index_of },
{ "SET", _coll_set },
{ "REMOVE", _coll_remove }, { "REMOVE", _coll_remove },
{ "CLEAR", _coll_clear }, { "CLEAR", _coll_clear },
{ "CLONE", _coll_clone }, { "CLONE", _coll_clone },
@ -3297,15 +3298,15 @@ static int _calc_expression(mb_interpreter_t* s, _ls_node_t** l, _object_t** val
int result = 0; int result = 0;
_ls_node_t* ast = 0; _ls_node_t* ast = 0;
_running_context_t* running = 0; _running_context_t* running = 0;
_ls_node_t* garbage = 0; register _ls_node_t* garbage = 0;
_ls_node_t* optr = 0; register _ls_node_t* optr = 0;
_ls_node_t* opnd = 0; register _ls_node_t* opnd = 0;
_object_t* c = 0; register _object_t* c = 0;
_object_t* x = 0; register _object_t* x = 0;
_object_t* a = 0; register _object_t* a = 0;
_object_t* b = 0; register _object_t* b = 0;
_object_t* r = 0; register _object_t* r = 0;
_object_t* theta = 0; register _object_t* theta = 0;
char pri = _ZERO_CHAR; char pri = _ZERO_CHAR;
int* inep = 0; int* inep = 0;
int f = 0; int f = 0;
@ -15356,7 +15357,7 @@ static int _std_get(mb_interpreter_t* s, void** l) {
break; break;
#endif /* MB_ENABLE_CLASS */ #endif /* MB_ENABLE_CLASS */
default: default:
_handle_error_on_obj(s, SE_RN_COLLECTION_OR_ITERATOR_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result); _handle_error_on_obj(s, SE_RN_COLLECTION_OR_ITERATOR_OR_CLASS_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
break; break;
} }
@ -15371,6 +15372,72 @@ _exit:
return result; return result;
} }
/* SET statement */
static int _std_set(mb_interpreter_t* s, void** l) {
int result = MB_FUNC_OK;
mb_value_t coll;
mb_value_t key;
mb_value_t val;
_object_t ocoll;
#ifdef MB_ENABLE_COLLECTION_LIB
_object_t* oval = 0;
int_t idx = 0;
#endif /* MB_ENABLE_COLLECTION_LIB */
mb_assert(s && l);
mb_make_nil(coll);
mb_make_nil(key);
mb_make_nil(val);
mb_check(mb_attempt_open_bracket(s, l));
mb_check(mb_pop_value(s, l, &coll));
_MAKE_NIL(&ocoll);
switch(coll.type) {
#ifdef MB_ENABLE_COLLECTION_LIB
case MB_DT_LIST:
_public_value_to_internal_object(&coll, &ocoll);
while(mb_has_arg(s, l)) {
mb_make_nil(val);
mb_check(mb_pop_int(s, l, &idx));
mb_check(mb_pop_value(s, l, &val));
if(!_set_list(ocoll.data.list, idx, &val, &oval)) {
_destroy_object(oval, 0);
_handle_error_on_obj(s, SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
}
}
break;
case MB_DT_DICT:
_public_value_to_internal_object(&coll, &ocoll);
while(mb_has_arg(s, l)) {
mb_make_nil(key);
mb_make_nil(val);
mb_check(mb_pop_value(s, l, &key));
mb_check(mb_pop_value(s, l, &val));
_set_dict(ocoll.data.dict, &key, &val, 0, 0);
}
break;
#endif /* MB_ENABLE_COLLECTION_LIB */
default:
_handle_error_on_obj(s, SE_RN_COLLECTION_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
break;
}
mb_check(mb_attempt_close_bracket(s, l));
mb_check(mb_push_value(s, l, coll));
_exit:
_assign_public_value(&coll, 0);
return result;
}
/* PRINT statement */ /* PRINT statement */
static int _std_print(mb_interpreter_t* s, void** l) { static int _std_print(mb_interpreter_t* s, void** l) {
int result = MB_FUNC_OK; int result = MB_FUNC_OK;
@ -15980,68 +16047,6 @@ _exit:
return result; return result;
} }
/* SET statement */
static int _coll_set(mb_interpreter_t* s, void** l) {
int result = MB_FUNC_OK;
mb_value_t coll;
int_t idx = 0;
mb_value_t key;
mb_value_t val;
_object_t ocoll;
_object_t* oval = 0;
mb_assert(s && l);
mb_make_nil(coll);
mb_make_nil(key);
mb_make_nil(val);
mb_check(mb_attempt_open_bracket(s, l));
mb_check(mb_pop_value(s, l, &coll));
_MAKE_NIL(&ocoll);
switch(coll.type) {
case MB_DT_LIST:
_public_value_to_internal_object(&coll, &ocoll);
while(mb_has_arg(s, l)) {
mb_make_nil(val);
mb_check(mb_pop_int(s, l, &idx));
mb_check(mb_pop_value(s, l, &val));
if(!_set_list(ocoll.data.list, idx, &val, &oval)) {
_destroy_object(oval, 0);
_handle_error_on_obj(s, SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
}
}
break;
case MB_DT_DICT:
_public_value_to_internal_object(&coll, &ocoll);
while(mb_has_arg(s, l)) {
mb_make_nil(key);
mb_make_nil(val);
mb_check(mb_pop_value(s, l, &key));
mb_check(mb_pop_value(s, l, &val));
_set_dict(ocoll.data.dict, &key, &val, 0, 0);
}
break;
default:
_handle_error_on_obj(s, SE_RN_COLLECTION_EXPECTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
break;
}
mb_check(mb_attempt_close_bracket(s, l));
mb_check(mb_push_value(s, l, coll));
_exit:
_assign_public_value(&coll, 0);
return result;
}
/* REMOVE statement */ /* REMOVE statement */
static int _coll_remove(mb_interpreter_t* s, void** l) { static int _coll_remove(mb_interpreter_t* s, void** l) {
int result = MB_FUNC_OK; int result = MB_FUNC_OK;

View File

@ -413,6 +413,7 @@ typedef enum mb_error_e {
SE_RN_COLLECTION_EXPECTED, SE_RN_COLLECTION_EXPECTED,
SE_RN_ITERATOR_EXPECTED, SE_RN_ITERATOR_EXPECTED,
SE_RN_COLLECTION_OR_ITERATOR_EXPECTED, SE_RN_COLLECTION_OR_ITERATOR_EXPECTED,
SE_RN_COLLECTION_OR_ITERATOR_OR_CLASS_EXPECTED,
SE_RN_INVALID_ITERATOR, SE_RN_INVALID_ITERATOR,
SE_RN_EMPTY_COLLECTION, SE_RN_EMPTY_COLLECTION,
SE_RN_REFERENCED_TYPE_EXPECTED, SE_RN_REFERENCED_TYPE_EXPECTED,