blob: 5fae4005bb448c8c63c21fa23c7fd40e903a8dbb [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/* //device/libs/android_runtime/BindTest.cpp
2**
3** Copyright 2006, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#include <stdio.h>
19#include <stdlib.h>
20#include <jam-public.h>
21
22static u4 offset_instanceString;
23static FieldBlock *fb_classString = NULL;
24static Class *class_ReturnedObject = NULL;
25static MethodBlock *mb_ReturnedObject_setReturnedString = NULL;
26static MethodBlock *mb_Java_Lang_Object_Equals = NULL;
27
28static u4 offset_mObj;
29static u4 offset_mBool;
30static u4 offset_mInt;
31static u4 offset_mString;
32static u4 offset_mDouble;
33static u4 offset_mLong;
34
35
36/* native String getString(); */
37static uintptr_t *
38getString(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
39{
40 RETURN_OBJ (createString ("String"));
41}
42
43/* native String getNullString(); */
44static uintptr_t *
45getNullString(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
46{
47 RETURN_OBJ (createString (NULL));
48}
49
50/* native String getBooleanTrue(); */
51static uintptr_t *
52getBooleanTrue(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
53{
54 RETURN_BOOLEAN (TRUE);
55}
56
57/* native String getBooleanFalse(); */
58static uintptr_t *
59getBooleanFalse(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
60{
61 RETURN_BOOLEAN (FALSE);
62}
63
64/* native Object nonvoidThrowsException() */
65static uintptr_t *
66nonvoidThrowsException (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
67{
68 if (1) {
69 signalException("java/lang/NullPointerException", NULL);
70 goto exception;
71 }
72
73 RETURN_OBJ (NULL);
74exception:
75 RETURN_VOID;
76}
77
78/* native void setInstanceString(String s); */
79static uintptr_t *
80setInstanceString (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
81{
82 Object *jthis = (Object *) ostack[0];
83
84 JOBJ_set_obj(jthis, offset_instanceString, ostack[1]);
85
86 RETURN_VOID;
87}
88
89/* native void setClassString(String s) */
90static uintptr_t *
91setClassString (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
92{
93// Object *jthis = (Object *) ostack[0];
94
95 fb_classString->static_value = ostack[1];
96
97 RETURN_VOID;
98}
99
100/* native String makeStringFromThreeChars(char a, char b, char c); */
101static uintptr_t *
102makeStringFromThreeChars (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
103{
104 // Object *jthis = ostack[0];
105 char a = (char) ostack[1];
106 char b = (char) ostack[2];
107 char c = (char) ostack[3];
108
109 char str[4];
110
111 str[0] = a;
112 str[1] = b;
113 str[2] = c;
114 str[3] = 0;
115
116 RETURN_OBJ(createString(str));
117}
118
119/* native ReturnedObject makeReturnedObject(String a); */
120static uintptr_t *
121makeReturnedObject (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
122{
123 //Object *jthis = (Object*)ostack[0];
124 Object *a = (Object*)ostack[1];
125
126 Object *ret;
127
128 ret = allocObject(class_ReturnedObject);
129
130 executeMethod(ret, mb_ReturnedObject_setReturnedString, a);
131
132 RETURN_OBJ (ret);
133}
134
135/* native double addDoubles(double a, double b); */
136static uintptr_t *
137addDoubles (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
138{
139 //Object *jthis = (Object*)ostack[0];
140 double a = JARG_get_double(1);
141 double b = JARG_get_double(3);
142
143 RETURN_DOUBLE(a+b);
144}
145
146/* native void setAll (Object obj, boolean bool, int i, String str, double d, long l) */
147static uintptr_t *
148setAll (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
149{
150 Object *jthis = JARG_get_obj(0);
151
152 Object *obj = JARG_get_obj(1);
153 bool b = JARG_get_bool(2);
154 int i = JARG_get_int(3);
155 char *str = JARG_get_cstr_strdup(4);
156 double d = JARG_get_double(5);
157 long long ll = JARG_get_long_long(5+2);
158
159 JOBJ_set_obj(jthis, offset_mObj, obj);
160 JOBJ_set_bool(jthis, offset_mBool, b);
161 JOBJ_set_int(jthis, offset_mInt, i);
162 JOBJ_set_cstr(jthis, offset_mString, str);
163 free(str);
164 str = NULL;
165 JOBJ_set_double(jthis, offset_mDouble, d);
166 JOBJ_set_long_long(jthis, offset_mLong, ll);
167
168 RETURN_VOID;
169}
170
171/* native void compareAll (Object obj, boolean bool, int i, String str, double d, long l) */
172static uintptr_t *
173compareAll (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
174{
175 Object *jthis = JARG_get_obj(0);
176
177 Object *obj = JARG_get_obj(1);
178 bool b = JARG_get_bool(2);
179 int i = JARG_get_int(3);
180 Object *strObj = JARG_get_obj(4);
181 double d = JARG_get_double(5);
182 long long ll = JARG_get_long_long(5+2);
183
184 bool ret;
185
186 void *result;
187
188 Object *mStringObj = JOBJ_get_obj(jthis, offset_mString);
189
190 char *s = JARG_get_cstr_strdup(4);
191
192 result = executeMethod (strObj, lookupVirtualMethod(strObj,mb_Java_Lang_Object_Equals),
193 JOBJ_get_obj(jthis, offset_mString));
194
195 if (exceptionOccurred()) {
196 RETURN_VOID;
197 }
198
199 ret = (*(uintptr_t *)result != 0)
200 && (obj == JOBJ_get_obj(jthis, offset_mObj))
201 && (b == JOBJ_get_bool(jthis, offset_mBool))
202 && (i == JOBJ_get_int(jthis, offset_mInt))
203 && (d == JOBJ_get_double(jthis, offset_mDouble))
204 && (ll == JOBJ_get_long_long(jthis, offset_mLong));
205
206
207 RETURN_BOOLEAN(ret);
208}
209
210static VMMethod methods[] = {
211 {"getString", getString},
212 {"getNullString", getNullString},
213 {"getBooleanTrue", getBooleanTrue},
214 {"getBooleanFalse", getBooleanFalse},
215 {"nonvoidThrowsException", nonvoidThrowsException},
216 {"setInstanceString", setInstanceString},
217 {"setClassString", setClassString},
218 {"makeStringFromThreeChars", makeStringFromThreeChars},
219 {"makeReturnedObject", makeReturnedObject},
220 {"addDoubles", addDoubles},
221 {"setAll", setAll},
222 {"compareAll", compareAll},
223 {NULL, NULL}
224};
225
226
227void register_BindTest()
228{
229 jamvm_registerClass("BindTest", methods);
230
231 Class *clazz = NULL;
232
233 clazz = findClassFromClassLoader("BindTest", getSystemClassLoader());
234
235 if (clazz == NULL) {
236 fprintf(stderr, "Error: BindTest not found\n");
237 clearException();
238 return;
239 }
240
241 FieldBlock *fb;
242
243 fb = findField(clazz, "instanceString", "Ljava/lang/String;");
244
245 if (fb == NULL || ((fb->access_flags & ACC_STATIC) == ACC_STATIC)) {
246 fprintf(stderr, "Error: BindTest.instanceString not found or error\n");
247 return;
248 }
249
250 offset_instanceString = fb->offset;
251
252 fb_classString = findField(clazz, "classString", "Ljava/lang/String;");
253
254 if (fb_classString == NULL || ((fb_classString->access_flags & ACC_STATIC) != ACC_STATIC)) {
255 fprintf(stderr, "Error: BindTest.classString not found or error\n");
256 return;
257 }
258
259
260 class_ReturnedObject = findClassFromClassLoader("ReturnedObject", getSystemClassLoader());
261
262 if (class_ReturnedObject == NULL) {
263 fprintf(stderr, "Error: ReturnedObject class not found or error\n");
264 return;
265 }
266
267 mb_ReturnedObject_setReturnedString=
268 findMethod (class_ReturnedObject, "setReturnedString", "(Ljava/lang/String;)V");
269
270 if (mb_ReturnedObject_setReturnedString == NULL) {
271 fprintf(stderr, "Error: ReturnedObject.setReturnedString class not found or error\n");
272 return;
273 }
274
275 offset_mObj = findField(clazz, "mObj", "Ljava/lang/Object;")->offset;
276 offset_mBool = findField(clazz, "mBool", "Z" )->offset;
277 offset_mInt = findField(clazz, "mInt", "I")->offset;
278 offset_mString = findField(clazz, "mString", "Ljava/lang/String;")->offset;
279 offset_mDouble = findField(clazz, "mDouble", "D")->offset;
280 offset_mLong = findField(clazz, "mLong", "J")->offset;
281
282
283 mb_Java_Lang_Object_Equals = findMethod (
284 findClassFromClassLoader("java/lang/Object", getSystemClassLoader()),
285 "equals", "(Ljava/lang/Object;)Z");
286
287}
288
289