Array.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 22 Sep 2015 16:28:42 +0100
branchjv
changeset 18759 c1217211909c
parent 18678 a9b30d72dff9
child 18942 b48824459593
permissions -rw-r--r--
Changed identification strings to contain jv-branch ...to make explicit that this distribution is not the official one used by eXept and therefore that eXept is not to be blamed in case of any problem.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18267
3bc0c58cb8e9 class: Array
Stefan Vogel <sv@exept.de>
parents: 18246
diff changeset
     1
"{ Encoding: utf8 }"
3bc0c58cb8e9 class: Array
Stefan Vogel <sv@exept.de>
parents: 18246
diff changeset
     2
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     4
 COPYRIGHT (c) 1989 by Claus Gittinger
155
edd7fc34e104 *** empty log message ***
claus
parents: 92
diff changeset
     5
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
"
5347
21b418ac4cc3 oops: from:to:do: failed badly when stopIndex was < startIndex.
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
    14
"{ Package: 'stx:libbasic' }"
21b418ac4cc3 oops: from:to:do: failed badly when stopIndex was < startIndex.
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
    15
17376
5c0cab0193cf class: Array
Stefan Vogel <sv@exept.de>
parents: 16387
diff changeset
    16
"{ NameSpace: Smalltalk }"
5c0cab0193cf class: Array
Stefan Vogel <sv@exept.de>
parents: 16387
diff changeset
    17
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
ArrayedCollection variableSubclass:#Array
1083
fadaedfa28f8 cosmetic change - no space after last element in displayString
Claus Gittinger <cg@exept.de>
parents: 951
diff changeset
    19
	instanceVariableNames:''
fadaedfa28f8 cosmetic change - no space after last element in displayString
Claus Gittinger <cg@exept.de>
parents: 951
diff changeset
    20
	classVariableNames:''
fadaedfa28f8 cosmetic change - no space after last element in displayString
Claus Gittinger <cg@exept.de>
parents: 951
diff changeset
    21
	poolDictionaries:''
fadaedfa28f8 cosmetic change - no space after last element in displayString
Claus Gittinger <cg@exept.de>
parents: 951
diff changeset
    22
	category:'Collections-Arrayed'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
    25
!Array class methodsFor:'documentation'!
77
6c38ca59927f *** empty log message ***
claus
parents: 47
diff changeset
    26
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    27
copyright
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    28
"
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    29
 COPYRIGHT (c) 1989 by Claus Gittinger
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    30
	      All Rights Reserved
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    31
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    32
 This software is furnished under a license and may be used
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    33
 only in accordance with the terms of that license and with the
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    35
 be provided or otherwise made available to, or used by, any
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    36
 other person.  No title to or ownership of the software is
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    37
 hereby transferred.
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    38
"
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    39
!
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
    40
77
6c38ca59927f *** empty log message ***
claus
parents: 47
diff changeset
    41
documentation
6c38ca59927f *** empty log message ***
claus
parents: 47
diff changeset
    42
"
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    43
    Instances of Array store general objects;
16386
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    44
    an array's size is fixed, therefore add:/remove: are not allowed.
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
    45
    (actually, #add: is implemented for compatibility with smalltalks which
16386
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    46
     provide it, but it is very slow and outputs an annoying warning message...)
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    47
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    48
    Access to the individual elements is via an integer index,
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    49
    using the well-known access messages #at: and #at:put:.
399
claus
parents: 393
diff changeset
    50
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
    51
    Since Arrays are used very often in the system (either directly or a data-container
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
    52
    of more complex collection classes), some methods have been tuned by reimplementing
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
    53
    them as primitives. Also, the compiler inline-codes some operations
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
    54
    (especially: the above accessing messages).
92
0c73b48551ac *** empty log message ***
claus
parents: 82
diff changeset
    55
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
    56
    Notice that Array is a built-in class
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
    57
    (i.e. the VM knows about its representation).
16386
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    58
    Therefore it is NOT possible to add named instance variables or change Arrays inheritance.
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
    59
    However, subclassing is allowed of course
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    60
    - even with added named instance variables.
92
0c73b48551ac *** empty log message ***
claus
parents: 82
diff changeset
    61
0c73b48551ac *** empty log message ***
claus
parents: 82
diff changeset
    62
    Literal arrays (i.e. array-constants) are entered in source as:
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    63
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    64
	#( element1 element2 ... element-N)
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    65
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    66
    where each element must be itself a literal constant.
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    67
    Array, symbol and byteArray constants within an array can be written
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    68
    without the initial #-character.
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    69
    In addition, true, false and nil are also allowed as array-literal.
399
claus
parents: 393
diff changeset
    70
92
0c73b48551ac *** empty log message ***
claus
parents: 82
diff changeset
    71
    Examples:
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    72
      #(1 2 3)                -> 3 elements: 1, 2 and 3
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    73
      #('foo' 2 (1 2))        -> 3 elements: a String, 2 and anotherArray
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    74
      #('foo' #(1 2) #foo)    -> 3 elements: a String, another array and a symbol
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    75
      #('foo' (1 2) foo)      -> same as above
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    76
      #(nil true #true)       -> 3 elements: nil, true and a symbol (watch out)
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
    77
      #(two [3 3 3] (4 4 4))  -> 3 elements: a symbol, a byteArray and another array
1276
21649f929b32 commentary
Claus Gittinger <cg@exept.de>
parents: 1266
diff changeset
    78
16386
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    79
    Also, a syntactic sugar piece allows for Array instances to be created dynamcially
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    80
    at runtime with the brace syntax:
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    81
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    82
	{ expr1 . expr2 . ... . expr-N }
16386
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    83
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    84
    where each expr-i evaluates to an element of the new array instance.
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    85
    Notice that the expressions are separated by a period.
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    86
    Semantically, this is equivalent to ``Array with:expr1 with:expr2 ... with:expr-N''
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    87
    Examples:
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    88
	{ 1 . 2 . 3 }         -> a new 3 element array; similar to #( 1 2 3 ),
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    89
				 but in contrast, a new array instance is created
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    90
	{
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    91
	    { 'foo' . [ Transcript showCR:'foo' ] } .
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    92
	    { 'bar' . [ Transcript showCR:'bar' ] }
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    93
	    { 'baz' . [ Transcript showCR:'baz' ] }
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    94
	}
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    95
			      -> a new 3 element array, consisting of 3 new
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    96
				 2-element array instances, consisting of a string
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
    97
				 and a block each
16386
99c180342c05 class: Array
Claus Gittinger <cg@exept.de>
parents: 16262
diff changeset
    98
4062
4959de96b06f documentation
Claus Gittinger <cg@exept.de>
parents: 3979
diff changeset
    99
    [memory requirements:]
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   100
	OBJ-HEADER + (size * ptr-size)
4062
4959de96b06f documentation
Claus Gittinger <cg@exept.de>
parents: 3979
diff changeset
   101
2145
d243ffafeae3 more docu
Claus Gittinger <cg@exept.de>
parents: 2052
diff changeset
   102
    [warning:]
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   103
	read the warning about 'growing fixed size collection'
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   104
	in ArrayedCollection's documentation
1276
21649f929b32 commentary
Claus Gittinger <cg@exept.de>
parents: 1266
diff changeset
   105
1290
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1276
diff changeset
   106
    [author:]
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   107
	Claus Gittinger
1290
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1276
diff changeset
   108
1276
21649f929b32 commentary
Claus Gittinger <cg@exept.de>
parents: 1266
diff changeset
   109
    [see also:]
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   110
	OrderedCollection
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   111
	ByteArray FloatArray DoubleArray IntegerArray BitArray
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   112
	CharacterArray String
77
6c38ca59927f *** empty log message ***
claus
parents: 47
diff changeset
   113
"
626
f359cb7eba58 version at the end
Claus Gittinger <cg@exept.de>
parents: 588
diff changeset
   114
! !
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   115
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
   116
!Array class methodsFor:'instance creation'!
249
claus
parents: 220
diff changeset
   117
claus
parents: 220
diff changeset
   118
basicNew:anInteger
claus
parents: 220
diff changeset
   119
    "return an instance of myself with anInteger indexed variables.
claus
parents: 220
diff changeset
   120
     Since Array-creation is so common (all other collections use them),
claus
parents: 220
diff changeset
   121
     it seems worth to have a specially tuned version here."
claus
parents: 220
diff changeset
   122
claus
parents: 220
diff changeset
   123
%{  /* NOCONTEXT */
claus
parents: 220
diff changeset
   124
claus
parents: 220
diff changeset
   125
    OBJ newobj;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   126
    unsigned INT nInstVars;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   127
    unsigned INT instsize;
249
claus
parents: 220
diff changeset
   128
    INT nindexedinstvars;
claus
parents: 220
diff changeset
   129
    REGISTER OBJ *op;
claus
parents: 220
diff changeset
   130
claus
parents: 220
diff changeset
   131
    if (__isSmallInteger(anInteger)) {
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
   132
	nindexedinstvars = __intVal(anInteger);
249
claus
parents: 220
diff changeset
   133
	if (nindexedinstvars >= 0) {
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
   134
	    nInstVars = __intVal(__ClassInstPtr(self)->c_ninstvars);
249
claus
parents: 220
diff changeset
   135
claus
parents: 220
diff changeset
   136
	    nInstVars += nindexedinstvars;
claus
parents: 220
diff changeset
   137
	    instsize = OHDR_SIZE + __OBJS2BYTES__(nInstVars);
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
   138
	    if (__CanDoQuickAlignedNew(instsize)) {     /* OBJECT ALLOCATION */
357
claus
parents: 356
diff changeset
   139
		/*
claus
parents: 356
diff changeset
   140
		 * the most common case
claus
parents: 356
diff changeset
   141
		 */
835
8bd6f4aa8130 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 834
diff changeset
   142
		__qCheckedAlignedNew(newobj, instsize);
357
claus
parents: 356
diff changeset
   143
	ok: ;
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
   144
		__InstPtr(newobj)->o_class = self;
369
claus
parents: 365
diff changeset
   145
		__qSTORE(newobj, self);
claus
parents: 365
diff changeset
   146
14623
c433536ae3ab 64 bit fixes
Claus Gittinger <cg@exept.de>
parents: 14380
diff changeset
   147
#if (POINTER_SIZE == 4) && defined(memset4) && defined(FAST_ARRAY_MEMSET4)
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
   148
		memset4(__InstPtr(newobj)->i_instvars, nil, nInstVars);
249
claus
parents: 220
diff changeset
   149
#else
claus
parents: 220
diff changeset
   150
# if !defined(NEGATIVE_ADDRESSES)
claus
parents: 220
diff changeset
   151
		/*
claus
parents: 220
diff changeset
   152
		 * knowing that nil is 0
claus
parents: 220
diff changeset
   153
		 */
14657
6610eb2df25c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   154
#  ifdef __sparc__
6610eb2df25c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   155
#   define FAST_ARRAY_MEMSET_DOUBLES_UNROLLED
6610eb2df25c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   156
#  endif
2979
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   157
14657
6610eb2df25c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   158
#  ifdef __VMS__
6610eb2df25c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   159
#   define FAST_ARRAY_MEMSET_LONGLONG_UNROLLED
6610eb2df25c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 14632
diff changeset
   160
#  endif
2979
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   161
249
claus
parents: 220
diff changeset
   162
#  if defined(FAST_ARRAY_MEMSET_DOUBLES_UNROLLED)
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
   163
		op = __InstPtr(newobj)->i_instvars;
249
claus
parents: 220
diff changeset
   164
		if (nInstVars > 8) {
claus
parents: 220
diff changeset
   165
		    *op++ = nil;    /* for alignment */
claus
parents: 220
diff changeset
   166
		    nInstVars--;
claus
parents: 220
diff changeset
   167
		    while (nInstVars >= 8) {
claus
parents: 220
diff changeset
   168
			*(double *)op = 0.0;
claus
parents: 220
diff changeset
   169
			((double *)op)[1] = 0.0;
claus
parents: 220
diff changeset
   170
			((double *)op)[2] = 0.0;
claus
parents: 220
diff changeset
   171
			((double *)op)[3] = 0.0;
claus
parents: 220
diff changeset
   172
			op += 8;
claus
parents: 220
diff changeset
   173
			nInstVars -= 8;
claus
parents: 220
diff changeset
   174
		    }
claus
parents: 220
diff changeset
   175
		}
claus
parents: 220
diff changeset
   176
		while (nInstVars) {
claus
parents: 220
diff changeset
   177
		    *op++ = 0;
claus
parents: 220
diff changeset
   178
		    nInstVars--;
claus
parents: 220
diff changeset
   179
		}
claus
parents: 220
diff changeset
   180
#  else
14623
c433536ae3ab 64 bit fixes
Claus Gittinger <cg@exept.de>
parents: 14380
diff changeset
   181
#   if (POINTER_SIZE == 4) && defined(FAST_ARRAY_MEMSET_LONGLONG_UNROLLED)
2979
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   182
#    ifdef INT64
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   183
#     define LONGLONG INT64
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   184
#    else
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   185
#     define LONGLONG long long
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   186
#    endif
2979
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   187
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
   188
		op = __InstPtr(newobj)->i_instvars;
249
claus
parents: 220
diff changeset
   189
		if (nInstVars > 8) {
claus
parents: 220
diff changeset
   190
		    *op++ = nil;    /* for alignment */
claus
parents: 220
diff changeset
   191
		    nInstVars--;
claus
parents: 220
diff changeset
   192
		    while (nInstVars >= 8) {
2979
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   193
			*(LONGLONG *)op = 0;
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   194
			((LONGLONG *)op)[1] = 0;
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   195
			((LONGLONG *)op)[2] = 0;
6bb06c5e49d8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2950
diff changeset
   196
			((LONGLONG *)op)[3] = 0;
249
claus
parents: 220
diff changeset
   197
			op += 8;
claus
parents: 220
diff changeset
   198
			nInstVars -= 8;
claus
parents: 220
diff changeset
   199
		    }
claus
parents: 220
diff changeset
   200
		}
claus
parents: 220
diff changeset
   201
		while (nInstVars) {
claus
parents: 220
diff changeset
   202
		    *op++ = 0;
claus
parents: 220
diff changeset
   203
		    nInstVars--;
claus
parents: 220
diff changeset
   204
		}
claus
parents: 220
diff changeset
   205
#   else
claus
parents: 220
diff changeset
   206
#    if defined(FAST_ARRAY_MEMSET)
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
   207
		memset(__InstPtr(newobj)->i_instvars, 0, instsize - OHDR_SIZE);
249
claus
parents: 220
diff changeset
   208
#    else
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
   209
		op = __InstPtr(newobj)->i_instvars;
14623
c433536ae3ab 64 bit fixes
Claus Gittinger <cg@exept.de>
parents: 14380
diff changeset
   210
#     if (POINTER_SIZE == 4) && defined(INT64)
2950
d5fae0fb75d7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2915
diff changeset
   211
		while (nInstVars > 1) {
d5fae0fb75d7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2915
diff changeset
   212
		    *((INT64 *)op) = 0;
d5fae0fb75d7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2915
diff changeset
   213
		    nInstVars -= 2;
d5fae0fb75d7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2915
diff changeset
   214
		    op += 2;
d5fae0fb75d7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2915
diff changeset
   215
		}
d5fae0fb75d7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2915
diff changeset
   216
#     endif
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   217
		while (nInstVars >= 8) {
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   218
		    nInstVars -= 8;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   219
		    op[0] = nil; op[1] = nil;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   220
		    op[2] = nil; op[3] = nil;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   221
		    op[4] = nil; op[5] = nil;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   222
		    op[6] = nil; op[7] = nil;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   223
		    op += 8;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   224
		}
249
claus
parents: 220
diff changeset
   225
		while (nInstVars--)
claus
parents: 220
diff changeset
   226
		    *op++ = nil;
claus
parents: 220
diff changeset
   227
#    endif
claus
parents: 220
diff changeset
   228
#   endif
claus
parents: 220
diff changeset
   229
#  endif
claus
parents: 220
diff changeset
   230
# else
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
   231
		op = __InstPtr(newobj)->i_instvars;
249
claus
parents: 220
diff changeset
   232
		while (nInstVars--)
claus
parents: 220
diff changeset
   233
		    *op++ = nil;
claus
parents: 220
diff changeset
   234
# endif
claus
parents: 220
diff changeset
   235
#endif
claus
parents: 220
diff changeset
   236
		RETURN ( newobj );
357
claus
parents: 356
diff changeset
   237
	    } else {
claus
parents: 356
diff changeset
   238
		/*
claus
parents: 356
diff changeset
   239
		 * a GC will happen ...
claus
parents: 356
diff changeset
   240
		 * have to protect all context stuff
claus
parents: 356
diff changeset
   241
		 * (especially for self, but also for backtrace in case of
claus
parents: 356
diff changeset
   242
		 *  allocation failure)
claus
parents: 356
diff changeset
   243
		 */
834
c68ed1088b42 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 829
diff changeset
   244
		__PROTECT_CONTEXT__
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   245
		newobj = __STX___new((INT)instsize);
834
c68ed1088b42 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 829
diff changeset
   246
		__UNPROTECT_CONTEXT__
357
claus
parents: 356
diff changeset
   247
		if (newobj != nil) {
claus
parents: 356
diff changeset
   248
		    goto ok;
claus
parents: 356
diff changeset
   249
		}
249
claus
parents: 220
diff changeset
   250
	    }
claus
parents: 220
diff changeset
   251
	}
claus
parents: 220
diff changeset
   252
    }
claus
parents: 220
diff changeset
   253
%}.
claus
parents: 220
diff changeset
   254
    "
