On Sat, Dec 22, 2012 at 2:27 PM, Stephan Beal <[email protected]> wrote:

> Hi, devs,
>
> i have just found a regression (from "sometime since last summer") in the
> handling of Object destruction. Consider this JS code:
> ...
>
# Fatal error in ../src/objects-inl.h, line 2386
> # CHECK(object->IsJSObject()) failed
> #
>

The worst part is that i verify that Value->IsObject() before attempting
the GetPointerFromInternalField():

ResultType operator()( v8::Handle<v8::Value> const & h ) const
        {
            if( h.IsEmpty() || ! h->IsObject() ) return NULL;
            else
            {
                void * ext = NULL;
                v8::Handle<v8::Value> proto(h);
                while( !ext && !proto.IsEmpty() && proto->IsObject() )
                {
                    v8::Local<v8::Object> const & obj( v8::Object::Cast(
*proto ) );
                    ext = (obj->InternalFieldCount() != InternalFieldCount)
                        ? NULL
                        : obj->GetPointerFromInternalField(
InternalFieldIndex );
                    if( ! ext )
                    {
                        if( !SearchPrototypeChain ) break;
                        else proto = obj->GetPrototype();
                    }
                }
                return ext ? static_cast<ResultType>(ext) : NULL;
            }
        }

so this appears to be a genuine bug in v8, in that IsObject() is returning
true, Object::Cast() is functioning (not asserting), but
GetPointerFromInternalField() is triggering a not-an-object assertion.


-- 
----- stephan beal
http://wanderinghorse.net/home/stephan/
http://gplus.to/sgbeal

-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users

Reply via email to