diff -r 6c5ce0e1e7a8 -r 82091a50055d Array.st --- 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; + } } } }