claus
parents: 220
diff changeset
   255
     arrive here if something went wrong ...
claus
parents: 220
diff changeset
   256
     figure out what it was
claus
parents: 220
diff changeset
   257
    "
claus
parents: 220
diff changeset
   258
    (anInteger isMemberOf:SmallInteger) ifFalse:[
claus
parents: 220
diff changeset
   259
	"
claus
parents: 220
diff changeset
   260
	 the argument is either not an integer,
claus
parents: 220
diff changeset
   261
	 or a LargeInteger (which means that its definitely too big)
claus
parents: 220
diff changeset
   262
	"
claus
parents: 220
diff changeset
   263
	self error:'argument to new: must be Integer'.
claus
parents: 220
diff changeset
   264
	^ nil
claus
parents: 220
diff changeset
   265
    ].
claus
parents: 220
diff changeset
   266
    (anInteger < 0) ifTrue:[
claus
parents: 220
diff changeset
   267
	"
claus
parents: 220
diff changeset
   268
	 the argument is negative,
claus
parents: 220
diff changeset
   269
	"
claus
parents: 220
diff changeset
   270
	self error:'bad (negative) argument to new:'.
claus
parents: 220
diff changeset
   271
	^ nil
claus
parents: 220
diff changeset
   272
    ].
claus
parents: 220
diff changeset
   273
    "
claus
parents: 220
diff changeset
   274
     memory allocation failed.
claus
parents: 220
diff changeset
   275
     When we arrive here, there was no memory, even after
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   276
     a garbage collect.
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   277
     This means, that the VM wanted to get some more memory from the
249
claus
parents: 220
diff changeset
   278
     Operatingsystem, which was not kind enough to give it.
claus
parents: 220
diff changeset
   279
     Bad luck - you should increase the swap space on your machine.
claus
parents: 220
diff changeset
   280
    "
claus
parents: 220
diff changeset
   281
    ^ ObjectMemory allocationFailureSignal raise.
549
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   282
!
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   283
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   284
new:anInteger
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   285
    "return an instance of myself with anInteger indexed variables.
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
   286
     Redefined here to save a few cycles when executed.
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
   287
     (Since this is often called, its worth giving it an extra ilc-slot.
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
   288
      Future versions of stc will do this automatically.)"
549
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   289
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   290
    ^ self basicNew:anInteger
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
   291
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
   292
    "Modified: 23.4.1996 / 15:52:15 / cg"
360
claus
parents: 359
diff changeset
   293
! !
claus
parents: 359
diff changeset
   294
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
   295
!Array class methodsFor:'queries'!
345
claus
parents: 328
diff changeset
   296
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   297
isBuiltInClass
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
   298
    "return true if this class is known by the run-time-system.
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
   299
     Here, true is returned for myself, false for subclasses."
345
claus
parents: 328
diff changeset
   300
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   301
    ^ self == Array
1243
955b7f55f7a4 commentary
Claus Gittinger <cg@exept.de>
parents: 1219
diff changeset
   302
1266
cef9b3cd49df commentary
Claus Gittinger <cg@exept.de>
parents: 1244
diff changeset
   303
    "Modified: 23.4.1996 / 15:55:06 / cg"
249
claus
parents: 220
diff changeset
   304
! !
claus
parents: 220
diff changeset
   305
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
!Array methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   308
at:index
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   309
    "return the indexed instance variable with index, anInteger.
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   310
     Reimplemented here to avoid the additional at:->basicAt: send
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   311
     (which we can do here, since when arriving here, #at: is obviously not
1730
e668db8cbae0 comment
Claus Gittinger <cg@exept.de>
parents: 1695
diff changeset
   312
      redefined in a subclass).
577
106bfaa8db3c commentary
Claus Gittinger <cg@exept.de>
parents: 554
diff changeset
   313
     This method is the same as basicAt:."
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   314
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   315
%{  /* NOCONTEXT */
18288
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   316
#ifdef __SCHTEAM__
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   317
    if (index.isSmallInteger()) {
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   318
	return context._RETURN( self.basicAt(index.intValue() ));
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   319
    }
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   320
#else
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   321
    REGISTER INT indx;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   322
    REGISTER OBJ slf;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   323
    REGISTER unsigned INT nIndex;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   324
    REGISTER OBJ cls;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   325
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   326
    if (__isSmallInteger(index)) {
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   327
	indx = __intVal(index) - 1;
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   328
	slf = self;
18257
877a8f1b326d Optimize for fast-path in Array >> at: / at:put:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
   329
	cls = __qClass(slf);
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   330
	cls = __qClass(slf);
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   331
	nIndex = __BYTES2OBJS__(__qSize(slf) - OHDR_SIZE);
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   332
	if (cls == Array) {
18257
877a8f1b326d Optimize for fast-path in Array >> at: / at:put:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
   333
	    fetch:
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   334
	    if ((unsigned INT)indx < (unsigned INT)nIndex) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   335
		RETURN ( __InstPtr(slf)->i_instvars[indx] );
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   336
	    }
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   337
	    goto badIndex;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   338
	}
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   339
	if (indx >= 0) {
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   340
	    indx += __intVal(__ClassInstPtr(cls)->c_ninstvars);
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   341
	    goto fetch;
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   342
	}
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   343
    }
4385
dbe7d1e8c54c oops - subclasses with instVars allowed for index-less-than-1-access
Claus Gittinger <cg@exept.de>
parents: 4309
diff changeset
   344
badIndex: ;
18288
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   345
#endif /* not SCHTEAM */
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   346
%}.
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   347
"/    ^ super at:index
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   348
    ^ super basicAt:index   "/ knowing that super-#at: does #basicAt:
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   349
!
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   350
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   351
at:index put:anObject
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   352
    "store the 2nd arg, anObject as indexed instvar with index, anInteger.
1219
054f7eff0c30 commentary
Claus Gittinger <cg@exept.de>
parents: 1168
diff changeset
   353
     Returns anObject (sigh).
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   354
     Reimplemented here to avoid the additional at:put:->basicAt:put: send
1730
e668db8cbae0 comment
Claus Gittinger <cg@exept.de>
parents: 1695
diff changeset
   355
     (which we can do here, since when arriving here, #atput:: is obviously not
e668db8cbae0 comment
Claus Gittinger <cg@exept.de>
parents: 1695
diff changeset
   356
      redefined in a subclass).
577
106bfaa8db3c commentary
Claus Gittinger <cg@exept.de>
parents: 554
diff changeset
   357
     This method is the same as basicAt:put:."
549
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   358
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   359
%{  /* NOCONTEXT */
18288
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   360
#ifdef __SCHTEAM__
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   361
    if (index.isSmallInteger()) {
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   362
	self.basicAt_put(index.intValue(), anObject);
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   363
	return context._RETURN( anObject );
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   364
    }
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   365
#else
549
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   366
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   367
    REGISTER INT indx;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   368
    REGISTER OBJ slf;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   369
    REGISTER unsigned INT nIndex;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   370
    REGISTER OBJ cls;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   371
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   372
    if (__isSmallInteger(index)) {
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   373
	indx = __intVal(index) - 1;
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   374
	slf = self;
18257
877a8f1b326d Optimize for fast-path in Array >> at: / at:put:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
   375
        cls = __qClass(slf);
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   376
	cls = __qClass(slf);
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   377
	nIndex = __BYTES2OBJS__(__qSize(slf) - OHDR_SIZE);
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   378
	if (cls == Array) {
18257
877a8f1b326d Optimize for fast-path in Array >> at: / at:put:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18120
diff changeset
   379
	    store:
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   380
	    if ((unsigned INT)indx < (unsigned INT)nIndex) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   381
		__InstPtr(slf)->i_instvars[indx] = anObject;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   382
		__STORE(slf, anObject);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   383
		RETURN ( anObject );
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   384
	    }
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   385
	    goto badIndex;
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   386
	}
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   387
	if (indx >= 0) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   388
	    indx += __intVal(__ClassInstPtr(cls)->c_ninstvars);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
   389
	    goto store;
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   390
	}
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   391
    }
4385
dbe7d1e8c54c oops - subclasses with instVars allowed for index-less-than-1-access
Claus Gittinger <cg@exept.de>
parents: 4309
diff changeset
   392
badIndex: ;
18289
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
   393
#endif /* not SCHTEAM */
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   394
%}.
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   395
"/    ^ super at:index put:anObject
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   396
    ^ super basicAt:index put:anObject  "/ knowing that super-#at:put: does #basicAt:put:
1219
054f7eff0c30 commentary
Claus Gittinger <cg@exept.de>
parents: 1168
diff changeset
   397
054f7eff0c30 commentary
Claus Gittinger <cg@exept.de>
parents: 1168
diff changeset
   398
    "Modified: 19.4.1996 / 11:16:42 / cg"
549
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   399
!
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   400
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   401
basicAt:index
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   402
    "return the indexed instance variable with index, anInteger
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   403
     - added here for speed"
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   404
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   405
%{  /* NOCONTEXT */
18288
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   406
#ifdef __SCHTEAM__
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   407
    if (index.isSmallInteger()) {
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   408
	return context._RETURN( self.basicAt(index.intValue() ));
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   409
    }
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   410
#else
549
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   411
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   412
    REGISTER INT indx;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   413
    REGISTER OBJ slf;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   414
    REGISTER unsigned INT nIndex;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   415
    REGISTER OBJ cls;
549
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   416
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   417
    if (__isSmallInteger(index)) {
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   418
	indx = __intVal(index) - 1;
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   419
	slf = self;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   420
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   421
	nIndex = __BYTES2OBJS__(__qSize(slf) - OHDR_SIZE);
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   422
	if ((cls = __qClass(slf)) != Array) {
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   423
	    if (indx < 0) goto badIndex;
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   424
	    indx += __intVal(__ClassInstPtr(cls)->c_ninstvars);
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   425
	}
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   426
	if ((unsigned INT)indx < (unsigned INT)nIndex) {
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   427
	    RETURN ( __InstPtr(slf)->i_instvars[indx] );
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   428
	}
549
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   429
    }
4385
dbe7d1e8c54c oops - subclasses with instVars allowed for index-less-than-1-access
Claus Gittinger <cg@exept.de>
parents: 4309
diff changeset
   430
badIndex: ;
18288
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   431
#endif /* not SCHTEAM */
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   432
%}.
549
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   433
    ^ super basicAt:index
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   434
!
2a8e44b511c2 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 543
diff changeset
   435
77
6c38ca59927f *** empty log message ***
claus
parents: 47
diff changeset
   436
basicAt:index put:anObject
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
    "store the 2nd arg, anObject as indexed instvar with index, anInteger.
1219
054f7eff0c30 commentary
Claus Gittinger <cg@exept.de>
parents: 1168
diff changeset
   438
     Returns anObject (sigh).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
     - added here for speed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
%{  /* NOCONTEXT */
18288
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   442
#ifdef __SCHTEAM__
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   443
    if (index.isSmallInteger()) {
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   444
	self.basicAt_put(index.intValue(), anObject);
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   445
	return context._RETURN( anObject );
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   446
    }
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   447
#else
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   448
    REGISTER INT indx;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   449
    REGISTER OBJ slf;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   450
    REGISTER unsigned INT nIndex;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   451
    REGISTER OBJ cls;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
249
claus
parents: 220
diff changeset
   453
    if (__isSmallInteger(index)) {
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   454
	indx = __intVal(index) - 1;
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   455
	slf = self;
1143
27325100bdf4 can check index against low..hi with a single compare&branch
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   456
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   457
	nIndex = __BYTES2OBJS__(__qSize(slf) - OHDR_SIZE);
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   458
	if ((cls = __qClass(slf)) != Array) {
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   459
	    if (indx < 0) goto badIndex;
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   460
	    indx += __intVal(__ClassInstPtr(cls)->c_ninstvars);
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   461
	}
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   462
	if ((unsigned INT)indx < (unsigned INT)nIndex) {
4474
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   463
	    __InstPtr(slf)->i_instvars[indx] = anObject;
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   464
	    __STORE(slf, anObject);
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   465
	    RETURN ( anObject );
d34823aa554e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4385
diff changeset
   466
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
    }
4385
dbe7d1e8c54c oops - subclasses with instVars allowed for index-less-than-1-access
Claus Gittinger <cg@exept.de>
parents: 4309
diff changeset
   468
badIndex: ;
18288
1232fc152674 steam code
Claus Gittinger <cg@exept.de>
parents: 18267
diff changeset
   469
#endif /* not SCHTEAM */
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   470
%}.
77
6c38ca59927f *** empty log message ***
claus
parents: 47
diff changeset
   471
    ^ super basicAt:index put:anObject
1219
054f7eff0c30 commentary
Claus Gittinger <cg@exept.de>
parents: 1168
diff changeset
   472
054f7eff0c30 commentary
Claus Gittinger <cg@exept.de>
parents: 1168
diff changeset
   473
    "Modified: 19.4.1996 / 11:14:26 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   476
!Array methodsFor:'converting'!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   477
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   478
asArray
15061
fea9df1c613a class: Array
Claus Gittinger <cg@exept.de>
parents: 14995
diff changeset
   479
    "return the receiver as an array - that's the receiver itself.
fea9df1c613a class: Array
Claus Gittinger <cg@exept.de>
parents: 14995
diff changeset
   480
     Notice: Use asNewArray, if you intent to modify the returned collection."
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   481
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   482
    "could be an instance of a subclass..."
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   483
    self class == Array ifTrue:[
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   484
	^ self
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   485
    ].
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   486
    ^ super asArray
1243
955b7f55f7a4 commentary
Claus Gittinger <cg@exept.de>
parents: 1219
diff changeset
   487
955b7f55f7a4 commentary
Claus Gittinger <cg@exept.de>
parents: 1219
diff changeset
   488
    "Modified: 22.4.1996 / 12:42:09 / cg"
12452
Claus Gittinger <cg@exept.de>
parents: 12162
diff changeset
   489
!
Claus Gittinger <cg@exept.de>
parents: 12162
diff changeset
   490
Claus Gittinger <cg@exept.de>
parents: 12162
diff changeset
   491
asImmutableArray
Claus Gittinger <cg@exept.de>
parents: 12162
diff changeset
   492
    "return a write-protected copy of myself"
Claus Gittinger <cg@exept.de>
parents: 12162
diff changeset
   493
14158
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   494
    "/ self assert:(ImmutableArray notNil).
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   495
    ^ self copy beImmutable
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   496
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   497
    "Modified: / 07-06-2012 / 11:06:48 / cg"
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   498
!
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   499
14995
3ac27883699a class: Array
Stefan Vogel <sv@exept.de>
parents: 14687
diff changeset
   500
asNewArray
3ac27883699a class: Array
Stefan Vogel <sv@exept.de>
parents: 14687
diff changeset
   501
    "return the receiver as an unique new array."
3ac27883699a class: Array
Stefan Vogel <sv@exept.de>
parents: 14687
diff changeset
   502
3ac27883699a class: Array
Stefan Vogel <sv@exept.de>
parents: 14687
diff changeset
   503
    "could be an instance of a subclass..."
3ac27883699a class: Array
Stefan Vogel <sv@exept.de>
parents: 14687
diff changeset
   504
    self class == Array ifTrue:[
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   505
	^ self copy
14995
3ac27883699a class: Array
Stefan Vogel <sv@exept.de>
parents: 14687
diff changeset
   506
    ].
3ac27883699a class: Array
Stefan Vogel <sv@exept.de>
parents: 14687
diff changeset
   507
    ^ super asArray
3ac27883699a class: Array
Stefan Vogel <sv@exept.de>
parents: 14687
diff changeset
   508
!
3ac27883699a class: Array
Stefan Vogel <sv@exept.de>
parents: 14687
diff changeset
   509
14158
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   510
beImmutable
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   511
    "make myself write-protected"
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   512
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   513
    self changeClassTo:ImmutableArray
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   514
8565a6b7f00a added: #beImmutable
Claus Gittinger <cg@exept.de>
parents: 13077
diff changeset
   515
    "Created: / 07-06-2012 / 11:06:33 / cg"
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   516
! !
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   517
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
!Array methodsFor:'copying'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
15848
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   520
, aCollection
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   521
%{
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   522
    if (__isArray(aCollection)) {
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   523
	if (__isArray(self)) {
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   524
	    OBJ newArray;
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   525
	    int mySize = __arraySize(self);
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   526
	    int otherSize = __arraySize(aCollection);
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   527
	    REGISTER OBJ src;
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   528
	    int srcIdx, dstIdx;
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   529
	    newArray = __ARRAY_NEW_INT(mySize+otherSize);
15848
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   530
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   531
	    src = self;
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   532
	    for (dstIdx=0; dstIdx<mySize; dstIdx++) {
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   533
		OBJ el = __ArrayInstPtr(src)->a_element[dstIdx];
15848
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   534
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   535
		__ArrayInstPtr(newArray)->a_element[dstIdx] = el;
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   536
		__STORE(newArray, el);
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   537
	    }
15848
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   538
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   539
	    src = aCollection;
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   540
	    for (srcIdx=0; srcIdx<otherSize; srcIdx++, dstIdx++) {
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   541
		OBJ el = __ArrayInstPtr(src)->a_element[srcIdx];
15848
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   542
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   543
		__ArrayInstPtr(newArray)->a_element[dstIdx] = el;
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   544
		__STORE(newArray, el);
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   545
	    }
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   546
	    RETURN (newArray);
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
   547
	}
15848
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   548
    }
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   549
%}.
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   550
    ^ super , aCollection
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   551
!
e839ccbebb14 class: Array
Claus Gittinger <cg@exept.de>
parents: 15608
diff changeset
   552
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
copyWith:something
220
9079bd965dd7 keysAndValuesDo: fix
claus
parents: 219
diff changeset
   554
    "return a new collection containing the receivers elements
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   555
     and the single new element, newElement.
220
9079bd965dd7 keysAndValuesDo: fix
claus
parents: 219
diff changeset
   556
     This is different from concatentation, which expects another collection
9079bd965dd7 keysAndValuesDo: fix
claus
parents: 219
diff changeset
   557
     as argument, but equivalent to copy-and-addLast.
370
claus
parents: 369
diff changeset
   558
     Reimplemented for speed if receiver is an Array.
claus
parents: 369
diff changeset
   559
     (since the inherited copyWith uses replaceFromTo:, which is also
claus
parents: 369
diff changeset
   560
      tuned, it is questionable, if we need this)"
claus
parents: 369
diff changeset
   561
claus
parents: 369
diff changeset
   562
%{  /* NOCONTEXT */
4122
7e3b6b267c06 comment
Claus Gittinger <cg@exept.de>
parents: 4062
diff changeset
   563
    OBJ nObj;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   564
    unsigned INT sz;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   565
    unsigned INT nIndex;
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   566
    REGISTER OBJ *srcP, *dstP;
293
31df3850e98c *** empty log message ***
claus
parents: 287
diff changeset
   567
    REGISTER int spc;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
328
claus
parents: 325
diff changeset
   569
    if (__qClass(self) == Array) {
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   570
	sz = __qSize(self) + sizeof(OBJ);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   571
	__PROTECT2__(something, self);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   572
	__qAlignedNew(nObj, sz);        /* OBJECT ALLOCATION */
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   573
	__UNPROTECT2__(self, something);
92
0c73b48551ac *** empty log message ***
claus
parents: 82
diff changeset
   574
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   575
	if (nObj) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   576
	    __InstPtr(nObj)->o_class = Array;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   577
	    __qSTORE(nObj, Array);
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   579
	    nIndex = __BYTES2OBJS__(sz - OHDR_SIZE - sizeof(OBJ));
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   580
	    /*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   581
	     * sorry:
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   582
	     *   cannot use bcopy, since we must take care of stores ...
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   583
	     *   could check for: notRemembered + inOld + notLifoRem
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   584
	     *                  + not incrGCRunning
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   585
	     * but: copyWith is not heavily used by real programmers ...
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   586
	     */
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   587
	    spc = __qSpace(nObj);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   588
	    srcP = __arrayVal(self);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   589
	    dstP = __arrayVal(nObj);
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
   590
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   591
#ifdef __UNROLL_LOOPS__
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   592
	    while (nIndex >= 4) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   593
		OBJ element;
4122
7e3b6b267c06 comment
Claus Gittinger <cg@exept.de>
parents: 4062
diff changeset
   594
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   595
		element = srcP[0];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   596
		dstP[0] = element;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   597
		__STORE_SPC(nObj, element, spc);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   598
		element = srcP[1];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   599
		dstP[1] = element;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   600
		__STORE_SPC(nObj, element, spc);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   601
		element = srcP[2];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   602
		dstP[2] = element;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   603
		__STORE_SPC(nObj, element, spc);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   604
		element = srcP[3];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   605
		dstP[3] = element;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   606
		__STORE_SPC(nObj, element, spc);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   607
		srcP += 4;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   608
		dstP += 4;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   609
		nIndex -= 4;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   610
	    }
393
claus
parents: 388
diff changeset
   611
#endif
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   612
	    while (nIndex--) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   613
		OBJ element;
4122
7e3b6b267c06 comment
Claus Gittinger <cg@exept.de>
parents: 4062
diff changeset
   614
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   615
		element = *srcP++;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   616
		*dstP++ = element;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   617
		__STORE_SPC(nObj, element, spc);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   618
	    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   619
	    *dstP = something;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   620
	    __STORE_SPC(nObj, something, spc);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   621
	    RETURN ( nObj );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   622
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
    }
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   624
%}.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   625
    ^ super copyWith:something
