290 lines
8.1 KiB
C++
290 lines
8.1 KiB
C++
|
/* //device/libs/android_runtime/BindTest.cpp
|
||
|
**
|
||
|
** Copyright 2006, The Android Open Source Project
|
||
|
**
|
||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
** you may not use this file except in compliance with the License.
|
||
|
** You may obtain a copy of the License at
|
||
|
**
|
||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||
|
**
|
||
|
** Unless required by applicable law or agreed to in writing, software
|
||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
** See the License for the specific language governing permissions and
|
||
|
** limitations under the License.
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <jam-public.h>
|
||
|
|
||
|
static u4 offset_instanceString;
|
||
|
static FieldBlock *fb_classString = NULL;
|
||
|
static Class *class_ReturnedObject = NULL;
|
||
|
static MethodBlock *mb_ReturnedObject_setReturnedString = NULL;
|
||
|
static MethodBlock *mb_Java_Lang_Object_Equals = NULL;
|
||
|
|
||
|
static u4 offset_mObj;
|
||
|
static u4 offset_mBool;
|
||
|
static u4 offset_mInt;
|
||
|
static u4 offset_mString;
|
||
|
static u4 offset_mDouble;
|
||
|
static u4 offset_mLong;
|
||
|
|
||
|
|
||
|
/* native String getString(); */
|
||
|
static uintptr_t *
|
||
|
getString(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
RETURN_OBJ (createString ("String"));
|
||
|
}
|
||
|
|
||
|
/* native String getNullString(); */
|
||
|
static uintptr_t *
|
||
|
getNullString(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
RETURN_OBJ (createString (NULL));
|
||
|
}
|
||
|
|
||
|
/* native String getBooleanTrue(); */
|
||
|
static uintptr_t *
|
||
|
getBooleanTrue(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
RETURN_BOOLEAN (TRUE);
|
||
|
}
|
||
|
|
||
|
/* native String getBooleanFalse(); */
|
||
|
static uintptr_t *
|
||
|
getBooleanFalse(Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
RETURN_BOOLEAN (FALSE);
|
||
|
}
|
||
|
|
||
|
/* native Object nonvoidThrowsException() */
|
||
|
static uintptr_t *
|
||
|
nonvoidThrowsException (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
if (1) {
|
||
|
signalException("java/lang/NullPointerException", NULL);
|
||
|
goto exception;
|
||
|
}
|
||
|
|
||
|
RETURN_OBJ (NULL);
|
||
|
exception:
|
||
|
RETURN_VOID;
|
||
|
}
|
||
|
|
||
|
/* native void setInstanceString(String s); */
|
||
|
static uintptr_t *
|
||
|
setInstanceString (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
Object *jthis = (Object *) ostack[0];
|
||
|
|
||
|
JOBJ_set_obj(jthis, offset_instanceString, ostack[1]);
|
||
|
|
||
|
RETURN_VOID;
|
||
|
}
|
||
|
|
||
|
/* native void setClassString(String s) */
|
||
|
static uintptr_t *
|
||
|
setClassString (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
// Object *jthis = (Object *) ostack[0];
|
||
|
|
||
|
fb_classString->static_value = ostack[1];
|
||
|
|
||
|
RETURN_VOID;
|
||
|
}
|
||
|
|
||
|
/* native String makeStringFromThreeChars(char a, char b, char c); */
|
||
|
static uintptr_t *
|
||
|
makeStringFromThreeChars (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
// Object *jthis = ostack[0];
|
||
|
char a = (char) ostack[1];
|
||
|
char b = (char) ostack[2];
|
||
|
char c = (char) ostack[3];
|
||
|
|
||
|
char str[4];
|
||
|
|
||
|
str[0] = a;
|
||
|
str[1] = b;
|
||
|
str[2] = c;
|
||
|
str[3] = 0;
|
||
|
|
||
|
RETURN_OBJ(createString(str));
|
||
|
}
|
||
|
|
||
|
/* native ReturnedObject makeReturnedObject(String a); */
|
||
|
static uintptr_t *
|
||
|
makeReturnedObject (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
//Object *jthis = (Object*)ostack[0];
|
||
|
Object *a = (Object*)ostack[1];
|
||
|
|
||
|
Object *ret;
|
||
|
|
||
|
ret = allocObject(class_ReturnedObject);
|
||
|
|
||
|
executeMethod(ret, mb_ReturnedObject_setReturnedString, a);
|
||
|
|
||
|
RETURN_OBJ (ret);
|
||
|
}
|
||
|
|
||
|
/* native double addDoubles(double a, double b); */
|
||
|
static uintptr_t *
|
||
|
addDoubles (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
//Object *jthis = (Object*)ostack[0];
|
||
|
double a = JARG_get_double(1);
|
||
|
double b = JARG_get_double(3);
|
||
|
|
||
|
RETURN_DOUBLE(a+b);
|
||
|
}
|
||
|
|
||
|
/* native void setAll (Object obj, boolean bool, int i, String str, double d, long l) */
|
||
|
static uintptr_t *
|
||
|
setAll (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
Object *jthis = JARG_get_obj(0);
|
||
|
|
||
|
Object *obj = JARG_get_obj(1);
|
||
|
bool b = JARG_get_bool(2);
|
||
|
int i = JARG_get_int(3);
|
||
|
char *str = JARG_get_cstr_strdup(4);
|
||
|
double d = JARG_get_double(5);
|
||
|
long long ll = JARG_get_long_long(5+2);
|
||
|
|
||
|
JOBJ_set_obj(jthis, offset_mObj, obj);
|
||
|
JOBJ_set_bool(jthis, offset_mBool, b);
|
||
|
JOBJ_set_int(jthis, offset_mInt, i);
|
||
|
JOBJ_set_cstr(jthis, offset_mString, str);
|
||
|
free(str);
|
||
|
str = NULL;
|
||
|
JOBJ_set_double(jthis, offset_mDouble, d);
|
||
|
JOBJ_set_long_long(jthis, offset_mLong, ll);
|
||
|
|
||
|
RETURN_VOID;
|
||
|
}
|
||
|
|
||
|
/* native void compareAll (Object obj, boolean bool, int i, String str, double d, long l) */
|
||
|
static uintptr_t *
|
||
|
compareAll (Class *clazz, MethodBlock *mb, uintptr_t *ostack)
|
||
|
{
|
||
|
Object *jthis = JARG_get_obj(0);
|
||
|
|
||
|
Object *obj = JARG_get_obj(1);
|
||
|
bool b = JARG_get_bool(2);
|
||
|
int i = JARG_get_int(3);
|
||
|
Object *strObj = JARG_get_obj(4);
|
||
|
double d = JARG_get_double(5);
|
||
|
long long ll = JARG_get_long_long(5+2);
|
||
|
|
||
|
bool ret;
|
||
|
|
||
|
void *result;
|
||
|
|
||
|
Object *mStringObj = JOBJ_get_obj(jthis, offset_mString);
|
||
|
|
||
|
char *s = JARG_get_cstr_strdup(4);
|
||
|
|
||
|
result = executeMethod (strObj, lookupVirtualMethod(strObj,mb_Java_Lang_Object_Equals),
|
||
|
JOBJ_get_obj(jthis, offset_mString));
|
||
|
|
||
|
if (exceptionOccurred()) {
|
||
|
RETURN_VOID;
|
||
|
}
|
||
|
|
||
|
ret = (*(uintptr_t *)result != 0)
|
||
|
&& (obj == JOBJ_get_obj(jthis, offset_mObj))
|
||
|
&& (b == JOBJ_get_bool(jthis, offset_mBool))
|
||
|
&& (i == JOBJ_get_int(jthis, offset_mInt))
|
||
|
&& (d == JOBJ_get_double(jthis, offset_mDouble))
|
||
|
&& (ll == JOBJ_get_long_long(jthis, offset_mLong));
|
||
|
|
||
|
|
||
|
RETURN_BOOLEAN(ret);
|
||
|
}
|
||
|
|
||
|
static VMMethod methods[] = {
|
||
|
{"getString", getString},
|
||
|
{"getNullString", getNullString},
|
||
|
{"getBooleanTrue", getBooleanTrue},
|
||
|
{"getBooleanFalse", getBooleanFalse},
|
||
|
{"nonvoidThrowsException", nonvoidThrowsException},
|
||
|
{"setInstanceString", setInstanceString},
|
||
|
{"setClassString", setClassString},
|
||
|
{"makeStringFromThreeChars", makeStringFromThreeChars},
|
||
|
{"makeReturnedObject", makeReturnedObject},
|
||
|
{"addDoubles", addDoubles},
|
||
|
{"setAll", setAll},
|
||
|
{"compareAll", compareAll},
|
||
|
{NULL, NULL}
|
||
|
};
|
||
|
|
||
|
|
||
|
void register_BindTest()
|
||
|
{
|
||
|
jamvm_registerClass("BindTest", methods);
|
||
|
|
||
|
Class *clazz = NULL;
|
||
|
|
||
|
clazz = findClassFromClassLoader("BindTest", getSystemClassLoader());
|
||
|
|
||
|
if (clazz == NULL) {
|
||
|
fprintf(stderr, "Error: BindTest not found\n");
|
||
|
clearException();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
FieldBlock *fb;
|
||
|
|
||
|
fb = findField(clazz, "instanceString", "Ljava/lang/String;");
|
||
|
|
||
|
if (fb == NULL || ((fb->access_flags & ACC_STATIC) == ACC_STATIC)) {
|
||
|
fprintf(stderr, "Error: BindTest.instanceString not found or error\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
offset_instanceString = fb->offset;
|
||
|
|
||
|
fb_classString = findField(clazz, "classString", "Ljava/lang/String;");
|
||
|
|
||
|
if (fb_classString == NULL || ((fb_classString->access_flags & ACC_STATIC) != ACC_STATIC)) {
|
||
|
fprintf(stderr, "Error: BindTest.classString not found or error\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
class_ReturnedObject = findClassFromClassLoader("ReturnedObject", getSystemClassLoader());
|
||
|
|
||
|
if (class_ReturnedObject == NULL) {
|
||
|
fprintf(stderr, "Error: ReturnedObject class not found or error\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
mb_ReturnedObject_setReturnedString=
|
||
|
findMethod (class_ReturnedObject, "setReturnedString", "(Ljava/lang/String;)V");
|
||
|
|
||
|
if (mb_ReturnedObject_setReturnedString == NULL) {
|
||
|
fprintf(stderr, "Error: ReturnedObject.setReturnedString class not found or error\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
offset_mObj = findField(clazz, "mObj", "Ljava/lang/Object;")->offset;
|
||
|
offset_mBool = findField(clazz, "mBool", "Z" )->offset;
|
||
|
offset_mInt = findField(clazz, "mInt", "I")->offset;
|
||
|
offset_mString = findField(clazz, "mString", "Ljava/lang/String;")->offset;
|
||
|
offset_mDouble = findField(clazz, "mDouble", "D")->offset;
|
||
|
offset_mLong = findField(clazz, "mLong", "J")->offset;
|
||
|
|
||
|
|
||
|
mb_Java_Lang_Object_Equals = findMethod (
|
||
|
findClassFromClassLoader("java/lang/Object", getSystemClassLoader()),
|
||
|
"equals", "(Ljava/lang/Object;)Z");
|
||
|
|
||
|
}
|
||
|
|
||
|
|