+added array clone support.

This commit is contained in:
paladin-t 2016-02-22 14:35:27 +08:00
parent 72874d6d15
commit 42d8bf6649
2 changed files with 51 additions and 10 deletions

View File

@ -1,3 +1,6 @@
Feb. 22 2016
Added array clone support
Feb. 19 2016
Added source tracing for sub routine invoking
Added member accessing support following a routine of a class instance

View File

@ -1423,10 +1423,11 @@ static void _destroy_usertype_ref(_usertype_ref_t* c);
static void _unref_usertype_ref(_ref_t* ref, void* data);
#endif /* MB_ENABLE_USERTYPE_REF */
static _array_t* _create_array(const char* n, _data_e t, mb_interpreter_t* s);
static _array_t* _create_array(mb_interpreter_t* s, const char* n, _data_e t);
static void _destroy_array(_array_t* arr);
static void _init_array(_array_t* arr);
static int _get_array_pos(struct mb_interpreter_t* s, _array_t* arr, int* d, int c);
static _array_t* _clone_array(mb_interpreter_t* s, _array_t* arr);
static int _get_array_pos(mb_interpreter_t* s, _array_t* arr, int* d, int c);
static int _get_array_index(mb_interpreter_t* s, _ls_node_t** l, _object_t* c, unsigned int* index, bool_t* literally);
static bool_t _get_array_elem(mb_interpreter_t* s, _array_t* arr, unsigned int index, mb_value_u* val, _data_e* type);
static int _set_array_elem(mb_interpreter_t* s, _ls_node_t* ast, _array_t* arr, unsigned int index, mb_value_u* val, _data_e* type);
@ -2540,6 +2541,7 @@ static _ht_node_t* _ht_create(unsigned int size, _ht_compare cmp, _ht_hash hs, _
result->count = 0;
#if _LAZY_HASH_TABLE
mb_unrefvar(ul);
result->array = 0;
#else /* _LAZY_HASH_TABLE */
result->array = (_ls_node_t**)mb_malloc(sizeof(_ls_node_t*) * result->array_size);
@ -4254,6 +4256,7 @@ static int _append_symbol(mb_interpreter_t* s, char* sym, bool_t* delsym, int po
#else /* MB_ENABLE_SOURCE_TRACE */
mb_unrefvar(row);
mb_unrefvar(col);
obj->source_pos = (char)pos;
#endif /* MB_ENABLE_SOURCE_TRACE */
@ -4356,7 +4359,7 @@ static int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object
(*obj)->ref = true;
*delsym = true;
} else {
tmp.array = _create_array(sym, _DT_UNKNOWN, s);
tmp.array = _create_array(s, sym, _DT_UNKNOWN);
memcpy(&tmp.array->type, value, sizeof(tmp.array->type));
(*obj)->data.array = tmp.array;
@ -5029,6 +5032,7 @@ static int_t _get_size_of(_data_e type) {
}
#else /* MB_SIMPLE_ARRAY */
mb_unrefvar(type);
result = sizeof(_raw_u);
#endif /* MB_SIMPLE_ARRAY */
@ -5614,7 +5618,7 @@ static void _unref_usertype_ref(_ref_t* ref, void* data) {
}
#endif /* MB_ENABLE_USERTYPE_REF */
static _array_t* _create_array(const char* n, _data_e t, mb_interpreter_t* s) {
static _array_t* _create_array(mb_interpreter_t* s, const char* n, _data_e t) {
/* Create an array */
_array_t* result = (_array_t*)mb_malloc(sizeof(_array_t));
memset(result, 0, sizeof(_array_t));
@ -5677,7 +5681,23 @@ static void _init_array(_array_t* arr) {
#endif /* MB_SIMPLE_ARRAY */
}
static int _get_array_pos(struct mb_interpreter_t* s, _array_t* arr, int* d, int c) {
static _array_t* _clone_array(mb_interpreter_t* s, _array_t* arr) {
/* Clone an array */
_array_t* result = 0;
mb_assert(s && arr);
result = _create_array(s, mb_strdup(arr->name, 0), arr->type);
result->count = arr->count;
result->dimension_count = arr->dimension_count;
memcpy(result->dimensions, arr->dimensions, sizeof(result->dimensions));
_init_array(result);
/* TODO */
return result;
}
static int _get_array_pos(mb_interpreter_t* s, _array_t* arr, int* d, int c) {
/* Calculate the true index of an array */
int result = 0;
int i = 0;
@ -6734,6 +6754,7 @@ static int _clone_clsss_field(void* data, void* extra, void* n) {
/* Clone fields of a class instance to another */
int result = _OP_RESULT_NORMAL;
_object_t* obj = 0;
_array_t* arr = 0;
_var_t* var = 0;
_routine_t* sub = 0;
_class_t* instance = (_class_t*)n;
@ -6747,13 +6768,25 @@ static int _clone_clsss_field(void* data, void* extra, void* n) {
goto _exit;
switch(obj->type) {
case _DT_VAR:
var = (_var_t*)obj->data.variable;
var = obj->data.variable;
ret = _duplicate_parameter(var, 0, instance->scope);
_clone_object(instance->ref.s, obj, ret->data.variable->data, false);
break;
case _DT_ARRAY:
arr = obj->data.array;
if(!_ht_find(instance->scope->var_dict, arr->name)) {
ret = _create_object();
ret->type = _DT_ARRAY;
ret->ref = false;
_clone_object(instance->ref.s, obj, ret, false);
_ht_set_or_insert(instance->scope->var_dict, ret->data.array->name, ret);
}
break;
case _DT_ROUTINE:
sub = (_routine_t*)obj->data.routine;
sub = obj->data.routine;
if(!_ht_find(instance->scope->var_dict, sub->name)) {
_routine_t* routine = _clone_routine(sub, instance, false);
ret = _create_object();
@ -7858,8 +7891,7 @@ static int _clone_object(mb_interpreter_t* s, _object_t* obj, _object_t* tgt, bo
break;
case _DT_ARRAY:
tgt->data.array = obj->data.array;
mb_assert(0 && "Not implemented.");
tgt->data.array = _clone_array(s, obj->data.array);
break;
#ifdef MB_ENABLE_COLLECTION_LIB
@ -10607,7 +10639,7 @@ int mb_init_array(struct mb_interpreter_t* s, void** l, mb_data_e t, int* d, int
type = _DT_REAL;
#endif /* MB_SIMPLE_ARRAY */
arr = _create_array(0, type, s);
arr = _create_array(s, 0, type);
for(j = 0; j < c; j++) {
n = d[j];
arr->dimensions[arr->dimension_count++] = n;
@ -10735,6 +10767,7 @@ int mb_init_coll(struct mb_interpreter_t* s, void** l, mb_value_t* coll) {
}
#else /* MB_ENABLE_COLLECTION_LIB */
mb_unrefvar(coll);
_handle_error_on_obj(s, SE_RN_NOT_SUPPORTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
#endif /* MB_ENABLE_COLLECTION_LIB */
@ -10780,6 +10813,7 @@ int mb_get_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, mb_value_
mb_unrefvar(idx);
mb_unrefvar(coll);
mb_unrefvar(i);
_handle_error_on_obj(s, SE_RN_NOT_SUPPORTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
#endif /* MB_ENABLE_COLLECTION_LIB */
@ -10832,6 +10866,7 @@ int mb_set_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, mb_value_
mb_unrefvar(coll);
mb_unrefvar(oval);
mb_unrefvar(i);
_handle_error_on_obj(s, SE_RN_NOT_SUPPORTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
#endif /* MB_ENABLE_COLLECTION_LIB */
@ -10877,6 +10912,7 @@ int mb_remove_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, mb_val
mb_unrefvar(coll);
mb_unrefvar(idx);
mb_unrefvar(i);
_handle_error_on_obj(s, SE_RN_NOT_SUPPORTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
#endif /* MB_ENABLE_COLLECTION_LIB */
@ -10916,6 +10952,7 @@ int mb_count_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, int* c)
}
#else /* MB_ENABLE_COLLECTION_LIB */
mb_unrefvar(coll);
_handle_error_on_obj(s, SE_RN_NOT_SUPPORTED, s->source_file, DON2(l), MB_FUNC_ERR, _exit, result);
#endif /* MB_ENABLE_COLLECTION_LIB */
@ -12079,6 +12116,7 @@ static int _core_is(mb_interpreter_t* s, void** l) {
val->data.integer = (int_t)is_a;
#else /* MB_ENABLE_CLASS */
mb_unrefvar(is_a);
_handle_error_on_obj(s, SE_RN_NOT_SUPPORTED, s->source_file, TON(l), MB_FUNC_ERR, _exit, result);
#endif /* MB_ENABLE_CLASS */
}