+added dot symbol accessing of functions for referenced usertype.
This commit is contained in:
parent
9068895924
commit
1af1ecb5f1
3
HISTORY
3
HISTORY
@ -1,3 +1,6 @@
|
|||||||
|
Jan. 7 2017
|
||||||
|
Added dot symbol accessing of functions for referenced usertype
|
||||||
|
|
||||||
Dec. 2 2016
|
Dec. 2 2016
|
||||||
Fixed a case sensitive issue with the IMPORT statement (for module), thanks to wwiv for pointing it out
|
Fixed a case sensitive issue with the IMPORT statement (for module), thanks to wwiv for pointing it out
|
||||||
|
|
||||||
|
@ -816,6 +816,9 @@ typedef struct mb_interpreter_t {
|
|||||||
_parsing_context_t* parsing_context;
|
_parsing_context_t* parsing_context;
|
||||||
_running_context_t* running_context;
|
_running_context_t* running_context;
|
||||||
_ls_node_t* var_args;
|
_ls_node_t* var_args;
|
||||||
|
#ifdef MB_ENABLE_USERTYPE_REF
|
||||||
|
_object_t* usertype_ref_ahead;
|
||||||
|
#endif /* MB_ENABLE_USERTYPE_REF */
|
||||||
unsigned char jump_set;
|
unsigned char jump_set;
|
||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
_class_t* last_instance;
|
_class_t* last_instance;
|
||||||
@ -8834,6 +8837,10 @@ static _ls_node_t* _search_identifier_accessor(mb_interpreter_t* s, _running_con
|
|||||||
return 0;
|
return 0;
|
||||||
switch(obj->type) {
|
switch(obj->type) {
|
||||||
case _DT_VAR:
|
case _DT_VAR:
|
||||||
|
#ifdef MB_ENABLE_USERTYPE_REF
|
||||||
|
if(obj->data.variable->data->type == _DT_USERTYPE_REF)
|
||||||
|
return result;
|
||||||
|
#endif /* MB_ENABLE_USERTYPE_REF */
|
||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
if(obj->data.variable->data->type == _DT_CLASS)
|
if(obj->data.variable->data->type == _DT_CLASS)
|
||||||
instance = obj->data.variable->data->data.instance;
|
instance = obj->data.variable->data->data.instance;
|
||||||
@ -9984,6 +9991,30 @@ _retry:
|
|||||||
if(pathed && pathed->data) {
|
if(pathed && pathed->data) {
|
||||||
if(obj != (_object_t*)pathed->data) {
|
if(obj != (_object_t*)pathed->data) {
|
||||||
/* Found another node */
|
/* Found another node */
|
||||||
|
#ifdef MB_ENABLE_USERTYPE_REF
|
||||||
|
_object_t* tmp = (_object_t*)pathed->data;
|
||||||
|
if(tmp && tmp->type == _DT_VAR && tmp->data.variable->data->type == _DT_USERTYPE_REF) {
|
||||||
|
bool_t mod = false;
|
||||||
|
_ls_node_t* fn = 0;
|
||||||
|
mb_func_t func = 0;
|
||||||
|
char* r = strrchr(obj->data.variable->name, '.');
|
||||||
|
if(r) ++r;
|
||||||
|
fn = _find_func(s, r, &mod);
|
||||||
|
if(fn && fn->data) {
|
||||||
|
func = (mb_func_t)(intptr_t)fn->data;
|
||||||
|
s->usertype_ref_ahead = (_object_t*)pathed->data;
|
||||||
|
#ifdef MB_ENABLE_STACK_TRACE
|
||||||
|
_ls_pushback(s->stack_frames, r);
|
||||||
|
#endif /* MB_ENABLE_STACK_TRACE */
|
||||||
|
result = (func)(s, (void**)&ast);
|
||||||
|
#ifdef MB_ENABLE_STACK_TRACE
|
||||||
|
_ls_popback(s->stack_frames);
|
||||||
|
#endif /* MB_ENABLE_STACK_TRACE */
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* MB_ENABLE_USERTYPE_REF */
|
||||||
obj = (_object_t*)pathed->data;
|
obj = (_object_t*)pathed->data;
|
||||||
|
|
||||||
goto _retry;
|
goto _retry;
|
||||||
@ -11407,11 +11438,23 @@ int mb_pop_value(struct mb_interpreter_t* s, void** l, mb_value_t* val) {
|
|||||||
val_ptr = &val_obj;
|
val_ptr = &val_obj;
|
||||||
_MAKE_NIL(val_ptr);
|
_MAKE_NIL(val_ptr);
|
||||||
|
|
||||||
|
#ifdef MB_ENABLE_USERTYPE_REF
|
||||||
|
if(s->usertype_ref_ahead) {
|
||||||
|
ast = (_ls_node_t*)*l;
|
||||||
|
memcpy(val_ptr, s->usertype_ref_ahead, sizeof(_object_t));
|
||||||
|
s->usertype_ref_ahead = 0;
|
||||||
|
|
||||||
|
goto _got;
|
||||||
|
}
|
||||||
|
#endif /* MB_ENABLE_USERTYPE_REF */
|
||||||
ast = (_ls_node_t*)*l;
|
ast = (_ls_node_t*)*l;
|
||||||
result = _calc_expression(s, &ast, &val_ptr);
|
result = _calc_expression(s, &ast, &val_ptr);
|
||||||
if(result != MB_FUNC_OK)
|
if(result != MB_FUNC_OK)
|
||||||
goto _exit;
|
goto _exit;
|
||||||
|
|
||||||
|
#ifdef MB_ENABLE_USERTYPE_REF
|
||||||
|
_got:
|
||||||
|
#endif /* MB_ENABLE_USERTYPE_REF */
|
||||||
if(val_ptr->type == _DT_STRING && !val_ptr->ref) {
|
if(val_ptr->type == _DT_STRING && !val_ptr->ref) {
|
||||||
_destroy_edge_objects(s);
|
_destroy_edge_objects(s);
|
||||||
_mark_edge_destroy_string(s, val_ptr->data.string);
|
_mark_edge_destroy_string(s, val_ptr->data.string);
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user