author | Stefan Vogel <sv@exept.de> |
Tue, 09 Apr 2002 20:58:14 +0200 | |
changeset 6491 | 6976d9b69e01 |
parent 4673 | 39fa7949617b |
child 7018 | 5ceb0daa7b1b |
permissions | -rw-r--r-- |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
1 |
" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
2 |
COPYRIGHT (c) 1995 by Claus Gittinger |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
3 |
All Rights Reserved |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
4 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
5 |
This software is furnished under a license and may be used |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
6 |
only in accordance with the terms of that license and with the |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
7 |
inclusion of the above copyright notice. This software may not |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
8 |
be provided or otherwise made available to, or used by, any |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
9 |
other person. No title to or ownership of the software is |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
10 |
hereby transferred. |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
11 |
" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
12 |
|
6491
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
13 |
"{ Package: 'stx:libbasic' }" |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
14 |
|
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
15 |
Object subclass:#ExternalAddress |
1267 | 16 |
instanceVariableNames:'address*' |
17 |
classVariableNames:'' |
|
18 |
poolDictionaries:'' |
|
19 |
category:'System-Support' |
|
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
20 |
! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
21 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
22 |
!ExternalAddress class methodsFor:'documentation'! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
23 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
24 |
copyright |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
25 |
" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
26 |
COPYRIGHT (c) 1995 by Claus Gittinger |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
27 |
All Rights Reserved |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
28 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
29 |
This software is furnished under a license and may be used |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
30 |
only in accordance with the terms of that license and with the |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
31 |
inclusion of the above copyright notice. This software may not |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
32 |
be provided or otherwise made available to, or used by, any |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
33 |
other person. No title to or ownership of the software is |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
34 |
hereby transferred. |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
35 |
" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
36 |
! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
37 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
38 |
documentation |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
39 |
" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
40 |
Instances of this class represent external (non-Smalltalk) addresses. |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
41 |
They are only useful to represent handles as returned by C functions |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
42 |
as smalltalk objects. For example, Window- or WidgetIDs (which are actually |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
43 |
32 bit pointers) should be represented this way. |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
44 |
(you should not use SmallIntegers for this, since they can only represent 31 |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
45 |
bits; LargeIntegers could be used in theory, but it is not a very good style |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
46 |
to do so, since it makes things a bit cryptic - having ExternalAddresses |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
47 |
around makes things pretty clear in inspectors etc.). |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
48 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
49 |
There is not much you can do with ExternalAddresses on the smalltalk level; |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
50 |
creation/use is mostly in primitive C-code via |
1317 | 51 |
__MKEXTERNALADDRESS(voidPtr) and __ExternalAddressVal(obj). |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
52 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
53 |
ExternallAddresses are much like ExternalBytes - however, the latter |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
54 |
allow you to access bytes via indexed at:/at:put: messages. |
1960 | 55 |
ExternalAddresses do not allow such accesses (they are meant to remain |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
56 |
anonymous). |
1286 | 57 |
|
58 |
[author:] |
|
3957 | 59 |
Claus Gittinger |
1317 | 60 |
|
61 |
[see also:] |
|
3957 | 62 |
ByteArray |
63 |
ExternalBytes ExternalFunction |
|
64 |
( how to write primitive code :html: programming/primitive.html ) |
|
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
65 |
" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
66 |
! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
67 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
68 |
examples |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
69 |
" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
70 |
To pass some C-pointer from primitive code to smalltalk: |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
71 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
72 |
... |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
73 |
RETURN (__MKEXTERNALADDRESS(foo)); |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
74 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
75 |
pass it back to C and use it there: |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
76 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
77 |
... |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
78 |
if (__isExternalAddress(anExternalAddress)) { |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
79 |
ptr = __externalAddressVal(anExternalAddress)); |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
80 |
} |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
81 |
... |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
82 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
83 |
concrete example: |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
84 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
85 |
test1 |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
86 |
%{ |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
87 |
static char foo[] = {'h', 'e' ,'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n'}; |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
88 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
89 |
RETURN (__MKEXTERNALADDRESS(foo)); |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
90 |
%} |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
91 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
92 |
test2:anExternalAddress |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
93 |
%{ |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
94 |
if (__isExternalAddress(anExternalAddress)) { |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
95 |
printf(__externalAddressVal(anExternalAddress)); |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
96 |
RETURN (self); |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
97 |
} |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
98 |
%} |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
99 |
" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
100 |
! ! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
101 |
|
3957 | 102 |
!ExternalAddress class methodsFor:'instance creation'! |
103 |
||
104 |
newAddress:addr |
|
105 |
^ self new setAddress:addr |
|
106 |
! ! |
|
107 |
||
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
108 |
!ExternalAddress class methodsFor:'queries'! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
109 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
110 |
isBuiltInClass |
1267 | 111 |
"return true if this class is known by the run-time-system. |
112 |
Here, true is returned." |
|
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
113 |
|
3552 | 114 |
^ self == ExternalAddress |
1267 | 115 |
|
3552 | 116 |
"Modified: / 11.6.1998 / 17:12:40 / cg" |
6491
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
117 |
! |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
118 |
|
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
119 |
pointerSize |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
120 |
"answer the size in bytes of a pointer" |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
121 |
|
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
122 |
%{ /* NOCONTEXT */ |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
123 |
RETURN(__mkSmallInteger(sizeof(void *))); |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
124 |
%}. |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
125 |
|
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
126 |
" |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
127 |
self pointerSize |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
128 |
" |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
129 |
! ! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
130 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
131 |
!ExternalAddress methodsFor:'accessing'! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
132 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
133 |
address |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
134 |
"return the start address as an integer" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
135 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
136 |
%{ /* NOCONTEXT */ |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
137 |
|
2869 | 138 |
unsigned INT addr; |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
139 |
|
2877 | 140 |
addr = (unsigned INT)__INST(address_); |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
141 |
RETURN ( __MKUINT(addr)); |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
142 |
%} |
4673 | 143 |
! |
144 |
||
145 |
instVarAt:index |
|
146 |
"redefined to suppress direct access to my address, which is a non-object" |
|
147 |
||
148 |
index == 1 ifTrue:[ |
|
149 |
^ self address |
|
150 |
]. |
|
151 |
^ super instVarAt:index |
|
152 |
||
153 |
"Created: / 3.9.1999 / 13:47:03 / ps" |
|
154 |
! |
|
155 |
||
156 |
instVarAt:index put:newAddress |
|
157 |
"redefined to suppress direct access to my address, which is a non-object" |
|
158 |
||
159 |
index == 1 ifTrue:[ |
|
160 |
self setAddress:newAddress. |
|
161 |
^ newAddress |
|
162 |
]. |
|
163 |
^ super instVarAt:index put:newAddress |
|
164 |
||
165 |
"Created: / 3.9.1999 / 14:31:57 / ps" |
|
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
166 |
! ! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
167 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
168 |
!ExternalAddress methodsFor:'comparing'! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
169 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
170 |
= anExternalAddress |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
171 |
"return true, if two externalAddress instance represent the same |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
172 |
C pointer" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
173 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
174 |
%{ /* NOCONTEXT */ |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
175 |
if (__isExternalAddress(anExternalAddress) |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
176 |
&& (__externalAddressVal(self) == __externalAddressVal(anExternalAddress))) { |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
177 |
RETURN (true); |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
178 |
} |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
179 |
%}. |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
180 |
^ false |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
181 |
! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
182 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
183 |
hash |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
184 |
"return a number useful for hashing" |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
185 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
186 |
%{ /* NOCONTEXT */ |
2869 | 187 |
unsigned INT addr = (unsigned INT) __externalAddressVal(self); |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
188 |
|
2472
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
189 |
if (addr > _MAX_INT) { |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
190 |
if ((addr & 1) == 0) { |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
191 |
addr >>= 1; |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
192 |
} |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
193 |
if (addr > _MAX_INT) { |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
194 |
if ((addr & 1) == 0) { |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
195 |
addr >>= 1; |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
196 |
} |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
197 |
} |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
198 |
if (addr > _MAX_INT) { |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
199 |
addr &= _MAX_INT; |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
200 |
} |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
201 |
} else { |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
202 |
addr <<= 1; |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
203 |
if (addr <= _MAX_INT) { |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
204 |
addr <<= 1; |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
205 |
if (addr <= _MAX_INT) { |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
206 |
addr <<= 1; |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
207 |
} |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
208 |
} |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
209 |
addr >>= 1; |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
210 |
} |
00e7a1b3b07f
better distribution of the hash-key (look for zero-bits)
Claus Gittinger <cg@exept.de>
parents:
1960
diff
changeset
|
211 |
RETURN (__MKSMALLINT(addr)); |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
212 |
%} |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
213 |
! ! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
214 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
215 |
!ExternalAddress methodsFor:'converting'! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
216 |
|
6491
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
217 |
asExternalAddress |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
218 |
"convert to an ExternalAddress. |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
219 |
Useful to convert subclasses" |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
220 |
|
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
221 |
%{ /* NOCONTEXT */ |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
222 |
|
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
223 |
if (__qClass(self) == @global(ExternalAddress)) { |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
224 |
RETURN(self) |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
225 |
} |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
226 |
RETURN(__MKEXTERNALADDRESS(__INST(address_))); |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
227 |
%}. |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
228 |
|
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
229 |
" |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
230 |
(ExternalAddress newAddress:16r12345678) asExternalAddress |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
231 |
" |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
232 |
! |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
233 |
|
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
234 |
asExternalBytes |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
235 |
"return an ExternalBytes object pointing to where the receiver points to. |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
236 |
Use of this is not recommended; primitives which return externalAddresses |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
237 |
dont think that access to the memory is required/useful, while primitives |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
238 |
which do think so should return an externalBytes instance right away." |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
239 |
|
6491
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
240 |
%{ /* NOCONTEXT */ |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
241 |
|
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
242 |
RETURN(__MKEXTERNALBYTES(__INST(address_))); |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
243 |
%} |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
244 |
|
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
245 |
" |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
246 |
(ExternalAddress newAddress:16r12345678) asExternalBytes |
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
247 |
" |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
248 |
! ! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
249 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
250 |
!ExternalAddress methodsFor:'printing & storing'! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
251 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
252 |
displayString |
2957 | 253 |
"return a printed representation of the receiver for displaying" |
254 |
||
3487 | 255 |
^ self class name , ' at:' , (self address printStringRadix:16) |
2957 | 256 |
|
3487 | 257 |
"Modified: / 26.5.1998 / 16:11:50 / cg" |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
258 |
! ! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
259 |
|
3957 | 260 |
!ExternalAddress methodsFor:'private accessing'! |
261 |
||
262 |
setAddress:anInteger |
|
263 |
"set the address" |
|
264 |
||
265 |
%{ /* NOCONTEXT */ |
|
266 |
||
267 |
unsigned INT addr; |
|
268 |
||
269 |
if (__isSmallInteger(anInteger)) { |
|
270 |
addr = __intVal(anInteger); |
|
271 |
} else { |
|
272 |
addr = __longIntVal(anInteger); |
|
273 |
} |
|
274 |
__INST(address_) = (OBJ)addr; |
|
275 |
%} |
|
276 |
! ! |
|
277 |
||
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
278 |
!ExternalAddress class methodsFor:'documentation'! |
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
279 |
|
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
280 |
version |
6491
6976d9b69e01
Conversion between ExternalBytes and ExternalAddress
Stefan Vogel <sv@exept.de>
parents:
4673
diff
changeset
|
281 |
^ '$Header: /cvs/stx/stx/libbasic/ExternalAddress.st,v 1.16 2002-04-09 18:58:14 stefan Exp $' |
847
a79ec4e6670d
ExternalAddress moved from libbasic2
Claus Gittinger <cg@exept.de>
parents:
diff
changeset
|
282 |
! ! |