[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