I have submitted a new version of this code:
https://review.source.android.com/#change,10635

Please feel free to review and comment. Thanks all for your patience,
sorry about introducing a defect in the first place.

On Fri, Jul 10, 2009 at 5:22 AM, Chen Yang<[email protected]> wrote:
> how about moving the computation of refOffsets to dvmLinkClass, after the
> precacheReferenceOffsets is done?
> I have made one improvement for current code which avoid one problem on x86,
> and I have passed verification in kvm.
>
> diff --git a/vm/oo/Class.c b/vm/oo/Class.c
> index 3b11724..85fa5a3 100644
> --- a/vm/oo/Class.c
> +++ b/vm/oo/Class.c
> @@ -4252,28 +4252,29 @@ noverify:
>      if (clazz->refOffsets != CLASS_WALK_SUPER) {
>          InstField *f;
>          int i;
> +        int cnt= clazz->ifieldRefCount;
>
>          /* All of the fields that contain object references
>           * are guaranteed to be at the beginning of the ifields list.
>           */
> -        f = clazz->ifields;
> -        for (i = 0; i < clazz->ifieldRefCount; i++) {
> -            /*
> -             * Note that, per the comment on struct InstField,
> -             * f->byteOffset is the offset from the beginning of
> -             * obj, not the offset into obj->instanceData.
> -             */
> -            assert(f->byteOffset >= CLASS_SMALLEST_OFFSET);
> -            assert((f->byteOffset & (CLASS_OFFSET_ALIGNMENT - 1)) == 0);
> -            u4 newBit = CLASS_BIT_FROM_OFFSET(f->byteOffset);
> -            if (newBit != 0) {
> -                clazz->refOffsets |= newBit;
> -            } else {
> + if(cnt>0) {
> +#define CLASS_BIT_SHIFT_COUNT(byteOffset) (((unsigned int)(byteOffset) -
> CLASS_SMALLEST_OFFSET) /  CLASS_OFFSET_ALIGNMENT)
> +            f = clazz->ifields;
> +     if( CLASS_BIT_SHIFT_COUNT(f[cnt-1].byteOffset) >= CLASS_BITS_PER_WORD)
>                  clazz->refOffsets = CLASS_WALK_SUPER;
> -                break;
> +     else for (i = 0; i < cnt; i++) {
> +                /*
> +                * Note that, per the comment on struct InstField,
> +                * f->byteOffset is the offset from the beginning of
> +                * obj, not the offset into obj->instanceData.
> +                */
> +                assert(f->byteOffset >= CLASS_SMALLEST_OFFSET);
> +                assert((f->byteOffset & (CLASS_OFFSET_ALIGNMENT - 1)) ==
> 0);
> +                u4 newBit = CLASS_BIT_FROM_OFFSET(f->byteOffset);
> +                clazz->refOffsets |= newBit;
> +                f++;
>              }
> -            f++;
> -        }
> + }
>      }
>
>      if (dvmCheckException(self)) {
>
>
> On Fri, Jul 10, 2009 at 5:41 AM, fadden <[email protected]> wrote:
>>
>> On Jul 9, 1:13 am, Chen Yang <[email protected]> wrote:
>> > Any explanation on why it doesn't show on ARM platform?
>>
>> It does -- it comes down to timing and luck.  If you have a class that
>> creates an instance of itself during class initialization, and a GC
>> happens before class init completes, you will likely have some trouble
>> later on.
>> >>
>



-- 
bhayes yat cs dot stanford dot edu is what you should put in your
contact files -- it'll forward to me no matter where I move

--~--~---------~--~----~------------~-------~--~----~
unsubscribe: [email protected]
website: http://groups.google.com/group/android-porting
-~----------~----~----~----~------~----~------~--~---

Reply via email to