callback handler map not correctly populated by direct use of SetCallHandler (issue 15814005)

7 views
Skip to first unread message

sven...@chromium.org

unread,
May 24, 2013, 3:37:15 AM5/24/13
to dca...@chromium.org, v8-...@googlegroups.com
LGTM (but I think I need an offline in-depth explanation of the
CallbackTable
:-)

https://codereview.chromium.org/15814005/

dca...@chromium.org

unread,
May 24, 2013, 4:04:34 AM5/24/13
to sven...@chromium.org, v8-...@googlegroups.com
Reviewers: Sven Panne,

Message:
Committed patchset #1 manually as r14789 (presubmit successful).

Description:
callback handler map not correctly populated by direct use of SetCallHandler

R=sven...@chromium.org
BUG=

Committed: https://code.google.com/p/v8/source/detail?r=14789

Please review this at https://codereview.chromium.org/15814005/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
M src/api.cc
M test/cctest/test-api.cc


Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index
eb99257d786607d1d9c2a44b6b0d585d6c1a44ad..9a91698e240a8315b0228e69174db6f0bd7c1d14
100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -982,7 +982,7 @@ void
FunctionTemplate::Inherit(v8::Handle<FunctionTemplate> value) {

template<typename Callback>
static Local<FunctionTemplate> FunctionTemplateNew(
- Callback callback_in,
+ Callback callback,
v8::Handle<Value> data,
v8::Handle<Signature> signature,
int length) {
@@ -998,10 +998,8 @@ static Local<FunctionTemplate> FunctionTemplateNew(
int next_serial_number = isolate->next_serial_number();
isolate->set_next_serial_number(next_serial_number + 1);
obj->set_serial_number(i::Smi::FromInt(next_serial_number));
- if (callback_in != 0) {
+ if (callback != 0) {
if (data.IsEmpty()) data = v8::Undefined();
- InvocationCallback callback =
- i::CallbackTable::Register(isolate, callback_in);
Utils::ToLocal(obj)->SetCallHandler(callback, data);
}
obj->set_length(length);
@@ -1225,7 +1223,7 @@ int TypeSwitch::match(v8::Handle<Value> value) {

template<typename Callback>
static void FunctionTemplateSetCallHandler(FunctionTemplate*
function_template,
- Callback callback,
+ Callback callback_in,
v8::Handle<Value> data) {
i::Isolate* isolate = Utils::OpenHandle(function_template)->GetIsolate();
if (IsDeadCheck(isolate, "v8::FunctionTemplate::SetCallHandler()"))
return;
@@ -1235,6 +1233,8 @@ static void
FunctionTemplateSetCallHandler(FunctionTemplate* function_template,
isolate->factory()->NewStruct(i::CALL_HANDLER_INFO_TYPE);
i::Handle<i::CallHandlerInfo> obj =
i::Handle<i::CallHandlerInfo>::cast(struct_obj);
+ InvocationCallback callback =
+ i::CallbackTable::Register(isolate, callback_in);
SET_FIELD_WRAPPED(obj, set_callback, callback);
if (data.IsEmpty()) data = v8::Undefined();
obj->set_data(*Utils::OpenHandle(*data));
Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index
c8f67de0abfc857747de6893320715eab7601cd1..a1ca013a32a5c0f8cc5b32272fd99e91d0b558b4
100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -40,6 +40,7 @@
#include "v8.h"

#include "api.h"
+#include "arguments.h"
#include "isolate.h"
#include "compilation-cache.h"
#include "execution.h"
@@ -908,6 +909,12 @@ static void TestFunctionTemplateInitializer(Handler
handler) {
CHECK_EQ(102, script->Run()->Int32Value());
}
}
+ // Blow away handler database
+ i::Isolate* isolate = i::Isolate::Current();
+ if (isolate->callback_table() != NULL) {
+ delete isolate->callback_table();
+ isolate->set_callback_table(NULL);
+ }
// Use SetCallHandler to initialize a function template, should work
like the
// previous one.
{


Reply all
Reply to author
Forward
0 new messages