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
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
290