# HG changeset patch # User Claus Gittinger # Date 961494971 -7200 # Node ID 55cbe7c0a58f5fe9db1c9f7828505a61e1685214 # Parent d3cd213d13ec24acdcbb3e19b3b92739575a2b64 super-send fallBacks diff -r d3cd213d13ec -r 55cbe7c0a58f Array.st --- a/Array.st Mon Jun 19 16:53:43 2000 +0200 +++ b/Array.st Tue Jun 20 11:56:11 2000 +0200 @@ -1777,17 +1777,18 @@ el1 = anElement; el2 = alternative; op = & (__InstPtr(self)->i_instvars[index]); while (index++ < nIndex) { - if ((o = *op++) == el1) { - RETURN ( __MKSMALLINT(index - nInsts) ); - } - if (o == el2) { - if (altIndex == 0) { - altIndex = index; - } - } + if ((o = *op++) == el1) { + RETURN ( __MKSMALLINT(index - nInsts) ); + } + if (o == el2) { + if (altIndex == 0) { + altIndex = index; + } + } } RETURN ( __MKSMALLINT(altIndex) ); -%} +%}. + ^ super identityIndexOf:anElement or:alternative " #(1 2 3 4 5 6 7 8 9) identityIndexOf:3 or:5 @@ -1814,96 +1815,96 @@ int nInsts; if (__isSmallInteger(start)) { - index = __intVal(start) - 1; - if (index >= 0) { - nInsts = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars); - index += nInsts; - nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE); - el = anElement; - op = & (__InstPtr(self)->i_instvars[index]); + index = __intVal(start) - 1; + if (index >= 0) { + nInsts = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars); + index += nInsts; + nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE); + el = anElement; + op = & (__InstPtr(self)->i_instvars[index]); #if defined(memsrch4) - if (index < nIndex) { - OBJ *p; + if (index < nIndex) { + OBJ *p; - p = memsrch4(op, (INT)el, (nIndex - index)); - if (p) { - index += (p - op + 1); - RETURN ( __MKSMALLINT(index) ); - } - } + p = memsrch4(op, (INT)el, (nIndex - index)); + if (p) { + index += (p - op + 1); + RETURN ( __MKSMALLINT(index) ); + } + } #else # if defined(UNROLL_LOOPS) - { - /* - * dont argue about those gotos below - they speed up that thing by 30%; - * its better to exit the loops below with a goto, - * since the generated code will then be: - * compare - * branch-on-equal found - * - * otherwise (with ret as if-statement), we get: - * compare - * branch-on-not-equal skipLabel - * move-to-ret-register true - * goto ret-label - * skipLabel - * - * therefore, WITH the so-much-blamed goto, we only branch - * when found; without the goto, we branch always. - * Pipelined CPUs do usually not like taken branches. - */ + { + /* + * dont argue about those gotos below - they speed up that thing by 30%; + * its better to exit the loops below with a goto, + * since the generated code will then be: + * compare + * branch-on-equal found + * + * otherwise (with ret as if-statement), we get: + * compare + * branch-on-not-equal skipLabel + * move-to-ret-register true + * goto ret-label + * skipLabel + * + * therefore, WITH the so-much-blamed goto, we only branch + * when found; without the goto, we branch always. + * Pipelined CPUs do usually not like taken branches. + */ - unsigned int i8; + unsigned int i8; - while ((i8 = index + 8) < nIndex) { - if (op[0] == el) goto found1; - if (op[1] == el) goto found2; - if (op[2] == el) goto found3; - if (op[3] == el) goto found4; - if (op[4] == el) goto found5; - if (op[5] == el) goto found6; - if (op[6] == el) goto found7; - if (op[7] == el) goto found8; - index = i8; - op += 8; - } - if (0) { - found1: - RETURN ( __MKSMALLINT(index + 1 - nInsts) ); - found2: - RETURN ( __MKSMALLINT(index + 2 - nInsts) ); - found3: - RETURN ( __MKSMALLINT(index + 3 - nInsts) ); - found4: - RETURN ( __MKSMALLINT(index + 4 - nInsts) ); - found5: - RETURN ( __MKSMALLINT(index + 5 - nInsts) ); - found6: - RETURN ( __MKSMALLINT(index + 6 - nInsts) ); - found7: - RETURN ( __MKSMALLINT(index + 7 - nInsts) ); - found8: - RETURN ( __MKSMALLINT(index + 8 - nInsts) ); - } - } + while ((i8 = index + 8) < nIndex) { + if (op[0] == el) goto found1; + if (op[1] == el) goto found2; + if (op[2] == el) goto found3; + if (op[3] == el) goto found4; + if (op[4] == el) goto found5; + if (op[5] == el) goto found6; + if (op[6] == el) goto found7; + if (op[7] == el) goto found8; + index = i8; + op += 8; + } + if (0) { + found1: + RETURN ( __MKSMALLINT(index + 1 - nInsts) ); + found2: + RETURN ( __MKSMALLINT(index + 2 - nInsts) ); + found3: + RETURN ( __MKSMALLINT(index + 3 - nInsts) ); + found4: + RETURN ( __MKSMALLINT(index + 4 - nInsts) ); + found5: + RETURN ( __MKSMALLINT(index + 5 - nInsts) ); + found6: + RETURN ( __MKSMALLINT(index + 6 - nInsts) ); + found7: + RETURN ( __MKSMALLINT(index + 7 - nInsts) ); + found8: + RETURN ( __MKSMALLINT(index + 8 - nInsts) ); + } + } # endif /* UNROLLED_LOOPS */ - while (index++ < nIndex) { - if (*op++ == el) goto found0; - } + while (index++ < nIndex) { + if (*op++ == el) goto found0; + } - if (0) { - found0: - RETURN ( __MKSMALLINT(index - nInsts) ); - } + if (0) { + found0: + RETURN ( __MKSMALLINT(index - nInsts) ); + } #endif /* no memsrch */ - } - RETURN ( __MKSMALLINT(0) ); + } + RETURN ( __MKSMALLINT(0) ); } %}. - ^ self indexNotInteger + ^ super identityIndexOf:anElement startingAt:start ! identityIndexOf:anElement startingAt:start endingAt:stop @@ -1921,82 +1922,82 @@ int nInsts; if (__bothSmallInteger(start, stop)) { - index = __intVal(start) - 1; - if (index >= 0) { - nInsts = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars); - index += nInsts; - lastIndex = nInsts + __intVal(stop); - nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE); - if (nIndex < lastIndex) { - lastIndex = nIndex; - } - el = anElement; - op = & (__InstPtr(self)->i_instvars[index]); + index = __intVal(start) - 1; + if (index >= 0) { + nInsts = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars); + index += nInsts; + lastIndex = nInsts + __intVal(stop); + nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE); + if (nIndex < lastIndex) { + lastIndex = nIndex; + } + el = anElement; + op = & (__InstPtr(self)->i_instvars[index]); #if defined(memsrch4) - if (index < lastIndex) { - OBJ *p; + if (index < lastIndex) { + OBJ *p; - p = memsrch4(op, (INT)el, (lastIndex - index)); - if (p) { - index += (p - op + 1); - RETURN ( __MKSMALLINT(index) ); - } - } + p = memsrch4(op, (INT)el, (lastIndex - index)); + if (p) { + index += (p - op + 1); + RETURN ( __MKSMALLINT(index) ); + } + } #else # if defined(UNROLL_LOOPS) - { - unsigned int i8; + { + unsigned int i8; - while ((i8 = index + 8) < lastIndex) { - if (op[0] == el) goto found1; - if (op[1] == el) goto found2; - if (op[2] == el) goto found3; - if (op[3] == el) goto found4; - if (op[4] == el) goto found5; - if (op[5] == el) goto found6; - if (op[6] == el) goto found7; - if (op[7] == el) goto found8; - index = i8; - op += 8; - } + while ((i8 = index + 8) < lastIndex) { + if (op[0] == el) goto found1; + if (op[1] == el) goto found2; + if (op[2] == el) goto found3; + if (op[3] == el) goto found4; + if (op[4] == el) goto found5; + if (op[5] == el) goto found6; + if (op[6] == el) goto found7; + if (op[7] == el) goto found8; + index = i8; + op += 8; + } - if (0) { - found1: - RETURN ( __MKSMALLINT(index + 1 - nInsts) ); - found2: - RETURN ( __MKSMALLINT(index + 2 - nInsts) ); - found3: - RETURN ( __MKSMALLINT(index + 3 - nInsts) ); - found4: - RETURN ( __MKSMALLINT(index + 4 - nInsts) ); - found5: - RETURN ( __MKSMALLINT(index + 5 - nInsts) ); - found6: - RETURN ( __MKSMALLINT(index + 6 - nInsts) ); - found7: - RETURN ( __MKSMALLINT(index + 7 - nInsts) ); - found8: - RETURN ( __MKSMALLINT(index + 8 - nInsts) ); - } - } + if (0) { + found1: + RETURN ( __MKSMALLINT(index + 1 - nInsts) ); + found2: + RETURN ( __MKSMALLINT(index + 2 - nInsts) ); + found3: + RETURN ( __MKSMALLINT(index + 3 - nInsts) ); + found4: + RETURN ( __MKSMALLINT(index + 4 - nInsts) ); + found5: + RETURN ( __MKSMALLINT(index + 5 - nInsts) ); + found6: + RETURN ( __MKSMALLINT(index + 6 - nInsts) ); + found7: + RETURN ( __MKSMALLINT(index + 7 - nInsts) ); + found8: + RETURN ( __MKSMALLINT(index + 8 - nInsts) ); + } + } # endif /* UNROLL_LOOPS */ - while (index++ < lastIndex) { - if (*op++ == el) goto found0; - } + while (index++ < lastIndex) { + if (*op++ == el) goto found0; + } - if (0) { - found0: - RETURN ( __MKSMALLINT(index - nInsts) ); - } + if (0) { + found0: + RETURN ( __MKSMALLINT(index - nInsts) ); + } #endif - } - RETURN ( __MKSMALLINT(0) ); + } + RETURN ( __MKSMALLINT(0) ); } %}. - ^ self indexNotInteger + ^ super identityIndexOf:anElement startingAt:start endingAt:stop ! @@ -2265,7 +2266,6 @@ |element| %{ /* NOCONTEXT */ - /* * first, do a quick check using == * this does not need a context or message send. @@ -2274,7 +2274,6 @@ REGISTER int index; REGISTER OBJ o; unsigned int nIndex; - static struct inlineCache eq = _ILC1; nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE); index = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars); @@ -2288,18 +2287,18 @@ * (except if searching for nil - there is no need for equal compare ...) */ if (nIndex > 500) { - if (o != nil) - nIndex = 500; + if (o != nil) + nIndex = 500; } # ifdef memsrch4 if (index < nIndex) { - OBJ *p; + OBJ *p; - p = memsrch4(&(__InstPtr(self)->i_instvars[index]), (INT)o, (nIndex - index)); - if (p) { - RETURN ( true ); - } + p = memsrch4(&(__InstPtr(self)->i_instvars[index]), (INT)o, (nIndex - index)); + if (p) { + RETURN ( true ); + } } # else @@ -2325,36 +2324,43 @@ */ # if defined(UNROLL_LOOPS) { - unsigned int i8; - REGISTER OBJ slf = self; + unsigned int i8; + REGISTER OBJ slf = self; - while ((i8 = index + 8) < nIndex) { - if (__InstPtr(slf)->i_instvars[index] == o) goto found; - if (__InstPtr(slf)->i_instvars[index+1] == o) goto found; - if (__InstPtr(slf)->i_instvars[index+2] == o) goto found; - if (__InstPtr(slf)->i_instvars[index+3] == o) goto found; - if (__InstPtr(slf)->i_instvars[index+4] == o) goto found; - if (__InstPtr(slf)->i_instvars[index+5] == o) goto found; - if (__InstPtr(slf)->i_instvars[index+6] == o) goto found; - if (__InstPtr(slf)->i_instvars[index+7] == o) goto found; - index = i8; - } + while ((i8 = index + 8) < nIndex) { + if (__InstPtr(slf)->i_instvars[index] == o) goto found; + if (__InstPtr(slf)->i_instvars[index+1] == o) goto found; + if (__InstPtr(slf)->i_instvars[index+2] == o) goto found; + if (__InstPtr(slf)->i_instvars[index+3] == o) goto found; + if (__InstPtr(slf)->i_instvars[index+4] == o) goto found; + if (__InstPtr(slf)->i_instvars[index+5] == o) goto found; + if (__InstPtr(slf)->i_instvars[index+6] == o) goto found; + if (__InstPtr(slf)->i_instvars[index+7] == o) goto found; + index = i8; + } } # endif /* UNROLL_LOOPS */ while (index < nIndex) { - if (__InstPtr(self)->i_instvars[index++] == o) goto found; + if (__InstPtr(self)->i_instvars[index++] == o) goto found; } if (0) { - found: - RETURN (true); + found: + RETURN (true); } # endif /* no memsrch */ if (o == nil) { - RETURN ( false ); + RETURN ( false ); } +%}. + +%{ + REGISTER int index; + REGISTER OBJ o; + unsigned int nIndex; + static struct inlineCache eq = _ILC1; /* * then do a slow(er) check using = @@ -2367,18 +2373,19 @@ index = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars); while (index < nIndex) { - element = __InstPtr(self)->i_instvars[index++]; - if (element != nil) { - if ((*eq.ilc_func)(anObject, - @symbol(=), - nil,&eq, - element)==true) { - RETURN ( true ); - } - } + element = __InstPtr(self)->i_instvars[index++]; + if (element != nil) { + if ((*eq.ilc_func)(anObject, + @symbol(=), + nil,&eq, + element)==true) { + RETURN ( true ); + } + } } + RETURN (false); %}. - ^ false + ^ super includes:anObject ! includesIdentical:anObject @@ -2408,5 +2415,5 @@ !Array class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/Array.st,v 1.122 2000-04-01 10:40:15 cg Exp $' + ^ '$Header: /cvs/stx/stx/libbasic/Array.st,v 1.123 2000-06-20 09:56:11 cg Exp $' ! !