This commit is contained in:
hyung-hwan 2007-12-07 19:57:10 +00:00
parent 6a50833e9b
commit 240f95de4a
6 changed files with 52 additions and 18 deletions

View File

@ -1166,7 +1166,7 @@ int Awk::open ()
}
functionMap = ase_awk_map_open (
this, 512, 70, freeFunctionMapValue, awk);
this, 512, 70, freeFunctionMapValue, ASE_NULL, awk);
if (functionMap == ASE_NULL)
{
ase_awk_close (awk);

View File

@ -68,7 +68,7 @@ ase_awk_t* ase_awk_open (const ase_awk_prmfns_t* prmfns, void* custom_data)
return ASE_NULL;
}
awk->wtab = ase_awk_map_open (awk, 512, 70, free_word, awk);
awk->wtab = ase_awk_map_open (awk, 512, 70, free_word, ASE_NULL, awk);
if (awk->wtab == ASE_NULL)
{
ase_str_close (&awk->token.name);
@ -76,7 +76,7 @@ ase_awk_t* ase_awk_open (const ase_awk_prmfns_t* prmfns, void* custom_data)
return ASE_NULL;
}
awk->rwtab = ase_awk_map_open (awk, 512, 70, free_word, awk);
awk->rwtab = ase_awk_map_open (awk, 512, 70, free_word, ASE_NULL, awk);
if (awk->rwtab == ASE_NULL)
{
ase_awk_map_close (awk->wtab);
@ -86,7 +86,7 @@ ase_awk_t* ase_awk_open (const ase_awk_prmfns_t* prmfns, void* custom_data)
}
/* TODO: initial map size?? */
awk->tree.afns = ase_awk_map_open (awk, 512, 70, free_afn, awk);
awk->tree.afns = ase_awk_map_open (awk, 512, 70, free_afn, ASE_NULL, awk);
if (awk->tree.afns == ASE_NULL)
{
ase_awk_map_close (awk->rwtab);
@ -162,7 +162,7 @@ ase_awk_t* ase_awk_open (const ase_awk_prmfns_t* prmfns, void* custom_data)
awk->bfn.sys = ASE_NULL;
/*awk->bfn.user = ASE_NULL;*/
awk->bfn.user = ase_awk_map_open (awk, 512, 70, free_bfn, awk);
awk->bfn.user = ase_awk_map_open (awk, 512, 70, free_bfn, ASE_NULL, awk);
if (awk->bfn.user == ASE_NULL)
{
ase_awk_tab_close (&awk->parse.params);

View File

@ -19,7 +19,8 @@ static int rehash (ase_awk_map_t* map);
ase_awk_map_t* ase_awk_map_open (
void* owner, ase_size_t capa, unsigned int factor,
void(*freeval)(void*,void*), ase_awk_t* awk)
void(*freeval)(void*,void*), void(*sameval)(void*,void*),
ase_awk_t* awk)
{
ase_awk_map_t* map;
@ -42,6 +43,7 @@ ase_awk_map_t* ase_awk_map_open (
map->capa = capa;
map->size = 0;
map->freeval = freeval;
map->sameval = sameval;
while (capa > 0) map->buck[--capa] = ASE_NULL;
map->factor = factor;
@ -214,15 +216,29 @@ ase_awk_pair_t* ase_awk_map_setpair (
ase_awk_map_t* map, ase_awk_pair_t* pair, void* val)
{
/* use this function with care */
if (ASE_AWK_PAIR_VAL(pair) != val)
if (ASE_AWK_PAIR_VAL(pair) == val)
{
/* if the old value and the new value are the same,
* it just calls the handler for this condition.
* No value replacement occurs. */
if (map->sameval != ASE_NULL)
{
map->sameval (map->owner, val);
}
}
else
{
/* frees the old value */
if (map->freeval != ASE_NULL)
{
map->freeval (map->owner, ASE_AWK_PAIR_VAL(pair));
}
/* the new value takes the place */
ASE_AWK_PAIR_VAL(pair) = val;
}
return pair;
}

View File

@ -37,6 +37,7 @@ struct ase_awk_map_t
ase_size_t threshold;
ase_awk_pair_t** buck;
void (*freeval) (void*,void*);
void (*sameval) (void*,void*);
ase_awk_t* awk;
};
@ -51,7 +52,8 @@ extern "C" {
ase_awk_map_t* ase_awk_map_open (
void* owner, ase_size_t capa, unsigned int factor,
void(*freeval)(void*,void*), ase_awk_t* awk);
void(*freeval)(void*,void*), void(*sameval)(void*,void*),
ase_awk_t* awk);
void ase_awk_map_close (ase_awk_map_t* map);

View File

@ -718,6 +718,11 @@ static void free_namedval (void* run, void* val)
ase_awk_refdownval ((ase_awk_run_t*)run, val);
}
static void same_namedval (void* run, void* val)
{
ase_awk_refdownval_nofree ((ase_awk_run_t*)run, val);
}
static int init_run (
ase_awk_run_t* run, ase_awk_t* awk,
ase_awk_runios_t* runios, void* custom_data)
@ -772,7 +777,7 @@ static int init_run (
}
run->named = ase_awk_map_open (
run, 1024, 70, free_namedval, run->awk);
run, 1024, 70, free_namedval, same_namedval, run->awk);
if (run->named == ASE_NULL)
{
ase_str_close (&run->format.fmt);
@ -2368,8 +2373,9 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde)
return -1;
}
if (ase_awk_map_put (run->named,
var->id.name, var->id.name_len, tmp) == ASE_NULL)
pair = ase_awk_map_put (run->named,
var->id.name, var->id.name_len, tmp);
if (pair == ASE_NULL)
{
ase_awk_refupval (run, tmp);
ase_awk_refdownval (run, tmp);
@ -2381,7 +2387,7 @@ static int run_delete (ase_awk_run_t* run, ase_awk_nde_delete_t* nde)
}
/* as this is the assignment, it needs to update
* the reference count of the target value */
* the reference count of the target value. */
ase_awk_refupval (run, tmp);
}
else
@ -4491,11 +4497,10 @@ static ase_awk_val_t* eval_binop_ma (
ase_awk_refupval (run, rv);
res = eval_binop_match0 (
run, lv, rv, left->line, right->line, 1);
res = eval_binop_match0 (run, lv, rv, left->line, right->line, 1);
ase_awk_refdownval (run, lv);
ase_awk_refdownval (run, rv);
ase_awk_refdownval (run, lv);
return res;
}
@ -4525,8 +4530,8 @@ static ase_awk_val_t* eval_binop_nm (
res = eval_binop_match0 (
run, lv, rv, left->line, right->line, 0);
ase_awk_refdownval (run, lv);
ase_awk_refdownval (run, rv);
ase_awk_refdownval (run, lv);
return res;
}

