[Commit] nickle array.c, 1.19, 1.20 execute.c, 1.81, 1.82 gram.y, 1.123, 1.124 main.c, 1.33, 1.34 nickle.h, 1.104, 1.105 sched.c, 1.52, 1.53 type.c, 1.54, 1.55 value.c, 1.42, 1.43 value.h, 1.87, 1.88

Keith Packard commit at keithp.com
Sun Jun 29 22:53:45 PDT 2003


Committed by: keithp

Update of /local/src/CVS/nickle
In directory home.keithp.com:/tmp/cvs-serv6103

Modified Files:
	array.c execute.c gram.y main.c nickle.h sched.c type.c 
	value.c value.h 
Log Message:
Tag arrays as resizable/fixed-size.  Add setdims and setdim builtins

Index: array.c
===================================================================
RCS file: /local/src/CVS/nickle/array.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- array.c	17 Jun 2003 17:15:46 -0000	1.19
+++ array.c	30 Jun 2003 04:53:42 -0000	1.20
@@ -14,7 +14,7 @@
 ArrayInit (void)
 {
     ENTER ();
-    Empty = NewArray (True, typePoly, 0, 0);
+    Empty = NewArray (True, False, typePoly, 0, 0);
     MemAddRoot (Empty);
     EXIT ();
     return 1;
@@ -203,7 +203,7 @@
 };
 
 Value
-NewArray (Bool constant, TypePtr type, int ndim, int *dims)
+NewArray (Bool constant, Bool resizable, TypePtr type, int ndim, int *dims)
 {
     ENTER ();
     Value   ret;
@@ -220,7 +220,7 @@
 	ents = 0;
     ret = ALLOCATE (&ArrayRep.data, sizeof (Array) + (ndim * 2) * sizeof (int));
     ret->array.ndim = ndim;
-    ret->array.ents = ents;
+    ret->array.resizable = resizable;
     ret->array.values = 0;
     ret->array.values = NewBox (constant, True, ents, type);
     for (dim = 0; dim < ndim; dim++)
@@ -235,14 +235,16 @@
     int	    *dims = ArrayDims(a);
     int	    *limits = ArrayLimits(a);
 
-    if (dims[dim] <= size)
+    if (dims[dim] < size || dims[dim] > size * 2)
     {
 	ENTER ();
+	BoxPtr	obox = a->values;
 	BoxPtr	nbox;
 	int	odim = dims[dim];
-	int	ents = a->ents;
+	int	ents = obox->nvalues;
 	int	chunk_size;
-	int	chunk_skip;
+	int	chunk_ostride;
+	int	chunk_nstride;
 	int	chunk_zero;
 	int	d;
 	int	nchunk;
@@ -250,7 +252,7 @@
 
 	if (!ents)
 	{
-	    chunk_size = 0;
+	    chunk_ostride = 0;
 	    for (d = 0; d < a->ndim; d++)
 	    {
 		dims[d] = 1;
@@ -262,35 +264,72 @@
 	}
 	else
 	{
-	    chunk_size = 1;
+	    chunk_ostride = 1;
 	    for (d = 0; d <= dim; d++)
-		chunk_size *= dims[d];
-	    nchunk = ents / chunk_size;
+		chunk_ostride *= dims[d];
+	    nchunk = ents / chunk_ostride;
 	}
-	chunk_skip = chunk_size;
-	while (odim < size)
+	chunk_nstride = chunk_ostride;
+	if (odim < size)
 	{
-	    odim <<= 1;
-	    ents <<= 1;
-	    chunk_skip <<= 1;
+	    /* bigger */
+	    while (odim < size)
+	    {
+		odim <<= 1;
+		ents <<= 1;
+		chunk_nstride <<= 1;
+	    }
+	    chunk_size = chunk_ostride;
+	}
+	else if (size > 0)
+	{
+	    /* smaller */
+	    while (odim > size * 2)
+	    {
+		odim >>= 1;
+		ents >>= 1;
+		chunk_nstride >>= 1;
+	    }
+	    chunk_size = chunk_nstride;
+	}
+	else
+	{
+	    /* empty */
+	    ents = 0;
+	    chunk_nstride = 0;
+	    chunk_size = 0;
+	    for (d = 0; d < a->ndim; d++)
+	    {
+		dims[d] = 0;
+		limits[d] = 0;
+	    }
 	}
 	nbox = NewBox (a->values->constant, True, ents, a->values->u.type);
 	o = BoxElements (a->values);
 	n = BoxElements (nbox);
-	chunk_zero = chunk_skip - chunk_size;
+        chunk_zero = chunk_nstride - chunk_size;
 	while (nchunk--)
 	{
 	    memcpy (n, o, chunk_size * sizeof (Value));
-	    o += chunk_size;
+	    o += chunk_ostride;
 	    n += chunk_size;
 	    memset (n, '\0', chunk_zero * sizeof (Value));
 	    n += chunk_zero;
 	}
-	BoxSetReplace (a->values, nbox, chunk_size, chunk_skip);
+	BoxSetReplace (a->values, nbox, chunk_ostride, chunk_nstride);
 	a->values = nbox;
-	a->ents = ents;
 	dims[dim] = odim;
 	EXIT ();
     }
     limits[dim] = size;
+}
+
+void
+ArraySetDimensions (Value av, int *dims)
+{
+    Array   *a = &av->array;
+    int	    i;
+
+    for (i = 0; i < a->ndim; i++)
+	ArrayResize (av, i, dims[i]);
 }

Index: execute.c
===================================================================
RCS file: /local/src/CVS/nickle/execute.c,v
retrieving revision 1.81
retrieving revision 1.82
diff -u -d -r1.81 -r1.82
--- execute.c	10 Jun 2003 00:42:46 -0000	1.81
+++ execute.c	30 Jun 2003 04:53:42 -0000	1.82
@@ -57,7 +57,7 @@
 	int	extra = argc - nformal;
 	Value	array;
 	
-	array = NewArray (True, typePoly, 1, &extra);
+	array = NewArray (True, False, typePoly, 1, &extra);
 	BoxValueSet (frame->frame, fe, array);
 	for (; fe < argc; fe++)
 	    BoxValueSet (array->array.values, fe-nformal, Copy (Arg(fe)));
@@ -312,7 +312,7 @@
 }
 
 static Value
