This commit is contained in:
hyung-hwan 2008-01-16 08:03:41 +00:00
parent 20f579cfd9
commit a0aae74abe
4 changed files with 58 additions and 0 deletions

View File

@ -255,6 +255,9 @@ struct ase_awk_run_t
/*ase_size_t scache32_count; /*ase_size_t scache32_count;
ase_size_t scache64_count;*/ ase_size_t scache64_count;*/
ase_awk_val_int_t* ifree;
ase_awk_val_chunk_t* ichunk;
ase_awk_nde_blk_t* active_block; ase_awk_nde_blk_t* active_block;
ase_byte_t* pattern_range_state; ase_byte_t* pattern_range_state;

View File

@ -747,6 +747,8 @@ static int init_run (
run->fcache_count = 0; run->fcache_count = 0;
/*run->scache32_count = 0; /*run->scache32_count = 0;
run->scache64_count = 0;*/ run->scache64_count = 0;*/
run->ichunk = ASE_NULL;
run->ifree = ASE_NULL;
run->errnum = ASE_AWK_ENOERR; run->errnum = ASE_AWK_ENOERR;
run->errlin = 0; run->errlin = 0;
@ -976,6 +978,13 @@ static void deinit_run (ase_awk_run_t* run)
ase_awk_val_str_t* tmp = run->scache64[--run->scache64_count]; ase_awk_val_str_t* tmp = run->scache64[--run->scache64_count];
ase_awk_freeval (run, (ase_awk_val_t*)tmp, ase_false); ase_awk_freeval (run, (ase_awk_val_t*)tmp, ase_false);
}*/ }*/
while (run->ichunk != ASE_NULL)
{
ase_awk_val_pool_t* next = run->ichunk->next;
ASE_AWK_FREE (run->awk, run->ichunk);
run->ichunk = next;
}
} }
static int build_runarg ( static int build_runarg (

View File

@ -68,6 +68,7 @@ ase_awk_val_t* ase_awk_makeintval (ase_awk_run_t* run, ase_long_t v)
return (ase_awk_val_t*)&awk_int[v-awk_int[0].val]; return (ase_awk_val_t*)&awk_int[v-awk_int[0].val];
} }
/*
if (run->icache_count > 0) if (run->icache_count > 0)
{ {
val = run->icache[--run->icache_count]; val = run->icache[--run->icache_count];
@ -82,6 +83,35 @@ ase_awk_val_t* ase_awk_makeintval (ase_awk_run_t* run, ase_long_t v)
return ASE_NULL; return ASE_NULL;
} }
} }
*/
ase_awk_val_pool_t* p = run->ipool;
ase_awk_val_int_t* f = run->ifree;
if (f = ASE_NULL)
{
ase_awk_val_int_t* x;
ase_size_t i;
p = ASE_AWK_MALLOC (run->awk,
ASE_SIZEOF(ase_awk_val_pool_t)+
ASE_SIZEOF(ase_awk_val_int_t)*100);
if (p == ASE_NULL)
{
ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM);
return ASE_NULL;
}
x = (ase_awk_val_int_t*)(p + 1);
for (i = 0; i < 100-1; i++) f
x[i].nde = (ase_awk_nde_int_t*)&x[i+1];
x[i].nde = ASE_NULL;
run->ifree = &f[0];
p->next = run->ipool;
}
val = run->ifree;
p->ifree = (ase_awk_val_int_t*)p->ifree->nde;
val->type = ASE_AWK_VAL_INT; val->type = ASE_AWK_VAL_INT;
val->ref = 0; val->ref = 0;
@ -385,12 +415,20 @@ void ase_awk_freeval (ase_awk_run_t* run, ase_awk_val_t* val, ase_bool_t cache)
} }
else if (val->type == ASE_AWK_VAL_INT) else if (val->type == ASE_AWK_VAL_INT)
{ {
/*
if (cache && run->icache_count < ASE_COUNTOF(run->icache)) if (cache && run->icache_count < ASE_COUNTOF(run->icache))
{ {
run->icache[run->icache_count++] = run->icache[run->icache_count++] =
(ase_awk_val_int_t*)val; (ase_awk_val_int_t*)val;
} }
else ASE_AWK_FREE (run->awk, val); else ASE_AWK_FREE (run->awk, val);
*/
if (cache)
{
val->nde = (ase_awk_val_nde_t*)run->ifree;
run->ifree = val;
}
else ASE_AWK_FREE (run->awk, val);
} }
else if (val->type == ASE_AWK_VAL_REAL) else if (val->type == ASE_AWK_VAL_REAL)
{ {

View File

@ -59,6 +59,9 @@ typedef struct ase_awk_val_rex_t ase_awk_val_rex_t;
typedef struct ase_awk_val_map_t ase_awk_val_map_t; typedef struct ase_awk_val_map_t ase_awk_val_map_t;
typedef struct ase_awk_val_ref_t ase_awk_val_ref_t; typedef struct ase_awk_val_ref_t ase_awk_val_ref_t;
/* this is not a value. it is just a value holder */
typedef struct ase_awk_val_chunk_t ase_awk_val_chunk_t;
#if ASE_SIZEOF_INT == 2 #if ASE_SIZEOF_INT == 2
#define ASE_AWK_VAL_HDR \ #define ASE_AWK_VAL_HDR \
unsigned int type: 3; \ unsigned int type: 3; \
@ -149,6 +152,11 @@ struct ase_awk_val_ref_t
ase_awk_val_t** adr; ase_awk_val_t** adr;
}; };
struct ase_awk_val_chunk_t
{
ase_awk_val_chunk_t* next;
};
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif