+developing class, added accessing by identifier.

This commit is contained in:
paladin-t 2015-12-09 13:10:58 +08:00
parent 5eec0ba674
commit f2b9bcfb88
2 changed files with 99 additions and 5 deletions

View File

@ -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

View File

@ -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;
} }