a27a279701f8 Initial revision
claus
parents:
diff changeset
   626
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   627
216
a8abff749575 *** empty log message ***
claus
parents: 155
diff changeset
   628
!Array methodsFor:'enumerating'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   629
10796
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   630
addAllNonNilElementsTo:aCollection
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   631
    "add all nonNil elements of the receiver to aCollection.
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   632
     Return aCollection.
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   633
     Redefined here for slightly more speed."
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   634
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   635
    |stop "{ Class: SmallInteger }"|
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   636
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   637
    stop := self size.
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   638
    1 to:stop do:[:idx |
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   639
	|each|
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   640
	each := self at:idx.
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   641
	each notNil ifTrue:[
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   642
	    aCollection add:each.
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   643
	].
10796
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   644
    ].
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   645
    ^ aCollection
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   646
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   647
    "
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   648
     #(1 2 3 4 5 1 2 3 symbol 'string' nil) addAllNonNilElementsTo:Set new
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   649
    "
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   650
!
08a9ee8cf317 Do not add nil elements to a Set in #asSet and #asIdentitySet
Stefan Vogel <sv@exept.de>
parents: 10089
diff changeset
   651
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   652
addAllTo:aCollection
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   653
    "add all elements of the receiver to aCollection.
8603
9187c6f1a291 comment
Claus Gittinger <cg@exept.de>
parents: 8442
diff changeset
   654
     Return aCollection.
9187c6f1a291 comment
Claus Gittinger <cg@exept.de>
parents: 8442
diff changeset
   655
     Redefined here for slightly more speed."
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   656
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   657
    |stop "{ Class: SmallInteger }"|
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   658
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   659
    stop := self size.
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   660
    1 to:stop do:[:idx |
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   661
	aCollection add:(self at:idx)
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   662
    ].
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   663
    ^ aCollection
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   664
!
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   665
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   666
do:aBlock
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   667
    "evaluate the argument, aBlock for each element in the collection.
4122
7e3b6b267c06 comment
Claus Gittinger <cg@exept.de>
parents: 4062
diff changeset
   668
     - reimplemented for speed, since this is used by many higher
7e3b6b267c06 comment
Claus Gittinger <cg@exept.de>
parents: 4062
diff changeset
   669
       level collections"
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   670
2202
Claus Gittinger <cg@exept.de>
parents: 2185
diff changeset
   671
    | sz "{ Class: SmallInteger }"|
945
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
   672
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
   673
    sz := self size.
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   674
%{
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   675
    REGISTER OBJFUNC codeVal;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   676
    REGISTER INT index;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   677
    unsigned INT nIndex;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   678
    static struct inlineCache val = _ILC1;
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   679
    REGISTER OBJ rHome;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   680
    INT actualSize;
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   681
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   682
    {
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   683
	OBJ mySelf = self;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   684
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   685
	index = __intVal(__ClassInstPtr(__qClass(mySelf))->c_ninstvars);
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   686
	actualSize = __BYTES2OBJS__(__qSize(mySelf) - OHDR_SIZE);
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   687
    }
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   688
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   689
    nIndex = index + __intVal(sz);
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   690
    if (nIndex <= actualSize) {
945
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
   691
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   692
	if (__isBlockLike(aBlock)
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
   693
	 && (__BlockInstPtr(aBlock)->b_nargs == __mkSmallInteger(1))) {
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   694
	    {
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
   695
		/*
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
   696
		 * the most common case: a static compiled block, with home on the stack ...
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   697
		 */
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   698
		REGISTER OBJFUNC codeVal;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   699
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
   700
		if (((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
2678
37eec0043bdb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2360
diff changeset
   701
#ifdef PARANOIA
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
   702
		 && (! ((INT)(__BlockInstPtr(aBlock)->b_flags) & __MASKSMALLINT(F_DYNAMIC)))
2678
37eec0043bdb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2360
diff changeset
   703
#endif
37eec0043bdb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2360
diff changeset
   704
		) {
2254
5e3cb9e7e682 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2217
diff changeset
   705
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   706
#ifdef NEW_BLOCK_CALL
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   707
#                   define BLOCK_ARG        aBlock
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   708
#else
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   709
#                   define BLOCK_ARG        rHome
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   710
		    REGISTER OBJ rHome;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   711
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   712
		    rHome = __BlockInstPtr(aBlock)->b_home;
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   713
		    if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE))
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   714
#endif
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   715
		    {
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   716
2878
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
   717
			    /*
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
   718
			     * boy; what an ugly looking piece of code ...
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
   719
			     * however, this software pipelined thing has no taken conditional
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
   720
			     * branches in the normal case and is almost twice as fast to even
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
   721
			     * what an unrolling optimizing compiler produces from the loop below ...
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
   722
			     * notice, that those gotos expand to forward branches (which are predicted
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
   723
			     * as NOT taken by most machines ... which is exactly what we want)
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
   724
			     */
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   725
			    REGISTER OBJ el;
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   726
#ifdef __UNROLL_LOOPS__
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   727
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   728
			    {
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   729
				int i8;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   730
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   731
				while ((i8 = index+8) < nIndex) {
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   732
				    el = __InstPtr(self)->i_instvars[index];
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   733
				    if (InterruptPending != nil) goto interrupt0;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   734
		continue0:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   735
				    (*codeVal)(BLOCK_ARG, el);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   736
				    el = __InstPtr(self)->i_instvars[index+1];
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   737
				    if (InterruptPending != nil) goto interrupt1;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   738
		continue1:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   739
				    (*codeVal)(BLOCK_ARG, el);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   740
				    el = __InstPtr(self)->i_instvars[index+2];
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   741
				    if (InterruptPending != nil) goto interrupt2;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   742
		continue2:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   743
				    (*codeVal)(BLOCK_ARG, el);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   744
				    el = __InstPtr(self)->i_instvars[index+3];
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   745
				    if (InterruptPending != nil) goto interrupt3;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   746
		continue3:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   747
				    (*codeVal)(BLOCK_ARG, el);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   748
				    el = __InstPtr(self)->i_instvars[index+4];
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   749
				    if (InterruptPending != nil) goto interrupt4;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   750
		continue4:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   751
				    (*codeVal)(BLOCK_ARG, el);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   752
				    el = __InstPtr(self)->i_instvars[index+5];
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   753
				    if (InterruptPending != nil) goto interrupt5;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   754
		continue5:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   755
				    (*codeVal)(BLOCK_ARG, el);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   756
				    el = __InstPtr(self)->i_instvars[index+6];
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   757
				    if (InterruptPending != nil) goto interrupt6;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   758
		continue6:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   759
				    (*codeVal)(BLOCK_ARG, el);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   760
				    el = __InstPtr(self)->i_instvars[index+7];
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   761
				    if (InterruptPending != nil) goto interrupt7;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   762
		continue7:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   763
				    (*codeVal)(BLOCK_ARG, el);
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   764
				    index = i8;
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   765
				}
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   766
			    }
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   767
#endif /* __UNROLL_LOOPS__ */
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   768
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   769
			    for (; index < nIndex; index++) {
2217
Claus Gittinger <cg@exept.de>
parents: 2216
diff changeset
   770
				el = __InstPtr(self)->i_instvars[index];
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   771
				if (InterruptPending != nil) goto interruptX;
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
   772
		continueX:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   773
				(*codeVal)(BLOCK_ARG, el);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   774
			    }
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   775
			    RETURN (self);
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   776
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   777
#ifdef __UNROLL_LOOPS__
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   778
		interrupt0:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   779
			    __interruptL(@line);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   780
			    el = __InstPtr(self)->i_instvars[index];
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   781
			    goto continue0;
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   782
		interrupt1:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   783
			    __interruptL(@line);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   784
			    el = __InstPtr(self)->i_instvars[index+1];
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   785
			    goto continue1;
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   786
		interrupt2:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   787
			    __interruptL(@line);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   788
			    el = __InstPtr(self)->i_instvars[index+2];
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   789
			    goto continue2;
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   790
		interrupt3:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   791
			    __interruptL(@line);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   792
			    el = __InstPtr(self)->i_instvars[index+3];
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   793
			    goto continue3;
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   794
		interrupt4:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   795
			    __interruptL(@line);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   796
			    el = __InstPtr(self)->i_instvars[index+4];
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   797
			    goto continue4;
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   798
		interrupt5:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   799
			    __interruptL(@line);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   800
			    el = __InstPtr(self)->i_instvars[index+5];
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   801
			    goto continue5;
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   802
		interrupt6:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   803
			    __interruptL(@line);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   804
			    el = __InstPtr(self)->i_instvars[index+6];
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   805
			    goto continue6;
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
   806
		interrupt7:
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   807
			    __interruptL(@line);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   808
			    el = __InstPtr(self)->i_instvars[index+7];
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   809
			    goto continue7;
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   810
#endif /* __UNROLL_LOOPS__ */
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   811
		interruptX:
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   812
			    __interruptL(@line);
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   813
			    el = __InstPtr(self)->i_instvars[index];
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   814
			    goto continueX;
3500
90eb689740cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3485
diff changeset
   815
		    }
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   816
		}
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   817
	    }
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   818
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   819
	    /*
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   820
	     * sorry, must check code-pointer in the loop
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   821
	     * it could be recompiled or flushed
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   822
	     */
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   823
#           undef BLOCK_ARG
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   824
#ifdef NEW_BLOCK_CALL
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   825
#           define BLOCK_ARG        aBlock
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   826
#           define IBLOCK_ARG       nil
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   827
#else
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   828
#           define BLOCK_ARG        (__BlockInstPtr(aBlock)->b_home)
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   829
#           define IBLOCK_ARG       (__BlockInstPtr(aBlock)->b_home)
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   830
#endif
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   831
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   832
	    for (; index < nIndex; index++) {
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   833
		REGISTER OBJFUNC codeVal;
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   834
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   835
		if (InterruptPending != nil) __interruptL(@line);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   836
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   837
		if ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil) {
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   838
		    (*codeVal)(BLOCK_ARG, __InstPtr(self)->i_instvars[index]);
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   839
		} else {
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   840
		    if (__BlockInstPtr(aBlock)->b_bytecodes != nil) {
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   841
			/*
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   842
			 * arg is a compiled block with bytecode -
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   843
			 * directly call interpreter without going through Block>>value
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   844
			 */
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   845
#ifdef PASS_ARG_POINTER
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   846
			__interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, &(__InstPtr(self)->i_instvars[index]));
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   847
#else
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   848
			__interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, __InstPtr(self)->i_instvars[index]);
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   849
#endif
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   850
		    } else {
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   851
			(*val.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   852
					    @symbol(value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   853
					    nil, &val,
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
   854
					    __InstPtr(self)->i_instvars[index]);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   855
		    }
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   856
		}
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
   857
	    }
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   858
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   859
#           undef BLOCK_ARG
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   860
#           undef IBLOCK_ARG
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   861
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   862
	    RETURN (self );
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   863
	}
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   864
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   865
	/*
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   866
	 * not a block - send it #value:
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   867
	 */
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   868
	for (; index < nIndex; index++) {
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   869
	    if (InterruptPending != nil) __interruptL(@line);
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   870
	    // console_printf("el%d -> %"_lx_"\n", index, (long)(__InstPtr(self)->i_instvars[index]));
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   871
	    (*val.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   872
				@symbol(value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   873
				nil, &val,
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
   874
				__InstPtr(self)->i_instvars[index]);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   875
	}
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   876
	RETURN ( self );
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   877
    }
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
   878
    /*
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
   879
     * I am something, not handled here
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   880
     */
945
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
   881
