home: hub: 9ficl

Download patch

ref: bedc04c61570b08e55444136805b94dade678697
parent: 5858c58946f9166810de28c40b1839e0b386835f
author: asau <asau@ficl.sf.net>
date: Sat Dec 4 15:38:47 CST 2010

Allocate separate memory region for stack data.

--- a/ficl.h
+++ b/ficl.h
@@ -4,7 +4,7 @@
 ** Author: John Sadler (john_sadler@alum.mit.edu)
 ** Created: 19 July 1997
 ** Dedicated to RHS, in loving memory
-** $Id: ficl.h,v 1.28 2010/11/03 14:44:38 asau Exp $
+** $Id: ficl.h,v 1.29 2010/12/04 21:38:47 asau Exp $
 ********************************************************************
 **
 ** Copyright (c) 1997-2001 John Sadler (john_sadler@alum.mit.edu)
@@ -931,7 +931,7 @@
     ficlCell *top;     /* stack pointer */
     ficlVm *vm;        /* used for debugging */
     char *name;        /* used for debugging */
-    ficlCell base[1];  /* Top of stack */
+    ficlCell *base;    /* Top of stack */
 } ficlStack;
 
 /*
--- a/stack.c
+++ b/stack.c
@@ -3,7 +3,7 @@
 ** Forth Inspired Command Language
 ** Author: John Sadler (john_sadler@alum.mit.edu)
 ** Created: 16 Oct 1997
-** $Id: stack.c,v 1.14 2010/12/02 16:28:03 asau Exp $
+** $Id: stack.c,v 1.15 2010/12/04 21:38:47 asau Exp $
 *******************************************************************/
 /*
 ** Copyright (c) 1997-2001 John Sadler (john_sadler@alum.mit.edu)
@@ -98,13 +98,15 @@
 
 ficlStack *ficlStackCreate(ficlVm *vm, char *name, unsigned size)
 {
-    size_t totalSize = sizeof (ficlStack) + (size * sizeof (ficlCell));
-    ficlStack *stack = (ficlStack*)ficlMalloc(totalSize);
+    ficlCell *base = (ficlCell*)ficlMalloc(size * sizeof (ficlCell));
+    ficlStack *stack = (ficlStack*)ficlMalloc(sizeof (ficlStack));
 
     FICL_VM_ASSERT(vm, size != 0);
+    FICL_VM_ASSERT(vm, base != NULL);
     FICL_VM_ASSERT(vm, stack != NULL);
 
     stack->size = size;
+    stack->base = base;
     stack->frame = NULL;
 
 	stack->vm = vm;
@@ -122,8 +124,11 @@
 
 void ficlStackDestroy(ficlStack *stack)
 {
-    if (stack)
+    if (stack != NULL) {
+	if (stack->base != NULL)
+	    ficlFree(stack->base);
         ficlFree(stack);
+    }
     return;
 }