1 /* //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 
22 static u4 offset_instanceString;
23 static FieldBlock *fb_classString = NULL;
24 static Class *class_ReturnedObject = NULL;
25 static MethodBlock *mb_ReturnedObject_setReturnedString = NULL;
26 static MethodBlock *mb_Java_Lang_Object_Equals = NULL;
27 
28 static u4 offset_mObj;
29 static u4 offset_mBool;
30 static u4 offset_mInt;
31 static u4 offset_mString;
32 static u4 offset_mDouble;
33 static u4 offset_mLong;
34 
35 
36 /* native String getString(); */
37 static uintptr_t *
getString(Class * clazz,MethodBlock * mb,uintptr_t * ostack)38 getString(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
39 {
40     RETURN_OBJ (createString ("String"));
41 }
42 
43 /* native String getNullString(); */
44 static uintptr_t *
getNullString(Class * clazz,MethodBlock * mb,uintptr_t * ostack)45 getNullString(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
46 {
47     RETURN_OBJ (createString (NULL));
48 }
49 
50 /* native String getBooleanTrue(); */
51 static uintptr_t *
getBooleanTrue(Class * clazz,MethodBlock * mb,uintptr_t * ostack)52 getBooleanTrue(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
53 {
54     RETURN_BOOLEAN (TRUE);
55 }
56 
57 /* native String getBooleanFalse(); */
58 static uintptr_t *
getBooleanFalse(Class * clazz,MethodBlock * mb,uintptr_t * ostack)59 getBooleanFalse(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
60 {
61     RETURN_BOOLEAN (FALSE);
62 }
63 
64 /* native Object nonvoidThrowsException() */
65 static uintptr_t *
nonvoidThrowsException(Class * clazz,MethodBlock * mb,uintptr_t * ostack)66 nonvoidThrowsException (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);
74 exception:
75     RETURN_VOID;
76 }
77 
78 /* native void setInstanceString(String s); */
79 static uintptr_t *
setInstanceString(Class * clazz,MethodBlock * mb,uintptr_t * ostack)80 setInstanceString (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) */
90 static uintptr_t *
setClassString(Class * clazz,MethodBlock * mb,uintptr_t * ostack)91 setClassString (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); */
101 static uintptr_t *
makeStringFromThreeChars(Class * clazz,MethodBlock * mb,uintptr_t * ostack)102 makeStringFromThreeChars (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); */
120 static uintptr_t *
makeReturnedObject(Class * clazz,MethodBlock * mb,uintptr_t * ostack)121 makeReturnedObject (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); */
136 static uintptr_t *
addDoubles(Class * clazz,MethodBlock * mb,uintptr_t * ostack)137 addDoubles (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) */
147 static uintptr_t *
setAll(Class * clazz,MethodBlock * mb,uintptr_t * ostack)148 setAll  (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) */
172 static uintptr_t *
compareAll(Class * clazz,MethodBlock * mb,uintptr_t * ostack)173 compareAll  (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 
210 static 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 
register_BindTest()227 void 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 
290