*fixed a wrong memory copy bug with the PRINT statement; +added TOSTRING meta method to serialize a class instance.
This commit is contained in:
parent
c7dda61248
commit
9c35b84843
2
HISTORY
2
HISTORY
@ -1,4 +1,6 @@
|
|||||||
Jan. 21 2016
|
Jan. 21 2016
|
||||||
|
Fixed a wrong memory copy bug with the PRINT statement
|
||||||
|
Added TOSTRING meta method to serialize a class instance
|
||||||
Improved type handling
|
Improved type handling
|
||||||
|
|
||||||
Jan. 20 2016
|
Jan. 20 2016
|
||||||
|
@ -408,6 +408,10 @@ typedef struct _label_t {
|
|||||||
_ls_node_t* node;
|
_ls_node_t* node;
|
||||||
} _label_t;
|
} _label_t;
|
||||||
|
|
||||||
|
#ifdef MB_ENABLE_CLASS
|
||||||
|
# define _TO_STRING_FUNC "TOSTRING"
|
||||||
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
|
||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
typedef struct _class_t {
|
typedef struct _class_t {
|
||||||
_ref_t ref;
|
_ref_t ref;
|
||||||
@ -1545,7 +1549,7 @@ static int _clear_scope_chain(mb_interpreter_t* s);
|
|||||||
static int _dispose_scope_chain(mb_interpreter_t* s);
|
static int _dispose_scope_chain(mb_interpreter_t* s);
|
||||||
static void _tidy_scope_chain(mb_interpreter_t* s);
|
static void _tidy_scope_chain(mb_interpreter_t* s);
|
||||||
static void _tidy_intermediate_value(_ref_t* ref, void* data);
|
static void _tidy_intermediate_value(_ref_t* ref, void* data);
|
||||||
static _object_t* _eval_var_in_print(mb_interpreter_t* s, _ls_node_t** ast, _object_t* obj);
|
static _object_t* _eval_var_in_print(mb_interpreter_t* s, _object_t** val_ptr, _ls_node_t** ast, _object_t* obj);
|
||||||
|
|
||||||
static void _stepped(mb_interpreter_t* s, _ls_node_t* ast);
|
static void _stepped(mb_interpreter_t* s, _ls_node_t* ast);
|
||||||
static int _execute_statement(mb_interpreter_t* s, _ls_node_t** l);
|
static int _execute_statement(mb_interpreter_t* s, _ls_node_t** l);
|
||||||
@ -8279,28 +8283,30 @@ void _tidy_intermediate_value(_ref_t* ref, void* data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_object_t* _eval_var_in_print(mb_interpreter_t* s, _ls_node_t** ast, _object_t* obj) {
|
_object_t* _eval_var_in_print(mb_interpreter_t* s, _object_t** val_ptr, _ls_node_t** ast, _object_t* obj) {
|
||||||
/* Evaluate a variable, this is a helper function for the PRINT statement */
|
/* Evaluate a variable, this is a helper function for the PRINT statement */
|
||||||
_object_t* val_ptr = 0;
|
|
||||||
_object_t tmp;
|
_object_t tmp;
|
||||||
|
|
||||||
if(obj->type == _DT_ROUTINE) {
|
if(obj->type == _DT_ROUTINE) {
|
||||||
_execute_statement(s, ast);
|
_execute_statement(s, ast);
|
||||||
_MAKE_NIL(&tmp);
|
_MAKE_NIL(&tmp);
|
||||||
_public_value_to_internal_object(&s->running_context->intermediate_value, &tmp);
|
_public_value_to_internal_object(&s->running_context->intermediate_value, &tmp);
|
||||||
val_ptr = obj = &tmp;
|
if(tmp.type == _DT_STRING) {
|
||||||
if(tmp.type == _DT_STRING)
|
|
||||||
tmp.data.string = mb_strdup(tmp.data.string, strlen(tmp.data.string) + 1);
|
tmp.data.string = mb_strdup(tmp.data.string, strlen(tmp.data.string) + 1);
|
||||||
|
tmp.ref = false;
|
||||||
|
mb_make_nil(s->running_context->intermediate_value);
|
||||||
|
}
|
||||||
|
**val_ptr = tmp;
|
||||||
if(*ast) *ast = (*ast)->prev;
|
if(*ast) *ast = (*ast)->prev;
|
||||||
} else if(obj->type == _DT_VAR) {
|
} else if(obj->type == _DT_VAR) {
|
||||||
val_ptr = obj = obj->data.variable->data;
|
*val_ptr = obj->data.variable->data;
|
||||||
if(*ast) *ast = (*ast)->next;
|
if(*ast) *ast = (*ast)->next;
|
||||||
} else {
|
} else {
|
||||||
val_ptr = obj;
|
*val_ptr = obj;
|
||||||
if(*ast) *ast = (*ast)->next;
|
if(*ast) *ast = (*ast)->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return val_ptr;
|
return *val_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _stepped(mb_interpreter_t* s, _ls_node_t* ast) {
|
void _stepped(mb_interpreter_t* s, _ls_node_t* ast) {
|
||||||
@ -13821,7 +13827,7 @@ int _std_print(mb_interpreter_t* s, void** l) {
|
|||||||
case _DT_VAR:
|
case _DT_VAR:
|
||||||
if(obj->data.variable->data->type == _DT_ROUTINE) {
|
if(obj->data.variable->data->type == _DT_ROUTINE) {
|
||||||
obj = obj->data.variable->data;
|
obj = obj->data.variable->data;
|
||||||
val_ptr = _eval_var_in_print(s, &ast, obj);
|
val_ptr = _eval_var_in_print(s, &val_ptr, &ast, obj);
|
||||||
|
|
||||||
goto _print;
|
goto _print;
|
||||||
}
|
}
|
||||||
@ -13831,7 +13837,7 @@ int _std_print(mb_interpreter_t* s, void** l) {
|
|||||||
if(pathed && pathed->data) {
|
if(pathed && pathed->data) {
|
||||||
if(obj != (_object_t*)pathed->data) {
|
if(obj != (_object_t*)pathed->data) {
|
||||||
obj = (_object_t*)pathed->data;
|
obj = (_object_t*)pathed->data;
|
||||||
val_ptr = _eval_var_in_print(s, &ast, obj);
|
val_ptr = _eval_var_in_print(s, &val_ptr, &ast, obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13870,6 +13876,33 @@ _print:
|
|||||||
_get_printer(s)(mb_get_type_string(_internal_type_to_public_type(val_ptr->type)));
|
_get_printer(s)(mb_get_type_string(_internal_type_to_public_type(val_ptr->type)));
|
||||||
} else if(val_ptr->type == _DT_TYPE) {
|
} else if(val_ptr->type == _DT_TYPE) {
|
||||||
_get_printer(s)(mb_get_type_string(val_ptr->data.type));
|
_get_printer(s)(mb_get_type_string(val_ptr->data.type));
|
||||||
|
#ifdef MB_ENABLE_CLASS
|
||||||
|
} else if(val_ptr->type == _DT_CLASS) {
|
||||||
|
bool_t got_tostr = false;
|
||||||
|
_ls_node_t* tsn = _search_identifier_in_class(s, val_ptr->data.instance, _TO_STRING_FUNC, 0, 0);
|
||||||
|
if(tsn) {
|
||||||
|
_object_t* tso = (_object_t*)tsn->data;
|
||||||
|
_ls_node_t* tmp = *l;
|
||||||
|
mb_value_t va[1];
|
||||||
|
mb_make_nil(va[0]);
|
||||||
|
if(_eval_routine(s, &tmp, va, 1, tso->data.routine, 0, 0) == MB_FUNC_OK) {
|
||||||
|
val_ptr = &val_obj;
|
||||||
|
_MAKE_NIL(val_ptr);
|
||||||
|
_public_value_to_internal_object(&s->running_context->intermediate_value, val_ptr);
|
||||||
|
if(val_ptr->type == _DT_STRING) {
|
||||||
|
val_ptr->data.string = mb_strdup(val_ptr->data.string, strlen(val_ptr->data.string) + 1);
|
||||||
|
val_ptr->ref = false;
|
||||||
|
mb_make_nil(s->running_context->intermediate_value);
|
||||||
|
}
|
||||||
|
obj = val_ptr;
|
||||||
|
got_tostr = true;
|
||||||
|
|
||||||
|
goto _print;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_get_printer(s)(mb_get_type_string(_internal_type_to_public_type(val_ptr->type)));
|
||||||
|
#endif /* MB_ENABLE_CLASS */
|
||||||
} else {
|
} else {
|
||||||
_get_printer(s)(mb_get_type_string(_internal_type_to_public_type(val_ptr->type)));
|
_get_printer(s)(mb_get_type_string(_internal_type_to_public_type(val_ptr->type)));
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user