%}.
946
35962f2a169b be prepared for cheaters, subclassing Array returning invalid sizes ...
Claus Gittinger <cg@exept.de>
parents: 945
diff changeset
   882
    ^ super do:aBlock
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   883
!
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
   884
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   885
from:start to:stop do:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   886
    "evaluate the argument, aBlock for the elements starting at index start
a27a279701f8 Initial revision
claus
parents:
diff changeset
   887
     up to (and including) stop in the collection.
4122
7e3b6b267c06 comment
Claus Gittinger <cg@exept.de>
parents: 4062
diff changeset
   888
     - reimplemented for speed, since this is used by many higher
7e3b6b267c06 comment
Claus Gittinger <cg@exept.de>
parents: 4062
diff changeset
   889
       level collections"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   890
a27a279701f8 Initial revision
claus
parents:
diff changeset
   891
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   892
    REGISTER OBJFUNC codeVal;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   893
    REGISTER INT index;
2
claus
parents: 1
diff changeset
   894
    REGISTER OBJ rHome;
2052
9fdab6cbecfa *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1903
diff changeset
   895
    OBJ slf;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   896
    INT nIndex, nInsts;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   897
    static struct inlineCache val = _ILC1;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   898
    INT indexHigh;
2184
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
   899
    OBJ myClass;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   900
2184
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
   901
    slf = self;
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
   902
    myClass = __qClass(slf);
5347
21b418ac4cc3 oops: from:to:do: failed badly when stopIndex was < startIndex.
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
   903
21b418ac4cc3 oops: from:to:do: failed badly when stopIndex was < startIndex.
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
   904
    if ( __bothSmallInteger(start, stop)
21b418ac4cc3 oops: from:to:do: failed badly when stopIndex was < startIndex.
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
   905
     && ((index = __intVal(start)) > 0) ) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   906
	indexHigh = __intVal(stop);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   907
	nIndex = __BYTES2OBJS__(__qSize(slf) - OHDR_SIZE);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   908
	if (myClass != @global(Array)) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   909
	    nInsts = __intVal(__ClassInstPtr(myClass)->c_ninstvars);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   910
	    index += nInsts;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   911
	    indexHigh += nInsts;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   912
	}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   913
	if (indexHigh <= nIndex) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   914
	    OBJ __aBlock = aBlock;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
   915
	    INT n;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   916
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   917
	    index--;                            /* 0-based */
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   918
	    n = indexHigh - index;
3484
79a08dfa50c9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3234
diff changeset
   919
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   920
	    if (__isBlockLike(__aBlock)
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
   921
	     && (__BlockInstPtr(__aBlock)->b_nargs == __mkSmallInteger(1))) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   922
		{
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   923
		    /*
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   924
		     * the most common case: a static compiled block, with home on the stack ...
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   925
		     */
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   926
		    REGISTER OBJFUNC codeVal;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   927
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   928
		    if (((codeVal = __BlockInstPtr(__aBlock)->b_code) != (OBJFUNC)nil)
2678
37eec0043bdb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2360
diff changeset
   929
#ifdef PARANOIA
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   930
		     && (! ((INT)(__BlockInstPtr(__aBlock)->b_flags) & __MASKSMALLINT(F_DYNAMIC)))
2678
37eec0043bdb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2360
diff changeset
   931
#endif
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   932
		    ) {
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   933
#ifdef NEW_BLOCK_CALL
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   934
#                       define BLOCK_ARG        aBlock
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
   935
#else
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   936
#                       define BLOCK_ARG        rHome
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   937
			REGISTER OBJ rHome;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   938
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   939
			rHome = __BlockInstPtr(__aBlock)->b_home;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   940
			if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE))
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   941
#endif
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   942
			{
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   943
			    REGISTER OBJ el;
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
   944
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   945
#ifdef __UNROLL_LOOPS__
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   946
			    /*
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   947
			     * boy; what an ugly looking piece of code ...
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   948
			     * however, this software pipelined thing has no taken conditional
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   949
			     * branches in the normal case and is almost twice as fast to even
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   950
			     * what an unrolling optimizing compiler produces from the loop below ...
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   951
			     * notice, that those gotos expand to forward branches (which are predicted
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   952
			     * as NOT taken by most machines ... which is exactly what we want)
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   953
			     */
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   954
			    {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   955
				while ( n >= 8) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   956
				    el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   957
				    if (InterruptPending != nil) goto interrupt0;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   958
		continue0:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   959
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   960
				    el = __InstPtr(self)->i_instvars[index+1];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   961
				    if (InterruptPending != nil) goto interrupt1;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   962
		continue1:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   963
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   964
				    el = __InstPtr(self)->i_instvars[index+2];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   965
				    if (InterruptPending != nil) goto interrupt2;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   966
		continue2:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   967
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   968
				    el = __InstPtr(self)->i_instvars[index+3];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   969
				    if (InterruptPending != nil) goto interrupt3;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   970
		continue3:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   971
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   972
				    el = __InstPtr(self)->i_instvars[index+4];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   973
				    if (InterruptPending != nil) goto interrupt4;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   974
		continue4:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   975
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   976
				    el = __InstPtr(self)->i_instvars[index+5];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   977
				    if (InterruptPending != nil) goto interrupt5;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   978
		continue5:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   979
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   980
				    el = __InstPtr(self)->i_instvars[index+6];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   981
				    if (InterruptPending != nil) goto interrupt6;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   982
		continue6:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   983
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   984
				    el = __InstPtr(self)->i_instvars[index+7];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   985
				    if (InterruptPending != nil) goto interrupt7;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   986
		continue7:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   987
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   988
				    n -= 8;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   989
				    index += 8;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   990
				}
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
   991
# ifdef __UNROLL_LOOPS2__ /* this makes small loops slower */
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   992
				if (n >= 4) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   993
				    el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   994
				    if (InterruptPending != nil) goto interrupt0b;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   995
		continue0b:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   996
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   997
				    el = __InstPtr(self)->i_instvars[index+1];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   998
				    if (InterruptPending != nil) goto interrupt1b;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
   999
		continue1b:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1000
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1001
				    el = __InstPtr(self)->i_instvars[index+2];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1002
				    if (InterruptPending != nil) goto interrupt2b;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1003
		continue2b:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1004
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1005
				    el = __InstPtr(self)->i_instvars[index+3];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1006
				    if (InterruptPending != nil) goto interrupt3b;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1007
		continue3b:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1008
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1009
				    n -= 4;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1010
				    index += 4;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1011
				}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1012
				if (n >= 2) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1013
				    el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1014
				    if (InterruptPending != nil) goto interrupt0c;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1015
		continue0c:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1016
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1017
				    el = __InstPtr(self)->i_instvars[index+1];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1018
				    if (InterruptPending != nil) goto interrupt1c;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1019
		continue1c:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1020
				    (*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1021
				    n -= 2;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1022
				    index += 2;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1023
				}
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  1024
# endif /* __UNROLL_LOOPS2__ */
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1025
			    }
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  1026
#endif /* __UNROLL_LOOPS__ */
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1027
			    while (n > 0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1028
				el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1029
				if (InterruptPending != nil) goto interruptX;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1030
		continueX:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1031
				(*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1032
				n--;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1033
				index++;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1034
			    }
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1035
			    RETURN (self);
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
  1036
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  1037
#ifdef __UNROLL_LOOPS__
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1038
		interrupt0:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1039
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1040
			    goto continue0;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1041
		interrupt1:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1042
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+1];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1043
			    goto continue1;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1044
		interrupt2:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1045
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+2];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1046
			    goto continue2;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1047
		interrupt3:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1048
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+3];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1049
			    goto continue3;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1050
		interrupt4:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1051
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+4];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1052
			    goto continue4;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1053
		interrupt5:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1054
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+5];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1055
			    goto continue5;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1056
		interrupt6:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1057
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+6];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1058
			    goto continue6;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1059
		interrupt7:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1060
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+7];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1061
			    goto continue7;
3484
79a08dfa50c9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3234
diff changeset
  1062
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  1063
# ifdef __UNROLL_LOOPS2__
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1064
		interrupt0b:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1065
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1066
			    goto continue0b;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1067
		interrupt1b:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1068
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+1];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1069
			    goto continue1b;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1070
		interrupt2b:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1071
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+2];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1072
			    goto continue2b;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1073
		interrupt3b:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1074
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+3];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1075
			    goto continue3b;
3484
79a08dfa50c9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3234
diff changeset
  1076
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1077
		interrupt0c:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1078
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1079
			    goto continue0c;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1080
		interrupt1c:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1081
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index+1];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1082
			    goto continue1c;
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  1083
# endif /* __UNROLL_LOOPS2__ */
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  1084
#endif /* __UNROLL_LOOPS__ */
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1085
		interruptX:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1086
			    __interruptL(@line); el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1087
			    goto continueX;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1088
			}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1089
		    }
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1090
		}
370
claus
parents: 369
diff changeset
  1091
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1092
		/*
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1093
		 * sorry, must check code-pointer in the loop
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1094
		 * it could be recompiled or flushed
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1095
		 */
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1096
#               undef BLOCK_ARG
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1097
#ifdef NEW_BLOCK_CALL
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1098
#               define BLOCK_ARG        aBlock
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1099
#               define IBLOCK_ARG       nil
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1100
#else
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1101
#               define BLOCK_ARG        (__BlockInstPtr(aBlock)->b_home)
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1102
#               define IBLOCK_ARG       (__BlockInstPtr(aBlock)->b_home)
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1103
#endif
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1104
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1105
		while (n > 0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1106
		    REGISTER OBJFUNC codeVal;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1107
		    OBJ el;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1108
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1109
		    el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1110
		    if (InterruptPending != nil) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1111
			__interruptL(@line);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1112
			el = __InstPtr(self)->i_instvars[index];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1113
		    }
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1114
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1115
		    if ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1116
			(*codeVal)(BLOCK_ARG, el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1117
		    } else {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1118
			if (__BlockInstPtr(aBlock)->b_bytecodes != nil) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1119
			    /*
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1120
			     * arg is a compiled block with bytecode -
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1121
			     * directly call interpreter without going through Block>>value
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1122
			     */
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1123
#ifdef PASS_ARG_POINTER
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1124
			    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, &el);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1125
#else
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1126
			    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, el);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1127
#endif
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1128
			} else {
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1129
			    (*val.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1130
					    @symbol(value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1131
					    nil, &val,
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1132
					    el);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1133
			}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1134
		    }
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1135
		    n--;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1136
		    index++;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1137
		}
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1138
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1139
#               undef BLOCK_ARG
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1140
#               undef IBLOCK_ARG
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1141
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1142
		RETURN (self );
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1143
	    }
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1144
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1145
	    /*
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1146
	     * not a block - send it #value:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1147
	     */
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1148
	    while (n > 0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1149
		if (InterruptPending != nil) __interruptL(@line);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1150
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1151
		(*val.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1152
				@symbol(value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1153
				nil, &val,
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1154
				__InstPtr(self)->i_instvars[index]);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1155
		n--;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1156
		index++;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1157
	    }
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1158
	    RETURN ( self );
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1159
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1160
    }
945
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
  1161
%}.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1162
    ^ super from:start to:stop do:aBlock
5347
21b418ac4cc3 oops: from:to:do: failed badly when stopIndex was < startIndex.
Claus Gittinger <cg@exept.de>
parents: 5049
diff changeset
  1163
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1164
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1165
42
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1166
from:start to:stop reverseDo:aBlock
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1167
    "evaluate the argument, aBlock for the elements starting at index start
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1168
     up to (and including) stop in the collection. Step in reverse order.
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1169
     - reimplemented for speed"
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1170
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1171
%{
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1172
    REGISTER OBJFUNC codeVal;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1173
    REGISTER INT index;
42
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1174
    REGISTER OBJ rHome;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1175
    INT nIndex;
42
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1176
    static struct inlineCache val = _ILC1;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1177
    INT indexLow, indexHigh;
42
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1178
586
cab695f942a6 weakArray readBarrier for IGC
Claus Gittinger <cg@exept.de>
parents: 577
diff changeset
  1179
    if (__bothSmallInteger(start, stop)
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1180
     && (__qClass(self) == @global(Array))
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1181
     && ((indexLow = __intVal(start)) > 0)) {
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1182
	indexHigh = __intVal(stop);
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1183
	nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1184
	if (indexHigh <= nIndex) {
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1185
	    indexLow--;
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1186
	    indexHigh--;
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1187
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1188
	    if (__isBlockLike(aBlock)
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1189
	     && (__BlockInstPtr(aBlock)->b_nargs == __mkSmallInteger(1))) {
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1190
#               undef BLOCK_ARG
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1191
#ifdef NEW_BLOCK_CALL
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1192
#               define BLOCK_ARG        aBlock
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1193
#               define IBLOCK_ARG       nil
42
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1194
#else
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1195
#               define BLOCK_ARG        (__BlockInstPtr(aBlock)->b_home)
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1196
#               define IBLOCK_ARG       (__BlockInstPtr(aBlock)->b_home)
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1197
#endif
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1198
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1199
		for (index=indexHigh; index >= indexLow; index--) {
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1200
		    REGISTER OBJFUNC codeVal;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1201
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1202
		    if (InterruptPending != nil) __interruptL(@line);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1203
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1204
		    if ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil) {
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1205
			(*codeVal)(BLOCK_ARG, __InstPtr(self)->i_instvars[index]);
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1206
		    } else {
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1207
			if (__BlockInstPtr(aBlock)->b_bytecodes != nil) {
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1208
			    /*
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1209
			     * arg is a compiled block with bytecode -
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1210
			     * directly call interpreter without going through Block>>value
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1211
			     */
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1212
#ifdef PASS_ARG_POINTER
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1213
			    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, &(__InstPtr(self)->i_instvars[index]));
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1214
#else
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1215
			    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, __InstPtr(self)->i_instvars[index]);
42
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1216
#endif
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1217
			} else {
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1218
			    (*val.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1219
					    @symbol(value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1220
					    nil, &val,
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1221
					    __InstPtr(self)->i_instvars[index]);
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1222
			}
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1223
		    }
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1224
		}
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1225
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1226
#               undef BLOCK_ARG
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1227
#               undef IBLOCK_ARG
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1228
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1229
		RETURN (self );
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1230
	    }
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1231
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1232
	    /*
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1233
	     * not a block - send it #value:
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1234
	     */
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1235
	    for (index=indexHigh; index >= indexLow; index--) {
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1236
		if (InterruptPending != nil) __interruptL(@line);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1237
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1238
		(*val.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1239
				@symbol(value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1240
				nil, &val,
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1241
				__InstPtr(self)->i_instvars[index]);
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1242
	    }
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1243
	    RETURN ( self );
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1244
	}
42
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1245
    }
945
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
  1246
