1"======================================================================
2|
3|   Java run-time support.  java.lang.reflect.Array native methods.
4|
5|
6 ======================================================================"
7
8
9"======================================================================
10|
11| Copyright 2003 Free Software Foundation, Inc.
12| Written by Paolo Bonzini.
13|
14| This file is part of GNU Smalltalk.
15|
16| The GNU Smalltalk class library is free software; you can redistribute it
17| and/or modify it under the terms of the GNU General Public License
18| as published by the Free Software Foundation; either version 2, or (at
19| your option) any later version.
20|
21| The GNU Smalltalk class library is distributed in the hope that it will be
22| useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
23| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
24| Public License for more details.
25|
26| You should have received a copy of the GNU Lesser General Public License
27| along with the GNU Smalltalk class library; see the file COPYING.  If not,
28| write to the Free Software Foundation, 51 Franklin Street, Fifth Floor,
29| Boston, MA 02110-1301, USA.
30|
31 ======================================================================"
32
33
34!JavaVM methodsFor: 'java.lang.reflect.Array'!
35
36java_lang_reflect_Array_newInstance_java_lang_Class: arg1 int: arg2
37    | arrayClass |
38    <javaNativeMethod: #'newInstance(Ljava/lang/Class;I)Ljava/lang/Object;'
39        for: #{Java.java.lang.reflect.Array} static: true>
40    arg1 == VoidClass ifTrue: [
41	^JavaVM throw: Java.java.lang.IllegalArgumentException ].
42    arg2 < 0 ifTrue: [
43	^JavaVM throw: Java.java.lang.NegativeArraySizeException ].
44
45    arrayClass := arg1 javaType arrayClass.
46    ^arrayClass new: arg2!
47
48java_lang_reflect_Array_newInstance_java_lang_Class: arg1 intArray: arg2
49    <javaNativeMethod: #'newInstance(Ljava/lang/Class;[I)Ljava/lang/Object;'
50        for: #{Java.java.lang.reflect.Array} static: true>
51    (arg1 javaType isArrayType and: [
52	(arg1 javaType arrayDimensionality >= arg2 size) ]) ifFalse: [
53	    ^JavaVM throw: Java.java.lang.IllegalArgumentException ].
54
55    ^arg1 javaType javaMultiNewArray: arg2 from: 1
56!
57
58java_lang_reflect_Array_getLength_java_lang_Object: arg1
59    <javaNativeMethod: #'getLength(Ljava/lang/Object;)I'
60        for: #{Java.java.lang.reflect.Array} static: true>
61    ^(arg1 isKindOf: JavaObject)
62	ifTrue: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
63	ifFalse: [ arg1 size ]
64!
65
66java_lang_reflect_Array_get_java_lang_Object: arg1 int: arg2
67    | desiredClass |
68    <javaNativeMethod: #'get(Ljava/lang/Object;I)Ljava/lang/Object;'
69        for: #{Java.java.lang.reflect.Array} static: true>
70    arg1 class == Array
71	ifTrue: [ ^arg1 javaAt: arg2 ].
72
73    arg1 class == JavaBooleanArray ifTrue: [
74	^(arg1 javaAt: arg2) = 0
75	    ifTrue: [ Java.java.lang.Boolean FALSE ]
76	    ifFalse: [ Java.java.lang.Boolean TRUE ]].
77
78    desiredClass :=
79        arg1 class == JavaIntArray ifTrue: [ Java.java.lang.Integer ] ifFalse: [
80        arg1 class == JavaShortArray ifTrue: [ Java.java.lang.Short ] ifFalse: [
81        arg1 class == JavaByteArray ifTrue: [ Java.java.lang.Byte ] ifFalse: [
82        arg1 class == JavaLongArray ifTrue: [ Java.java.lang.Long ] ifFalse: [
83        arg1 class == JavaFloatArray ifTrue: [ Java.java.lang.Float ] ifFalse: [
84        arg1 class == JavaDoubleArray ifTrue: [ Java.java.lang.Double ] ifFalse: [
85        Java.java.lang.Char ]]]]]].
86
87    ^desiredClass new
88	perform: #'<init>()V';
89	value: (arg1 javaAt: arg2)
90!
91
92java_lang_reflect_Array_getChar_java_lang_Object: arg1 int: arg2
93    <javaNativeMethod: #'getChar(Ljava/lang/Object;I)C'
94        for: #{Java.java.lang.reflect.Array} static: true>
95    ^arg1 class == JavaCharArray
96	ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
97	ifTrue: [ arg1 javaAt: arg2 ]
98!
99
100java_lang_reflect_Array_getByte_java_lang_Object: arg1 int: arg2
101    <javaNativeMethod: #'getByte(Ljava/lang/Object;I)B'
102        for: #{Java.java.lang.reflect.Array} static: true>
103    ^arg1 class == JavaByteArray
104	ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
105	ifTrue: [ arg1 javaAt: arg2 ]
106!
107
108java_lang_reflect_Array_getShort_java_lang_Object: arg1 int: arg2
109    <javaNativeMethod: #'getShort(Ljava/lang/Object;I)S'
110        for: #{Java.java.lang.reflect.Array} static: true>
111    ^(arg1 class == JavaByteArray
112	or: [ arg1 class == JavaShortArray ])
113	    ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
114	    ifTrue: [ arg1 javaAt: arg2 ]
115!
116
117java_lang_reflect_Array_getInt_java_lang_Object: arg1 int: arg2
118    <javaNativeMethod: #'getInt(Ljava/lang/Object;I)I'
119        for: #{Java.java.lang.reflect.Array} static: true>
120    ^(arg1 class == JavaByteArray
121	or: [ arg1 class == JavaCharArray
122	or: [ arg1 class == JavaIntArray
123	or: [ arg1 class == JavaShortArray ]]])
124	    ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
125	    ifTrue: [ arg1 javaAt: arg2 ]
126!
127
128java_lang_reflect_Array_getLong_java_lang_Object: arg1 int: arg2
129    <javaNativeMethod: #'getLong(Ljava/lang/Object;I)J'
130        for: #{Java.java.lang.reflect.Array} static: true>
131    ^(arg1 class == Array
132	or: [ arg1 class == ByteArray
133	or: [ arg1 class == JavaDoubleArray
134	or: [ arg1 class == JavaFloatArray ]]])
135	    ifTrue: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
136	    ifFalse: [ arg1 javaAt: arg2 ]
137!
138
139java_lang_reflect_Array_getFloat_java_lang_Object: arg1 int: arg2
140    <javaNativeMethod: #'getFloat(Ljava/lang/Object;I)F'
141        for: #{Java.java.lang.reflect.Array} static: true>
142    ^(arg1 class == Array
143	or: [ arg1 class == ByteArray
144	or: [ arg1 class == JavaDoubleArray ]])
145	ifTrue: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
146	ifFalse: [ (arg1 javaAt: arg2) asFloatE ]
147!
148
149java_lang_reflect_Array_getDouble_java_lang_Object: arg1 int: arg2
150    <javaNativeMethod: #'getDouble(Ljava/lang/Object;I)D'
151        for: #{Java.java.lang.reflect.Array} static: true>
152    ^(arg1 class == Array or: [ arg1 class == ByteArray ])
153	ifTrue: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
154	ifFalse: [ (arg1 javaAt: arg2) asFloatD ]
155!
156
157java_lang_reflect_Array_getBoolean_java_lang_Object: arg1 int: arg2
158    <javaNativeMethod: #'getBoolean(Ljava/lang/Object;I)Z'
159        for: #{Java.java.lang.reflect.Array} static: true>
160    ^arg1 class == ByteArray
161	ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
162	ifTrue: [ arg1 javaAt: arg2 ]
163!
164
165java_lang_reflect_Array_getElementType_java_lang_Object: arg1 int: arg2
166    <javaNativeMethod: #'getElementType(Ljava/lang/Object;I)Ljava/lang/Class;'
167        for: #{Java.java.lang.reflect.Array} static: true>
168    self notYetImplemented
169!
170
171java_lang_reflect_Array_set_java_lang_Object: arg1 int: arg2 java_lang_Object: arg3 java_lang_Class: arg4
172    <javaNativeMethod: #'set(Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Class;)V'
173        for: #{Java.java.lang.reflect.Array} static: true>
174
175    (arg3 isKindOf: arg4 asSmalltalkClass)
176	ifFalse: [ ^JavaVM throw: Java.java.lang.IllegalArgumentException ]
177
178    arg1 javaAt: arg2 put: arg3
179!
180
181java_lang_reflect_Array_setByte_java_lang_Object: arg1 int: arg2 byte: arg3
182    <javaNativeMethod: #'setByte(Ljava/lang/Object;IB)V'
183        for: #{Java.java.lang.reflect.Array} static: true>
184    ^(arg1 class == Array
185	or: [ arg1 class == ByteArray
186	or: [ arg1 class == JavaCharArray ]])
187	ifTrue: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
188	ifFalse: [ arg1 javaAt: arg2 put: arg3 ]
189!
190
191java_lang_reflect_Array_setShort_java_lang_Object: arg1 int: arg2 short: arg3
192    <javaNativeMethod: #'setShort(Ljava/lang/Object;IS)V'
193        for: #{Java.java.lang.reflect.Array} static: true>
194    ^(arg1 class == Array
195	or: [ arg1 class == JavaByteArray
196	or: [ arg1 class == ByteArray
197	or: [ arg1 class == JavaCharArray ]]])
198	ifTrue: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
199	ifFalse: [ arg1 javaAt: arg2 put: arg3 ]
200!
201
202java_lang_reflect_Array_setInt_java_lang_Object: arg1 int: arg2 int: arg3
203    <javaNativeMethod: #'setInt(Ljava/lang/Object;II)V'
204        for: #{Java.java.lang.reflect.Array} static: true>
205    ^(arg1 class == JavaDoubleArray
206	or: [ arg1 class == JavaFloatArray
207	or: [ arg1 class == JavaIntArray
208	or: [ arg1 class == JavaLong Array ]]])
209	ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
210	ifTrue: [ arg1 javaAt: arg2 put: arg3 ]
211!
212
213java_lang_reflect_Array_setLong_java_lang_Object: arg1 int: arg2 long: arg3
214    <javaNativeMethod: #'setLong(Ljava/lang/Object;IJ)V'
215        for: #{Java.java.lang.reflect.Array} static: true>
216    ^(arg1 class == JavaDoubleArray
217	or: [ arg1 class == JavaFloatArray
218	or: [ arg1 class == JavaLong Array ]])
219	ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
220	ifTrue: [ arg1 javaAt: arg2 put: arg3 ]
221!
222
223java_lang_reflect_Array_setFloat_java_lang_Object: arg1 int: arg2 float: arg3
224    <javaNativeMethod: #'setFloat(Ljava/lang/Object;IF)V'
225        for: #{Java.java.lang.reflect.Array} static: true>
226    ^(arg1 class == JavaDoubleArray or: [ arg1 class == JavaFloatArray ])
227	ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
228	ifTrue: [ arg1 javaAt: arg2 put: arg3 ]
229!
230
231java_lang_reflect_Array_setDouble_java_lang_Object: arg1 int: arg2 double: arg3
232    <javaNativeMethod: #'setDouble(Ljava/lang/Object;ID)V'
233        for: #{Java.java.lang.reflect.Array} static: true>
234    ^arg1 class == JavaDoubleArray
235	ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
236	ifTrue: [ arg1 javaAt: arg2 put: arg3 ]
237!
238
239java_lang_reflect_Array_setChar_java_lang_Object: arg1 int: arg2 char: arg3
240    <javaNativeMethod: #'setChar(Ljava/lang/Object;IC)V'
241        for: #{Java.java.lang.reflect.Array} static: true>
242    ^(arg1 class == Array
243	or: [ arg1 class == ByteArray
244	or: [ arg1 class == JavaShortArray
245	or: [ arg1 class == JavaCharArray ]]])
246	ifTrue: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
247	ifFalse: [ arg1 javaAt: arg2 put: arg3 ]
248!
249
250java_lang_reflect_Array_setBoolean_java_lang_Object: arg1 int: arg2 boolean: arg3
251    <javaNativeMethod: #'setBoolean(Ljava/lang/Object;IZ)V'
252        for: #{Java.java.lang.reflect.Array} static: true>
253    ^arg1 class == ByteArray
254	ifFalse: [ JavaVM throw: Java.java.lang.IllegalArgumentException ]
255	ifTrue: [ arg1 javaAt: arg2 put: arg3 ]
256! !
257
258