--- a/Behavior.st Thu Jun 02 09:21:01 2016 +0100
+++ b/Behavior.st Mon Jun 06 10:37:21 2016 +0100
@@ -2534,6 +2534,7 @@
unsigned INT nInstVars;
unsigned INT instsize;
INT nindexedinstvars;
+ unsigned INT nBytes;
unsigned INT flags;
# if ! defined(FAST_ARRAY_MEMSET)
REGISTER char *cp;
@@ -2555,8 +2556,8 @@
flags = __intVal(__INST(flags)) & ARRAYMASK;
switch (flags) {
case BYTEARRAY:
- instsize = OHDR_SIZE + nindexedinstvars;
- if (nInstVars == 0) {
+ nBytes = nindexedinstvars + __OBJS2BYTES__(nInstVars);
+ instsize = OHDR_SIZE + nBytes;
if (__CanDoQuickNew(instsize)) { /* OBJECT ALLOCATION */
/*
* the most common case
@@ -2564,29 +2565,34 @@
__qCheckedNew(newobj, instsize);
__InstPtr(newobj)->o_class = self;
__qSTORE(newobj, self);
-
+ nilIt:
+ cp = (char *)__InstPtr(newobj)->i_instvars;
# if defined(memset4) && defined(FAST_ARRAY_MEMSET4) || defined(FAST_MEMSET4)
- nInstVars = nindexedinstvars >> 2;
- if (nindexedinstvars & 3) nInstVars++;
- memset4(__InstPtr(newobj)->i_instvars, 0, nInstVars);
+ memset4(cp, 0, (nBytes+3) >> 2);
+# elif defined(FAST_ARRAY_MEMSET)
+ memset(cp, 0, nBytes);
# else
-# if defined(FAST_ARRAY_MEMSET)
- memset(__InstPtr(newobj)->i_instvars, 0, nindexedinstvars);
-# else
- cp = (char *)__InstPtr(newobj)->i_instvars;
- while (nindexedinstvars >= sizeof(INT)) {
+ while (nBytes >= (sizeof(INT) * 8L)) {
+ ((INT *)cp)[0] = (INT)0;
+ ((INT *)cp)[1] = (INT)0;
+ ((INT *)cp)[2] = (INT)0;
+ ((INT *)cp)[3] = (INT)0;
+ ((INT *)cp)[4] = (INT)0;
+ ((INT *)cp)[5] = (INT)0;
+ ((INT *)cp)[6] = (INT)0;
+ ((INT *)cp)[7] = (INT)0;
+ cp += (sizeof(INT) * 8L);
+ nBytes -= (sizeof(INT) * 8L);
+ }
+ while (nBytes >= sizeof(INT)) {
*(INT *)cp = (INT)0;
cp += sizeof(INT);
- nindexedinstvars -= sizeof(INT);
+ nBytes -= sizeof(INT);
}
- while (nindexedinstvars--)
- *cp++ = '\0';
-# endif
+ while (nBytes--)
+ *cp++ = 0;
# endif
RETURN ( newobj );
- }
- } else {
- instsize += __OBJS2BYTES__(nInstVars);
}
__PROTECT_CONTEXT__
__qNew(newobj, instsize); /* OBJECT ALLOCATION */
@@ -2596,39 +2602,13 @@
}
__InstPtr(newobj)->o_class = self;
__qSTORE(newobj, self);
-
-# if defined(memset4) && defined(FAST_ARRAY_MEMSET4) || defined(FAST_MEMSET4)
- nInstVars = (instsize-OHDR_SIZE) >> 2;
- if (instsize & 3) nInstVars++;
- memset4(__InstPtr(newobj)->i_instvars, 0, nInstVars);
-# else
-# if defined(FAST_ARRAY_MEMSET)
- /*
- * knowing that nil is 0
- */
- memset(__InstPtr(newobj)->i_instvars, 0, instsize-OHDR_SIZE);
-# else
- op = __InstPtr(newobj)->i_instvars;
- while (nInstVars--)
- *op++ = nil;
- cp = (char *)op;
- while (nindexedinstvars >= sizeof(INT)) {
- *(INT *)cp = 0;
- cp += sizeof(INT);
- nindexedinstvars -= sizeof(INT);
- }
- while (nindexedinstvars--)
- *cp++ = '\0';
-# endif
-# endif
- RETURN ( newobj );
+ goto nilIt;
break;
case WORDARRAY:
case SWORDARRAY:
- instsize = OHDR_SIZE +
- __OBJS2BYTES__(nInstVars) +
- nindexedinstvars * 2;
+ nBytes = __OBJS2BYTES__(nInstVars) + nindexedinstvars * 2;
+ instsize = OHDR_SIZE + nBytes;
__PROTECT_CONTEXT__
__qNew(newobj, instsize); /* OBJECT ALLOCATION */
__UNPROTECT_CONTEXT__
@@ -2637,28 +2617,12 @@
}
__InstPtr(newobj)->o_class = self;
__qSTORE(newobj, self);
-
-# if defined(FAST_ARRAY_MEMSET)
- /*
- * knowing that nil is 0
- */
- memset(__InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
-# else
- op = __InstPtr(newobj)->i_instvars;
- while (nInstVars--)
- *op++ = nil;
- sp = (short *)op;
- while (nindexedinstvars--)
- *sp++ = 0;
-# endif
- RETURN ( newobj );
- break;
+ goto nilIt;
case LONGARRAY:
case SLONGARRAY:
- instsize = OHDR_SIZE +
- __OBJS2BYTES__(nInstVars) +
- nindexedinstvars * 4;
+ nBytes = __OBJS2BYTES__(nInstVars) + nindexedinstvars * 4;
+ instsize = OHDR_SIZE + nBytes;
__PROTECT_CONTEXT__
__qAlignedNew(newobj, instsize); /* OBJECT ALLOCATION */
__UNPROTECT_CONTEXT__
@@ -2667,46 +2631,16 @@
}
__InstPtr(newobj)->o_class = self;
__qSTORE(newobj, self);
-
-# if defined(memset4)
- /*
- * knowing that nil is 0
- */
- {
- int n4 = nInstVars + nindexedinstvars;
-
- memset4(__InstPtr(newobj)->i_instvars, 0, n4);
- }
-# else
-# if 1 /* defined(FAST_ARRAY_MEMSET) */
- /*
- * knowing that nil is 0
- */
- memset(__InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
-# else
- op = __InstPtr(newobj)->i_instvars;
- while (nInstVars--)
- *op++ = nil;
-# if defined(__i386__) || defined(__x86__) || defined(__x86_64__) || defined(__sparc__)
- lp = (int *)op;
-# else
-# error "please (conditionally) cast op to pointer to 4byte integer type"
-# endif
- while (nindexedinstvars--)
- *lp++ = 0;
-# endif
-# endif
- RETURN ( newobj );
- break;
+ goto nilIt;
case LONGLONGARRAY:
case SLONGLONGARRAY:
instsize = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
-
# ifdef __NEED_LONGLONG_ALIGN
instsize = ((instsize-1) + __LONGLONG_ALIGN) & ~(__LONGLONG_ALIGN-1);
# endif
instsize += nindexedinstvars * 8;
+ nBytes = instsize - OHDR_SIZE;
__PROTECT_CONTEXT__
__qAlignedNew(newobj, instsize); /* OBJECT ALLOCATION */
@@ -2716,22 +2650,12 @@
}
__InstPtr(newobj)->o_class = self;
__qSTORE(newobj, self);
-
-# if defined(memset4)
- {
- int n4 = (instsize-OHDR_SIZE) / 4;
-
- memset4(__InstPtr(newobj)->i_instvars, 0, n4);
- }
-# else
- memset(__InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
-# endif
- RETURN ( newobj );
+ goto nilIt;
break;
case FLOATARRAY:
- instsize = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
- instsize += nindexedinstvars * sizeof(float);
+ nBytes = __OBJS2BYTES__(nInstVars) + nindexedinstvars * sizeof(float);
+ instsize = OHDR_SIZE + nBytes;
__PROTECT_CONTEXT__
__qNew(newobj, instsize); /* OBJECT ALLOCATION */
@@ -2742,18 +2666,10 @@
__InstPtr(newobj)->o_class = self;
__qSTORE(newobj, self);
+# if defined(__FLOAT0_IS_INT0) /* knowin that float 0.0 is all-zeros */
+ goto nilIt;
+# else
op = __InstPtr(newobj)->i_instvars;
-# if defined(__FLOAT0_IS_INT0) /* knowin that float 0.0 is all-zeros */
-# if defined(memset4)
- {
- int n4 = (instsize-OHDR_SIZE) / 4;
-
- memset4(__InstPtr(newobj)->i_instvars, 0, n4);
- }
-# else
- memset(__InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
-# endif
-# else
while (nInstVars-- != 0)
*op++ = nil;
fp = (float *)op;
@@ -2769,6 +2685,7 @@
instsize = ((instsize-1) + __DOUBLE_ALIGN) & ~(__DOUBLE_ALIGN-1);
# endif
instsize += nindexedinstvars * sizeof(double);
+ nBytes = instsize - OHDR_SIZE;
__PROTECT_CONTEXT__
__qAlignedNew(newobj, instsize); /* OBJECT ALLOCATION */
@@ -2780,15 +2697,7 @@
__qSTORE(newobj, self);
# if defined(__DOUBLE0_IS_INT0) /* knowin that double 0.0 is all-zeros */
-# ifdef memset4
- {
- int n4 = (instsize-OHDR_SIZE) / 4;
-
- memset4(__InstPtr(newobj)->i_instvars, 0, n4);
- }
-# else
- memset(__InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
-# endif
+ goto nilIt;
# else
op = __InstPtr(newobj)->i_instvars;
while (nInstVars-- != 0)