class: WeakArray
authorClaus Gittinger <cg@exept.de>
Thu, 23 Jul 2015 15:35:52 +0200
changeset 18627 1bd1d3f92fcc
parent 18626 9c150ffe028a
child 18628 6d7c70420471
class: WeakArray changed: #do: #validElementsDo:
WeakArray.st
--- a/WeakArray.st	Thu Jul 23 13:48:06 2015 +0200
+++ b/WeakArray.st	Thu Jul 23 15:35:52 2015 +0200
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 1991 by Claus Gittinger
 	      All Rights Reserved
@@ -507,7 +509,7 @@
 do:aBlock
     "evaluate the argument, aBlock for each element in the collection.
      - reimplemented for IGC readBarrier.
-     You dont have to understand this."
+     You don't have to understand this."
 
     |element|
 
@@ -521,50 +523,50 @@
 
     if (__isBlockLike(aBlock)
      && (__BlockInstPtr(aBlock)->b_nargs == __mkSmallInteger(1))) {
-	{
-	    /*
-	     * the most common case: a static compiled block, with home on the stack ...
-	     */
-	    REGISTER OBJFUNC codeVal;
+        {
+            /*
+             * the most common case: a static compiled block, with home on the stack ...
+             */
+            REGISTER OBJFUNC codeVal;
 
-	    if (((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
-	     && (! ((INT)(__BlockInstPtr(aBlock)->b_flags) & __MASKSMALLINT(F_DYNAMIC)))) {
+            if (((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
+             && (! ((INT)(__BlockInstPtr(aBlock)->b_flags) & __MASKSMALLINT(F_DYNAMIC)))) {
 
 #ifdef NEW_BLOCK_CALL
 #               define BLOCK_ARG        aBlock
 #else
 #               define BLOCK_ARG        rHome
-		REGISTER OBJ rHome;
+                REGISTER OBJ rHome;
 
-		rHome = __BlockInstPtr(aBlock)->b_home;
-		if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE))
+                rHome = __BlockInstPtr(aBlock)->b_home;
+                if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE))
 #endif
-		{
-		    for (; index < nIndex; index++) {
-			if (InterruptPending != nil) __interruptL(@line);
+                {
+                    for (; index < nIndex; index++) {
+                        if (InterruptPending != nil) __interruptL(@line);
 
-			element = __InstPtr(self)->i_instvars[index];
-			if (__isNonNilObject(element)) {
-			    element = __WEAK_READ__(self, element);
+                        element = __InstPtr(self)->i_instvars[index];
+                        if (__isNonNilObject(element)) {
+                            element = __WEAK_READ__(self, element);
 #ifdef WEAK_DEBUG
-			    if (! __ISVALIDOBJECT(element)) {
-				fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
-				__dumpObject__(element, __LINE__);
-				element = nil;
-			    }
+                            if (! __ISVALIDOBJECT(element)) {
+                                fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
+                                __dumpObject__(element, __LINE__);
+                                element = nil;
+                            }
 #endif
-			}
-			(*codeVal)(BLOCK_ARG, element);
-		    }
-		    RETURN (self);
-		}
-	    }
-	}
+                        }
+                        (*codeVal)(BLOCK_ARG, element);
+                    }
+                    RETURN (self);
+                }
+            }
+        }
 
-	/*
-	 * sorry, must check code-pointer in the loop
-	 * it could be recompiled or flushed
-	 */
+        /*
+         * sorry, must check code-pointer in the loop
+         * it could be recompiled or flushed
+         */
 #       undef BLOCK_ARG
 #ifdef NEW_BLOCK_CALL
 #       define BLOCK_ARG        aBlock
@@ -574,44 +576,44 @@
 #       define IBLOCK_ARG       (__BlockInstPtr(aBlock)->b_home)
 #endif
 
-	for (; index < nIndex; index++) {
-	    REGISTER OBJFUNC codeVal;
+        for (; index < nIndex; index++) {
+            REGISTER OBJFUNC codeVal;
 
-	    if (InterruptPending != nil) __interruptL(@line);
+            if (InterruptPending != nil) __interruptL(@line);
 
-	    element = __InstPtr(self)->i_instvars[index];
-	    if (__isNonNilObject(element)) {
-		element = __WEAK_READ__(self, element);
+            element = __InstPtr(self)->i_instvars[index];
+            if (__isNonNilObject(element)) {
+                element = __WEAK_READ__(self, element);
 #ifdef WEAK_DEBUG
-		if (! __ISVALIDOBJECT(element)) {
-		    fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
-		    __dumpObject__(element, __LINE__);
-		    element = nil;
-		}
+                if (! __ISVALIDOBJECT(element)) {
+                    fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
+                    __dumpObject__(element, __LINE__);
+                    element = nil;
+                }
 #endif
-	    }
-	    if ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil) {
-		(*codeVal)(BLOCK_ARG, element);
-	    } else {
-		if (__BlockInstPtr(aBlock)->b_bytecodes != nil) {
-		    /*
-		     * arg is a compiled block with bytecode -
-		     * directly call interpreter without going through Block>>value
-		     */
+            }
+            if ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil) {
+                (*codeVal)(BLOCK_ARG, element);
+            } else {
+                if (__BlockInstPtr(aBlock)->b_bytecodes != nil) {
+                    /*
+                     * arg is a compiled block with bytecode -
+                     * directly call interpreter without going through Block>>value
+                     */
 #ifdef PASS_ARG_POINTER
-		    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, &element);
+                    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, &element);
 #else
-		    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, element);
+                    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, element);
 #endif
-		} else {
-		    /*
-		     * arg is something else - call it with #value
-		     */
-		    (*val.ilc_func)(aBlock, @symbol(value:), nil, &val, element);
-		}
-	    }
-	}
-	RETURN (self);
+                } else {
+                    /*
+                     * arg is something else - call it with #value
+                     */
+                    (*val.ilc_func)(aBlock, @symbol(value:), nil, &val, element);
+                }
+            }
+        }
+        RETURN (self);
 
 #       undef BLOCK_ARG
 #       undef IBLOCK_ARG
