From b13892d586ff9aa345fded7bb60144562960eb1e Mon Sep 17 00:00:00 2001 From: "hyunghwan.chung" Date: Sun, 23 Dec 2018 08:33:52 +0000 Subject: [PATCH] substitute more macros for the slot field access. simplified code by getting rid of SET_ACTIVE_METHOD_CODE() and making related changes --- moo/lib/dic.c | 2 +- moo/lib/exec.c | 2 +- moo/lib/gc.c | 2 +- moo/lib/moo-prv.h | 8 -------- moo/lib/moo.h | 18 ++++++++---------- moo/lib/obj.c | 22 +++++++++++++++------- moo/lib/pf-basic.c | 35 ++++++++++++++++++++++++++--------- 7 files changed, 52 insertions(+), 37 deletions(-) diff --git a/moo/lib/dic.c b/moo/lib/dic.c index 107d4e4..c6da0fc 100644 --- a/moo/lib/dic.c +++ b/moo/lib/dic.c @@ -333,7 +333,7 @@ found: } } - dic->bucket->slot[x] = moo->_nil; /* the value is nil. no MOO_STORE_OOP */ + MOO_OBJ_SET_OOP_VAL (dic->bucket, x, moo->_nil); /* the value is nil. no MOO_STORE_OOP */ tally--; dic->tally = MOO_SMOOI_TO_OOP(tally); diff --git a/moo/lib/exec.c b/moo/lib/exec.c index a7c2f1d..a808a46 100644 --- a/moo/lib/exec.c +++ b/moo/lib/exec.c @@ -91,7 +91,7 @@ static MOO_INLINE const char* proc_state_to_string (int state) STORE_ACTIVE_IP (moo); \ (moo)->active_context = (v_ctx); \ (moo)->active_method = (moo_oop_method_t)(moo)->active_context->origin->method_or_nargs; \ - SET_ACTIVE_METHOD_CODE(moo); \ + (moo)->active_code = MOO_METHOD_GET_CODE_BYTE((moo)->active_method); \ LOAD_ACTIVE_IP (moo); \ (moo)->processor->active->current_context = (moo)->active_context; \ } while (0) diff --git a/moo/lib/gc.c b/moo/lib/gc.c index f2f8af2..260de28 100644 --- a/moo/lib/gc.c +++ b/moo/lib/gc.c @@ -1024,7 +1024,7 @@ void moo_gc (moo_t* moo) } */ - if (moo->active_method) SET_ACTIVE_METHOD_CODE (moo); /* update moo->active_code */ + if (moo->active_method) moo->active_code = MOO_METHOD_GET_CODE_BYTE(moo->active_method); /* update moo->active_code */ if (gcfin_count > 0) moo->sem_gcfin_sigreq = 1; /* TODO: include some gc statstics like number of live objects, gc performance, etc */ diff --git a/moo/lib/moo-prv.h b/moo/lib/moo-prv.h index 711f9f1..ecd3168 100644 --- a/moo/lib/moo-prv.h +++ b/moo/lib/moo-prv.h @@ -661,14 +661,6 @@ struct moo_compiler_t }; #endif -#if defined(MOO_USE_METHOD_TRAILER) - /* let it point to the trailer of the method */ -# define SET_ACTIVE_METHOD_CODE(moo) ((moo)->active_code = (moo_oob_t*)&(moo)->active_method->literal_frame[MOO_OBJ_GET_SIZE((moo)->active_method) + 1 - MOO_METHOD_NAMED_INSTVARS]) -#else - /* let it point to the payload of the code byte array */ -# define SET_ACTIVE_METHOD_CODE(moo) ((moo)->active_code = (moo)->active_method->code->slot) -#endif - #if defined(MOO_BCODE_LONG_PARAM_SIZE) && (MOO_BCODE_LONG_PARAM_SIZE == 1) # define MAX_CODE_INDEX (0xFFu) # define MAX_CODE_NTMPRS (0xFFu) diff --git a/moo/lib/moo.h b/moo/lib/moo.h index c98e4b6..c94f9cc 100644 --- a/moo/lib/moo.h +++ b/moo/lib/moo.h @@ -515,7 +515,7 @@ struct moo_obj_word_t #define MOO_OBJ_GET_WORD_VAL(oop,idx) ((((moo_oop_word_t)(oop))->slot)[idx]) #define MOO_OBJ_GET_LIWORD_VAL(oop,idx) ((((moo_oop_liword_t)(oop))->slot)[idx]) -/*#define MOO_OBJ_SET_OOP_VAL(oop,idx,val) ((((moo_oop_oop_t)(oop))->slot)[idx] = (val)) - I must use MOO_STORE_OOP() instead.*/ +#define MOO_OBJ_SET_OOP_VAL(oop,idx,val) ((((moo_oop_oop_t)(oop))->slot)[idx] = (val)) /* NOTE: MOO_STORE_OOP() */ #define MOO_OBJ_SET_CHAR_VAL(oop,idx,val) ((((moo_oop_char_t)(oop))->slot)[idx] = (val)) #define MOO_OBJ_SET_BYTE_VAL(oop,idx,val) ((((moo_oop_byte_t)(oop))->slot)[idx] = (val)) #define MOO_OBJ_SET_HALFWORD_VAL(oop,idx,val) ((((moo_oop_halfword_t)(oop))->slot)[idx] = (val)) @@ -680,18 +680,16 @@ struct moo_method_t }; #if defined(MOO_USE_METHOD_TRAILER) - - /* if m is to be type-cast to moo_oop_method_t, the macro must be - * redefined to this: - * (&((moo_oop_method_t)m)>slot[MOO_OBJ_GET_SIZE(m) + 1 - MOO_METHOD_NAMED_INSTVARS]) - */ - - /*((moo_oob_t*)&((moo_oop_oop_t)m)->slot[MOO_OBJ_GET_SIZE(m) + 1])*/ + /* the first byte after the main payload is the trailer size + * the code bytes are placed after the trailer size. + * + * code bytes -> ((moo_oob_t*)&((moo_oop_oop_t)m)->slot[MOO_OBJ_GET_SIZE(m) + 1]) or + * ((moo_oob_t*)&((moo_oop_method_t)m)->literal_frame[MOO_OBJ_GET_SIZE(m) + 1 - MOO_METHOD_NAMED_INSTVARS]) + * size -> ((moo_oow_t)((moo_oop_oop_t)m)->slot[MOO_OBJ_GET_SIZE(m)])*/ # define MOO_METHOD_GET_CODE_BYTE(m) MOO_OBJ_GET_TRAILER_BYTE(m) - /*((moo_oow_t)((moo_oop_oop_t)m)->slot[MOO_OBJ_GET_SIZE(m)])*/ # define MOO_METHOD_GET_CODE_SIZE(m) MOO_OBJ_GET_TRAILER_SIZE(m) #else -# define MOO_METHOD_GET_CODE_BYTE(m) ((m)->code->slot) +# define MOO_METHOD_GET_CODE_BYTE(m) MOO_OBJ_GET_BYTE_SLOT(((m)->code) # define MOO_METHOD_GET_CODE_SIZE(m) MOO_OBJ_GET_SIZE((m)->code) #endif diff --git a/moo/lib/obj.c b/moo/lib/obj.c index 0b0b95a..6921f09 100644 --- a/moo/lib/obj.c +++ b/moo/lib/obj.c @@ -80,7 +80,11 @@ moo_oop_t moo_allocoopobj (moo_t* moo, moo_oow_t size) MOO_OBJ_SET_SIZE (hdr, size); MOO_OBJ_SET_CLASS (hdr, moo->_nil); - while (size > 0) hdr->slot[--size] = moo->_nil; + while (size > 0) + { + size = size - 1; + MOO_OBJ_SET_OOP_VAL (hdr, size, moo->_nil); + } return (moo_oop_t)hdr; } @@ -102,18 +106,22 @@ moo_oop_t moo_allocoopobjwithtrailer (moo_t* moo, moo_oow_t size, const moo_oob_ MOO_OBJ_SET_SIZE (hdr, size); MOO_OBJ_SET_CLASS (hdr, moo->_nil); - for (i = 0; i < size; i++) hdr->slot[i] = moo->_nil; + for (i = 0; i < size; i++) + { + MOO_OBJ_SET_OOP_VAL (hdr, i, moo->_nil); + } /* [NOTE] this is not converted to a SmallInteger object. it is a special slot handled by GC for an object with the TRAILER bit set */ - hdr->slot[size] = (moo_oop_t)blen; + MOO_OBJ_SET_OOP_VAL (hdr, size, (moo_oop_t)blen); + /* the trailer part is just composed of raw bytes from the moo core's perspective. */ if (bptr) { - MOO_MEMCPY (&hdr->slot[size + 1], bptr, blen); + MOO_MEMCPY ((moo_oob_t*)MOO_OBJ_GET_OOP_PTR(hdr, size + 1), bptr, blen); } else { - MOO_MEMSET (&hdr->slot[size + 1], 0, blen); + MOO_MEMSET ((moo_oob_t*)MOO_OBJ_GET_OOP_PTR(hdr, size + 1), 0, blen); } return (moo_oop_t)hdr; @@ -275,7 +283,7 @@ moo_oop_t moo_instantiate (moo_t* moo, moo_oop_class_t _class, const void* vptr, while (i > 0) { --i; - MOO_STORE_OOP (moo, &((moo_oop_oop_t)oop)->slot[i], ((moo_oop_oop_t)_class->initv[0])->slot[i]); + MOO_STORE_OOP (moo, MOO_OBJ_GET_OOP_PTR(oop, i), MOO_OBJ_GET_OOP_VAL(_class->initv[0], i)); } } } @@ -361,7 +369,7 @@ moo_oop_t moo_instantiatewithtrailer (moo_t* moo, moo_oop_class_t _class, moo_oo while (i > 0) { --i; - MOO_STORE_OOP (moo, &((moo_oop_oop_t)oop)->slot[i], ((moo_oop_oop_t)_class->initv[0])->slot[i]); + MOO_STORE_OOP (moo, MOO_OBJ_GET_OOP_PTR(oop, i), MOO_OBJ_GET_OOP_VAL(_class->initv[0], i)); } } } diff --git a/moo/lib/pf-basic.c b/moo/lib/pf-basic.c index 08c2879..6cd8541 100644 --- a/moo/lib/pf-basic.c +++ b/moo/lib/pf-basic.c @@ -441,7 +441,7 @@ moo_pfrc_t moo_pf_basic_at_put (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) } case MOO_OBJ_TYPE_OOP: - MOO_STORE_OOP (moo, MOO_OBJ_GET_OOP_PTR(rcv, idx), val); /*((moo_oop_oop_t)rcv)->slot[idx] = val;*/ + MOO_STORE_OOP (moo, MOO_OBJ_GET_OOP_PTR(rcv, idx), val); break; default: @@ -713,19 +713,36 @@ moo_pfrc_t moo_pf_basic_shift (moo_t* moo, moo_mod_t* mod, moo_ooi_t nargs) break; case MOO_OBJ_TYPE_OOP: - MOO_MEMMOVE (&((moo_oop_oop_t)rcv)->slot[didx], - &((moo_oop_oop_t)rcv)->slot[sidx], - ssz * MOO_SIZEOF(((moo_oop_oop_t)rcv)->slot[0])); - if (didx > sidx) { - /* no need to use MOO_STORE_OOP because moo->_nil is the assigning value */ - while (sidx < didx) ((moo_oop_oop_t)rcv)->slot[sidx++] = moo->_nil; + moo_oow_t i; + for (i = ssz; i > 0; ) + { + MOO_STORE_OOP (moo, MOO_OBJ_GET_OOP_PTR(rcv, didx + i), MOO_OBJ_GET_OOP_VAL(rcv, sidx + i)); + } + + while (sidx < didx) + { + /* no need to use MOO_STORE_OOP because moo->_nil is the assigned value */ + MOO_OBJ_SET_OOP_VAL (rcv, sidx, moo->_nil); + sidx = sidx + 1; + } } else { - /* no need to use MOO_STORE_OOP because moo->_nil is the assigning value */ - while (didx > sidx) ((moo_oop_oop_t)rcv)->slot[(didx++) + ssz] = moo->_nil; + moo_oow_t i; + for (i = 0; i < ssz; i++) + { + --i; + MOO_STORE_OOP (moo, MOO_OBJ_GET_OOP_PTR(rcv, didx + i), MOO_OBJ_GET_OOP_VAL(rcv, sidx + i)); + } + + while (didx > sidx) + { + /* no need to use MOO_STORE_OOP because moo->_nil is the assigned value */ + MOO_OBJ_SET_OOP_VAL (rcv, didx + ssz, moo->_nil); + didx = didx + 1; + } } break;