| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index 2093dbb29295db0389cb3ca1e50c506cf822347f..8177bafb29f125ea8ea10b7f71ff4cf83963f90b 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -807,31 +807,84 @@ THREADED_TEST(GlobalProperties) {
|
|
|
| static v8::Handle<Value> handle_call(const v8::Arguments& args) {
|
| ApiTestFuzzer::Fuzz();
|
| + args.GetReturnValue().Set(v8_str("bad value"));
|
| return v8_num(102);
|
| }
|
|
|
| +static v8::Handle<Value> handle_call_indirect(const v8::Arguments& args) {
|
| + ApiTestFuzzer::Fuzz();
|
| + args.GetReturnValue().Set(v8_str("bad value"));
|
| + args.GetReturnValue().Set(v8_num(102));
|
| + return v8::Handle<Value>();
|
| +}
|
| +
|
| +static void handle_callback(const v8::FunctionCallbackInfo<Value>& info) {
|
| + ApiTestFuzzer::Fuzz();
|
| + info.GetReturnValue().Set(v8_str("bad value"));
|
| + info.GetReturnValue().Set(v8_num(102));
|
| +}
|
| +
|
|
|
| static v8::Handle<Value> construct_call(const v8::Arguments& args) {
|
| ApiTestFuzzer::Fuzz();
|
| args.This()->Set(v8_str("x"), v8_num(1));
|
| args.This()->Set(v8_str("y"), v8_num(2));
|
| + args.GetReturnValue().Set(v8_str("bad value"));
|
| return args.This();
|
| }
|
|
|
| -static v8::Handle<Value> Return239(Local<String> name, const AccessorInfo&) {
|
| +static v8::Handle<Value> construct_call_indirect(const v8::Arguments& args) {
|
| + ApiTestFuzzer::Fuzz();
|
| + args.This()->Set(v8_str("x"), v8_num(1));
|
| + args.This()->Set(v8_str("y"), v8_num(2));
|
| + args.GetReturnValue().Set(v8_str("bad value"));
|
| + args.GetReturnValue().Set(args.This());
|
| + return v8::Handle<Value>();
|
| +}
|
| +
|
| +static void construct_callback(
|
| + const v8::FunctionCallbackInfo<Value>& info) {
|
| + ApiTestFuzzer::Fuzz();
|
| + info.This()->Set(v8_str("x"), v8_num(1));
|
| + info.This()->Set(v8_str("y"), v8_num(2));
|
| + info.GetReturnValue().Set(v8_str("bad value"));
|
| + info.GetReturnValue().Set(info.This());
|
| +}
|
| +
|
| +
|
| +static v8::Handle<Value> Return239(
|
| + Local<String> name, const AccessorInfo& info) {
|
| ApiTestFuzzer::Fuzz();
|
| + info.GetReturnValue().Set(v8_str("bad value"));
|
| return v8_num(239);
|
| }
|
|
|
| +static v8::Handle<Value> Return239Indirect(
|
| + Local<String> name, const AccessorInfo& info) {
|
| + ApiTestFuzzer::Fuzz();
|
| + Handle<Value> value = v8_num(239);
|
| + info.GetReturnValue().Set(v8_str("bad value"));
|
| + info.GetReturnValue().Set(value);
|
| + return v8::Handle<Value>();
|
| +}
|
|
|
| -THREADED_TEST(FunctionTemplate) {
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| +static void Return239Callback(
|
| + Local<String> name, const v8::PropertyCallbackInfo<Value>& info) {
|
| + ApiTestFuzzer::Fuzz();
|
| + info.GetReturnValue().Set(v8_str("bad value"));
|
| + info.GetReturnValue().Set(v8_num(239));
|
| +}
|
| +
|
| +
|
| +template<typename Handler>
|
| +static void TestFunctionTemplateInitializer(LocalContext* env,
|
| + Handler handler) {
|
| + // Test constructor calls.
|
| {
|
| Local<v8::FunctionTemplate> fun_templ =
|
| - v8::FunctionTemplate::New(handle_call);
|
| + v8::FunctionTemplate::New(handler);
|
| Local<Function> fun = fun_templ->GetFunction();
|
| - env->Global()->Set(v8_str("obj"), fun);
|
| + (*env)->Global()->Set(v8_str("obj"), fun);
|
| Local<Script> script = v8_compile("obj()");
|
| CHECK_EQ(102, script->Run()->Int32Value());
|
| }
|
| @@ -839,29 +892,47 @@ THREADED_TEST(FunctionTemplate) {
|
| // previous one.
|
| {
|
| Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
|
| - fun_templ->SetCallHandler(handle_call);
|
| + fun_templ->SetCallHandler(handler);
|
| Local<Function> fun = fun_templ->GetFunction();
|
| - env->Global()->Set(v8_str("obj"), fun);
|
| + (*env)->Global()->Set(v8_str("obj"), fun);
|
| Local<Script> script = v8_compile("obj()");
|
| CHECK_EQ(102, script->Run()->Int32Value());
|
| }
|
| - // Test constructor calls.
|
| - {
|
| - Local<v8::FunctionTemplate> fun_templ =
|
| - v8::FunctionTemplate::New(construct_call);
|
| - fun_templ->SetClassName(v8_str("funky"));
|
| - fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), Return239);
|
| - Local<Function> fun = fun_templ->GetFunction();
|
| - env->Global()->Set(v8_str("obj"), fun);
|
| - Local<Script> script = v8_compile("var s = new obj(); s.x");
|
| - CHECK_EQ(1, script->Run()->Int32Value());
|
| +}
|
|
|
| - Local<Value> result = v8_compile("(new obj()).toString()")->Run();
|
| - CHECK_EQ(v8_str("[object funky]"), result);
|
|
|
| - result = v8_compile("(new obj()).m")->Run();
|
| - CHECK_EQ(239, result->Int32Value());
|
| - }
|
| +template<typename Constructor, typename Accessor>
|
| +static void TestFunctionTemplateAccessor(LocalContext* env,
|
| + Constructor constructor,
|
| + Accessor accessor) {
|
| + Local<v8::FunctionTemplate> fun_templ =
|
| + v8::FunctionTemplate::New(construct_call);
|
| + fun_templ->SetClassName(v8_str("funky"));
|
| + fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), accessor);
|
| + Local<Function> fun = fun_templ->GetFunction();
|
| + (*env)->Global()->Set(v8_str("obj"), fun);
|
| + Local<Script> script = v8_compile("var s = new obj(); s.x");
|
| + CHECK_EQ(1, script->Run()->Int32Value());
|
| + Local<Value> result = v8_compile("(new obj()).toString()")->Run();
|
| + CHECK_EQ(v8_str("[object funky]"), result);
|
| + result = v8_compile("(new obj()).m")->Run();
|
| + CHECK_EQ(239, result->Int32Value());
|
| +}
|
| +
|
| +
|
| +THREADED_TEST(FunctionTemplate) {
|
| + LocalContext env;
|
| + v8::HandleScope scope(env->GetIsolate());
|
| +
|
| + TestFunctionTemplateInitializer(&env, handle_call);
|
| + TestFunctionTemplateInitializer(&env, handle_call_indirect);
|
| + TestFunctionTemplateInitializer(&env, handle_callback);
|
| +
|
| + TestFunctionTemplateAccessor(&env, construct_call, Return239);
|
| + TestFunctionTemplateAccessor(&env,
|
| + construct_call_indirect,
|
| + Return239Indirect);
|
| + TestFunctionTemplateAccessor(&env, construct_callback, Return239Callback);
|
| }
|
|
|
|
|
| @@ -4649,7 +4720,10 @@ THREADED_TEST(SetterOnly) {
|
| THREADED_TEST(NoAccessors) {
|
| v8::HandleScope scope(v8::Isolate::GetCurrent());
|
| Local<ObjectTemplate> templ = ObjectTemplate::New();
|
| - templ->SetAccessor(v8_str("x"), NULL, NULL, v8_str("donut"));
|
| + templ->SetAccessor(v8_str("x"),
|
| + static_cast<v8::AccessorGetter>(NULL),
|
| + NULL,
|
| + v8_str("donut"));
|
| LocalContext context;
|
| context->Global()->Set(v8_str("obj"), templ->NewInstance());
|
| Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x"));
|
| @@ -5308,8 +5382,7 @@ THREADED_TEST(UndetectableObject) {
|
| LocalContext env;
|
| v8::HandleScope scope(env->GetIsolate());
|
|
|
| - Local<v8::FunctionTemplate> desc =
|
| - v8::FunctionTemplate::New(0, v8::Handle<Value>());
|
| + Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New();
|
| desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable
|
|
|
| Local<v8::Object> obj = desc->GetFunction()->NewInstance();
|
| @@ -5352,8 +5425,7 @@ THREADED_TEST(VoidLiteral) {
|
| LocalContext env;
|
| v8::HandleScope scope(env->GetIsolate());
|
|
|
| - Local<v8::FunctionTemplate> desc =
|
| - v8::FunctionTemplate::New(0, v8::Handle<Value>());
|
| + Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New();
|
| desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable
|
|
|
| Local<v8::Object> obj = desc->GetFunction()->NewInstance();
|
| @@ -5396,8 +5468,7 @@ THREADED_TEST(ExtensibleOnUndetectable) {
|
| LocalContext env;
|
| v8::HandleScope scope(env->GetIsolate());
|
|
|
| - Local<v8::FunctionTemplate> desc =
|
| - v8::FunctionTemplate::New(0, v8::Handle<Value>());
|
| + Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New();
|
| desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable
|
|
|
| Local<v8::Object> obj = desc->GetFunction()->NewInstance();
|
| @@ -10497,29 +10568,64 @@ THREADED_TEST(CallICFastApi_DirectCall_Throw) {
|
| }
|
|
|
|
|
| -v8::Handle<v8::Value> DirectGetterCallback(Local<String> name,
|
| - const v8::AccessorInfo& info) {
|
| +static Handle<Value> DoDirectGetter() {
|
| if (++p_getter_count % 3 == 0) {
|
| HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask);
|
| GenerateSomeGarbage();
|
| }
|
| + return v8_str("Direct Getter Result");
|
| +}
|
| +
|
| +static void CheckReturnValue(v8::ReturnValue<v8::Value> rv) {
|
| + i::Object** o = *reinterpret_cast<i::Object***>(&rv);
|
| + CHECK((*o)->IsTheHole() || (*o)->IsUndefined());
|
| +}
|
| +
|
| +static v8::Handle<v8::Value> DirectGetter(Local<String> name,
|
| + const v8::AccessorInfo& info) {
|
| + CheckReturnValue(info.GetReturnValue());
|
| + info.GetReturnValue().Set(v8_str("Garbage"));
|
| + return DoDirectGetter();
|
| +}
|
| +
|
| +static v8::Handle<v8::Value> DirectGetterIndirect(
|
| + Local<String> name,
|
| + const v8::AccessorInfo& info) {
|
| + CheckReturnValue(info.GetReturnValue());
|
| + info.GetReturnValue().Set(DoDirectGetter());
|
| return v8::Handle<v8::Value>();
|
| }
|
|
|
| +static void DirectGetterCallback(
|
| + Local<String> name,
|
| + const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| + CheckReturnValue(info.GetReturnValue());
|
| + info.GetReturnValue().Set(DoDirectGetter());
|
| +}
|
|
|
| -THREADED_TEST(LoadICFastApi_DirectCall_GCMoveStub) {
|
| +
|
| +template<typename Accessor>
|
| +static void LoadICFastApi_DirectCall_GCMoveStub(Accessor accessor) {
|
| LocalContext context;
|
| v8::HandleScope scope(context->GetIsolate());
|
| v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New();
|
| - obj->SetAccessor(v8_str("p1"), DirectGetterCallback);
|
| + obj->SetAccessor(v8_str("p1"), accessor);
|
| context->Global()->Set(v8_str("o1"), obj->NewInstance());
|
| p_getter_count = 0;
|
| - CompileRun(
|
| + v8::Handle<v8::Value> result = CompileRun(
|
| "function f() {"
|
| " for (var i = 0; i < 30; i++) o1.p1;"
|
| + " return o1.p1"
|
| "}"
|
| "f();");
|
| - CHECK_EQ(30, p_getter_count);
|
| + CHECK_EQ(v8_str("Direct Getter Result"), result);
|
| + CHECK_EQ(31, p_getter_count);
|
| +}
|
| +
|
| +THREADED_TEST(LoadICFastApi_DirectCall_GCMoveStub) {
|
| + LoadICFastApi_DirectCall_GCMoveStub(DirectGetterIndirect);
|
| + LoadICFastApi_DirectCall_GCMoveStub(DirectGetterCallback);
|
| + LoadICFastApi_DirectCall_GCMoveStub(DirectGetter);
|
| }
|
|
|
|
|
| @@ -11198,7 +11304,7 @@ THREADED_TEST(InterceptorICSetterExceptions) {
|
| THREADED_TEST(NullNamedInterceptor) {
|
| v8::HandleScope scope(v8::Isolate::GetCurrent());
|
| v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
|
| - templ->SetNamedPropertyHandler(0);
|
| + templ->SetNamedPropertyHandler(static_cast<v8::NamedPropertyGetter>(0));
|
| LocalContext context;
|
| templ->Set("x", v8_num(42));
|
| v8::Handle<v8::Object> obj = templ->NewInstance();
|
| @@ -11213,7 +11319,7 @@ THREADED_TEST(NullNamedInterceptor) {
|
| THREADED_TEST(NullIndexedInterceptor) {
|
| v8::HandleScope scope(v8::Isolate::GetCurrent());
|
| v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
|
| - templ->SetIndexedPropertyHandler(0);
|
| + templ->SetIndexedPropertyHandler(static_cast<v8::IndexedPropertyGetter>(0));
|
| LocalContext context;
|
| templ->Set("42", v8_num(42));
|
| v8::Handle<v8::Object> obj = templ->NewInstance();
|
|
|