@@ -622,29 +624,31 @@
      * not a block - send it #value:
      */
     for (; index < nIndex; index++) {
-	if (InterruptPending != nil) __interruptL(@line);
+        if (InterruptPending != nil) __interruptL(@line);
 
-	element = __InstPtr(self)->i_instvars[index];
-	if (__isNonNilObject(element)) {
-	    element = __WEAK_READ__(self, element);
+        element = __InstPtr(self)->i_instvars[index];
+        if (__isNonNilObject(element)) {
+            element = __WEAK_READ__(self, element);
 #ifdef WEAK_DEBUG
-	    if (! __ISVALIDOBJECT(element)) {
-		fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
-		__dumpObject__(element, __LINE__);
-		element = nil;
-	    }
+            if (! __ISVALIDOBJECT(element)) {
+                fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
+                __dumpObject__(element, __LINE__);
+                element = nil;
+            }
 #endif
-	}
-	(*val.ilc_func)(aBlock,
-			    @symbol(value:),
-			    nil, &val,
-			    element);
+        }
+        (*val.ilc_func)(aBlock,
+                            @symbol(value:),
+                            nil, &val,
+                            element);
     }
     RETURN (self);
 %}.
     ^ super do:[:each |
-	each ~~ nil ifTrue:[aBlock value:each]
+        each ~~ nil ifTrue:[aBlock value:each]
       ]
+
+    "Modified: / 23-07-2015 / 15:35:24 / cg"
 !
 
 forAllDeadIndicesDo:aBlock
@@ -847,7 +851,7 @@
 !
 
 validElementsDo:aBlock