%}.
42
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1247
    ^ super from:start to:stop reverseDo:aBlock
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1248
!
e33491f6f260 *** empty log message ***
claus
parents: 36
diff changeset
  1249
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1250
keysAndValuesDo:aBlock
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1251
    "evaluate the argument, aBlock for each element in the collection.
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1252
     Pass both index and element to the block.
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1253
     - reimplemented for speed"
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1254
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1255
%{
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1256
    REGISTER OBJFUNC codeVal;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1257
    REGISTER INT index;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1258
    static struct inlineCache val2 = _ILC2;
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1259
    REGISTER OBJ rHome;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1260
    INT actualSize;
2184
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
  1261
    OBJ myClass;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1262
2184
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
  1263
    myClass = __qClass(self);
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1264
    if ((__ClassInstPtr(myClass)->c_ninstvars) == __mkSmallInteger(0)) {
946
35962f2a169b be prepared for cheaters, subclassing Array returning invalid sizes ...
Claus Gittinger <cg@exept.de>
parents: 945
diff changeset
  1265
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1266
	actualSize = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1267
	index = 0;
945
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
  1268
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1269
	if (index < actualSize) {
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1270
	    if (__isBlockLike(aBlock)
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1271
	     && (__BlockInstPtr(aBlock)->b_nargs == __mkSmallInteger(2))) {
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1272
		{
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1273
		    /*
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1274
		     * the most common case: a static compiled block, with home on the stack ...
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1275
		     */
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1276
		    REGISTER OBJFUNC codeVal;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1277
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1278
		    if (((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
2678
37eec0043bdb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2360
diff changeset
  1279
#ifdef PARANOIA
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1280
		     && (! ((INT)(__BlockInstPtr(aBlock)->b_flags) & __MASKSMALLINT(F_DYNAMIC)))
2678
37eec0043bdb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2360
diff changeset
  1281
#endif
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1282
		    ) {
2254
5e3cb9e7e682 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2217
diff changeset
  1283
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1284
#ifdef NEW_BLOCK_CALL
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1285
#                       define BLOCK_ARG        aBlock
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1286
#else
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1287
#                       define BLOCK_ARG        rHome
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1288
			REGISTER OBJ rHome;
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1289
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1290
			rHome = __BlockInstPtr(aBlock)->b_home;
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1291
			if ((rHome == nil) || (__qSpace(rHome) >= STACKSPACE))
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1292
#endif
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1293
			{
2878
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
  1294
			    OBJ el;
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
  1295
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1296
			    while (index < actualSize) {
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1297
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1298
				el = __InstPtr(self)->i_instvars[index];
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1299
				if (InterruptPending != nil) goto interruptX;
2878
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
  1300
		continueX:
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1301
				index++;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1302
				(*codeVal)(BLOCK_ARG, __mkSmallInteger(index), el);
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1303
			    }
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1304
			    RETURN (self);
2878
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
  1305
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
  1306
		interruptX:
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1307
			    __interruptL(@line);
2878
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
  1308
			    el = __InstPtr(self)->i_instvars[index];
71f51a44643f comment
Claus Gittinger <cg@exept.de>
parents: 2865
diff changeset
  1309
			    goto continueX;
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1310
			}
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1311
		    }
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1312
		}
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1313
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1314
		/*
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1315
		 * sorry, must check code-pointer in the loop
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1316
		 * it could be recompiled or flushed
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1317
		 */
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1318
#               undef BLOCK_ARG
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1319
#ifdef NEW_BLOCK_CALL
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1320
#               define BLOCK_ARG        aBlock
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1321
#               define IBLOCK_ARG       nil
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1322
#else
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1323
#               define BLOCK_ARG        (__BlockInstPtr(aBlock)->b_home)
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1324
#               define IBLOCK_ARG       (__BlockInstPtr(aBlock)->b_home)
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1325
#endif
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1326
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1327
		while (index < actualSize) {
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1328
		    REGISTER OBJFUNC codeVal;
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1329
		    OBJ el;
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1330
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1331
		    if (InterruptPending != nil) __interruptL(@line);
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1332
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1333
		    el = __InstPtr(self)->i_instvars[index];
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1334
		    index++;
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1335
		    if ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1336
			(*codeVal)(BLOCK_ARG, __mkSmallInteger(index), el);
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1337
		    } else {
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1338
			if (__BlockInstPtr(aBlock)->b_bytecodes != nil) {
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1339
			    /*
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1340
			     * arg is a compiled block with bytecode -
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1341
			     * directly call interpreter without going through Block>>value
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1342
			     */
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1343
#ifdef PASS_ARG_POINTER
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1344
			    {
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1345
				OBJ t[2];
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1346
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1347
				t[0] = __mkSmallInteger(index);
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1348
				t[1] = el;
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1349
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1350
				__interpret(aBlock, 2, nil, IBLOCK_ARG, nil, nil, t);
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1351
			    }
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1352
#else
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1353
			    __interpret(aBlock, 2, nil, IBLOCK_ARG, nil, nil, __mkSmallInteger(index), el);
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1354
#endif
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1355
			} else {
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1356
			    (*val2.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1357
						@symbol(value:value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1358
						nil, &val2,
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1359
						__mkSmallInteger(index),
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1360
						el);
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1361
			}
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1362
		    }
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1363
		}
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1364
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1365
#               undef BLOCK_ARG
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1366
#               undef IBLOCK_ARG
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1367
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1368
		RETURN (self );
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
  1369
	    }
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1370
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
  1371
	    /*
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1372
	     * not a block - send it #value:
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
  1373
	     */
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1374
	    while (index < actualSize) {
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1375
		OBJ el;
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
  1376
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1377
		if (InterruptPending != nil) __interruptL(@line);
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
  1378
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1379
		el = __InstPtr(self)->i_instvars[index];
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1380
		index++;
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1381
		(*val2.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1382
				    @symbol(value:value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1383
				    nil, &val2,
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1384
				    __mkSmallInteger(index),
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1385
				    el);
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1386
	    }
2842
1cda44a3660e oops - #keysAndValuesDo: was from for subclasses with named instVars
Claus Gittinger <cg@exept.de>
parents: 2821
diff changeset
  1387
	    RETURN ( self );
2915
fdfc6c64bf60 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
  1388
	}
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1389
    }
945
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
  1390
%}.
946
35962f2a169b be prepared for cheaters, subclassing Array returning invalid sizes ...
Claus Gittinger <cg@exept.de>
parents: 945
diff changeset
  1391
    ^ super keysAndValuesDo:aBlock
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1392
!
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1393
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1394
modifyingTraverse:aBlock
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1395
    "Evaluate aBlock for every element that is not an Array,
11167
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1396
     and recursively traverse Arrays.
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1397
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1398
     aBlock may return the original element or a new element.
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1399
     If a new element is returned, the element is changed to the new element."
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1400
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1401
    self
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1402
	keysAndValuesDo:[:eachIndex :eachElement |
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1403
	    eachElement isArray ifTrue:[
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1404
		eachElement modifyingTraverse:aBlock
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1405
	    ] ifFalse:[
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1406
		|newElement|
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1407
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1408
		newElement := aBlock value:eachElement.
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1409
		newElement ~~ eachElement ifTrue:[
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1410
		    self at:eachIndex put:newElement.
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1411
		].
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1412
	    ]
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1413
	].
11167
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1414
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1415
    "
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1416
     example: replace all elements which are 10 with: 'changed'
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1417
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1418
     #(1 2 (3 (4 5 (6 7) 8) 9 10) 11 (12 (13)) 14) copy
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1419
	 modifyingTraverse:[:el |
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1420
	    el = 10 ifTrue:['changed'] ifFalse:[el]
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1421
	 ];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1422
	 inspect
11167
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1423
    "
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1424
!
883813e7d746 New: #modifyingTraverse:
Stefan Vogel <sv@exept.de>
parents: 10796
diff changeset
  1425
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1426
reverseDo:aBlock
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1427
    "evaluate the argument, aBlock for each element in the collection in reverse order.
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1428
     - reimplemented for speed"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1429
945
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
  1430
    |home sz "{ Class: SmallInteger }" |
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
  1431
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
  1432
    sz := self size.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1433
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1434
    REGISTER OBJFUNC codeVal;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1435
    REGISTER INT index;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1436
    unsigned INT nIndex;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1437
    INT endIndex;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1438
    static struct inlineCache val = _ILC1;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1439
    INT actualSize;
2184
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
  1440
    OBJ myClass;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1441
2184
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
  1442
    myClass = __qClass(self);
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
  1443
    {
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1444
	endIndex = __intVal(__ClassInstPtr(myClass)->c_ninstvars);
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1445
	actualSize = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1446
	nIndex = endIndex + __intVal(sz);
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1447
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1448
	if (nIndex <= actualSize) {
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1449
	    if (__isBlockLike(aBlock)
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1450
	     && (__BlockInstPtr(aBlock)->b_nargs == __mkSmallInteger(1))) {
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1451
#               undef BLOCK_ARG
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1452
#ifdef NEW_BLOCK_CALL
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1453
#               define BLOCK_ARG        aBlock
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1454
#               define IBLOCK_ARG       nil
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1455
#else
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1456
#               define BLOCK_ARG        (__BlockInstPtr(aBlock)->b_home)
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1457
#               define IBLOCK_ARG       (__BlockInstPtr(aBlock)->b_home)
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1458
#endif
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1459
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1460
		for (index=nIndex-1; index >= endIndex; index--) {
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1461
		    REGISTER OBJFUNC codeVal;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1462
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1463
		    if (InterruptPending != nil) __interruptL(@line);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1464
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1465
		    if ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil) {
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1466
			(*codeVal)(BLOCK_ARG, __InstPtr(self)->i_instvars[index]);
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1467
		    } else {
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1468
			if (__BlockInstPtr(aBlock)->b_bytecodes != nil) {
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1469
			    /*
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1470
			     * arg is a compiled block with bytecode -
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1471
			     * directly call interpreter without going through Block>>value
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1472
			     */
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1473
#ifdef PASS_ARG_POINTER
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1474
			    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, &(__InstPtr(self)->i_instvars[index]));
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1475
#else
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1476
			    __interpret(aBlock, 1, nil, IBLOCK_ARG, nil, nil, __InstPtr(self)->i_instvars[index]);
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1477
#endif
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1478
			} else {
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1479
			    (*val.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1480
					    @symbol(value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1481
					    nil, &val,
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1482
					    __InstPtr(self)->i_instvars[index]);
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1483
			}
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1484
		    }
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1485
		}
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1486
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1487
#               undef BLOCK_ARG
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1488
#               undef IBLOCK_ARG
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1489
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1490
		RETURN (self );
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1491
	    }
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1492
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1493
	    /*
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1494
	     * not a block - send it #value:
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1495
	     */
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1496
	    for (index=nIndex-1; index >= endIndex; index--) {
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1497
		if (InterruptPending != nil) __interruptL(@line);
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1498
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1499
		(*val.ilc_func)(aBlock,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1500
				@symbol(value:),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1501
				nil, &val,
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1502
				__InstPtr(self)->i_instvars[index]);
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1503
	    }
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1504
	    RETURN ( self );
946
35962f2a169b be prepared for cheaters, subclassing Array returning invalid sizes ...
Claus Gittinger <cg@exept.de>
parents: 945
diff changeset
  1505
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1506
    }
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1507
%}.
946
35962f2a169b be prepared for cheaters, subclassing Array returning invalid sizes ...
Claus Gittinger <cg@exept.de>
parents: 945
diff changeset
  1508
    ^ super reverseDo:aBlock
11
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1509
!
6bf3080856be *** empty log message ***
claus
parents: 10
diff changeset
  1510
328
claus
parents: 325
diff changeset
  1511
traverse:aBlock
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1512
    "Evaluate aBlock for every element that is not an Array,
1123
4e79c452592f commentary
Claus Gittinger <cg@exept.de>
parents: 1083
diff changeset
  1513
     and recursively traverse Arrays.
328
claus
parents: 325
diff changeset
  1514
     Implemented here to support better search for selectors in
claus
parents: 325
diff changeset
  1515
     literal arrays - might be a good idea to move it up in the collection
claus
parents: 325
diff changeset
  1516
     hierarchy, since this may be a useful method for other collections
claus
parents: 325
diff changeset
  1517
     as well."
claus
parents: 325
diff changeset
  1518
claus
parents: 325
diff changeset
  1519
    self do: [:el |
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1520
	el isArray
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1521
	    ifTrue: [el traverse: aBlock]
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1522
	    ifFalse: [aBlock value: el]]
328
claus
parents: 325
diff changeset
  1523
claus
parents: 325
diff changeset
  1524
    "
claus
parents: 325
diff changeset
  1525
     example: flattening an Array:
claus
parents: 325
diff changeset
  1526
claus
parents: 325
diff changeset
  1527
     |s|
claus
parents: 325
diff changeset
  1528
claus
parents: 325
diff changeset
  1529
     s := WriteStream on:Array new.
claus
parents: 325
diff changeset
  1530
     #(1 2 (3 (4 5 (6 7) 8) 9 10) 11 (12 (13)) 14) traverse:[:el | s nextPut:el].
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1531
     s contents
328
claus
parents: 325
diff changeset
  1532
    "
1123
4e79c452592f commentary
Claus Gittinger <cg@exept.de>
parents: 1083
diff changeset
  1533
    "
4e79c452592f commentary
Claus Gittinger <cg@exept.de>
parents: 1083
diff changeset
  1534
     example: deep search
4e79c452592f commentary
Claus Gittinger <cg@exept.de>
parents: 1083
diff changeset
  1535
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1536
     #(1 2 (3 (4 5 (6 7) 8) 9 10) 11 (12 (13)) 14) traverse:[:el |
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  1537
	el == 10 ifTrue:[Transcript showCR:'found']
1123
4e79c452592f commentary
Claus Gittinger <cg@exept.de>
parents: 1083
diff changeset
  1538
     ]
4e79c452592f commentary
Claus Gittinger <cg@exept.de>
parents: 1083
diff changeset
  1539
    "
4e79c452592f commentary
Claus Gittinger <cg@exept.de>
parents: 1083
diff changeset
  1540
4e79c452592f commentary
Claus Gittinger <cg@exept.de>
parents: 1083
diff changeset
  1541
    "Modified: 26.3.1996 / 17:08:10 / cg"
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1542
! !
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1544
!Array methodsFor:'filling & replacing'!
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1545
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1546
from:index1 to:index2 put:anObject
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1547
    "reimplemented for speed if receiver is an Array"
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1548
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1549
%{  /* NOCONTEXT */
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1550
#ifdef __SCHTEAM__
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1551
    if (bothSmallInteger(index1, index2)) {
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1552
	int _start = index1.intValue();
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1553
	int _stop = index2.intValue();
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1554
	self.from_to_put(_start, _stop, anObject);
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1555
	return context._RETURN(self);
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1556
    }
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1557
#else
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1558
    REGISTER INT index;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1559
    unsigned INT nIndex;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1560
    unsigned INT endIndex;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1561
    REGISTER OBJ *dst;
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1562
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1563
    if ((__qClass(self) == Array)
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1564
     && __bothSmallInteger(index1, index2)) {
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
  1565
	index = __intVal(index1) - 1;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1566
	if (index >= 0) {
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1567
	    nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
  1568
	    endIndex = __intVal(index2) - 1;
2185
790f4c380343 care for blocks being recompiled or code being flushed, while
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1569
951
2dd898849a8a directly call __new if quick allocation fails;
Claus Gittinger <cg@exept.de>
parents: 946
diff changeset
  1570
	    if ((endIndex >= index) && (endIndex < nIndex)) {
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
  1571
		dst = &(__InstPtr(self)->i_instvars[index]);
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1572
# ifdef memset4
2865
4d09015b12cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2842
diff changeset
  1573
		{
4d09015b12cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2842
diff changeset
  1574
		    int n4 = endIndex-index+1;
4d09015b12cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2842
diff changeset
  1575
4d09015b12cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2842
diff changeset
  1576
		    memset4(dst, anObject, n4);
4d09015b12cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2842
diff changeset
  1577
		}
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1578
# else
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1579
#  ifdef FAST_MEMSET
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1580
		if ((INT)anObject == 0) {
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1581
		    memset(dst, 0, __OBJS2BYTES__(endIndex-index+1));
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1582
		} else
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1583
#  endif
2865
4d09015b12cf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2842
diff changeset
  1584
		{
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1585
#  ifdef __UNROLL_LOOPS__
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1586
		    {
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1587
			INT i8;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1588
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1589
			while ((i8 = index + 8) <= endIndex) {
3041
f9487e848b67 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2991
diff changeset
  1590
			    dst[3] = dst[2] = dst[1] = dst[0] = anObject;
f9487e848b67 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2991
diff changeset
  1591
			    dst[7] = dst[6] = dst[5] = dst[4] = anObject;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1592
			    dst += 8;
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1593
			    index = i8;
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1594
			}
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1595
		    }
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1596
#  endif
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1597
		    for (; index <= endIndex; index++) {
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1598
			*dst++ = anObject;
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1599
		    }
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1600
		}
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1601
# endif
3730
375237229a8e replaceFrom... - unrolled 8 times;
Claus Gittinger <cg@exept.de>
parents: 3500
diff changeset
  1602
		__STORE(self, anObject);
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1603
		RETURN ( self );
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1604
	    }
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1605
	}
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1606
    }
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1607
#endif
945
b2a1dc200c42 allow redefinition of #size in subclasses (optimized methods did not work in this case)
Claus Gittinger <cg@exept.de>
parents: 835
diff changeset
  1608
%}.
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1609
    ^ super from:index1 to:index2 put:anObject
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1610
!
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1611
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1612
replaceFrom:start to:stop with:aCollection startingAt:repStart
1168
a8ac7ccb76db commentary
Claus Gittinger <cg@exept.de>
parents: 1158
diff changeset
  1613
    "replace elements in the receiver between index start and stop,
a8ac7ccb76db commentary
Claus Gittinger <cg@exept.de>
parents: 1158
diff changeset
  1614
     with elements  taken from replacementCollection starting at repStart.
3234
4cc58bc6a8ed comment
Claus Gittinger <cg@exept.de>
parents: 3226
diff changeset
  1615
     Return the receiver.
1168
a8ac7ccb76db commentary
Claus Gittinger <cg@exept.de>
parents: 1158
diff changeset
  1616
     Reimplemented for speed if both receiver and aCollection are Arrays"
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1617
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1618
%{  /* NOCONTEXT */
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1619
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1620
    unsigned INT nIndex;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1621
    unsigned INT repNIndex;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1622
    INT startIndex, stopIndex;
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1623
    REGISTER OBJ *src;
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1624
    REGISTER OBJ *dst;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1625
    INT repStopIndex;
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1626
    REGISTER INT repStartIndex;
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1627
    REGISTER OBJ t;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1628
    REGISTER INT count;
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1629
    OBJ myClass;
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1630
2210
9df9b4c48a6c weakText was wrong
Claus Gittinger <cg@exept.de>
parents: 2202
diff changeset
  1631
    if (
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1632
	(__ClassInstPtr((myClass = __qClass(self)))->c_ninstvars == __mkSmallInteger(0))
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1633
     && __isNonNilObject(aCollection)
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1634
     && (((t = __qClass(aCollection)) == Array) || (t == myClass))
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1635
     && __bothSmallInteger(start, stop)
2210
9df9b4c48a6c weakText was wrong
Claus Gittinger <cg@exept.de>
parents: 2202
diff changeset
  1636
     && __isSmallInteger(repStart)
9df9b4c48a6c weakText was wrong
Claus Gittinger <cg@exept.de>
parents: 2202
diff changeset
  1637
    ) {
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1638
	startIndex = __intVal(start) - 1;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1639
	if (startIndex >= 0) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1640
	    nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1641
	    stopIndex = __intVal(stop) - 1;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1642
	    count = stopIndex - startIndex + 1;
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1643
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1644
	    if ((count > 0) && (stopIndex < nIndex)) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1645
		repStartIndex = __intVal(repStart) - 1;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1646
		if (repStartIndex >= 0) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1647
		    repNIndex = __BYTES2OBJS__(__qSize(aCollection)-OHDR_SIZE);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1648
		    repStopIndex = repStartIndex + (stopIndex - startIndex);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1649
		    if (repStopIndex < repNIndex) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1650
			src = &(__InstPtr(aCollection)->i_instvars[repStartIndex]);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1651
			dst = &(__InstPtr(self)->i_instvars[startIndex]);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1652
			if (aCollection == self) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1653
			    /*
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1654
			     * no need to check stores if copying
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1655
			     * from myself
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1656
			     */
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1657
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1658
			    /*
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1659
			     * take care of overlapping copy
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1660
			     * do not depend on memset being smart enough
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1661
			     * (some are not ;-)
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1662
			     */
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1663
			    if (src < dst) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1664
				/* must do a reverse copy */
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1665
				src += count;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1666
				dst += count;
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  1667
#ifdef __UNROLL_LOOPS__
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1668
				while (count > 8) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1669
				    dst[-1] = src[-1];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1670
				    dst[-2] = src[-2];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1671
				    dst[-3] = src[-3];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1672
				    dst[-4] = src[-4];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1673
				    dst[-5] = src[-5];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1674
				    dst[-6] = src[-6];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1675
				    dst[-7] = src[-7];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1676
				    dst[-8] = src[-8];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1677
				    dst -= 8; src -= 8;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1678
				    count -= 8;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1679
				}
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1680
#endif
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1681
				while (count-- > 0) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1682
				    *--dst = *--src;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1683
				}
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1684
				RETURN ( self );
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1685
			    }
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1686
#ifdef SOFTWARE_PIPELINE
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1687
			    {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1688
				/*
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1689
				 * the loop below fetches one longWord behind
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1690
				 * this should not be a problem
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1691
				 */
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1692
				OBJ t1 = src[0];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1693
				count--;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1694
				if (count) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1695
				    dst++; src++;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1696
				    do {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1697
					dst[-1] = t1;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1698
					t1 = src[0];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1699
					src++;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1700
					dst++;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1701
				    } while (count--);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1702
				} else {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1703
				    dst[0] = t1;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1704
				}
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1705
			    }
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1706
#else
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1707
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1708
# ifdef bcopy4
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1709
			    bcopy4(src, dst, count);
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1710
# else
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1711
#  ifdef FAST_MEMCPY
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1712
			    memcpy(dst, src, __OBJS2BYTES__(count));
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1713
#  else
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  1714
#   ifdef __UNROLL_LOOPS__
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1715
			    while (count >= 8) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1716
				dst[0] = src[0];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1717
				dst[1] = src[1];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1718
				dst[2] = src[2];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1719
				dst[3] = src[3];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1720
				dst[4] = src[4];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1721
				dst[5] = src[5];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1722
				dst[6] = src[6];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1723
				dst[7] = src[7];
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1724
				dst += 8; src += 8;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1725
				count -= 8;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1726
			    }
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1727
#   endif
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1728
			    while (count--) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1729
				*dst++ = *src++;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1730
			    }
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1731
#  endif
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1732
# endif
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1733
#endif
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1734
			} else {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1735
			    REGISTER int spc = __qSpace(self);
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  1736
#ifdef __UNROLL_LOOPS__
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1737
			    while (count >= 8) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1738
				t = src[0]; dst[0] = t; __STORE_SPC(self, t, spc);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1739
				t = src[1]; dst[1] = t; __STORE_SPC(self, t, spc);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1740
				t = src[2]; dst[2] = t; __STORE_SPC(self, t, spc);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1741
				t = src[3]; dst[3] = t; __STORE_SPC(self, t, spc);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1742
				t = src[4]; dst[4] = t; __STORE_SPC(self, t, spc);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1743
				t = src[5]; dst[5] = t; __STORE_SPC(self, t, spc);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1744
				t = src[6]; dst[6] = t; __STORE_SPC(self, t, spc);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1745
				t = src[7]; dst[7] = t; __STORE_SPC(self, t, spc);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1746
				count -= 8; src += 8; dst += 8;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1747
			    }
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1748
#endif
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1749
			    while (count-- > 0) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1750
				t = *src++;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1751
				*dst++ = t;
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1752
				__STORE_SPC(self, t, spc);
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1753
			    }
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1754
			}
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1755
			RETURN ( self );
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1756
		    }
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1757
		}
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1758
	    }
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  1759
18654
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1760
	    if (count == 0) {
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1761
		RETURN ( self );
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1762
	    }
