Index: chrome/renderer/extensions/miscellaneous_bindings.cc |
=================================================================== |
--- chrome/renderer/extensions/miscellaneous_bindings.cc (revision 188637) |
+++ chrome/renderer/extensions/miscellaneous_bindings.cc (working copy) |
@@ -164,22 +164,24 @@ |
v8::Persistent<v8::Value> object, |
void* parameter) { |
v8::HandleScope handle_scope; |
- GCCallbackArgs* args = reinterpret_cast<GCCallbackArgs*>(parameter); |
+ GCCallbackArgs* args = static_cast<GCCallbackArgs*>(parameter); |
+ v8::Handle<v8::Context> context = args->callback->CreationContext(); |
+ v8::Context::Scope context_scope(context); |
WebKit::WebScopedMicrotaskSuppression suppression; |
- args->callback->Call(args->callback->CreationContext()->Global(), 0, NULL); |
+ // Wrap in try/catch here so that we don't call into any message/exception |
+ // handlers during GC. That is a recipe for pain. |
+ v8::TryCatch trycatch; |
+ args->callback->Call(context->Global(), 0, NULL); |
delete args; |
} |
// Binds a callback to be invoked when the given object is garbage collected. |
v8::Handle<v8::Value> BindToGC(const v8::Arguments& args) { |
- if (args.Length() == 2 && args[0]->IsObject() && args[1]->IsFunction()) { |
- GCCallbackArgs* context = new GCCallbackArgs( |
- v8::Handle<v8::Object>::Cast(args[0]), |
- v8::Handle<v8::Function>::Cast(args[1])); |
- context->object.MakeWeak(context, GCCallback); |
- } else { |
- NOTREACHED(); |
- } |
+ CHECK(args.Length() == 2 && args[0]->IsObject() && args[1]->IsFunction()); |
+ GCCallbackArgs* context = new GCCallbackArgs( |
+ v8::Handle<v8::Object>::Cast(args[0]), |
+ v8::Handle<v8::Function>::Cast(args[1])); |
+ context->object.MakeWeak(context, GCCallback); |
return v8::Undefined(); |
} |
}; |