-    "evaluate the argument, aBlock for each non-nil/non-zero element"
+    "evaluate the argument, aBlock for each non-nil/non-evacuated element"
 
     |element|
 %{
@@ -859,57 +863,57 @@
     nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
     if (__isBlockLike(aBlock)
      && (__BlockInstPtr(aBlock)->b_nargs == __mkSmallInteger(1))) {
-	{
-	    /*
-	     * the most common case: a static compiled block, with home on the stack ...
-	     */
-	    REGISTER OBJFUNC codeVal;
+        {
+            /*
+             * the most common case: a static compiled block, with home on the stack ...
+             */
+            REGISTER OBJFUNC codeVal;
 
-	    if (((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
-	     && (! ((INT)(__BlockInstPtr(aBlock)->b_flags) & __MASKSMALLINT(F_DYNAMIC)))) {
+            if (((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
+             && (! ((INT)(__BlockInstPtr(aBlock)->b_flags) & __MASKSMALLINT(F_DYNAMIC)))) {
 
 #ifdef NEW_BLOCK_CALL
 #               define BLOCK_ARG        aBlock
 #else
 #               define BLOCK_ARG        rHome
-		REGISTER OBJ rHome;
+                REGISTER OBJ rHome;
 
-		rHome = __BlockInstPtr(aBlock)->b_home;
-		if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE))
+                rHome = __BlockInstPtr(aBlock)->b_home;
+                if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE))
 #endif
-		{
-		    for (; index < nIndex; index++) {
-			element = __InstPtr(self)->i_instvars[index];
-			if (element && (element != __mkSmallInteger(0))) {
-			    if (InterruptPending != nil) {
-				__interruptL(@line);
-				element = __InstPtr(self)->i_instvars[index];
-			    }
+                {
+                    for (; index < nIndex; index++) {
+                        element = __InstPtr(self)->i_instvars[index];
+                        if (__isNonNilObject(element)) {
+                            if (InterruptPending != nil) {
+                                __interruptL(@line);
+                                element = __InstPtr(self)->i_instvars[index];
+                            }
 
-			    if (__isNonNilObject(element)) {
-				element = __WEAK_READ__(self, element);
+                            if (__isNonNilObject(element)) {
+                                element = __WEAK_READ__(self, element);
 #ifdef WEAK_DEBUG
-				if (! __ISVALIDOBJECT(element)) {
-				    fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
-				    __dumpObject__(element, __LINE__);
-				    element = nil;
-				}
+                                if (! __ISVALIDOBJECT(element)) {
+                                    fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
+                                    __dumpObject__(element, __LINE__);
+                                    element = nil;
+                                }
 #endif
-			    }
-			    if (element && (element != __mkSmallInteger(0))) {
-				(*codeVal)(BLOCK_ARG, element);
-			    }
-			}
-		    }
-		    RETURN (self);
-		}
-	    }
-	}
+                                if (__isNonNilObject(element)) {
+                                    (*codeVal)(BLOCK_ARG, element);
+                                }
+                            }
+                        }
+                    }
+                    RETURN (self);
+                }
+            }
+        }
 
-	/*
-	 * sorry, must check code-pointer in the loop
-	 * it could be recompiled or flushed
-	 */
+        /*
+         * sorry, must check code-pointer in the loop
+         * it could be recompiled or flushed
+         */
 #       undef BLOCK_ARG
 #ifdef NEW_BLOCK_CALL
 #       define BLOCK_ARG        aBlock
@@ -919,50 +923,50 @@
 #       define IBLOCK_ARG       (__BlockInstPtr(aBlock)->b_home)
 #endif
 
-	for (; index < nIndex; index++) {
-	    REGISTER OBJFUNC codeVal;
+        for (; index < nIndex; index++) {
+            REGISTER OBJFUNC codeVal;
 
-	    element = __InstPtr(self)->i_instvars[index];
-	    if (element && (element != __mkSmallInteger(0))) {
-		if (InterruptPending != nil) {
-		    __interruptL(@line);
-		    element = __InstPtr(self)->i_instvars[index];
-		}
-		if (__isNonNilObject(element)) {
-		    element = __WEAK_READ__(self, element);
+            element = __InstPtr(self)->i_instvars[index];
+            if (__isNonNilObject(element)) {
+                if (InterruptPending != nil) {
+                    __interruptL(@line);
+                    element = __InstPtr(self)->i_instvars[index];
+                }
+                if (__isNonNilObject(element)) {
+                    element = __WEAK_READ__(self, element);
 #ifdef WEAK_DEBUG
-		    if (! __ISVALIDOBJECT(element)) {
-			fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
-			__dumpObject__(element, __LINE__);
-			element = nil;
-		    }
+                    if (! __ISVALIDOBJECT(element)) {
+                        fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
+                        __dumpObject__(element, __LINE__);
+                        element = nil;
+                    }
 #endif
-		}
-		if (element && (element != __mkSmallInteger(0))) {
-		    if ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil) {
-			(*codeVal)(BLOCK_ARG, element);
-		    } else {
-			if (__BlockInstPtr(aBlock)->b_bytecodes != nil) {
-			    /*
-			     * arg is a compiled block with bytecode -
-			     * directly call interpreter without going through Block>>value
-			     */
+                    if (__isNonNilObject(element)) {
+                        if ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil) {
+                            (*codeVal)(BLOCK_ARG, element);
+                        } else {
+                            if (__BlockInstPtr(aBlock)->b_bytecodes != nil) {
+                                /*
+                                 * arg is a compiled block with bytecode -
+                                 * directly call interpreter without going through Block>>value
+                                 */
 #ifdef PASS_ARG_POINTER
-			    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, &element);
+                                __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, &element);
 #else
-			    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, element);
+                                __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, element);
 #endif
-			} else {
-			    /*
-			     * arg is something else - call it with #value
-			     */
-			    (*val.ilc_func)(aBlock, @symbol(value:), nil, &val, element);
-			}
-		    }
-		}
-	    }
-	}
-	RETURN (self);
+                            } else {
+                                /*
+                                 * arg is something else - call it with #value
+                                 */
+                                (*val.ilc_func)(aBlock, @symbol(value:), nil, &val, element);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        RETURN (self);
 
 #       undef BLOCK_ARG
 #       undef IBLOCK_ARG
@@ -972,36 +976,37 @@
      * not a block - send it #value:
      */
     for (; index < nIndex; index++) {
-	element = __InstPtr(self)->i_instvars[index];
-	if (element && (element != __mkSmallInteger(0))) {
-	    if (InterruptPending != nil) {
-		__interruptL(@line);
-		element = __InstPtr(self)->i_instvars[index];
-	    }
-	    if (__isNonNilObject(element)) {
-		element = __WEAK_READ__(self, element);
+        element = __InstPtr(self)->i_instvars[index];
+        if (__isNonNilObject(element)) {
+            if (InterruptPending != nil) {
+                __interruptL(@line);
+                element = __InstPtr(self)->i_instvars[index];
+            }
+            if (__isNonNilObject(element)) {
+                element = __WEAK_READ__(self, element);
 #ifdef WEAK_DEBUG
-		if (! __ISVALIDOBJECT(element)) {
-		    fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
-		    __dumpObject__(element, __LINE__);
-		    element = nil;
-		}
+                if (! __ISVALIDOBJECT(element)) {
+                    fprintf(stderr, "****** OOPS - invalid Weak-Read\n");
+                    __dumpObject__(element, __LINE__);
+                    element = nil;
+                }
 #endif
-	    }
-	    if (element && (element != __mkSmallInteger(0))) {
-		(*val.ilc_func)(aBlock,
-				    @symbol(value:),
-				    nil, &val,
-				    element);
-	    }
-	}
+                if (__isNonNilObject(element)) {
+                    (*val.ilc_func)(aBlock,
+                                    @symbol(value:),
+                                    nil, &val,
+                                    element);
+                }
+            }
+        }
     }
     RETURN (self);
 %}.
     ^ super do:[:each |
-	(each ~~ nil and:[each ~~ 0]) ifTrue:[aBlock value:each]
+        (each ~~ nil and:[each class ~~ SmallInteger]) ifTrue:[aBlock value:each]
       ]
 
+    "Modified: / 23-07-2015 / 15:32:44 / cg"
 ! !
 
 !WeakArray methodsFor:'notification'!