WeakArray.st
changeset 1903 30c98b3377c5
parent 1825 6f81b866a74a
child 2091 c11bb3e29a1b
equal deleted inserted replaced
1902:52376295aca8 1903:30c98b3377c5
   562     if (__isBlockLike(aBlock)
   562     if (__isBlockLike(aBlock)
   563      && ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
   563      && ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
   564      && (__BlockInstPtr(aBlock)->b_nargs == __MKSMALLINT(1))) {
   564      && (__BlockInstPtr(aBlock)->b_nargs == __MKSMALLINT(1))) {
   565 #ifdef NEW_BLOCK_CALL
   565 #ifdef NEW_BLOCK_CALL
   566 	for (; index < nIndex; index++) {
   566 	for (; index < nIndex; index++) {
   567 	    if (InterruptPending != nil) __interruptL(CONARG);
       
   568 
       
   569 	    element = __InstPtr(self)->i_instvars[index];
   567 	    element = __InstPtr(self)->i_instvars[index];
   570 	    if (element != nil) {
   568 	    if (element != nil) {
       
   569 		if (InterruptPending != nil) {
       
   570 		    __interruptL(CONARG);
       
   571 		    /* refetch; who knows what is done in the interrupt ... */
       
   572 		    element = __InstPtr(self)->i_instvars[index];
       
   573 		}
   571 		element = __WEAK_READ__(self, element);
   574 		element = __WEAK_READ__(self, element);
   572 		if (element != nil) {
   575 		if (element != nil) {
   573 		    (*codeVal)(aBlock, element);
   576 		    (*codeVal)(aBlock, element);
   574 		}
   577 		}
   575 	    }
   578 	    }
   580 	if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE)) {
   583 	if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE)) {
   581 	    /*
   584 	    /*
   582 	     * home will not move - keep in in a register
   585 	     * home will not move - keep in in a register
   583 	     */
   586 	     */
   584 	    for (; index < nIndex; index++) {
   587 	    for (; index < nIndex; index++) {
   585 		if (InterruptPending != nil) __interruptL(CONARG);
       
   586 
       
   587 		element = __InstPtr(self)->i_instvars[index];
   588 		element = __InstPtr(self)->i_instvars[index];
   588 		if (element != nil) {
   589 		if (element != nil) {
       
   590 		    if (InterruptPending != nil) {
       
   591 			__interruptL(CONARG);
       
   592 			/* refetch; who knows what is done in the interrupt ... */
       
   593 			element = __InstPtr(self)->i_instvars[index];
       
   594 		    }
   589 		    element = __WEAK_READ__(self, element);
   595 		    element = __WEAK_READ__(self, element);
   590 		    if (element != nil) {
   596 		    if (element != nil) {
   591 			(*codeVal)(rHome, element);
   597 			(*codeVal)(rHome, element);
   592 		    }
   598 		    }
   593 		}
   599 		}
   594 	    } 
   600 	    } 
   595 	} else {
   601 	} else {
   596 	    for (; index < nIndex; index++) {
   602 	    for (; index < nIndex; index++) {
   597 		if (InterruptPending != nil) __interruptL(@line CONARG);
       
   598 
       
   599 		element = __InstPtr(self)->i_instvars[index];
   603 		element = __InstPtr(self)->i_instvars[index];
   600 		if (element != nil) {
   604 		if (element != nil) {
       
   605 		    if (InterruptPending != nil) {
       
   606 			__interruptL(@line CONARG);
       
   607 			/* refetch; who knows what is done in the interrupt ... */
       
   608 			element = __InstPtr(self)->i_instvars[index];
       
   609 		    }
   601 		    element = __WEAK_READ__(self, element);
   610 		    element = __WEAK_READ__(self, element);
   602 		    if (element != nil) {
   611 		    if (element != nil) {
   603 			(*codeVal)(home, element);
   612 			(*codeVal)(home, element);
   604 		    }
   613 		    }
   605 		}
   614 		}
   606 	    }
   615 	    }
   607 	} 
   616 	} 
   608 #endif
   617 #endif
   609     } else {
   618     } else {
   610 	for (; index < nIndex; index++) {
   619 	for (; index < nIndex; index++) {
   611 	    if (InterruptPending != nil) __interruptL(@line CONARG);
       
   612 
       
   613 	    element = __InstPtr(self)->i_instvars[index];
   620 	    element = __InstPtr(self)->i_instvars[index];
   614 	    if (element != nil) {
   621 	    if (element != nil) {
       
   622 		if (InterruptPending != nil) {
       
   623 		    __interruptL(@line CONARG);
       
   624 		    /* refetch; who knows what is done in the interrupt ... */
       
   625 		    element = __InstPtr(self)->i_instvars[index];
       
   626 		}
   615 		element = __WEAK_READ__(self, element);
   627 		element = __WEAK_READ__(self, element);
   616 		if (element != nil) {
   628 		if (element != nil) {
   617 		    (*val.ilc_func)(aBlock, 
   629 		    (*val.ilc_func)(aBlock, 
   618 				    @symbol(value:), 
   630 				    @symbol(value:), 
   619 				    nil, &val, 
   631 				    nil, &val, 
   643 ! !
   655 ! !
   644 
   656 
   645 !WeakArray class methodsFor:'documentation'!
   657 !WeakArray class methodsFor:'documentation'!
   646 
   658 
   647 version
   659 version
   648     ^ '$Header: /cvs/stx/stx/libbasic/WeakArray.st,v 1.35 1996-10-27 14:10:46 cg Exp $'
   660     ^ '$Header: /cvs/stx/stx/libbasic/WeakArray.st,v 1.36 1996-11-06 12:17:58 cg Exp $'
   649 ! !
   661 ! !
   650 WeakArray initialize!
   662 WeakArray initialize!