Btw. the change in WebKit is related to http://www.whatwg.org/specs/web-apps/current-work/#perform-a-microtask-checkpoint
петак, 20. април 2012. 13.57.25 UTC-7, Nebojša Ćirić је написао/ла: > > A change (https://bugs.webkit.org/show_bug.cgi?id=84094) landed recently > that requires the following (see http://goo.gl/UsXm6 for details): > > // C++ calls into script contexts which are "owned" by WebKit (created in a > // process where WebKit.cpp initializes v8) must declare their type: > // > // 1. Calls into page/author script from a frame > // 2. Calls into page/author script from a worker > // 3. Calls into internal script (typically setup/teardown work) > // > // Debug-time checking of this is enforced via this class. > // > // Calls of type (1) should generally go through V8Proxy, as inspector > // instrumentation is needed. Calls of type (2) should always > stack-allocate a > // V8RecursionScope in the same block as the call into script. Calls of > type (3) > // should stack allocate a V8RecursionScope::MicrotaskSuppression -- this > // skips work that is spec'd to happen at the end of the outer-most script > stack > // frame of calls into page script: > // > // > http://www.whatwg.org/specs/web-apps/current-work/#perform-a-microtask-checkpoint > > I think my v8 extension falls into (3) and it started crashing in debug > mode. One possible fix is to include conditional dependency on WebKit in my > project and invoke the following to avoid crash: > > WebKit::WebScopedMicrotaskSuppression suppression; > > I would like to avoid adding WebKit dependency if possible. The library > currently only depends on v8 and ICU (for internationalization). > > My code uses standard v8 extension approach: > > 1. Binding > v8::Handle<v8::FunctionTemplate> Extension::GetNativeFunction( > v8::Handle<v8::String> name) { > if (name->Equals(v8::String::New("NativeJSCollator"))) { > return v8::FunctionTemplate::New(Collator::*JSCollator*); > ... > } > > 2. Creating JS object, defining some methods on that object, inserting a > C++ object and returning the result > v8::Persistent<v8::FunctionTemplate> Collator::collator_template_; > ... > v8::Handle<v8::Value> Collator::*JSCollator*(const v8::Arguments& args) { > if (collator_template_.IsEmpty()) { > v8::Local<v8::FunctionTemplate> > raw_template(v8::FunctionTemplate::New()); > raw_template->SetClassName(v8::String::New("v8Locale.Collator")); > > // Define internal field count on instance template. > v8::Local<v8::ObjectTemplate> object_template = > raw_template->InstanceTemplate(); > > // Set aside internal fields for icu collator. > object_template->SetInternalFieldCount(1); > > // Define all of the prototype methods on prototype template. > v8::Local<v8::ObjectTemplate> proto = raw_template->PrototypeTemplate(); > proto->Set(v8::String::New("compare"), > v8::FunctionTemplate::New(CollatorCompare)); > > collator_template_ = > v8::Persistent<v8::FunctionTemplate>::New(raw_template); > } > > // Create an empty object wrapper. > v8::Local<v8::Object> local_object = > collator_template_->GetFunction()->NewInstance(); > v8::Persistent<v8::Object> wrapper = > v8::Persistent<v8::Object>::New(local_object); > > // Set collator as internal field of the resulting JS object. > wrapper->SetPointerInInternalField(0, collator); > > // Make object handle weak so we can delete iterator once GC kicks in. > wrapper.MakeWeak(NULL, DeleteCollator); > > return wrapper; > } > > I assume one of the operations (related to templates) under 2. invokes JS > script in the background which triggers the debug assert. > > Is there a way to avoid running scripts while still getting the same > functionality, like manually constructing the object? > > Regards, > Nebojša Ćirić > -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