12e555d89149 jan's fast path change
Claus Gittinger <cg@exept.de>
parents: 18579
diff changeset
  1763
	}
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1764
    }
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1765
%}.
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1766
    ^ super replaceFrom:start to:stop with:aCollection startingAt:repStart
1168
a8ac7ccb76db commentary
Claus Gittinger <cg@exept.de>
parents: 1158
diff changeset
  1767
a8ac7ccb76db commentary
Claus Gittinger <cg@exept.de>
parents: 1158
diff changeset
  1768
    "Modified: 13.4.1996 / 12:17:13 / cg"
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1769
! !
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1770
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1771
!Array methodsFor:'printing & storing'!
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1772
13077
87f8b675848f Implement display with #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 12477
diff changeset
  1773
displayStringName
87f8b675848f Implement display with #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 12477
diff changeset
  1774
    self class == Array ifTrue:[
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1775
	^ '#'
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1776
    ].
13077
87f8b675848f Implement display with #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 12477
diff changeset
  1777
    ^ super displayStringName.
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1778
!
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1779
8442
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1780
printOn:aStream
12162
32aa3e64c889 comment/format in: #printOn:
Claus Gittinger <cg@exept.de>
parents: 11797
diff changeset
  1781
    "append a printed representation of the receiver to aStream"
8442
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1782
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1783
    self isLiteral ifTrue:[
18289
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1784
	|limit firstOne s|
8442
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1785
18289
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1786
	thisContext isRecursive ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1787
	    'Array [error]: printOn: of self referencing collection.' errorPrintCR.
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1788
	    aStream nextPutAll:'#("recursive")'.
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1789
	    ^ self
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1790
	].
8442
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1791
18289
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1792
	aStream nextPutAll:'#('.
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1793
	firstOne := true.
8442
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1794
18289
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1795
	"
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1796
	 if aStream is not positionable, create an temporary positionable stream
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1797
	 (needed for limit calculation)
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1798
	"
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1799
	aStream isPositionable ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1800
	    s := aStream.
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1801
	] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1802
	    s := CharacterWriteStream new:50.
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1803
	].
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1804
	limit := s position + self maxPrint.
8442
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1805
18289
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1806
	self printElementsDo:[:element |
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1807
	    firstOne ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1808
		s space
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1809
	    ] ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1810
		firstOne := false
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1811
	    ].
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1812
	    (s position >= limit) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1813
		s ~~ aStream ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1814
		    aStream nextPutAll:(s contents).
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1815
		].
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1816
		aStream nextPutAll:'...etc...)'.
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1817
		^ self
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1818
	    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1819
		element printOn:s.
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1820
	    ].
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1821
	].
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1822
	s ~~ aStream ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1823
	    aStream nextPutAll:(s contents).
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1824
	].
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1825
	aStream nextPut:$)
8442
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1826
    ] ifFalse:[
18289
Claus Gittinger <cg@exept.de>
parents: 18288
diff changeset
  1827
	super printOn:aStream
8442
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1828
    ]
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1829
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1830
    "
18267
3bc0c58cb8e9 class: Array
Stefan Vogel <sv@exept.de>
parents: 18246
diff changeset
  1831
     #(1 2 $a $Å  'hello' sym kewordSymbol:with: #'funny symbol') printString
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1832
     #(1 2 $a [1 2 3] true false nil #true #false #nil) printString
8442
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1833
    "
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1834
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1835
    "Created: 20.11.1995 / 11:16:58 / cg"
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1836
!
5b4f72d5e966 #printOn: prints Array as #(....) instead of Array(....)
Stefan Vogel <sv@exept.de>
parents: 8368
diff changeset
  1837
7600
5a3fee21c032 #storeString - omit # from Symbols and Arrays that are elements of an array.
Stefan Vogel <sv@exept.de>
parents: 6497
diff changeset
  1838
storeArrayElementOn:aStream
8368
2109093f80ff comment
Claus Gittinger <cg@exept.de>
parents: 7859
diff changeset
  1839
    "Store as element of an array. Omit the leading '#'"
7600
5a3fee21c032 #storeString - omit # from Symbols and Arrays that are elements of an array.
Stefan Vogel <sv@exept.de>
parents: 6497
diff changeset
  1840
5a3fee21c032 #storeString - omit # from Symbols and Arrays that are elements of an array.
Stefan Vogel <sv@exept.de>
parents: 6497
diff changeset
  1841
    self isLiteral ifTrue:[
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1842
	aStream nextPut:$(.
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1843
	self
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1844
	    do:[:element | element storeArrayElementOn:aStream]
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1845
	    separatedBy:[aStream space].
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1846
	aStream nextPut:$).
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1847
	^ self.
8368
2109093f80ff comment
Claus Gittinger <cg@exept.de>
parents: 7859
diff changeset
  1848
    ].
2109093f80ff comment
Claus Gittinger <cg@exept.de>
parents: 7859
diff changeset
  1849
    super storeArrayElementOn:aStream
2109093f80ff comment
Claus Gittinger <cg@exept.de>
parents: 7859
diff changeset
  1850
2109093f80ff comment
Claus Gittinger <cg@exept.de>
parents: 7859
diff changeset
  1851
    "
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1852
     #(1 2 3 4 5) storeOn:Transcript
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1853
     #(1 2 3 4 5) storeArrayElementOn:Transcript
8368
2109093f80ff comment
Claus Gittinger <cg@exept.de>
parents: 7859
diff changeset
  1854
    "
7600
5a3fee21c032 #storeString - omit # from Symbols and Arrays that are elements of an array.
Stefan Vogel <sv@exept.de>
parents: 6497
diff changeset
  1855
!
5a3fee21c032 #storeString - omit # from Symbols and Arrays that are elements of an array.
Stefan Vogel <sv@exept.de>
parents: 6497
diff changeset
  1856
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1857
storeOn:aStream
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1858
    "append a printed representation of the receiver to aStream,
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1859
     which allows reconstructing it via readFrom:.
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1860
     Redefined to output a somewhat more user friendly string."
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1861
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1862
    self isLiteral ifTrue:[
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1863
	aStream nextPutAll:'#('.
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1864
	self do:[:element | element storeArrayElementOn:aStream]
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1865
	     separatedBy:[aStream space].
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1866
	aStream nextPut:$)
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1867
    ] ifFalse:[
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1868
	super storeOn:aStream
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1869
    ]
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1870
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1871
    "
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1872
     #(1 2 $a 'hello' sym kewordSymbol:with: #'funny symbol') storeString
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1873
     #(1 2 $a [1 2 3] true false nil #true #false #nil) storeString
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1874
    "
588
ec7e2bc63d77 testing checkin
Claus Gittinger <cg@exept.de>
parents: 586
diff changeset
  1875
ec7e2bc63d77 testing checkin
Claus Gittinger <cg@exept.de>
parents: 586
diff changeset
  1876
    "Created: 20.11.1995 / 11:16:58 / cg"
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1877
! !
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1878
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1879
!Array methodsFor:'queries'!
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1880
5557
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1881
basicSize
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1882
    "return the number of indexed elements in the receiver"
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1883
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1884
%{  /* NOCONTEXT */
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
  1885
#ifdef __SCHTEAM__
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
  1886
    return context._RETURN (STInteger._new(self.basicSize()));
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
  1887
#else
5557
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1888
    REGISTER OBJ slf = self;
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1889
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1890
    RETURN ( __mkSmallInteger(__arraySize(slf) - __intVal(__ClassInstPtr(__qClass(slf))->c_ninstvars) ));
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
  1891
#endif
5557
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1892
%}
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1893
!
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1894
1243
955b7f55f7a4 commentary
Claus Gittinger <cg@exept.de>
parents: 1219
diff changeset
  1895
refersToLiteral:aLiteral
955b7f55f7a4 commentary
Claus Gittinger <cg@exept.de>
parents: 1219
diff changeset
  1896
    "return true if the receiver or recursively any array element in the
16262
9bc41f1f7057 class: Array
Claus Gittinger <cg@exept.de>
parents: 15848
diff changeset
  1897
     receiver refers to aLiteral (i.e. a deep search)"
1243
955b7f55f7a4 commentary
Claus Gittinger <cg@exept.de>
parents: 1219
diff changeset
  1898
18330
4a40efb10158 class: Array
Claus Gittinger <cg@exept.de>
parents: 18311
diff changeset
  1899
    self do:[:el |
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1900
	el == aLiteral ifTrue:[^true].
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1901
	(el class == Array or:[el class == ImmutableArray]) ifTrue:[
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1902
	    (el refersToLiteral: aLiteral) ifTrue: [^true]
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1903
	]
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1904
    ].
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1905
    ^ false
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1906
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1907
    "
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1908
     #(1 2 3) refersToLiteral:#foo
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1909
     #(1 2 3 foo bar baz) refersToLiteral:#foo
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1910
     #(1 2 3 (((bar foo))) bar baz) refersToLiteral:#foo
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1911
    "
1243
955b7f55f7a4 commentary
Claus Gittinger <cg@exept.de>
parents: 1219
diff changeset
  1912
5537
05d01dd462f6 comments
Claus Gittinger <cg@exept.de>
parents: 5531
diff changeset
  1913
    "Modified: / 18.8.2000 / 21:18:14 / cg"
5557
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1914
!
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1915
14256
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1916
refersToLiteralMatching:aMatchPattern
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1917
    "return true if the receiver or recursively any array element in the
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1918
     receiver is symbolic and matches aMatchPattern (i.e. a deep search)"
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1919
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1920
    self do:[ :el |
18408
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1921
	(el isSymbol and:[ aMatchPattern match: el]) ifTrue:[^true].
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1922
	(el class == Array or:[el class == ImmutableArray]) ifTrue:[
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1923
	    (el refersToLiteralMatching: aMatchPattern) ifTrue: [^true]
6f1d5142cbc3 comments
Claus Gittinger <cg@exept.de>
parents: 18330
diff changeset
  1924
	]
14256
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1925
    ].
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1926
    ^ false
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1927
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1928
    "
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1929
     #(1 2 3) refersToLiteralMatching:#foo
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1930
     #(1 2 3 foo bar baz) refersToLiteralMatching:#foo
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1931
     #(1 2 3 (((bar foo))) bar baz) refersToLiteralMatching:#foo
14256
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1932
    "
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1933
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1934
    "Modified: / 18-08-2000 / 21:18:14 / cg"
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1935
    "Created: / 26-07-2012 / 15:38:01 / cg"
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1936
!
45d30f2f4724 added: #refersToLiteralMatching:
Claus Gittinger <cg@exept.de>
parents: 14158
diff changeset
  1937
5557
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1938
size
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1939
    "return the number of indexed elements in the receiver.
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1940
     Reimplemented here to avoid the additional size->basicSize send
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1941
     (which we can do here, since when arriving here, #size is obviously not
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1942
      redefined in a subclass).
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1943
     This method is the same as basicSize."
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1944
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1945
%{  /* NOCONTEXT */
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
  1946
#ifdef __SCHTEAM__
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
  1947
    return context._RETURN (STInteger._new(self.basicSize()));
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
  1948
#else
5557
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1949
    REGISTER OBJ slf = self;
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1950
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1951
    RETURN ( __mkSmallInteger(__arraySize(slf) - __intVal(__ClassInstPtr(__qClass(slf))->c_ninstvars) ));
18246
d4d749c60f22 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 17376
diff changeset
  1952
#endif
5557
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5554
diff changeset
  1953
%}
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1954
! !
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1955
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  1956
!Array methodsFor:'searching'!
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  1957
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1958
identityIndexOf:anElement or:alternative
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1959
    "search the array for anElement or alternative;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1960
     return the index of anElement if found, or the index of anAlternative,
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1961
     if not found. If anAlternative is also not found, return 0.
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1962
     This is a special interface for high-speed searching in an array
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1963
     and at the same time searching for an empty slot.
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1964
     Do not use this method for your application classes, since it is
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1965
     not portable (i.e. other smalltalks do not offer this)"
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1966
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1967
%{  /* NOCONTEXT */
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1968
    REGISTER INT index;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1969
    REGISTER OBJ o, el1, el2;
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1970
    REGISTER OBJ *op;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1971
    REGISTER unsigned INT nIndex;
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1972
    INT altIndex = 0;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  1973
    INT nInsts;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1974
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1975
    index = 0;
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
  1976
    nInsts = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars);
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1977
    index += nInsts;
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1978
    nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1979
    el1 = anElement; el2 = alternative;
