+added an mb_init_coll function; *improved stability.

This commit is contained in:
Wang Renxin 2015-10-27 11:25:21 +08:00
parent e9bfffed36
commit 20cba0bcda

View File

@ -79,7 +79,7 @@ extern "C" {
/** Macros */ /** Macros */
#define _VER_MAJOR 1 #define _VER_MAJOR 1
#define _VER_MINOR 1 #define _VER_MINOR 1
#define _VER_REVISION 94 #define _VER_REVISION 95
#define _VER_SUFFIX #define _VER_SUFFIX
#define _MB_VERSION ((_VER_MAJOR * 0x01000000) + (_VER_MINOR * 0x00010000) + (_VER_REVISION)) #define _MB_VERSION ((_VER_MAJOR * 0x01000000) + (_VER_MINOR * 0x00010000) + (_VER_REVISION))
#define _STRINGIZE(A) _MAKE_STRINGIZE(A) #define _STRINGIZE(A) _MAKE_STRINGIZE(A)
@ -1173,6 +1173,7 @@ static void _destroy_parsing_context(_parsing_context_t** context);
static int _register_func(mb_interpreter_t* s, const char* n, mb_func_t f, bool_t local); static int _register_func(mb_interpreter_t* s, const char* n, mb_func_t f, bool_t local);
static int _remove_func(mb_interpreter_t* s, const char* n, bool_t local); static int _remove_func(mb_interpreter_t* s, const char* n, bool_t local);
static _ls_node_t* _find_func(mb_interpreter_t* s, const char* n);
static int _open_constant(mb_interpreter_t* s); static int _open_constant(mb_interpreter_t* s);
static int _close_constant(mb_interpreter_t* s); static int _close_constant(mb_interpreter_t* s);
@ -3412,7 +3413,6 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) {
char* conv_suc = 0; char* conv_suc = 0;
_parsing_context_t* context = 0; _parsing_context_t* context = 0;
_running_context_t* running = 0; _running_context_t* running = 0;
_ls_node_t* lclsyminscope = 0;
_ls_node_t* glbsyminscope = 0; _ls_node_t* glbsyminscope = 0;
size_t _sl = 0; size_t _sl = 0;
_data_e en = _DT_ANY; _data_e en = _DT_ANY;
@ -3605,9 +3605,8 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) {
goto _exit; goto _exit;
} }
} }
lclsyminscope = _ht_find(s->local_func_dict, sym); glbsyminscope = _find_func(s, sym);
glbsyminscope = _ht_find(s->global_func_dict, sym); if(glbsyminscope) {
if(lclsyminscope || glbsyminscope) {
if(context->last_symbol && context->last_symbol->type == _DT_ROUTINE) { if(context->last_symbol && context->last_symbol->type == _DT_ROUTINE) {
if(_sl == 1 && sym[0] == '(') if(_sl == 1 && sym[0] == '(')
_begin_routine_parameter_list(s); _begin_routine_parameter_list(s);
@ -3617,7 +3616,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) {
_end_routine_parameter_list(s); _end_routine_parameter_list(s);
} }
ptr = lclsyminscope ? (intptr_t)lclsyminscope->data : (intptr_t)glbsyminscope->data; ptr = (intptr_t)glbsyminscope->data;
memcpy(*value, &ptr, sizeof(intptr_t)); memcpy(*value, &ptr, sizeof(intptr_t));
result = _DT_FUNC; result = _DT_FUNC;
@ -6353,6 +6352,19 @@ int _remove_func(mb_interpreter_t* s, const char* n, bool_t local) {
return result; return result;
} }
_ls_node_t* _find_func(mb_interpreter_t* s, const char* n) {
/* Find function interface in function dictionary */
_ls_node_t* result = 0;
mb_assert(s && n);
result = _ht_find(s->local_func_dict, (void*)n);
if(!result)
result = _ht_find(s->global_func_dict, (void*)n);
return result;
}
int _open_constant(mb_interpreter_t* s) { int _open_constant(mb_interpreter_t* s) {
/* Open global constant */ /* Open global constant */
int result = MB_FUNC_OK; int result = MB_FUNC_OK;
@ -7269,6 +7281,36 @@ _exit:
return result; return result;
} }
int mb_init_coll(struct mb_interpreter_t* s, void** l, mb_value_t* coll) {
/* Initialize a collection */
int result = MB_FUNC_OK;
mb_assert(s);
#ifdef MB_ENABLE_COLLECTION_LIB
switch(coll->type) {
case MB_DT_LIST:
coll->value.list = _create_list(s);
break;
case MB_DT_DICT:
coll->value.dict = _create_dict(s);
break;
default:
_handle_error_on_obj(s, SE_RN_COLLECTION_EXPECTED, 0, TON(l), MB_FUNC_ERR, _exit, result);
break;
}
#else /* MB_ENABLE_COLLECTION_LIB */
mb_unrefvar(coll);
_handle_error_on_obj(s, SE_RN_NOT_SUPPORTED, 0, TON(l), MB_FUNC_ERR, _exit, result);
#endif /* MB_ENABLE_COLLECTION_LIB */
_exit:
return result;
}
int mb_get_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, mb_value_t idx, mb_value_t* val) { int mb_get_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, mb_value_t idx, mb_value_t* val) {
/* Get an element of a collection */ /* Get an element of a collection */
int result = MB_FUNC_OK; int result = MB_FUNC_OK;
@ -10492,6 +10534,7 @@ int _coll_peek(mb_interpreter_t* s, void** l) {
mb_value_t val; mb_value_t val;
_object_t olst; _object_t olst;
_object_t* oval = 0; _object_t* oval = 0;
_ls_node_t* node = 0;
mb_assert(s && l); mb_assert(s && l);
@ -10510,7 +10553,8 @@ int _coll_peek(mb_interpreter_t* s, void** l) {
_MAKE_NIL(&olst); _MAKE_NIL(&olst);
_public_value_to_internal_object(&lst, &olst); _public_value_to_internal_object(&lst, &olst);
oval = (_object_t*)(_ls_back(olst.data.list->list)->data); node = _ls_back(olst.data.list->list);
oval = node ? (_object_t*)(node->data) : 0;
if(oval) { if(oval) {
_internal_object_to_public_value(oval, &val); _internal_object_to_public_value(oval, &val);