-ThreadArray (Value thread, int ndim, Type *type)
+ThreadArray (Value thread, Bool resizable, int ndim, Type *type)
 {
     ENTER ();
     int	    i;
@@ -325,7 +325,7 @@
 	if (aborting)
 	    RETURN (0);
     }
-    RETURN (NewArray (False, type, ndim, dims));
+    RETURN (NewArray (False, resizable, type, ndim, dims));
 }
 
 static int
@@ -574,7 +574,7 @@
      * Build and array to hold the arguments, this will end up
      * in the thread's value on entry to the catch block
      */
-    args = NewArray (False, typePoly, 1, &argc);
+    args = NewArray (False, False, typePoly, 1, &argc);
     for (i = 0; i < argc; i++)
         BoxValueSet (args->array.values, i, Arg(i));
     if (!aborting)
@@ -617,7 +617,7 @@
 	RETURN (Void);
     }
     complete = True;
-    argc = args->array.ents;
+    argc = args->array.values->nvalues;
     for (i = 0; i < argc; i++)
     {
 	STACK_PUSH (thread->thread.continuation.stack,
@@ -1077,7 +1077,8 @@
 		    break;
 		case OpBuildArray:
 		    stack = inst->array.ndim;
-		    value = ThreadArray (thread, stack, inst->array.type);
+		    /* XXX resizable? */
+		    value = ThreadArray (thread, True, stack, inst->array.type);
 		    break;
 		case OpInitArray:
 		    stack = 0;

Index: gram.y
===================================================================
RCS file: /local/src/CVS/nickle/gram.y,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -d -r1.123 -r1.124
--- gram.y	17 Jun 2003 17:10:15 -0000	1.123
+++ gram.y	30 Jun 2003 04:53:42 -0000	1.124
@@ -1618,7 +1618,7 @@
     len = 1;
     for (e = colonnames; e; e = e->tree.left)
 	len++;
-    array = NewArray (False, typePrim[rep_string], 1, &len);
+    array = NewArray (False, False, typePrim[rep_string], 1, &len);
     len--;
     BoxValueSet (array->array.values, len, AtomString (name));
     e = colonnames;

Index: main.c
===================================================================
RCS file: /local/src/CVS/nickle/main.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- main.c	10 Jun 2003 00:42:46 -0000	1.33
+++ main.c	30 Jun 2003 04:53:43 -0000	1.34
@@ -29,7 +29,7 @@
     Value   args;
     int	    i;
 
-    args = NewArray (True, typePrim[rep_string], 1, &argc);
+    args = NewArray (True, True, typePrim[rep_string], 1, &argc);
     for (i = 0; i < argc; i++)
 	BoxValueSet (args->array.values, i, NewStrString (argv[i]));
     setVar (GlobalNamespace, "argv", args, 

Index: nickle.h
===================================================================
RCS file: /local/src/CVS/nickle/nickle.h,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -d -r1.104 -r1.105
--- nickle.h	26 Jun 2003 08:59:10 -0000	1.104
+++ nickle.h	30 Jun 2003 04:53:43 -0000	1.105
@@ -1018,6 +1018,8 @@
 Value	do_File_setbuf (Value, Value);
 Value	do_String_index (Value, Value);
 Value	do_setjmp (Value, Value);
+Value	do_setdims (Value, Value);
+Value	do_setdim (Value, Value);
 Value	do_Command_new (Value, Value);
 Value	do_Command_new_names (Value, Value);
 #ifdef GCD_DEBUG

Index: sched.c
===================================================================
RCS file: /local/src/CVS/nickle/sched.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- sched.c	26 Jun 2003 11:18:22 -0000	1.52
+++ sched.c	30 Jun 2003 04:53:43 -0000	1.53
@@ -1069,10 +1069,11 @@
 	PrintError ("Unhandled exception %A (", except->symbol.name);
 	if (args)
 	{
-	    for (i = 0; i < args->array.ents; i++)
+	    BoxPtr  values = args->array.values;
+	    for (i = 0; i < values->nvalues; i++)
 	    {
-		PrintError ("%v", BoxValueGet (args->array.values, i));
-		if (i < args->array.ents - 1)
+		PrintError ("%v", BoxValueGet (values, i));
+		if (i < values->nvalues - 1)
 		    PrintError (", ");
 	    }
 	}
@@ -1133,7 +1134,7 @@
     
     va_start (va, argc);
     i = argc + 1;
-    args = NewArray (False, typePoly, 1, &i);
+    args = NewArray (False, False, typePoly, 1, &i);
     BoxValueSet (args->array.values, 0, NewStrString (string));
     if (argc)
 	for (i = 0; i < argc; i++)

Index: type.c
===================================================================
RCS file: /local/src/CVS/nickle/type.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- type.c	2 May 2003 00:23:38 -0000	1.54
+++ type.c	30 Jun 2003 04:53:43 -0000	1.55
@@ -1055,7 +1055,7 @@
 		    int	i;
 		    BoxPtr  box = b->array.values;
 
-		    for (i = 0; i < b->array.ents; i++)
+		    for (i = 0; i < box->nvalues; i++)
 			if (BoxValueGet (box, i) &&
 			    !TypeCompatibleAssign (a->array.type,
 						   BoxValueGet (box, i)))

Index: value.c
===================================================================
RCS file: /local/src/CVS/nickle/value.c,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -d -r1.42 -r1.43
--- value.c	3 Jun 2003 06:03:56 -0000	1.42
+++ value.c	30 Jun 2003 04:53:43 -0000	1.43
@@ -582,13 +582,13 @@
     case rep_array:
 	if (v->array.values->constant)
 	    RETURN (v);
-	nv = NewArray (False, ArrayType(&v->array),
+	nv = NewArray (False, v->array.resizable, ArrayType(&v->array),
 		       v->array.ndim, ArrayDims(&v->array));
 	for (i = 0; i < v->array.ndim; i++)
 	    ArrayLimits(&nv->array)[i] = ArrayLimits(&v->array)[i];
 	box = v->array.values;
 	nbox = nv->array.values;
-	n = v->array.ents;
+	n = box->nvalues;
 	break;
     case rep_struct:
 	if (v->structs.values->constant)

Index: value.h
===================================================================
RCS file: /local/src/CVS/nickle/value.h,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -d -r1.87 -r1.88
--- value.h	26 Jun 2003 08:59:10 -0000	1.87
+++ value.h	30 Jun 2003 04:53:43 -0000	1.88
@@ -516,8 +516,8 @@
 
 typedef struct _array {
     BaseValue	base;
-    int		ndim;
-    int		ents;
+    int		resizable : 1;
+    int		ndim : (sizeof (int) * 8 - 1);
     BoxPtr	values;
 } Array;
 
@@ -768,7 +768,7 @@
     unsigned long   constant : 1;
     unsigned long   homogeneous : 1;
     unsigned long   replace : 1;
-    unsigned long   nvalues : 29;
+    unsigned long   nvalues : (sizeof (unsigned long) * 8) - 3;
     union {
 	BoxTypesPtr	    types;
 	TypePtr		    type;
@@ -826,8 +826,9 @@
 
 Value	NewString (int);
 Value	NewStrString (char *);
-Value	NewArray (Bool constant, TypePtr type, int ndim, int *dims);
+Value	NewArray (Bool constant, Bool resizable, TypePtr type, int ndim, int *dims);
 void	ArrayResize (Value av, int dim, int size);
+void	ArraySetDimensions (Value av, int *dims);
 Value	NewFile (int fd);
 Value	NewRefReal (BoxPtr box, int element, Value *re);
 char	*StringNextChar (char *src, unsigned *dst);




More information about the Commit mailing list