1133
961f2b095c22 underline cleanup
Claus Gittinger <cg@exept.de>
parents: 1123
diff changeset
  1980
    op = & (__InstPtr(self)->i_instvars[index]);
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1981
    while (index++ < nIndex) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1982
	if ((o = *op++) == el1) {
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1983
	    RETURN ( __mkSmallInteger(index - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1984
	}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1985
	if (o == el2) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1986
	    if (altIndex == 0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1987
		altIndex = index;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1988
	    }
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  1989
	}
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1990
    }
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  1991
    RETURN ( __mkSmallInteger(altIndex) );
5403
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  1992
%}.
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  1993
    ^ super identityIndexOf:anElement or:alternative
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1994
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1995
    "
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1996
     #(1 2 3 4 5 6 7 8 9) identityIndexOf:3 or:5
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1997
     #(1 2 0 4 5 6 7 8 9) identityIndexOf:3 or:5
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1998
     #(1 2 0 4 5 6 7 3 9) identityIndexOf:3 or:5
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  1999
     #(1 2 3 4 5 nil 7 3 9) identityIndexOf:3 or:nil
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2000
     #(1 2 nil 4 5 6 7 3 9) identityIndexOf:3 or:nil
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2001
     #(1 2 nil 4 5 6 7 8 9) identityIndexOf:3 or:nil
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2002
     #() identityIndexOf:3 or:nil
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2003
     #(1 2) identityIndexOf:3 or:nil
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2004
    "
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2005
!
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2006
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2007
identityIndexOf:anElement startingAt:start
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2008
    "search the array for anElement; return index if found, 0 otherwise
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2009
     - reimplemented for speed"
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2010
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2011
%{  /* NOCONTEXT */
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2012
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2013
    REGISTER INT index;
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2014
    REGISTER OBJ el;
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2015
    REGISTER OBJ *op;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2016
    REGISTER unsigned INT nIndex;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2017
    INT nInsts;
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2018
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2019
    if (__isSmallInteger(start)) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2020
	index = __intVal(start) - 1;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2021
	if (index >= 0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2022
	    nInsts = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2023
	    index += nInsts;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2024
	    nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2025
	    el = anElement;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2026
	    op = & (__InstPtr(self)->i_instvars[index]);
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  2027
2213
2a4a3df451bf fast memsrch4 (i386 only)
Claus Gittinger <cg@exept.de>
parents: 2211
diff changeset
  2028
#if defined(memsrch4)
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2029
	    if (index < nIndex) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2030
		OBJ *p;
2213
2a4a3df451bf fast memsrch4 (i386 only)
Claus Gittinger <cg@exept.de>
parents: 2211
diff changeset
  2031
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2032
		p = memsrch4(op, (INT)el, (nIndex - index));
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2033
		if (p) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2034
		    index += (p - op + 1);
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2035
		    RETURN ( __mkSmallInteger(index) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2036
		}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2037
	    }
2213
2a4a3df451bf fast memsrch4 (i386 only)
Claus Gittinger <cg@exept.de>
parents: 2211
diff changeset
  2038
#else
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
  2039
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2040
# ifdef __UNROLL_LOOPS__
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2041
	    {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2042
		/*
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2043
		 * dont argue about those gotos below - they speed up that thing by 30%;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2044
		 * its better to exit the loops below with a goto,
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2045
		 * since the generated code will then be:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2046
		 *   compare
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2047
		 *   branch-on-equal found
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2048
		 *
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2049
		 * otherwise (with ret as if-statement), we get:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2050
		 *   compare
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2051
		 *   branch-on-not-equal skipLabel
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2052
		 *   move-to-ret-register true
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2053
		 *   goto ret-label
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2054
		 * skipLabel
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2055
		 *
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2056
		 * therefore, WITH the so-much-blamed goto, we only branch
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2057
		 * when found; without the goto, we branch always.
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2058
		 * Pipelined CPUs do usually not like taken branches.
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2059
		 */
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
  2060
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2061
		unsigned INT i8;
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2062
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2063
		while ((i8 = index + 8) < nIndex) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2064
		    if (op[0] == el) goto found1;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2065
		    if (op[1] == el) goto found2;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2066
		    if (op[2] == el) goto found3;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2067
		    if (op[3] == el) goto found4;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2068
		    if (op[4] == el) goto found5;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2069
		    if (op[5] == el) goto found6;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2070
		    if (op[6] == el) goto found7;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2071
		    if (op[7] == el) goto found8;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2072
		    index = i8;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2073
		    op += 8;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2074
		}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2075
		if (0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2076
		    found1:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2077
			RETURN ( __mkSmallInteger(index + 1 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2078
		    found2:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2079
			RETURN ( __mkSmallInteger(index + 2 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2080
		    found3:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2081
			RETURN ( __mkSmallInteger(index + 3 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2082
		    found4:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2083
			RETURN ( __mkSmallInteger(index + 4 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2084
		    found5:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2085
			RETURN ( __mkSmallInteger(index + 5 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2086
		    found6:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2087
			RETURN ( __mkSmallInteger(index + 6 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2088
		    found7:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2089
			RETURN ( __mkSmallInteger(index + 7 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2090
		    found8:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2091
			RETURN ( __mkSmallInteger(index + 8 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2092
		}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2093
	    }
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2094
# endif /* __UNROLLED_LOOPS__ */
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
  2095
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2096
	    while (index++ < nIndex) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2097
		if (*op++ == el) goto found0;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2098
	    }
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
  2099
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2100
	    if (0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2101
		found0:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2102
		    RETURN ( __mkSmallInteger(index - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2103
	    }
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
  2104
#endif /* no memsrch */
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2105
	}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2106
	RETURN ( __mkSmallInteger(0) );
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2107
    }
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2108
%}.
5403
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  2109
    ^ super identityIndexOf:anElement startingAt:start
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2110
!
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2111
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2112
identityIndexOf:anElement startingAt:start endingAt:stop
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2113
    "search the array for anElement in the range start..stop;
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2114
     return the index if found, 0 otherwise.
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2115
     - reimplemented for speed when searching in OrderedCollections"
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2116
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2117
%{  /* NOCONTEXT */
18311
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2118
#ifdef __SCHTEAM__
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2119
    if (start.isSmallInteger()
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2120
     && stop.isSmallInteger()) {
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2121
	if (self.isVector()) {
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2122
	    int _start = start.intValue() - 1;
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2123
	    int _stop = stop.intValue() - 1;
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2124
	    for (int i=_start; i<=_stop; i++) {
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2125
		if (self.vectorRef(i) == anElement) {
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2126
		    return context._RETURN(i+1);
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2127
		}
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2128
	    }
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2129
	    return context._RETURN(STInteger._0);
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2130
	}
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2131
    }
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2132
#else
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2133
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2134
    REGISTER INT index;
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2135
    REGISTER OBJ el;
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2136
    REGISTER OBJ *op;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2137
    REGISTER unsigned INT lastIndex;
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2138
    unsigned INT nIndex;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2139
    INT nInsts;
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2140
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2141
    if (__bothSmallInteger(start, stop)) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2142
	index = __intVal(start) - 1;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2143
	if (index >= 0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2144
	    nInsts = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2145
	    index += nInsts;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2146
	    lastIndex = nInsts + __intVal(stop);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2147
	    nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2148
	    if (nIndex < lastIndex) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2149
		lastIndex = nIndex;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2150
	    }
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2151
	    el = anElement;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2152
	    op = & (__InstPtr(self)->i_instvars[index]);
2213
2a4a3df451bf fast memsrch4 (i386 only)
Claus Gittinger <cg@exept.de>
parents: 2211
diff changeset
  2153
2a4a3df451bf fast memsrch4 (i386 only)
Claus Gittinger <cg@exept.de>
parents: 2211
diff changeset
  2154
#if defined(memsrch4)
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2155
	    if (index < lastIndex) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2156
		OBJ *p;
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
  2157
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2158
		p = memsrch4(op, (INT)el, (lastIndex - index));
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2159
		if (p) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2160
		    index += (p - op + 1);
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2161
		    RETURN ( __mkSmallInteger(index) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2162
		}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2163
	    }
2216
e4fed6c622de *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2213
diff changeset
  2164
#else
2213
2a4a3df451bf fast memsrch4 (i386 only)
Claus Gittinger <cg@exept.de>
parents: 2211
diff changeset
  2165
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2166
# ifdef __UNROLL_LOOPS__
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2167
	    {
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2168
		unsigned INT i8;
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2169
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2170
		while ((i8 = index + 8) < lastIndex) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2171
		    if (op[0] == el) goto found1;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2172
		    if (op[1] == el) goto found2;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2173
		    if (op[2] == el) goto found3;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2174
		    if (op[3] == el) goto found4;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2175
		    if (op[4] == el) goto found5;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2176
		    if (op[5] == el) goto found6;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2177
		    if (op[6] == el) goto found7;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2178
		    if (op[7] == el) goto found8;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2179
		    index = i8;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2180
		    op += 8;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2181
		}
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
  2182
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2183
		if (0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2184
	    found1:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2185
		    RETURN ( __mkSmallInteger(index + 1 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2186
	    found2:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2187
		    RETURN ( __mkSmallInteger(index + 2 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2188
	    found3:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2189
		    RETURN ( __mkSmallInteger(index + 3 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2190
	    found4:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2191
		    RETURN ( __mkSmallInteger(index + 4 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2192
	    found5:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2193
		    RETURN ( __mkSmallInteger(index + 5 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2194
	    found6:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2195
		    RETURN ( __mkSmallInteger(index + 6 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2196
	    found7:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2197
		    RETURN ( __mkSmallInteger(index + 7 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2198
	    found8:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2199
		    RETURN ( __mkSmallInteger(index + 8 - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2200
		}
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2201
	    }
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2202
# endif /* __UNROLL_LOOPS__ */
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
  2203
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2204
	    while (index++ < lastIndex) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2205
		if (*op++ == el) goto found0;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2206
	    }
2715
48beff18cec0 software pipeline element access in enumeration method
Claus Gittinger <cg@exept.de>
parents: 2683
diff changeset
  2207
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2208
	    if (0) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2209
		found0:
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2210
		    RETURN ( __mkSmallInteger(index - nInsts) );
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2211
	    }
2213
2a4a3df451bf fast memsrch4 (i386 only)
Claus Gittinger <cg@exept.de>
parents: 2211
diff changeset
  2212
#endif
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2213
	}
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2214
	RETURN ( __mkSmallInteger(0) );
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2215
    }
18311
efd9abe45fd7 comment only
Claus Gittinger <cg@exept.de>
parents: 18289
diff changeset
  2216
#endif /*not SCHTEAM */
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2217
%}.
5403
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  2218
    ^ super identityIndexOf:anElement startingAt:start endingAt:stop
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2219
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2220
!
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2221
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2222
indexOf:anElement startingAt:start
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2223
    "search the array for anElement; return index if found, 0 otherwise
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2224
     - reimplemented for speed"
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2225
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2226
    |element|
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2227
%{
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2228
    REGISTER INT index;
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2229
    unsigned INT nIndex;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2230
    unsigned INT nInsts;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2231
    static struct inlineCache eq = _ILC1;
4130
662554f2a37c avoid refetch of void variables (if possible)
Claus Gittinger <cg@exept.de>
parents: 4122
diff changeset
  2232
    OBJ myClass, e;
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2233
2184
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
  2234
    myClass = __qClass(self);
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
  2235
    if ( __isSmallInteger(start) ) {
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2236
	index = __intVal(start) - 1;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2237
	if (index >= 0) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2238
	    nInsts = __intVal(__ClassInstPtr(myClass)->c_ninstvars);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2239
	    index += nInsts;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2240
	    nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
4130
662554f2a37c avoid refetch of void variables (if possible)
Claus Gittinger <cg@exept.de>
parents: 4122
diff changeset
  2241
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2242
	    e = anElement;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2243
	    if (e != nil) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2244
		/*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2245
		 * special kludge to search for a string;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2246
		 * this is so common, that its worth a special case
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2247
		 */
825
f7b73d83b9d4 optimized search for strings (dont know if its worth it ...)
Claus Gittinger <cg@exept.de>
parents: 788
diff changeset
  2248
#define SPECIAL_STRING_OPT
f7b73d83b9d4 optimized search for strings (dont know if its worth it ...)
Claus Gittinger <cg@exept.de>
parents: 788
diff changeset
  2249
#ifdef SPECIAL_STRING_OPT
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2250
		if (__isStringLike(e)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2251
		    while (index < nIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2252
			element = __InstPtr(self)->i_instvars[index++];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2253
			if (__isNonNilObject(element)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2254
			    if (element == e) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2255
				RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2256
			    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2257
			    if (__qClass(element) == @global(String)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2258
				if (strcmp(__stringVal(e), __stringVal(element)) == 0) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2259
				    RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2260
				}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2261
			    } else {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2262
				if ((*eq.ilc_func)(e, @symbol(=), nil,&eq, element) == true) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2263
				    RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2264
				}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2265
				/*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2266
				 * send of #= could have lead to a GC - refetch e
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2267
				 */
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2268
				e = anElement;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2269
			    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2270
			}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2271
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2272
		    RETURN (__mkSmallInteger(0));
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2273
		}
825
f7b73d83b9d4 optimized search for strings (dont know if its worth it ...)
Claus Gittinger <cg@exept.de>
parents: 788
diff changeset
  2274
#endif
14380
06aa294b80fa changed: #indexOf:startingAt:
Claus Gittinger <cg@exept.de>
parents: 14256
diff changeset
  2275
#ifdef MAKES_IT_SLOWER_BUT_WHY
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2276
		if (__isSmallInteger(e)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2277
		    /* search for a small number */
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2278
		    while (index < nIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2279
			element = __InstPtr(self)->i_instvars[index++];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2280
			if (element == e) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2281
			    RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2282
			}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2283
			if (!__isSmallInteger(element)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2284
			    if (element != nil) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2285
				if ((*eq.ilc_func)(e,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2286
						   @symbol(=),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2287
						   nil,&eq,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2288
						   element) == true) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2289
				    RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2290
				}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2291
				/*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2292
				 * send of #= could have lead to a GC - refetch e
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2293
				 */
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2294
				e = anElement;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2295
			    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2296
			}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2297
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2298
		    RETURN (__mkSmallInteger(0));
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2299
		}
14380
06aa294b80fa changed: #indexOf:startingAt:
Claus Gittinger <cg@exept.de>
parents: 14256
diff changeset
  2300
#endif /* MAKES_IT_SLOWER_BUT_WHY */
4130
662554f2a37c avoid refetch of void variables (if possible)
Claus Gittinger <cg@exept.de>
parents: 4122
diff changeset
  2301
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2302
		while (index < nIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2303
		    element = __InstPtr(self)->i_instvars[index++];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2304
		    if (element != nil) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2305
			if ((element == e)
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2306
			 || ((*eq.ilc_func)(e,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2307
					    @symbol(=),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2308
					    nil,&eq,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2309
					    element) == true)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2310
			    RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2311
			}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2312
			/*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2313
			 * send of #= could have lead to a GC - refetch e
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2314
			 */
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2315
			e = anElement;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2316
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2317
		}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2318
	    } else {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2319
		OBJ slf = self;
4130
662554f2a37c avoid refetch of void variables (if possible)
Claus Gittinger <cg@exept.de>
parents: 4122
diff changeset
  2320
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2321
		/*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2322
		 * search for nil - do an identity-search
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2323
		 */
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2324
#ifdef __UNROLL_LOOPS__
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2325
		{
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2326
		    unsigned INT i8;
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2327
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2328
		    while ((i8 = index + 8) < nIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2329
			if (__InstPtr(slf)->i_instvars[index] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 1) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2330
			if (__InstPtr(slf)->i_instvars[index+1] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 2) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2331
			if (__InstPtr(slf)->i_instvars[index+2] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 3) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2332
			if (__InstPtr(slf)->i_instvars[index+3] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 4) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2333
			if (__InstPtr(slf)->i_instvars[index+4] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 5) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2334
			if (__InstPtr(slf)->i_instvars[index+5] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 6) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2335
			if (__InstPtr(slf)->i_instvars[index+6] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 7) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2336
			if (__InstPtr(slf)->i_instvars[index+7] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 8) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2337
			index = i8;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2338
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2339
		}
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2340
#endif
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2341
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2342
		while (index < nIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2343
		    if (__InstPtr(slf)->i_instvars[index++] == nil) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2344
			RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2345
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2346
		}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2347
	    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2348
	}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2349
	RETURN (__mkSmallInteger(0));
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2350
    }
554
716dee42f589 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  2351
%}.
2184
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
  2352
    ^ super indexOf:anElement startingAt:start
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2353
!
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2354
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2355
indexOf:anElement startingAt:start endingAt:stop
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2356
    "search the array for anElement in the range start..stop;
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2357
     Return the index if found, 0 otherwise.
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2358
     - reimplemented for speed when searching in OrderedCollections"
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2359
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2360
    |element|
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2361
%{
8913
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2362
    REGISTER INT index;
b9498d27a554 64bit; mkSmallInteger
Claus Gittinger <cg@exept.de>
parents: 8901
diff changeset
  2363
    unsigned INT lastIndex, nIndex;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2364
    unsigned INT nInsts;
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2365
    static struct inlineCache eq = _ILC1;
4130
662554f2a37c avoid refetch of void variables (if possible)
Claus Gittinger <cg@exept.de>
parents: 4122
diff changeset
  2366
    OBJ myClass, e;
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2367
2184
f25db3e10530 no block-copy operations are allowed with WeakArrays
Claus Gittinger <cg@exept.de>
parents: 2145
diff changeset
  2368
    myClass = __qClass(self);
2357
061dadc13df1 removed WEAKPOINTER checks - WeakArray is no longer allowed to be a subclass of Array
Claus Gittinger <cg@exept.de>
parents: 2318
diff changeset
  2369
    if ( __bothSmallInteger(start, stop) ) {
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2370
	index = __intVal(start) - 1;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2371
	if (index >= 0) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2372
	    nInsts = __intVal(__ClassInstPtr(myClass)->c_ninstvars);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2373
	    index += nInsts;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2374
	    lastIndex = nInsts + __intVal(stop);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2375
	    nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2376
	    if (nIndex < lastIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2377
		lastIndex = nIndex;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2378
	    }
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2379
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2380
	    e = anElement;
4130
662554f2a37c avoid refetch of void variables (if possible)
Claus Gittinger <cg@exept.de>
parents: 4122
diff changeset
  2381
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2382
	    if (e != nil) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2383
		/*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2384
		 * special kludge to search for a string;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2385
		 * this is so common, that its worth a special case
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2386
		 */
4130
662554f2a37c avoid refetch of void variables (if possible)
Claus Gittinger <cg@exept.de>
parents: 4122
diff changeset
  2387
#define SPECIAL_STRING_OPT
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2388
#ifdef SPECIAL_STRING_OPT
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2389
		if (__isStringLike(e)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2390
		    while (index < lastIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2391
			element = __InstPtr(self)->i_instvars[index++];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2392
			if (__isNonNilObject(element)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2393
			    if (element == e) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2394
				RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2395
			    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2396
			    if (__qClass(element) == @global(String)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2397
				if (strcmp(__stringVal(e), __stringVal(element)) == 0) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2398
				    RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2399
				}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2400
			    } else {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2401
				if ((*eq.ilc_func)(e, @symbol(=), nil,&eq, element) == true) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2402
				    RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2403
				}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2404
				/*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2405
				 * send of #= could have lead to a GC - refetch e
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2406
				 */
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2407
				e = anElement;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2408
			    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2409
			}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2410
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2411
		    RETURN (__mkSmallInteger(0));
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2412
		}
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2413
#endif
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2414
		if (__isSmallInteger(e)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2415
		    /* search for a small number */
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2416
		    while (index < lastIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2417
			element = __InstPtr(self)->i_instvars[index++];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2418
			if (element == e) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2419
			    RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2420
			}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2421
			if (!__isSmallInteger(element)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2422
			    if ((*eq.ilc_func)(e,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2423
						@symbol(=),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2424
						nil,&eq,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2425
						element) == true) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2426
				RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2427
			    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2428
			    /*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2429
			     * send of #= could have lead to a GC - refetch e
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2430
			     */
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2431
			    e = anElement;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2432
			}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2433
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2434
		    RETURN (__mkSmallInteger(0));
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2435
		}
4130
662554f2a37c avoid refetch of void variables (if possible)
Claus Gittinger <cg@exept.de>
parents: 4122
diff changeset
  2436
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2437
		while (index < lastIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2438
		    element = __InstPtr(self)->i_instvars[index++];
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2439
		    if (element != nil) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2440
			e = anElement;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2441
			if ((element == e)
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2442
			 || ((*eq.ilc_func)(e,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2443
					    @symbol(=),
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2444
					    nil,&eq,
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2445
					    element) == true)) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2446
			    RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2447
			}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2448
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2449
		}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2450
	    } else {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2451
		OBJ slf = self;
4130
662554f2a37c avoid refetch of void variables (if possible)
Claus Gittinger <cg@exept.de>
parents: 4122
diff changeset
  2452
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2453
		/*
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2454
		 * search for nil - do an identity-search
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2455
		 */
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2456
#ifdef __UNROLL_LOOPS__
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2457
		{
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2458
		    unsigned INT i8;
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2459
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2460
		    while ((i8 = index + 8) < lastIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2461
			if (__InstPtr(slf)->i_instvars[index] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 1) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2462
			if (__InstPtr(slf)->i_instvars[index+1] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 2) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2463
			if (__InstPtr(slf)->i_instvars[index+2] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 3) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2464
			if (__InstPtr(slf)->i_instvars[index+3] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 4) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2465
			if (__InstPtr(slf)->i_instvars[index+4] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 5) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2466
			if (__InstPtr(slf)->i_instvars[index+5] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 6) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2467
			if (__InstPtr(slf)->i_instvars[index+6] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 7) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2468
			if (__InstPtr(slf)->i_instvars[index+7] == nil) { RETURN ( __mkSmallInteger(index - nInsts + 8) ); }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2469
			index = i8;
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2470
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2471
		}
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2472
#endif
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2473
		while (index < lastIndex) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2474
		    if (__InstPtr(slf)->i_instvars[index++] == nil) {
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2475
			RETURN ( __mkSmallInteger(index - nInsts) );
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2476
		    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2477
		}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2478
	    }
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2479
	}
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2480
	RETURN (__mkSmallInteger(0));
1158
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2481
    }
bf9aec9e892c added range search (mostly for big orderedCollections)
Claus Gittinger <cg@exept.de>
parents: 1143
diff changeset
  2482
%}.
2211
289095fe875a oops - must send super indeOf...endingAt:
Claus Gittinger <cg@exept.de>
parents: 2210
diff changeset
  2483
    ^ super indexOf:anElement startingAt:start endingAt:stop
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2484
! !
543
09293a92bddb checkin from browser
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
  2485
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2486
!Array methodsFor:'testing'!
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2487
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2488
includes:anObject
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2489
    "return true, if the argument, anObject is contained in the array
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2490
     - reimplemented for speed"
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2491
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2492
    |element|
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2493
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2494
%{  /* NOCONTEXT */
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2495
    /*
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2496
     * first, do a quick check using ==
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2497
     * this does not need a context or message send.
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2498
     * In many cases this will already find a match.
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2499
     */
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2500
    REGISTER INT index;
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2501
    REGISTER OBJ o;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2502
    unsigned INT nIndex;
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2503
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2504
    nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2505
    index = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars);
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2506
4309
7d8976a3abe3 bug fix
Claus Gittinger <cg@exept.de>
parents: 4305
diff changeset
  2507
    o = anObject;
7d8976a3abe3 bug fix
Claus Gittinger <cg@exept.de>
parents: 4305
diff changeset
  2508
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2509
    /*
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2510
     * however, the search is limited to the first 500
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2511
     * elements, since otherwise, we may spend too much time
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2512
     * searching for identity if an equal value is found early
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2513
     * (except if searching for nil - there is no need for equal compare ...)
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2514
     */
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2515
    if (nIndex > 500) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2516
	if (o != nil)
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2517
	    nIndex = 500;
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2518
    }
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2519
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2520
# ifdef memsrch4
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2521
    if (index < nIndex) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2522
	OBJ *p;
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2523
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2524
	p = memsrch4(&(__InstPtr(self)->i_instvars[index]), (INT)o, (nIndex - index));
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2525
	if (p) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2526
	    RETURN ( true );
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2527
	}
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2528
    }
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2529
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2530
# else
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2531
    /*
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2532
     * dont argue those gotos below - they speed up that thing by 30%
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2533
     * its better to exit the loops below with a goto,
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2534
     * since the generated code will then be:
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2535
     *   compare
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2536
     *   branch-on-equal found
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2537
     *
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2538
     * otherwise, we get:
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2539
     *   compare
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2540
     *   branch-on-not-equal skipLabel
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2541
     *   move-to-return-register true
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2542
     *   goto return-label
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2543
     * skipLabel
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2544
     *
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2545
     * therefore, WITH the so-much-blamed goto, we only branch
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2546
     * when found; without the goto, we branch always.
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2547
     * Pipelined CPUs do usually not like taken branches.
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2548
     * also, all branches are forward, which are usually predicted
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2549
     * as not taken.
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2550
     */
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2551
#  ifdef __UNROLL_LOOPS__
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2552
    {
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2553
	unsigned INT i8;
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2554
	REGISTER OBJ slf = self;
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2555
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2556
	while ((i8 = index + 8) < nIndex) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2557
	    if (__InstPtr(slf)->i_instvars[index] == o) goto found;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2558
	    if (__InstPtr(slf)->i_instvars[index+1] == o) goto found;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2559
	    if (__InstPtr(slf)->i_instvars[index+2] == o) goto found;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2560
	    if (__InstPtr(slf)->i_instvars[index+3] == o) goto found;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2561
	    if (__InstPtr(slf)->i_instvars[index+4] == o) goto found;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2562
	    if (__InstPtr(slf)->i_instvars[index+5] == o) goto found;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2563
	    if (__InstPtr(slf)->i_instvars[index+6] == o) goto found;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2564
	    if (__InstPtr(slf)->i_instvars[index+7] == o) goto found;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2565
	    index = i8;
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2566
	}
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2567
    }
8919
707a9ff7f9b2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2568
#  endif /* __UNROLL_LOOPS__ */
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2569
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2570
    while (index < nIndex) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2571
	if (__InstPtr(self)->i_instvars[index++] == o) goto found;
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2572
    }
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2573
    if (0) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2574
	found:
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2575
	    RETURN (true);
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2576
    }
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2577
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2578
# endif /* no memsrch */
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2579
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2580
    if (o == nil) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2581
	RETURN ( false );
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2582
    }
5403
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  2583
%}.
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  2584
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  2585
%{
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2586
    REGISTER INT index;
5403
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  2587
    REGISTER OBJ o;
14687
e718f7219911 64bit changes
Claus Gittinger <cg@exept.de>
parents: 14657
diff changeset
  2588
    unsigned INT nIndex;
5403
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  2589
    static struct inlineCache eq = _ILC1;
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2590
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2591
    /*
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2592
     * then do a slow(er) check using =
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2593
     */
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2594
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2595
    /*
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2596
     * sorry: cannot access the stuff from above ...
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2597
     */
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2598
    nIndex = __BYTES2OBJS__(__qSize(self) - OHDR_SIZE);
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2599
    index = __intVal(__ClassInstPtr(__qClass(self))->c_ninstvars);
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2600
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2601
    while (index < nIndex) {
6497
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2602
	element = __InstPtr(self)->i_instvars[index++];
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2603
	if (element != nil) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2604
	    if ((*eq.ilc_func)(anObject,
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2605
			       @symbol(=),
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2606
			       nil,&eq,
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2607
			       element)==true) {
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2608
		RETURN ( true );
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2609
	    }
786812ab9bb3 use arrayVal macro
Claus Gittinger <cg@exept.de>
parents: 5576
diff changeset
  2610
	}
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2611
    }
5403
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  2612
    RETURN (false);
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2613
%}.
5403
55cbe7c0a58f super-send fallBacks
Claus Gittinger <cg@exept.de>
parents: 5347
diff changeset
  2614
    ^ super includes:anObject
5049
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2615
!
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2616
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2617
includesIdentical:anObject
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2618
    "return true, if the argument, anObject is contained in the array
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2619
     uses #== (instead of #=) when comparing; i.e. the search is for
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2620
     the object, not some object being equal."
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2621
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2622
    ^ (self identityIndexOf:anObject) ~~ 0
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2623
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2624
    "
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2625
     #(1 2 3 4 5) includes:3.0
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2626
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2627
     #(1 2 3 4 5) includesIdentical:3.0
d8279f59df21 added #includesIdentical:
Claus Gittinger <cg@exept.de>
parents: 4681
diff changeset
  2628
    "
5554
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2629
!
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2630
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2631
isArray
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2632
    "return true, if the receiver is some kind of array (or weakArray etc).
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2633
     true is returned here."
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2634
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2635
    ^ true
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2636
!
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2637
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2638
isEmpty
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2639
    "return true if the receiver contains no elements.
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2640
     Reimplemented here for performance."
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2641
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2642
%{  /* NOCONTEXT */
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2643
    REGISTER OBJ slf = self;
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2644
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2645
    if (__qClass(slf) == Array) {
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2646
	RETURN ( (__arraySize(slf) == 0) ? true : false);
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2647
    }
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2648
%}.
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2649
    ^ self size == 0
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2650
!
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2651
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2652
isLiteral
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2653
    "return true, if the receiver can be used as a literal constant in ST syntax
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2654
     (i.e. can be used in constant arrays)"
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2655
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2656
    "/ no, simply returning true here is a mistake:
14632
6fe0dc1d5377 64bit mingw changes
Claus Gittinger <cg@exept.de>
parents: 14623
diff changeset
  2657
    "/ it could be a subclass of Array
5554
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2658
    "/ (of which the compiler does not know at all ...)
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2659
    self class == Array ifFalse:[^ false].
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2660
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2661
    "/
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2662
    "/ care for recursive arrays ...
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2663
    "/
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2664
    thisContext isRecursive ifTrue:[^ false].
10089
833fffc641ef code cleanup: use #conform instead of explicit loop
Claus Gittinger <cg@exept.de>
parents: 9360
diff changeset
  2665
    ^ self conform:[:element | element isLiteral].
5554
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2666
10089
833fffc641ef code cleanup: use #conform instead of explicit loop
Claus Gittinger <cg@exept.de>
parents: 9360
diff changeset
  2667
    "Modified: / 13-10-2006 / 13:00:45 / cg"
5554
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2668
!
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2669
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2670
notEmpty
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2671
    "return true if the receiver contains elements.
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2672
     Reimplemented here for performance."
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2673
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2674
%{  /* NOCONTEXT */
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2675
    REGISTER OBJ slf = self;
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2676
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2677
    if (__qClass(slf) == Array) {
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2678
	RETURN ( (__arraySize(slf) != 0) ? true : false);
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2679
    }
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2680
%}.
28520e96cca9 category changes
Claus Gittinger <cg@exept.de>
parents: 5537
diff changeset
  2681
    ^ self size ~~ 0
3088
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2682
! !
8b7011bef899 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3041
diff changeset
  2683
4681
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2684
!Array methodsFor:'tracing'!
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2685
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2686
traceInto:aRequestor level:level from:referrer
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2687
    "double dispatch into tracer, passing my type implicitely in the selector"
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2688
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2689
    ^ aRequestor traceArray:self level:level from:referrer
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2690
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2691
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2692
! !
7bac1e0ba551 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4661
diff changeset
  2693
1903
30c98b3377c5 slight tuning
Claus Gittinger <cg@exept.de>
parents: 1730
diff changeset
  2694
!Array class methodsFor:'documentation'!
626
f359cb7eba58 version at the end
Claus Gittinger <cg@exept.de>
parents: 588
diff changeset
  2695
f359cb7eba58 version at the end
Claus Gittinger <cg@exept.de>
parents: 588
diff changeset
  2696
version
18579
3dedfc433f6a class: Array
Stefan Vogel <sv@exept.de>
parents: 18408
diff changeset
  2697
    ^ '$Header$'
12162
32aa3e64c889 comment/format in: #printOn:
Claus Gittinger <cg@exept.de>
parents: 11797
diff changeset
  2698
!
32aa3e64c889 comment/format in: #printOn:
Claus Gittinger <cg@exept.de>
parents: 11797
diff changeset
  2699
32aa3e64c889 comment/format in: #printOn:
Claus Gittinger <cg@exept.de>
parents: 11797
diff changeset
  2700
version_CVS
18579
3dedfc433f6a class: Array
Stefan Vogel <sv@exept.de>
parents: 18408
diff changeset
  2701
    ^ '$Header$'
1244
dc9dd731258c commentary
Claus Gittinger <cg@exept.de>
parents: 1243
diff changeset
  2702
! !