View File

@ -242,7 +242,7 @@ ase_awk_val_t* ase_awk_makerexval (
return (ase_awk_val_t*)val;
}
static void free_map_val (void* run, void* v)
static void free_mapval (void* run, void* v)
{
#ifdef DEBUG_VAL
ase_dprintf (ASE_T("refdown in map free..."));
@ -253,6 +253,16 @@ static void free_map_val (void* run, void* v)
ase_awk_refdownval (run, v);
}
static void same_mapval (void* run, void* v)
{
#ifdef DEBUG_VAL
ase_dprintf (ASE_T("refdown nofree in map free..."));
ase_awk_dprintval (run, v);
ase_dprintf (ASE_T("\n"));
#endif
ase_awk_refdownval_nofree (run, v);
}
ase_awk_val_t* ase_awk_makemapval (ase_awk_run_t* run)
{
ase_awk_val_map_t* val;
@ -267,7 +277,8 @@ ase_awk_val_t* ase_awk_makemapval (ase_awk_run_t* run)
val->type = ASE_AWK_VAL_MAP;
val->ref = 0;
val->map = ase_awk_map_open (run, 256, 70, free_map_val, run->awk);
val->map = ase_awk_map_open (
run, 256, 70, free_mapval, same_mapval, run->awk);
if (val->map == ASE_NULL)
{
ASE_AWK_FREE (run->awk, val);