X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fbuiltin.c;h=9106a72553ed99c73257276477b3ddfb63d3d812;hb=95476ea581bfcd559a7384003da8e7616f1593c1;hp=0b9c1e73f265a87b56914b96eca6ed9113455859;hpb=23e55497855b49d2ddd5f15fbb7688ec4cf821ef;p=cacao.git diff --git a/src/vm/builtin.c b/src/vm/builtin.c index 0b9c1e73f..9106a7255 100644 --- a/src/vm/builtin.c +++ b/src/vm/builtin.c @@ -416,7 +416,7 @@ bool builtintable_replace_function(void *iptr_) *******************************************************************************/ -s4 builtin_instanceof(java_handle_t *o, classinfo *class) +bool builtin_instanceof(java_handle_t *o, classinfo *class) { classinfo *c; @@ -439,7 +439,7 @@ s4 builtin_instanceof(java_handle_t *o, classinfo *class) *******************************************************************************/ -s4 builtin_checkcast(java_handle_t *o, classinfo *class) +bool builtin_checkcast(java_handle_t *o, classinfo *class) { classinfo *c; @@ -465,8 +465,7 @@ s4 builtin_checkcast(java_handle_t *o, classinfo *class) *******************************************************************************/ -static s4 builtin_descriptorscompatible(arraydescriptor *desc, - arraydescriptor *target) +static bool builtin_descriptorscompatible(arraydescriptor *desc, arraydescriptor *target) { if (desc == target) return 1; @@ -480,6 +479,8 @@ static s4 builtin_descriptorscompatible(arraydescriptor *desc, /* {both arrays are arrays of references} */ if (desc->dimension == target->dimension) { + if (!desc->elementvftbl) + return 0; /* an array which contains elements of interface types is allowed to be casted to Object (JOWENN)*/ @@ -516,7 +517,7 @@ static s4 builtin_descriptorscompatible(arraydescriptor *desc, *******************************************************************************/ -s4 builtin_fast_arraycheckcast(java_object_t *o, classinfo *targetclass) +bool builtin_fast_arraycheckcast(java_object_t *o, classinfo *targetclass) { arraydescriptor *desc; @@ -538,7 +539,7 @@ s4 builtin_fast_arraycheckcast(java_object_t *o, classinfo *targetclass) *******************************************************************************/ -s4 builtin_fast_arrayinstanceof(java_object_t *o, classinfo *targetclass) +bool builtin_fast_arrayinstanceof(java_object_t *o, classinfo *targetclass) { if (o == NULL) return 0; @@ -553,9 +554,9 @@ s4 builtin_fast_arrayinstanceof(java_object_t *o, classinfo *targetclass) *******************************************************************************/ -s4 builtin_arrayinstanceof(java_handle_t *h, classinfo *targetclass) +bool builtin_arrayinstanceof(java_handle_t *h, classinfo *targetclass) { - s4 result; + bool result; LLNI_CRITICAL_START; @@ -635,9 +636,9 @@ java_object_t *builtin_retrieve_exception(void) *******************************************************************************/ -s4 builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o) +bool builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o) { - int result; + bool result; LLNI_CRITICAL_START; @@ -666,7 +667,16 @@ s4 builtin_canstore(java_handle_objectarray_t *oa, java_handle_t *o) *******************************************************************************/ -s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o) +bool fast_subtype_check(struct _vftbl *s, struct _vftbl *t) +{ + if (s->subtype_display[t->subtype_depth] == t) + return true; + if (t->subtype_offset != OFFSET(vftbl_t, subtype_display[DISPLAY_SIZE])) + return false; + return s->subtype_depth >= t->subtype_depth && s->subtype_overflow[t->subtype_depth - DISPLAY_SIZE] == t; +} + +bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o) { arraydescriptor *desc; arraydescriptor *valuedesc; @@ -674,7 +684,7 @@ s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o) vftbl_t *valuevftbl; int32_t baseval; uint32_t diffval; - int result; + bool result; if (o == NULL) return 1; @@ -698,8 +708,6 @@ s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o) if (valuevftbl == componentvftbl) return 1; - LOCK_MONITOR_ENTER(linker_classrenumber_lock); - baseval = componentvftbl->baseval; if (baseval <= 0) { @@ -709,11 +717,8 @@ s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o) (valuevftbl->interfacetable[baseval] != NULL)); } else { - diffval = valuevftbl->baseval - componentvftbl->baseval; - result = diffval <= (uint32_t) componentvftbl->diffval; + result = fast_subtype_check(valuevftbl, componentvftbl); } - - LOCK_MONITOR_EXIT(linker_classrenumber_lock); } else if (valuedesc == NULL) { /* {oa has dimension > 1} */ @@ -736,14 +741,14 @@ s4 builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o) /* This is an optimized version where a is guaranteed to be one-dimensional */ -s4 builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o) +bool builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o) { arraydescriptor *desc; vftbl_t *elementvftbl; vftbl_t *valuevftbl; int32_t baseval; uint32_t diffval; - int result; + bool result; if (o == NULL) return 1; @@ -765,8 +770,6 @@ s4 builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o) if (valuevftbl == elementvftbl) return 1; - LOCK_MONITOR_ENTER(linker_classrenumber_lock); - baseval = elementvftbl->baseval; if (baseval <= 0) { @@ -775,24 +778,21 @@ s4 builtin_fast_canstore_onedim(java_objectarray_t *a, java_object_t *o) (valuevftbl->interfacetable[baseval] != NULL)); } else { - diffval = valuevftbl->baseval - elementvftbl->baseval; - result = diffval <= (uint32_t) elementvftbl->diffval; + result = fast_subtype_check(valuevftbl, elementvftbl); } - LOCK_MONITOR_EXIT(linker_classrenumber_lock); - return result; } /* This is an optimized version where a is guaranteed to be a * one-dimensional array of a class type */ -s4 builtin_fast_canstore_onedim_class(java_objectarray_t *a, java_object_t *o) +bool builtin_fast_canstore_onedim_class(java_objectarray_t *a, java_object_t *o) { vftbl_t *elementvftbl; vftbl_t *valuevftbl; uint32_t diffval; - int result; + bool result; if (o == NULL) return 1; @@ -814,12 +814,7 @@ s4 builtin_fast_canstore_onedim_class(java_objectarray_t *a, java_object_t *o) if (valuevftbl == elementvftbl) return 1; - LOCK_MONITOR_ENTER(linker_classrenumber_lock); - - diffval = valuevftbl->baseval - elementvftbl->baseval; - result = diffval <= (uint32_t) elementvftbl->diffval; - - LOCK_MONITOR_EXIT(linker_classrenumber_lock); + result = fast_subtype_check(valuevftbl, elementvftbl); return result; } @@ -992,7 +987,7 @@ java_object_t *builtin_fast_new(classinfo *c) *******************************************************************************/ -java_handle_t *builtin_newarray(s4 size, classinfo *arrayclass) +java_handle_t *builtin_newarray(int32_t size, classinfo *arrayclass) { arraydescriptor *desc; s4 dataoffset; @@ -1055,7 +1050,7 @@ java_handle_t *builtin_newarray(s4 size, classinfo *arrayclass) *******************************************************************************/ -java_handle_t *builtin_java_newarray(s4 size, java_handle_t *arrayclazz) +java_handle_t *builtin_java_newarray(int32_t size, java_handle_t *arrayclazz) { return builtin_newarray(size, LLNI_classinfo_unwrap(arrayclazz)); } @@ -1073,7 +1068,7 @@ java_handle_t *builtin_java_newarray(s4 size, java_handle_t *arrayclazz) *******************************************************************************/ -java_handle_objectarray_t *builtin_anewarray(s4 size, classinfo *componentclass) +java_handle_objectarray_t *builtin_anewarray(int32_t size, classinfo *componentclass) { classinfo *arrayclass; @@ -1108,7 +1103,7 @@ java_handle_objectarray_t *builtin_anewarray(s4 size, classinfo *componentclass) *******************************************************************************/ #define BUILTIN_NEWARRAY_TYPE(type, arraytype) \ -java_handle_##type##array_t *builtin_newarray_##type(s4 size) \ +java_handle_##type##array_t *builtin_newarray_##type(int32_t size) \ { \ return (java_handle_##type##array_t *) \ builtin_newarray(size, primitivetype_table[arraytype].arrayclass); \