From 14137369da675b7fdaf7a193127bcf8865ac10db Mon Sep 17 00:00:00 2001 From: paladin-t Date: Wed, 9 Mar 2016 10:55:45 +0800 Subject: [PATCH] *improved overridden function invoking; *fixed a memory leak; *moved overriding information from stack to heap. --- HISTORY | 7 +++- MY-BASIC Quick Reference.pdf | Bin 228090 -> 228097 bytes core/my_basic.c | 67 +++++++++++++++++++++++------------ core/my_basic.h | 4 +-- 4 files changed, 53 insertions(+), 25 deletions(-) diff --git a/HISTORY b/HISTORY index 86ed959..aabadc6 100755 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,8 @@ +Mar. 9 2016 +Improved overridden function invoking +Fixed a memory leak +Moved overriding information from stack to heap + Mar. 8 2016 Fixed a memory overflow bug with the ASC statement @@ -23,7 +28,7 @@ Fixed a crash bug with an invalid expression Feb. 26 2016 Added a ME keyword to represent a class instance itself Added shallow cloning support -Fixed an overrided function copying issue +Fixed an overridden function copying issue Fixed a multiple disposing bug with outer scopes of lambda Feb. 25 2016 diff --git a/MY-BASIC Quick Reference.pdf b/MY-BASIC Quick Reference.pdf index 4e50cee119f5aacd997476399c45a1e74795ed04..a381238557b9f33d5d0fd5e94bf73014f4a2ea7b 100644 GIT binary patch delta 6777 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 diff --git a/core/my_basic.c b/core/my_basic.c index 0eb4820..aaf4234 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -353,13 +353,13 @@ typedef struct _gc_t { int_t collecting; } _gc_t; -typedef struct _override_func_info_t { - mb_meta_func_t is; - mb_meta_func_t add; - mb_meta_func_t sub; - mb_meta_func_t mul; - mb_meta_func_t div; -} _override_func_info_t; +typedef struct _override_operator_info_t { + mb_meta_operator_t is; + mb_meta_operator_t add; + mb_meta_operator_t sub; + mb_meta_operator_t mul; + mb_meta_operator_t div; +} _override_operator_info_t; typedef struct _usertype_ref_t { _ref_t ref; @@ -369,7 +369,7 @@ typedef struct _usertype_ref_t { mb_hash_func_t hash; mb_cmp_func_t cmp; mb_fmt_func_t fmt; - _override_func_info_t overrides; + _override_operator_info_t* operators; } _usertype_ref_t; typedef struct _func_t { @@ -981,15 +981,21 @@ static _object_t* _exp_assign = 0; if(opnd1->type == _DT_VAR) opnd1 = opnd1->data.variable->data; \ if(opnd2->type == _DT_VAR) opnd2 = opnd2->data.variable->data; \ if(opnd1->type == _DT_USERTYPE_REF) { \ - if(opnd1->data.usertype_ref->overrides.__optr) { \ - mb_value_t vfst, vscd; \ - mb_value_t ret; \ - mb_make_nil(vfst); \ - mb_make_nil(vscd); \ - mb_make_nil(ret); \ + mb_value_t vfst, vscd; \ + mb_value_t ret; \ + mb_make_nil(vfst); \ + mb_make_nil(vscd); \ + mb_make_nil(ret); \ + if(opnd1->data.usertype_ref->operators && opnd1->data.usertype_ref->operators->__optr) { \ _internal_object_to_public_value(opnd1, &vfst); \ _internal_object_to_public_value(opnd2, &vscd); \ - __result = opnd1->data.usertype_ref->overrides.__optr(s, (__tuple), &vfst, &vscd, &ret); \ + __result = opnd1->data.usertype_ref->operators->__optr(s, (__tuple), &vfst, &vscd, &ret); \ + _public_value_to_internal_object(&ret, retval); \ + goto __exit; \ + } else if(opnd2->data.usertype_ref->operators && opnd2->data.usertype_ref->operators->__optr) { \ + _internal_object_to_public_value(opnd1, &vfst); \ + _internal_object_to_public_value(opnd2, &vscd); \ + __result = opnd2->data.usertype_ref->operators->__optr(s, (__tuple), &vfst, &vscd, &ret); \ _public_value_to_internal_object(&ret, retval); \ goto __exit; \ } \ @@ -5728,6 +5734,14 @@ static int _gc_destroy_garbage(void* data, void* extra, _gc_t* gc) { break; #endif /* MB_ENABLE_LAMBDA */ +#ifdef MB_ENABLE_LAMBDA + case _DT_OUTER_SCOPE: /* Fall through */ +#endif /* MB_ENABLE_LAMBDA */ +#ifdef MB_ENABLE_USERTYPE_REF + case _DT_USERTYPE_REF: /* Fall through */ +#endif /* MB_ENABLE_USERTYPE_REF */ + case _DT_ARRAY: /* Do nothing */ + break; default: proc = false; @@ -5888,6 +5902,9 @@ static void _destroy_usertype_ref(_usertype_ref_t* c) { if(c->dtor) c->dtor(c->ref.s, c->usertype); + if(c->operators) { + safe_free(c->operators); + } _destroy_ref(&c->ref); safe_free(c); } @@ -8261,7 +8278,9 @@ static int _clone_object(mb_interpreter_t* s, _object_t* obj, _object_t* tgt, bo obj->data.usertype_ref->dtor, obj->data.usertype_ref->clone, obj->data.usertype_ref->hash, obj->data.usertype_ref->cmp, obj->data.usertype_ref->fmt ); - memcpy(&tgt->data.usertype_ref->overrides, &obj->data.usertype_ref->overrides, sizeof(_override_func_info_t)); + if(obj->data.usertype_ref->operators) + tgt->data.usertype_ref->operators = (_override_operator_info_t*)mb_malloc(sizeof(_override_operator_info_t)); + memcpy(tgt->data.usertype_ref->operators, obj->data.usertype_ref->operators, sizeof(_override_operator_info_t)); _ref(&tgt->data.usertype_ref->ref, tgt->data.usertype_ref); break; @@ -11536,7 +11555,7 @@ _exit: return result; } -int mb_override_value(struct mb_interpreter_t* s, void** l, mb_value_t val, mb_meta_func_u m, mb_meta_func_t f) { +int mb_override_value(struct mb_interpreter_t* s, void** l, mb_value_t val, mb_meta_func_u m, mb_meta_operator_t f) { /* Override a meta function of a value */ int result = MB_FUNC_OK; _object_t obj; @@ -11549,25 +11568,29 @@ int mb_override_value(struct mb_interpreter_t* s, void** l, mb_value_t val, mb_m _usertype_ref_t* user = 0; _public_value_to_internal_object(&val, &obj); user = obj.data.usertype_ref; + if(!user->operators) { + user->operators = (_override_operator_info_t*)mb_malloc(sizeof(_override_operator_info_t)); + memset(user->operators, 0, sizeof(_override_operator_info_t)); + } switch(m) { case MB_MF_IS: - user->overrides.is = f; + user->operators->is = f; break; case MB_MF_ADD: - user->overrides.add = f; + user->operators->add = f; break; case MB_MF_SUB: - user->overrides.sub = f; + user->operators->sub = f; break; case MB_MF_MUL: - user->overrides.mul = f; + user->operators->mul = f; break; case MB_MF_DIV: - user->overrides.div = f; + user->operators->div = f; break; } diff --git a/core/my_basic.h b/core/my_basic.h index f1ac1dc..5d6045d 100755 --- a/core/my_basic.h +++ b/core/my_basic.h @@ -497,7 +497,7 @@ typedef void* (* mb_clone_func_t)(struct mb_interpreter_t*, void*); typedef unsigned int (* mb_hash_func_t)(struct mb_interpreter_t*, void*); typedef int (* mb_cmp_func_t)(struct mb_interpreter_t*, void*, void*); typedef void (* mb_fmt_func_t)(struct mb_interpreter_t*, void*, mb_print_func_t); -typedef int (* mb_meta_func_t)(struct mb_interpreter_t*, void**, mb_value_t*, mb_value_t*, mb_value_t*); +typedef int (* mb_meta_operator_t)(struct mb_interpreter_t*, void**, mb_value_t*, mb_value_t*, mb_value_t*); typedef char* (* mb_memory_allocate_func_t)(unsigned); typedef void (* mb_memory_free_func_t)(char*); @@ -555,7 +555,7 @@ MBAPI int mb_make_ref_value(struct mb_interpreter_t* s, void* val, mb_value_t* o MBAPI int mb_get_ref_value(struct mb_interpreter_t* s, void** l, mb_value_t val, void** out); MBAPI int mb_ref_value(struct mb_interpreter_t* s, void** l, mb_value_t val); MBAPI int mb_unref_value(struct mb_interpreter_t* s, void** l, mb_value_t val); -MBAPI int mb_override_value(struct mb_interpreter_t* s, void** l, mb_value_t val, mb_meta_func_u m, mb_meta_func_t f); +MBAPI int mb_override_value(struct mb_interpreter_t* s, void** l, mb_value_t val, mb_meta_func_u m, mb_meta_operator_t f); MBAPI int mb_dispose_value(struct mb_interpreter_t* s, mb_value_t val); MBAPI int mb_get_routine(struct mb_interpreter_t* s, void** l, const char* n, mb_value_t* val);