+developing class, added accessing by identifier.
This commit is contained in:
parent
5eec0ba674
commit
f2b9bcfb88
5
HISTORY
5
HISTORY
@ -1,5 +1,8 @@
|
|||||||
|
Dec. 9 2015
|
||||||
|
Developing class, added accessing by identifier
|
||||||
|
|
||||||
Dec. 8 2015
|
Dec. 8 2015
|
||||||
Developing class, added reference, inheritance
|
Developing class, added reference struct, added meta class linking
|
||||||
Improved stability for sub routine
|
Improved stability for sub routine
|
||||||
|
|
||||||
Dec. 7 2015
|
Dec. 7 2015
|
||||||
|
@ -81,7 +81,7 @@ extern "C" {
|
|||||||
/** Macros */
|
/** Macros */
|
||||||
#define _VER_MAJOR 1
|
#define _VER_MAJOR 1
|
||||||
#define _VER_MINOR 1
|
#define _VER_MINOR 1
|
||||||
#define _VER_REVISION 103
|
#define _VER_REVISION 104
|
||||||
#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)
|
||||||
@ -1210,6 +1210,7 @@ static void _duplicate_parameter(void* data, void* extra, _running_context_t* ru
|
|||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
static _running_context_t* _reference_scope_by_class(mb_interpreter_t* s, _running_context_t* p, _class_t* c);
|
static _running_context_t* _reference_scope_by_class(mb_interpreter_t* s, _running_context_t* p, _class_t* c);
|
||||||
static _running_context_t* _push_scope_by_class(mb_interpreter_t* s, _running_context_t* p);
|
static _running_context_t* _push_scope_by_class(mb_interpreter_t* s, _running_context_t* p);
|
||||||
|
static _ls_node_t* _search_identifier_in_class(mb_interpreter_t* s, _class_t* instance, char* n);
|
||||||
#endif /* MB_ENABLE_CLASS */
|
#endif /* MB_ENABLE_CLASS */
|
||||||
static _running_context_t* _reference_scope_by_routine(mb_interpreter_t* s, _running_context_t* p, _routine_t* r);
|
static _running_context_t* _reference_scope_by_routine(mb_interpreter_t* s, _running_context_t* p, _routine_t* r);
|
||||||
static _running_context_t* _push_weak_scope_by_routine(mb_interpreter_t* s, _running_context_t* p, _routine_t* r);
|
static _running_context_t* _push_weak_scope_by_routine(mb_interpreter_t* s, _running_context_t* p, _routine_t* r);
|
||||||
@ -1219,7 +1220,8 @@ static _running_context_t* _pop_weak_scope(mb_interpreter_t* s, _running_context
|
|||||||
static _running_context_t* _pop_scope(mb_interpreter_t* s);
|
static _running_context_t* _pop_scope(mb_interpreter_t* s);
|
||||||
static _running_context_t* _find_scope(mb_interpreter_t* s, _running_context_t* p);
|
static _running_context_t* _find_scope(mb_interpreter_t* s, _running_context_t* p);
|
||||||
static _running_context_t* _get_scope_for_add_routine(mb_interpreter_t* s);
|
static _running_context_t* _get_scope_for_add_routine(mb_interpreter_t* s);
|
||||||
static _ls_node_t* _search_identifier_in_scope_chain(mb_interpreter_t* s, _running_context_t* scope, char* n, bool_t pathing);
|
static _ls_node_t* _search_identifier_accessor(mb_interpreter_t* s, _running_context_t* scope, char* n);
|
||||||
|
static _ls_node_t* _search_identifier_in_scope_chain(mb_interpreter_t* s, _running_context_t* scope, char* n, int pathing);
|
||||||
static _array_t* _search_array_in_scope_chain(mb_interpreter_t* s, _array_t* i, _object_t** o);
|
static _array_t* _search_array_in_scope_chain(mb_interpreter_t* s, _array_t* i, _object_t** o);
|
||||||
static _var_t* _search_var_in_scope_chain(mb_interpreter_t* s, _var_t* i);
|
static _var_t* _search_var_in_scope_chain(mb_interpreter_t* s, _var_t* i);
|
||||||
|
|
||||||
@ -5408,6 +5410,29 @@ _running_context_t* _push_scope_by_class(mb_interpreter_t* s, _running_context_t
|
|||||||
|
|
||||||
return s->running_context;
|
return s->running_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_ls_node_t* _search_identifier_in_class(mb_interpreter_t* s, _class_t* instance, char* n) {
|
||||||
|
/* Try to search an identifire from a class */
|
||||||
|
_ls_node_t* result = 0;
|
||||||
|
_ls_node_t* node = 0;
|
||||||
|
_class_t* meta = 0;
|
||||||
|
|
||||||
|
mb_assert(s && instance && n);
|
||||||
|
|
||||||
|
result = _search_identifier_in_scope_chain(s, instance->scope, n, 0);
|
||||||
|
|
||||||
|
if(!result) {
|
||||||
|
node = instance->meta_list ? instance->meta_list->next : 0;
|
||||||
|
while(node) {
|
||||||
|
meta = (_class_t*)node->data;
|
||||||
|
result = _search_identifier_in_class(s, meta, n);
|
||||||
|
if(result) break;
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
#endif /* MB_ENABLE_CLASS */
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
|
||||||
_running_context_t* _reference_scope_by_routine(mb_interpreter_t* s, _running_context_t* p, _routine_t* r) {
|
_running_context_t* _reference_scope_by_routine(mb_interpreter_t* s, _running_context_t* p, _routine_t* r) {
|
||||||
@ -5533,14 +5558,79 @@ _running_context_t* _get_scope_for_add_routine(mb_interpreter_t* s) {
|
|||||||
return running;
|
return running;
|
||||||
}
|
}
|
||||||
|
|
||||||
_ls_node_t* _search_identifier_in_scope_chain(mb_interpreter_t* s, _running_context_t* scope, char* n, bool_t pathing) {
|
_ls_node_t* _search_identifier_accessor(mb_interpreter_t* s, _running_context_t* scope, char* n) {
|
||||||
|
/* Try to search an identifier accessor in a scope */
|
||||||
|
_ls_node_t* result = 0;
|
||||||
|
_object_t* obj = 0;
|
||||||
|
char acc[_SINGLE_SYMBOL_MAX_LENGTH];
|
||||||
|
int i = 0;
|
||||||
|
int j = 0;
|
||||||
|
#ifdef MB_ENABLE_CLASS
|
||||||
|
_class_t* instance = 0;
|
||||||
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
|
||||||
|
mb_assert(s && n);
|
||||||
|
|
||||||
|
while((i == 0) || (i > 0 && n[i - 1])) {
|
||||||
|
acc[j] = n[i];
|
||||||
|
if(_is_accessor(acc[j]) || acc[j] == '\0') {
|
||||||
|
acc[j] = '\0';
|
||||||
|
#ifdef MB_ENABLE_CLASS
|
||||||
|
if(instance)
|
||||||
|
result = _search_identifier_in_class(s, instance, acc);
|
||||||
|
else
|
||||||
|
result = _search_identifier_in_scope_chain(s, scope, acc, 0);
|
||||||
|
#else /* MB_ENABLE_CLASS */
|
||||||
|
result = _search_identifier_in_scope_chain(s, scope, acc, 0);
|
||||||
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
if(!result) return 0;
|
||||||
|
obj = (_object_t*)result->data;
|
||||||
|
if(!obj) return 0;
|
||||||
|
switch(obj->type) {
|
||||||
|
#ifdef MB_ENABLE_CLASS
|
||||||
|
case _DT_CLASS:
|
||||||
|
instance = obj->data.instance;
|
||||||
|
|
||||||
|
break;
|
||||||
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
case _DT_VAR:
|
||||||
|
#ifdef MB_ENABLE_CLASS
|
||||||
|
if(obj->data.variable->data->type == _DT_CLASS)
|
||||||
|
instance = obj->data.variable->data->data.instance;
|
||||||
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mb_assert(0 && "Unsupported.");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
i++;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ls_node_t* _search_identifier_in_scope_chain(mb_interpreter_t* s, _running_context_t* scope, char* n, int pathing) {
|
||||||
/* Try to search an identifier in a scope chain */
|
/* Try to search an identifier in a scope chain */
|
||||||
_ls_node_t* result = 0;
|
_ls_node_t* result = 0;
|
||||||
_running_context_t* running = 0;
|
_running_context_t* running = 0;
|
||||||
mb_unrefvar(pathing);
|
|
||||||
|
|
||||||
mb_assert(s && n);
|
mb_assert(s && n);
|
||||||
|
|
||||||
|
if(pathing) {
|
||||||
|
result = _search_identifier_accessor(s, scope, n);
|
||||||
|
if(result)
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
if(scope)
|
if(scope)
|
||||||
running = scope;
|
running = scope;
|
||||||
else
|
else
|
||||||
@ -5557,6 +5647,7 @@ _ls_node_t* _search_identifier_in_scope_chain(mb_interpreter_t* s, _running_cont
|
|||||||
running = running->prev;
|
running = running->prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user