changed the doubly linked list to circular in idmap-imp.h

started writing some code to implement gc
This commit is contained in:
2020-03-18 08:30:40 +00:00
parent bc87c486da
commit 1285d77c1e
11 changed files with 345 additions and 155 deletions

View File

@ -36,6 +36,22 @@ hawk_val_t* hawk_val_nil = (hawk_val_t*)&awk_nil;
hawk_val_t* hawk_val_zls = (hawk_val_t*)&awk_zls;
hawk_val_t* hawk_val_zlm = (hawk_val_t*)&awk_zlm;
/* --------------------------------------------------------------------- */
/* TOOD: */
static hawk_val_t* gc_calloc (hawk_rtx_t* rtx, hawk_oow_t size)
{
hawk_gc_info_t* gci;
gci = (hawk_gc_info_t*)hawk_rtx_callocmem(rtx, HAWK_SIZEOF(*gci) + size);
if (HAWK_UNLIKELY(!gci)) return HAWK_NULL;
return hawk_gcinfo_to_val(gci);
}
/* --------------------------------------------------------------------- */
hawk_val_t* hawk_get_awk_nil_val (void)
{
return (hawk_val_t*)&awk_nil;
@ -95,8 +111,8 @@ hawk_val_t* hawk_rtx_makeintval (hawk_rtx_t* rtx, hawk_int_t v)
rtx->vmgr.ifree = (hawk_val_int_t*)val->nde;
val->v_type = HAWK_VAL_INT;
val->ref = 0;
val->stat = 0;
val->v_refs = 0;
val->v_static = 0;
val->nstr = 0;
val->fcb = 0;
val->i_val = v;
@ -146,8 +162,8 @@ hawk_val_t* hawk_rtx_makefltval (hawk_rtx_t* rtx, hawk_flt_t v)
rtx->vmgr.rfree = (hawk_val_flt_t*)val->nde;
val->v_type = HAWK_VAL_FLT;
val->ref = 0;
val->stat = 0;
val->v_refs = 0;
val->v_static = 0;
val->nstr = 0;
val->fcb = 0;
val->val = v;
@ -189,8 +205,8 @@ static HAWK_INLINE hawk_val_t* make_str_val (hawk_rtx_t* rtx, const hawk_ooch_t*
init:
#endif
val->v_type = HAWK_VAL_STR;
val->ref = 0;
val->stat = 0;
val->v_refs = 0;
val->v_static = 0;
val->nstr = 0;
val->fcb = 0;
val->val.len = len1 + len2;
@ -337,8 +353,7 @@ hawk_val_t* hawk_rtx_makenstrvalwithuchars (hawk_rtx_t* rtx, const hawk_uch_t* p
x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r);
v = hawk_rtx_makestrvalwithuchars(rtx, ptr, len);
if (!v) return HAWK_NULL;
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
if (x >= 0)
{
@ -360,8 +375,7 @@ hawk_val_t* hawk_rtx_makenstrvalwithbchars (hawk_rtx_t* rtx, const hawk_bch_t* p
x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r);
v = hawk_rtx_makestrvalwithbchars(rtx, ptr, len);
if (!v) return HAWK_NULL;
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
if (x >= 0)
{
@ -410,8 +424,8 @@ hawk_val_t* hawk_rtx_makembsvalwithbchars (hawk_rtx_t* rtx, const hawk_bch_t* pt
if (HAWK_UNLIKELY(!val)) return HAWK_NULL;
val->v_type = HAWK_VAL_MBS;
val->ref = 0;
val->stat = 0;
val->v_refs = 0;
val->v_static = 0;
val->nstr = 0;
val->fcb = 0;
val->val.len = len;
@ -496,8 +510,8 @@ hawk_val_t* hawk_rtx_makerexval (hawk_rtx_t* rtx, const hawk_oocs_t* str, hawk_t
if (HAWK_UNLIKELY(!val)) return HAWK_NULL;
val->v_type = HAWK_VAL_REX;
val->ref = 0;
val->stat = 0;
val->v_refs = 0;
val->v_static = 0;
val->nstr = 0;
val->fcb = 0;
val->str.len = str->len;
@ -549,17 +563,19 @@ hawk_val_t* hawk_rtx_makemapval (hawk_rtx_t* rtx)
},
HAWK_MAP_COMPER_DEFAULT,
same_mapval,
#if defined(HAWK_MAP_IS_HTB)
HAWK_MAP_SIZER_DEFAULT,
HAWK_MAP_HASHER_DEFAULT
#endif
};
hawk_val_map_t* val;
val = (hawk_val_map_t*)hawk_rtx_callocmem(rtx, HAWK_SIZEOF(hawk_val_map_t) + HAWK_SIZEOF(hawk_map_t) + HAWK_SIZEOF(rtx));
if (!val) return HAWK_NULL;
if (HAWK_UNLIKELY(!val)) return HAWK_NULL;
val->v_type = HAWK_VAL_MAP;
val->ref = 0;
val->stat = 0;
val->v_refs = 0;
val->v_static = 0;
val->nstr = 0;
val->fcb = 0;
val->map = (hawk_map_t*)(val + 1);
@ -734,8 +750,8 @@ hawk_val_t* hawk_rtx_makefunval (hawk_rtx_t* rtx, const hawk_fun_t* fun)
if (HAWK_UNLIKELY(!val)) return HAWK_NULL;
val->v_type = HAWK_VAL_FUN;
val->ref = 0;
val->stat = 0;
val->v_refs = 0;
val->v_static = 0;
val->nstr = 0;
val->fcb = 0;
val->fun = (hawk_fun_t*)fun;
@ -888,9 +904,9 @@ void hawk_rtx_refupval (hawk_rtx_t* rtx, hawk_val_t* val)
if (IS_STATICVAL(val)) return;
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_T("ref up [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->ref, val);
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_T("ref up [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->v_refs, val);
#endif
val->ref++;
val->v_refs++;
}
}
@ -901,15 +917,14 @@ void hawk_rtx_refdownval (hawk_rtx_t* rtx, hawk_val_t* val)
if (IS_STATICVAL(val)) return;
#if defined(DEBUG_VAL)
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_T("ref down [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->ref, val);
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_T("ref down [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->v_refs, val);
#endif
/* the reference count of a value should be greater than zero for it to be decremented. check the source code for any bugs */
HAWK_ASSERT (val->ref > 0);
HAWK_ASSERT (val->v_refs > 0);
val->ref--;
if (val->ref <= 0)
val->v_refs--;
if (val->v_refs <= 0)
{
hawk_rtx_freeval(rtx, val, 1);
}
@ -923,9 +938,9 @@ void hawk_rtx_refdownval_nofree (hawk_rtx_t* rtx, hawk_val_t* val)
if (IS_STATICVAL(val)) return;
/* the reference count of a value should be greater than zero for it to be decremented. check the source code for any bugs */
HAWK_ASSERT (val->ref > 0);
HAWK_ASSERT (val->v_refs > 0);
val->ref--;
val->v_refs--;
}
}