Behavior.st
branchjv
changeset 19947 436cd430841a
parent 19912 ca84ec5f80a7
child 19948 be658f466bca
--- 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)