Array.st
changeset 357 82091a50055d
parent 356 6c5ce0e1e7a8
child 359 b8df66983eff
--- a/Array.st	Wed May 24 14:44:58 1995 +0200
+++ b/Array.st	Tue Jun 06 05:56:11 1995 +0200
@@ -21,7 +21,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
 	      All Rights Reserved
 
-$Header: /cvs/stx/stx/libbasic/Array.st,v 1.27 1995-05-24 12:41:18 claus Exp $
+$Header: /cvs/stx/stx/libbasic/Array.st,v 1.28 1995-06-06 03:52:50 claus Exp $
 '!
 
 !Array class methodsFor:'documentation'!
@@ -42,7 +42,7 @@
 
 version
 "
-$Header: /cvs/stx/stx/libbasic/Array.st,v 1.27 1995-05-24 12:41:18 claus Exp $
+$Header: /cvs/stx/stx/libbasic/Array.st,v 1.28 1995-06-06 03:52:50 claus Exp $
 "
 !
 
@@ -107,10 +107,12 @@
 
 	    nInstVars += nindexedinstvars;
 	    instsize = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
-	    PROTECT_CONTEXT
-	    _qAlignedNew(newobj, instsize, SENDER);
-	    UNPROTECT_CONTEXT
-	    if (newobj != nil) {
+	    if (_CanDoQuickAlignedNew(instsize)) {
+		/*
+		 * the most common case
+		 */
+		_qCheckedAlignedNew(newobj, instsize);
+	ok: ;
 		_InstPtr(newobj)->o_class = self;
 #if defined(FAST_ARRAY_MEMSET4)
 		memset4(_InstPtr(newobj)->i_instvars, nil, nInstVars);
@@ -183,6 +185,19 @@
 # endif
 #endif
 		RETURN ( newobj );
+	    } else {
+		/*
+		 * a GC will happen ...
+		 * have to protect all context stuff
+		 * (especially for self, but also for backtrace in case of
+		 *  allocation failure)
+		 */
+		PROTECT_CONTEXT
+		_qAlignedNew(newobj, instsize, SENDER);
+		UNPROTECT_CONTEXT
+		if (newobj != nil) {
+		    goto ok;
+		}
 	    }
 	}
     }