*** empty log message ***
This commit is contained in:
parent
0260cdcdbf
commit
acbca7f730
@ -1,13 +1,10 @@
|
|||||||
OUT = aseawk
|
OUT = aseawk
|
||||||
|
|
||||||
# source files
|
C_SRCS = awk.c err.c tree.c str.c tab.c map.c parse.c \
|
||||||
C_SRCS = \
|
|
||||||
awk.c err.c tree.c str.c tab.c map.c parse.c \
|
|
||||||
run.c rec.c val.c func.c misc.c extio.c rex.c
|
run.c rec.c val.c func.c misc.c extio.c rex.c
|
||||||
JNI_SRCS = $(C_SRCS) jni.c
|
JNI_SRCS = $(C_SRCS) jni.c
|
||||||
JAVA_SRCS = Awk.java Exception.java Extio.java
|
JAVA_SRCS = Awk.java Exception.java Extio.java
|
||||||
|
|
||||||
# object files
|
|
||||||
C_OBJS = $(C_SRCS:.c=.obj)
|
C_OBJS = $(C_SRCS:.c=.obj)
|
||||||
JNI_OBJS = $(JNI_SRCS:.c=.obj)
|
JNI_OBJS = $(JNI_SRCS:.c=.obj)
|
||||||
JAVA_OBJS = $(JAVA_SRCS:.java=.class)
|
JAVA_OBJS = $(JAVA_SRCS:.java=.class)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: lsp.c,v 1.7 2006-10-24 04:22:39 bacon Exp $
|
* $Id: lsp.c,v 1.8 2006-10-24 15:31:35 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(__BORLANDC__)
|
#if defined(__BORLANDC__)
|
||||||
@ -76,15 +76,17 @@ ase_lsp_t* ase_lsp_open (
|
|||||||
lsp->input_arg = ASE_NULL;
|
lsp->input_arg = ASE_NULL;
|
||||||
lsp->output_arg = ASE_NULL;
|
lsp->output_arg = ASE_NULL;
|
||||||
|
|
||||||
lsp->mem = ase_lsp_mem_new (mem_ubound, mem_ubound_inc);
|
lsp->mem = ase_lsp_openmem (lsp, mem_ubound, mem_ubound_inc);
|
||||||
if (lsp->mem == ASE_NULL) {
|
if (lsp->mem == ASE_NULL)
|
||||||
|
{
|
||||||
ase_lsp_token_close (&lsp->token);
|
ase_lsp_token_close (&lsp->token);
|
||||||
if (lsp->__dynamic) ASE_LSP_FREE (lsp, lsp);
|
if (lsp->__dynamic) ASE_LSP_FREE (lsp, lsp);
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__add_builtin_prims(lsp) == -1) {
|
if (__add_builtin_prims(lsp) == -1)
|
||||||
ase_lsp_mem_free (lsp->mem);
|
{
|
||||||
|
ase_lsp_closemem (lsp->mem);
|
||||||
ase_lsp_token_close (&lsp->token);
|
ase_lsp_token_close (&lsp->token);
|
||||||
if (lsp->__dynamic) ASE_LSP_FREE (lsp, lsp);
|
if (lsp->__dynamic) ASE_LSP_FREE (lsp, lsp);
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
@ -98,7 +100,7 @@ ase_lsp_t* ase_lsp_open (
|
|||||||
|
|
||||||
void ase_lsp_close (ase_lsp_t* lsp)
|
void ase_lsp_close (ase_lsp_t* lsp)
|
||||||
{
|
{
|
||||||
ase_lsp_mem_free (lsp->mem);
|
ase_lsp_closemem (lsp->mem);
|
||||||
ase_lsp_token_close (&lsp->token);
|
ase_lsp_token_close (&lsp->token);
|
||||||
if (lsp->__dynamic) ASE_LSP_FREE (lsp, lsp);
|
if (lsp->__dynamic) ASE_LSP_FREE (lsp, lsp);
|
||||||
}
|
}
|
||||||
|
172
ase/lsp/mem.c
172
ase/lsp/mem.c
@ -1,54 +1,61 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: mem.c,v 1.12 2006-10-24 04:22:39 bacon Exp $
|
* $Id: mem.c,v 1.13 2006-10-24 15:31:35 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ase/lsp/lsp_i.h>
|
#include <ase/lsp/lsp_i.h>
|
||||||
|
|
||||||
ase_lsp_mem_t* ase_lsp_mem_new (ase_size_t ubound, ase_size_t ubound_inc)
|
ase_lsp_mem_t* ase_lsp_openmem (
|
||||||
|
ase_lsp_t* lsp, ase_size_t ubound, ase_size_t ubound_inc)
|
||||||
{
|
{
|
||||||
ase_lsp_mem_t* mem;
|
ase_lsp_mem_t* mem;
|
||||||
ase_size_t i;
|
ase_size_t i;
|
||||||
|
|
||||||
// allocate memory
|
/* allocate memory */
|
||||||
mem = (ase_lsp_mem_t*) ase_malloc (ase_sizeof(ase_lsp_mem_t));
|
mem = (ase_lsp_mem_t*) ASE_LSP_MALLOC (lsp, ase_sizeof(ase_lsp_mem_t));
|
||||||
if (mem == ASE_NULL) return ASE_NULL;
|
if (mem == ASE_NULL) return ASE_NULL;
|
||||||
|
|
||||||
// create a new root environment frame
|
ASE_LSP_MEMSET (lsp, mem, 0, ase_sizeof(ase_lsp_mem_t));
|
||||||
|
mem->lsp = lsp;
|
||||||
|
|
||||||
|
/* create a new root environment frame */
|
||||||
mem->frame = ase_lsp_frame_new ();
|
mem->frame = ase_lsp_frame_new ();
|
||||||
if (mem->frame == ASE_NULL) {
|
if (mem->frame == ASE_NULL)
|
||||||
ase_free (mem);
|
{
|
||||||
|
ASE_LSP_FREE (lsp, mem);
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
}
|
}
|
||||||
mem->root_frame = mem->frame;
|
mem->root_frame = mem->frame;
|
||||||
mem->brooding_frame = ASE_NULL;
|
mem->brooding_frame = ASE_NULL;
|
||||||
|
|
||||||
// create an array to hold temporary objects
|
/* create an array to hold temporary objects */
|
||||||
mem->temp_array = ase_lsp_array_new (512);
|
mem->temp_array = ase_lsp_array_new (512);
|
||||||
if (mem->temp_array == ASE_NULL) {
|
if (mem->temp_array == ASE_NULL)
|
||||||
|
{
|
||||||
ase_lsp_frame_free (mem->frame);
|
ase_lsp_frame_free (mem->frame);
|
||||||
ase_free (mem);
|
ASE_LSP_FREE (lsp, mem);
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// initialize object allocation list
|
/* initialize object allocation list */
|
||||||
mem->ubound = ubound;
|
mem->ubound = ubound;
|
||||||
mem->ubound_inc = ubound_inc;
|
mem->ubound_inc = ubound_inc;
|
||||||
mem->count = 0;
|
mem->count = 0;
|
||||||
for (i = 0; i < ASE_LSP_TYPE_COUNT; i++) {
|
for (i = 0; i < ASE_LSP_TYPE_COUNT; i++)
|
||||||
|
{
|
||||||
mem->used[i] = ASE_NULL;
|
mem->used[i] = ASE_NULL;
|
||||||
mem->free[i] = ASE_NULL;
|
mem->free[i] = ASE_NULL;
|
||||||
}
|
}
|
||||||
mem->locked = ASE_NULL;
|
mem->locked = ASE_NULL;
|
||||||
|
|
||||||
// when "ubound" is too small, the garbage collection can
|
/* when "ubound" is too small, the garbage collection can
|
||||||
// be performed while making the common objects.
|
* be performed while making the common objects. */
|
||||||
mem->nil = ASE_NULL;
|
mem->nil = ASE_NULL;
|
||||||
mem->t = ASE_NULL;
|
mem->t = ASE_NULL;
|
||||||
mem->quote = ASE_NULL;
|
mem->quote = ASE_NULL;
|
||||||
mem->lambda = ASE_NULL;
|
mem->lambda = ASE_NULL;
|
||||||
mem->macro = ASE_NULL;
|
mem->macro = ASE_NULL;
|
||||||
|
|
||||||
// initialize common object pointers
|
/* initialize common object pointers */
|
||||||
mem->nil = ase_lsp_make_nil (mem);
|
mem->nil = ase_lsp_make_nil (mem);
|
||||||
mem->t = ase_lsp_make_true (mem);
|
mem->t = ase_lsp_make_true (mem);
|
||||||
mem->quote = ase_lsp_make_symbol (mem, ASE_T("quote"));
|
mem->quote = ase_lsp_make_symbol (mem, ASE_T("quote"));
|
||||||
@ -59,32 +66,31 @@ ase_lsp_mem_t* ase_lsp_mem_new (ase_size_t ubound, ase_size_t ubound_inc)
|
|||||||
mem->t == ASE_NULL ||
|
mem->t == ASE_NULL ||
|
||||||
mem->quote == ASE_NULL ||
|
mem->quote == ASE_NULL ||
|
||||||
mem->lambda == ASE_NULL ||
|
mem->lambda == ASE_NULL ||
|
||||||
mem->macro == ASE_NULL) {
|
mem->macro == ASE_NULL)
|
||||||
|
{
|
||||||
ase_lsp_dispose_all (mem);
|
ase_lsp_dispose_all (mem);
|
||||||
ase_lsp_array_free (mem->temp_array);
|
ase_lsp_array_free (mem->temp_array);
|
||||||
ase_lsp_frame_free (mem->frame);
|
ase_lsp_frame_free (mem->frame);
|
||||||
ase_free (mem);
|
ASE_LSP_FREE (lsp, mem);
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ase_lsp_mem_free (ase_lsp_mem_t* mem)
|
void ase_lsp_closemem (ase_lsp_mem_t* mem)
|
||||||
{
|
{
|
||||||
ase_assert (mem != ASE_NULL);
|
/* dispose of the allocated objects */
|
||||||
|
|
||||||
// dispose of the allocated objects
|
|
||||||
ase_lsp_dispose_all (mem);
|
ase_lsp_dispose_all (mem);
|
||||||
|
|
||||||
// dispose of the temporary object arrays
|
/* dispose of the temporary object arrays */
|
||||||
ase_lsp_array_free (mem->temp_array);
|
ase_lsp_array_free (mem->temp_array);
|
||||||
|
|
||||||
// dispose of environment frames
|
/* dispose of environment frames */
|
||||||
ase_lsp_frame_free (mem->frame);
|
ase_lsp_frame_free (mem->frame);
|
||||||
|
|
||||||
// free the memory
|
/* free the memory */
|
||||||
ase_free (mem);
|
ASE_LSP_FREE (mem->lsp, mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __add_prim (ase_lsp_mem_t* mem,
|
static int __add_prim (ase_lsp_mem_t* mem,
|
||||||
@ -149,7 +155,7 @@ ase_lsp_obj_t* ase_lsp_alloc (ase_lsp_mem_t* mem, int type, ase_size_t size)
|
|||||||
{
|
{
|
||||||
ase_lsp_obj_t* obj;
|
ase_lsp_obj_t* obj;
|
||||||
|
|
||||||
if (mem->count >= mem->ubound) ase_lsp_garbage_collect (mem);
|
if (mem->count >= mem->ubound) ase_lsp_collectgarbage (mem);
|
||||||
if (mem->count >= mem->ubound) {
|
if (mem->count >= mem->ubound) {
|
||||||
mem->ubound += mem->ubound_inc;
|
mem->ubound += mem->ubound_inc;
|
||||||
if (mem->count >= mem->ubound) return ASE_NULL;
|
if (mem->count >= mem->ubound) return ASE_NULL;
|
||||||
@ -157,7 +163,7 @@ ase_lsp_obj_t* ase_lsp_alloc (ase_lsp_mem_t* mem, int type, ase_size_t size)
|
|||||||
|
|
||||||
obj = (ase_lsp_obj_t*) ase_malloc (size);
|
obj = (ase_lsp_obj_t*) ase_malloc (size);
|
||||||
if (obj == ASE_NULL) {
|
if (obj == ASE_NULL) {
|
||||||
ase_lsp_garbage_collect (mem);
|
ase_lsp_collectgarbage (mem);
|
||||||
|
|
||||||
obj = (ase_lsp_obj_t*) ase_malloc (size);
|
obj = (ase_lsp_obj_t*) ase_malloc (size);
|
||||||
if (obj == ASE_NULL) return ASE_NULL;
|
if (obj == ASE_NULL) return ASE_NULL;
|
||||||
@ -180,11 +186,11 @@ ase_lsp_obj_t* ase_lsp_alloc (ase_lsp_mem_t* mem, int type, ase_size_t size)
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ase_lsp_dispose (ase_lsp_mem_t* mem, ase_lsp_obj_t* prev, ase_lsp_obj_t* obj)
|
void ase_lsp_dispose (
|
||||||
|
ase_lsp_mem_t* mem, ase_lsp_obj_t* prev, ase_lsp_obj_t* obj)
|
||||||
{
|
{
|
||||||
ase_assert (mem != ASE_NULL);
|
ase_lsp_assert (mem->lsp, obj != ASE_NULL);
|
||||||
ase_assert (obj != ASE_NULL);
|
ase_lsp_assert (mem->lsp, mem->count > 0);
|
||||||
ase_assert (mem->count > 0);
|
|
||||||
|
|
||||||
// TODO: push the object to the free list for more
|
// TODO: push the object to the free list for more
|
||||||
// efficient memory management
|
// efficient memory management
|
||||||
@ -198,7 +204,7 @@ void ase_lsp_dispose (ase_lsp_mem_t* mem, ase_lsp_obj_t* prev, ase_lsp_obj_t* ob
|
|||||||
ase_dprint1 (ASE_T("mem->count: %u\n"), mem->count);
|
ase_dprint1 (ASE_T("mem->count: %u\n"), mem->count);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ase_free (obj);
|
ASE_LSP_FREE (mem->lsp, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ase_lsp_dispose_all (ase_lsp_mem_t* mem)
|
void ase_lsp_dispose_all (ase_lsp_mem_t* mem)
|
||||||
@ -206,10 +212,12 @@ void ase_lsp_dispose_all (ase_lsp_mem_t* mem)
|
|||||||
ase_lsp_obj_t* obj, * next;
|
ase_lsp_obj_t* obj, * next;
|
||||||
ase_size_t i;
|
ase_size_t i;
|
||||||
|
|
||||||
for (i = 0; i < ASE_LSP_TYPE_COUNT; i++) {
|
for (i = 0; i < ASE_LSP_TYPE_COUNT; i++)
|
||||||
|
{
|
||||||
obj = mem->used[i];
|
obj = mem->used[i];
|
||||||
|
|
||||||
while (obj != ASE_NULL) {
|
while (obj != ASE_NULL)
|
||||||
|
{
|
||||||
next = ASE_LSP_LINK(obj);
|
next = ASE_LSP_LINK(obj);
|
||||||
ase_lsp_dispose (mem, ASE_NULL, obj);
|
ase_lsp_dispose (mem, ASE_NULL, obj);
|
||||||
obj = next;
|
obj = next;
|
||||||
@ -217,7 +225,7 @@ void ase_lsp_dispose_all (ase_lsp_mem_t* mem)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ase_lsp_mark_obj (ase_lsp_obj_t* obj)
|
static void __mark_obj (ase_lsp_obj_t* obj)
|
||||||
{
|
{
|
||||||
ase_assert (obj != ASE_NULL);
|
ase_assert (obj != ASE_NULL);
|
||||||
|
|
||||||
@ -227,57 +235,63 @@ static void ase_lsp_mark_obj (ase_lsp_obj_t* obj)
|
|||||||
|
|
||||||
ASE_LSP_MARK(obj) = 1;
|
ASE_LSP_MARK(obj) = 1;
|
||||||
|
|
||||||
if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_CONS) {
|
if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_CONS)
|
||||||
ase_lsp_mark_obj (ASE_LSP_CAR(obj));
|
{
|
||||||
ase_lsp_mark_obj (ASE_LSP_CDR(obj));
|
__mark_obj (ASE_LSP_CAR(obj));
|
||||||
|
__mark_obj (ASE_LSP_CDR(obj));
|
||||||
}
|
}
|
||||||
else if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_FUNC) {
|
else if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_FUNC)
|
||||||
ase_lsp_mark_obj (ASE_LSP_FFORMAL(obj));
|
{
|
||||||
ase_lsp_mark_obj (ASE_LSP_FBODY(obj));
|
__mark_obj (ASE_LSP_FFORMAL(obj));
|
||||||
|
__mark_obj (ASE_LSP_FBODY(obj));
|
||||||
}
|
}
|
||||||
else if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_MACRO) {
|
else if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_MACRO)
|
||||||
ase_lsp_mark_obj (ASE_LSP_MFORMAL(obj));
|
{
|
||||||
ase_lsp_mark_obj (ASE_LSP_MBODY(obj));
|
__mark_obj (ASE_LSP_MFORMAL(obj));
|
||||||
|
__mark_obj (ASE_LSP_MBODY(obj));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ase_lsp_lock and ase_lsp_unlock_all are just called by ase_lsp_read.
|
* ase_lsp_lock and ase_lsp_unlockallobjs are just called by ase_lsp_read.
|
||||||
*/
|
*/
|
||||||
void ase_lsp_lock (ase_lsp_obj_t* obj)
|
void ase_lsp_lockobj (ase_lsp_obj_t* obj)
|
||||||
{
|
{
|
||||||
ase_assert (obj != ASE_NULL);
|
ase_assert (obj != ASE_NULL);
|
||||||
ASE_LSP_LOCK(obj) = 1;
|
ASE_LSP_LOCK(obj) = 1;
|
||||||
//ASE_LSP_MARK(obj) = 1;
|
//ASE_LSP_MARK(obj) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ase_lsp_unlock (ase_lsp_obj_t* obj)
|
void ase_lsp_unlockobj (ase_lsp_obj_t* obj)
|
||||||
{
|
{
|
||||||
ase_assert (obj != ASE_NULL);
|
ase_assert (obj != ASE_NULL);
|
||||||
ASE_LSP_LOCK(obj) = 0;
|
ASE_LSP_LOCK(obj) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ase_lsp_unlock_all (ase_lsp_obj_t* obj)
|
void ase_lsp_unlockallobjs (ase_lsp_obj_t* obj)
|
||||||
{
|
{
|
||||||
ase_assert (obj != ASE_NULL);
|
ase_assert (obj != ASE_NULL);
|
||||||
|
|
||||||
ASE_LSP_LOCK(obj) = 0;
|
ASE_LSP_LOCK(obj) = 0;
|
||||||
|
|
||||||
if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_CONS) {
|
if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_CONS)
|
||||||
ase_lsp_unlock_all (ASE_LSP_CAR(obj));
|
{
|
||||||
ase_lsp_unlock_all (ASE_LSP_CDR(obj));
|
ase_lsp_unlockallobjs (ASE_LSP_CAR(obj));
|
||||||
|
ase_lsp_unlockallobjs (ASE_LSP_CDR(obj));
|
||||||
}
|
}
|
||||||
else if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_FUNC) {
|
else if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_FUNC)
|
||||||
ase_lsp_unlock_all (ASE_LSP_FFORMAL(obj));
|
{
|
||||||
ase_lsp_unlock_all (ASE_LSP_FBODY(obj));
|
ase_lsp_unlockallobjs (ASE_LSP_FFORMAL(obj));
|
||||||
|
ase_lsp_unlockallobjs (ASE_LSP_FBODY(obj));
|
||||||
}
|
}
|
||||||
else if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_MACRO) {
|
else if (ASE_LSP_TYPE(obj) == ASE_LSP_OBJ_MACRO)
|
||||||
ase_lsp_unlock_all (ASE_LSP_MFORMAL(obj));
|
{
|
||||||
ase_lsp_unlock_all (ASE_LSP_MBODY(obj));
|
ase_lsp_unlockallobjs (ASE_LSP_MFORMAL(obj));
|
||||||
|
ase_lsp_unlockallobjs (ASE_LSP_MBODY(obj));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ase_lsp_mark (ase_lsp_mem_t* mem)
|
static void ase_lsp_markobjsinuse (ase_lsp_mem_t* mem)
|
||||||
{
|
{
|
||||||
ase_lsp_frame_t* frame;
|
ase_lsp_frame_t* frame;
|
||||||
ase_lsp_assoc_t* assoc;
|
ase_lsp_assoc_t* assoc;
|
||||||
@ -287,17 +301,19 @@ static void ase_lsp_mark (ase_lsp_mem_t* mem)
|
|||||||
#if 0
|
#if 0
|
||||||
ase_dprint0 (ASE_T("marking environment frames\n"));
|
ase_dprint0 (ASE_T("marking environment frames\n"));
|
||||||
#endif
|
#endif
|
||||||
// mark objects in the environment frames
|
/* mark objects in the environment frames */
|
||||||
frame = mem->frame;
|
frame = mem->frame;
|
||||||
while (frame != ASE_NULL) {
|
while (frame != ASE_NULL)
|
||||||
|
{
|
||||||
assoc = frame->assoc;
|
assoc = frame->assoc;
|
||||||
while (assoc != ASE_NULL) {
|
while (assoc != ASE_NULL)
|
||||||
ase_lsp_mark_obj (assoc->name);
|
{
|
||||||
|
__mark_obj (assoc->name);
|
||||||
|
|
||||||
if (assoc->value != ASE_NULL)
|
if (assoc->value != ASE_NULL)
|
||||||
ase_lsp_mark_obj (assoc->value);
|
__mark_obj (assoc->value);
|
||||||
if (assoc->func != ASE_NULL)
|
if (assoc->func != ASE_NULL)
|
||||||
ase_lsp_mark_obj (assoc->func);
|
__mark_obj (assoc->func);
|
||||||
|
|
||||||
assoc = assoc->link;
|
assoc = assoc->link;
|
||||||
}
|
}
|
||||||
@ -315,12 +331,12 @@ static void ase_lsp_mark (ase_lsp_mem_t* mem)
|
|||||||
|
|
||||||
assoc = frame->assoc;
|
assoc = frame->assoc;
|
||||||
while (assoc != ASE_NULL) {
|
while (assoc != ASE_NULL) {
|
||||||
ase_lsp_mark_obj (assoc->name);
|
__mark_obj (assoc->name);
|
||||||
|
|
||||||
if (assoc->value != ASE_NULL)
|
if (assoc->value != ASE_NULL)
|
||||||
ase_lsp_mark_obj (assoc->value);
|
__mark_obj (assoc->value);
|
||||||
if (assoc->func != ASE_NULL)
|
if (assoc->func != ASE_NULL)
|
||||||
ase_lsp_mark_obj (assoc->func);
|
__mark_obj (assoc->func);
|
||||||
|
|
||||||
assoc = assoc->link;
|
assoc = assoc->link;
|
||||||
}
|
}
|
||||||
@ -330,7 +346,7 @@ static void ase_lsp_mark (ase_lsp_mem_t* mem)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
ase_dprint0 (ASE_T("marking the locked object\n"));
|
ase_dprint0 (ASE_T("marking the locked object\n"));
|
||||||
if (mem->locked != ASE_NULL) ase_lsp_mark_obj (mem->locked);
|
if (mem->locked != ASE_NULL) __mark_obj (mem->locked);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
@ -338,21 +354,21 @@ static void ase_lsp_mark (ase_lsp_mem_t* mem)
|
|||||||
#endif
|
#endif
|
||||||
array = mem->temp_array;
|
array = mem->temp_array;
|
||||||
for (i = 0; i < array->size; i++) {
|
for (i = 0; i < array->size; i++) {
|
||||||
ase_lsp_mark_obj (array->buffer[i]);
|
__mark_obj (array->buffer[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
ase_dprint0 (ASE_T("marking builtin objects\n"));
|
ase_dprint0 (ASE_T("marking builtin objects\n"));
|
||||||
#endif
|
#endif
|
||||||
// mark common objects
|
// mark common objects
|
||||||
if (mem->t != ASE_NULL) ase_lsp_mark_obj (mem->t);
|
if (mem->t != ASE_NULL) __mark_obj (mem->t);
|
||||||
if (mem->nil != ASE_NULL) ase_lsp_mark_obj (mem->nil);
|
if (mem->nil != ASE_NULL) __mark_obj (mem->nil);
|
||||||
if (mem->quote != ASE_NULL) ase_lsp_mark_obj (mem->quote);
|
if (mem->quote != ASE_NULL) __mark_obj (mem->quote);
|
||||||
if (mem->lambda != ASE_NULL) ase_lsp_mark_obj (mem->lambda);
|
if (mem->lambda != ASE_NULL) __mark_obj (mem->lambda);
|
||||||
if (mem->macro != ASE_NULL) ase_lsp_mark_obj (mem->macro);
|
if (mem->macro != ASE_NULL) __mark_obj (mem->macro);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ase_lsp_sweep (ase_lsp_mem_t* mem)
|
static void ase_lsp_sweepunmarkedobjs (ase_lsp_mem_t* mem)
|
||||||
{
|
{
|
||||||
ase_lsp_obj_t* obj, * prev, * next;
|
ase_lsp_obj_t* obj, * prev, * next;
|
||||||
ase_size_t i;
|
ase_size_t i;
|
||||||
@ -386,10 +402,10 @@ static void ase_lsp_sweep (ase_lsp_mem_t* mem)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ase_lsp_garbage_collect (ase_lsp_mem_t* mem)
|
void ase_lsp_collectgarbage (ase_lsp_mem_t* mem)
|
||||||
{
|
{
|
||||||
ase_lsp_mark (mem);
|
ase_lsp_markobjsinuse (mem);
|
||||||
ase_lsp_sweep (mem);
|
ase_lsp_sweepunmarkedobjs (mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
ase_lsp_obj_t* ase_lsp_make_nil (ase_lsp_mem_t* mem)
|
ase_lsp_obj_t* ase_lsp_make_nil (ase_lsp_mem_t* mem)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: mem.h,v 1.9 2006-10-24 04:22:39 bacon Exp $
|
* $Id: mem.h,v 1.10 2006-10-24 15:31:35 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ASE_LSP_MEM_H_
|
#ifndef _ASE_LSP_MEM_H_
|
||||||
@ -9,8 +9,12 @@
|
|||||||
#include <ase/lsp/env.h>
|
#include <ase/lsp/env.h>
|
||||||
#include <ase/lsp/array.h>
|
#include <ase/lsp/array.h>
|
||||||
|
|
||||||
|
typedef struct ase_lsp_mem_t ase_lsp_mem_t;
|
||||||
|
|
||||||
struct ase_lsp_mem_t
|
struct ase_lsp_mem_t
|
||||||
{
|
{
|
||||||
|
ase_lsp_t* lsp;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* object allocation list
|
* object allocation list
|
||||||
*/
|
*/
|
||||||
@ -45,25 +49,25 @@ struct ase_lsp_mem_t
|
|||||||
ase_lsp_array_t* temp_array;
|
ase_lsp_array_t* temp_array;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ase_lsp_mem_t ase_lsp_mem_t;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ase_lsp_mem_t* ase_lsp_mem_new (ase_size_t ubound, ase_size_t ubound_inc);
|
ase_lsp_mem_t* ase_lsp_openmem (
|
||||||
void ase_lsp_mem_free (ase_lsp_mem_t* mem);
|
ase_lsp_t* lsp, ase_size_t ubound, ase_size_t ubound_inc);
|
||||||
|
void ase_lsp_closemem (ase_lsp_mem_t* mem);
|
||||||
|
|
||||||
int ase_lsp_add_builtin_prims (ase_lsp_mem_t* mem);
|
int ase_lsp_add_builtin_prims (ase_lsp_mem_t* mem);
|
||||||
|
|
||||||
ase_lsp_obj_t* ase_lsp_alloc (ase_lsp_mem_t* mem, int type, ase_size_t size);
|
ase_lsp_obj_t* ase_lsp_alloc (ase_lsp_mem_t* mem, int type, ase_size_t size);
|
||||||
void ase_lsp_dispose (ase_lsp_mem_t* mem, ase_lsp_obj_t* prev, ase_lsp_obj_t* obj);
|
void ase_lsp_dispose (ase_lsp_mem_t* mem, ase_lsp_obj_t* prev, ase_lsp_obj_t* obj);
|
||||||
void ase_lsp_dispose_all (ase_lsp_mem_t* mem);
|
void ase_lsp_dispose_all (ase_lsp_mem_t* mem);
|
||||||
void ase_lsp_garbage_collect (ase_lsp_mem_t* mem);
|
void ase_lsp_collectgarbage (ase_lsp_mem_t* mem);
|
||||||
|
|
||||||
void ase_lsp_lock (ase_lsp_obj_t* obj);
|
void ase_lsp_lockobj (ase_lsp_obj_t* obj);
|
||||||
void ase_lsp_unlock (ase_lsp_obj_t* obj);
|
void ase_lsp_unlockobj (ase_lsp_obj_t* obj);
|
||||||
void ase_lsp_unlock_all (ase_lsp_obj_t* obj);
|
void ase_lsp_unlockallobjs (ase_lsp_obj_t* obj);
|
||||||
|
|
||||||
// object creation of standard types
|
// object creation of standard types
|
||||||
ase_lsp_obj_t* ase_lsp_make_nil (ase_lsp_mem_t* mem);
|
ase_lsp_obj_t* ase_lsp_make_nil (ase_lsp_mem_t* mem);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: read.c,v 1.20 2006-10-24 04:22:39 bacon Exp $
|
* $Id: read.c,v 1.21 2006-10-24 15:31:35 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ase/lsp/lsp.h>
|
#include <ase/lsp/lsp.h>
|
||||||
@ -73,7 +73,7 @@ ase_lsp_obj_t* ase_lsp_read (ase_lsp_t* lsp)
|
|||||||
NEXT_TOKEN (lsp);
|
NEXT_TOKEN (lsp);
|
||||||
|
|
||||||
if (lsp->mem->locked != ASE_NULL) {
|
if (lsp->mem->locked != ASE_NULL) {
|
||||||
ase_lsp_unlock_all (lsp->mem->locked);
|
ase_lsp_unlockallobjs (lsp->mem->locked);
|
||||||
lsp->mem->locked = ASE_NULL;
|
lsp->mem->locked = ASE_NULL;
|
||||||
}
|
}
|
||||||
lsp->mem->locked = read_obj (lsp);
|
lsp->mem->locked = read_obj (lsp);
|
||||||
@ -97,18 +97,18 @@ static ase_lsp_obj_t* read_obj (ase_lsp_t* lsp)
|
|||||||
case TOKEN_INT:
|
case TOKEN_INT:
|
||||||
obj = ase_lsp_make_int (lsp->mem, TOKEN_IVALUE(lsp));
|
obj = ase_lsp_make_int (lsp->mem, TOKEN_IVALUE(lsp));
|
||||||
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ERR_MEMORY;
|
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ERR_MEMORY;
|
||||||
ase_lsp_lock (obj);
|
ase_lsp_lockobj (obj);
|
||||||
return obj;
|
return obj;
|
||||||
case TOKEN_REAL:
|
case TOKEN_REAL:
|
||||||
obj = ase_lsp_make_real (lsp->mem, TOKEN_RVALUE(lsp));
|
obj = ase_lsp_make_real (lsp->mem, TOKEN_RVALUE(lsp));
|
||||||
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ERR_MEMORY;
|
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ERR_MEMORY;
|
||||||
ase_lsp_lock (obj);
|
ase_lsp_lockobj (obj);
|
||||||
return obj;
|
return obj;
|
||||||
case TOKEN_STRING:
|
case TOKEN_STRING:
|
||||||
obj = ase_lsp_make_stringx (
|
obj = ase_lsp_make_stringx (
|
||||||
lsp->mem, TOKEN_SVALUE(lsp), TOKEN_SLENGTH(lsp));
|
lsp->mem, TOKEN_SVALUE(lsp), TOKEN_SLENGTH(lsp));
|
||||||
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ERR_MEMORY;
|
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ERR_MEMORY;
|
||||||
ase_lsp_lock (obj);
|
ase_lsp_lockobj (obj);
|
||||||
return obj;
|
return obj;
|
||||||
case TOKEN_IDENT:
|
case TOKEN_IDENT:
|
||||||
ase_assert (lsp->mem->nil != ASE_NULL && lsp->mem->t != ASE_NULL);
|
ase_assert (lsp->mem->nil != ASE_NULL && lsp->mem->t != ASE_NULL);
|
||||||
@ -118,7 +118,7 @@ static ase_lsp_obj_t* read_obj (ase_lsp_t* lsp)
|
|||||||
obj = ase_lsp_make_symbolx (
|
obj = ase_lsp_make_symbolx (
|
||||||
lsp->mem, TOKEN_SVALUE(lsp), TOKEN_SLENGTH(lsp));
|
lsp->mem, TOKEN_SVALUE(lsp), TOKEN_SLENGTH(lsp));
|
||||||
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ERR_MEMORY;
|
if (obj == ASE_NULL) lsp->errnum = ASE_LSP_ERR_MEMORY;
|
||||||
ase_lsp_lock (obj);
|
ase_lsp_lockobj (obj);
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@ -179,7 +179,7 @@ static ase_lsp_obj_t* read_list (ase_lsp_t* lsp)
|
|||||||
lsp->errnum = ASE_LSP_ERR_MEMORY;
|
lsp->errnum = ASE_LSP_ERR_MEMORY;
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
}
|
}
|
||||||
ase_lsp_lock ((ase_lsp_obj_t*)p);
|
ase_lsp_lockobj ((ase_lsp_obj_t*)p);
|
||||||
|
|
||||||
if (first == ASE_NULL) first = p;
|
if (first == ASE_NULL) first = p;
|
||||||
if (prev != ASE_NULL) prev->cdr = (ase_lsp_obj_t*)p;
|
if (prev != ASE_NULL) prev->cdr = (ase_lsp_obj_t*)p;
|
||||||
@ -211,14 +211,14 @@ static ase_lsp_obj_t* read_quote (ase_lsp_t* lsp)
|
|||||||
lsp->errnum = ASE_LSP_ERR_MEMORY;
|
lsp->errnum = ASE_LSP_ERR_MEMORY;
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
}
|
}
|
||||||
ase_lsp_lock (cons);
|
ase_lsp_lockobj (cons);
|
||||||
|
|
||||||
cons = ase_lsp_make_cons (lsp->mem, lsp->mem->quote, cons);
|
cons = ase_lsp_make_cons (lsp->mem, lsp->mem->quote, cons);
|
||||||
if (cons == ASE_NULL) {
|
if (cons == ASE_NULL) {
|
||||||
lsp->errnum = ASE_LSP_ERR_MEMORY;
|
lsp->errnum = ASE_LSP_ERR_MEMORY;
|
||||||
return ASE_NULL;
|
return ASE_NULL;
|
||||||
}
|
}
|
||||||
ase_lsp_lock (cons);
|
ase_lsp_lockobj (cons);
|
||||||
|
|
||||||
return cons;
|
return cons;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user