Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(581)

Side by Side Diff: test/cctest/test-api.cc

Issue 9285013: Fix building with clang (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: . Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/x64/lithium-x64.cc ('k') | test/cctest/test-compiler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1171 matching lines...) Expand 10 before | Expand all | Expand 10 after
1182 THREADED_TEST(GlobalPrototype) { 1182 THREADED_TEST(GlobalPrototype) {
1183 v8::HandleScope scope; 1183 v8::HandleScope scope;
1184 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New(); 1184 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New();
1185 func_templ->PrototypeTemplate()->Set( 1185 func_templ->PrototypeTemplate()->Set(
1186 "dummy", 1186 "dummy",
1187 v8::FunctionTemplate::New(DummyCallHandler)); 1187 v8::FunctionTemplate::New(DummyCallHandler));
1188 v8::Handle<ObjectTemplate> templ = func_templ->InstanceTemplate(); 1188 v8::Handle<ObjectTemplate> templ = func_templ->InstanceTemplate();
1189 templ->Set("x", v8_num(200)); 1189 templ->Set("x", v8_num(200));
1190 templ->SetAccessor(v8_str("m"), GetM); 1190 templ->SetAccessor(v8_str("m"), GetM);
1191 LocalContext env(0, templ); 1191 LocalContext env(0, templ);
1192 v8::Handle<v8::Object> obj(env->Global());
1193 v8::Handle<Script> script(v8_compile("dummy()")); 1192 v8::Handle<Script> script(v8_compile("dummy()"));
1194 v8::Handle<Value> result(script->Run()); 1193 v8::Handle<Value> result(script->Run());
1195 CHECK_EQ(13.4, result->NumberValue()); 1194 CHECK_EQ(13.4, result->NumberValue());
1196 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value()); 1195 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value());
1197 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value()); 1196 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value());
1198 } 1197 }
1199 1198
1200 1199
1201 THREADED_TEST(ObjectTemplate) { 1200 THREADED_TEST(ObjectTemplate) {
1202 v8::HandleScope scope; 1201 v8::HandleScope scope;
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
1840 v8::HandleScope scope; 1839 v8::HandleScope scope;
1841 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); 1840 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New();
1842 global->Set(v8_str("callScriptRecursively"), 1841 global->Set(v8_str("callScriptRecursively"),
1843 v8::FunctionTemplate::New(CallScriptRecursivelyCall)); 1842 v8::FunctionTemplate::New(CallScriptRecursivelyCall));
1844 global->Set(v8_str("callFunctionRecursively"), 1843 global->Set(v8_str("callFunctionRecursively"),
1845 v8::FunctionTemplate::New(CallFunctionRecursivelyCall)); 1844 v8::FunctionTemplate::New(CallFunctionRecursivelyCall));
1846 LocalContext env(NULL, global); 1845 LocalContext env(NULL, global);
1847 1846
1848 env->Global()->Set(v8_str("depth"), v8::Integer::New(0)); 1847 env->Global()->Set(v8_str("depth"), v8::Integer::New(0));
1849 call_recursively_script = v8_compile("callScriptRecursively()"); 1848 call_recursively_script = v8_compile("callScriptRecursively()");
1850 v8::Handle<Value> result(call_recursively_script->Run()); 1849 call_recursively_script->Run();
1851 call_recursively_script = v8::Handle<Script>(); 1850 call_recursively_script = v8::Handle<Script>();
1852 1851
1853 env->Global()->Set(v8_str("depth"), v8::Integer::New(0)); 1852 env->Global()->Set(v8_str("depth"), v8::Integer::New(0));
1854 Script::Compile(v8_str("callFunctionRecursively()"))->Run(); 1853 Script::Compile(v8_str("callFunctionRecursively()"))->Run();
1855 } 1854 }
1856 1855
1857 1856
1858 static v8::Handle<Value> 1857 static v8::Handle<Value>
1859 ThrowingPropertyHandlerGet(Local<String> key, const AccessorInfo&) { 1858 ThrowingPropertyHandlerGet(Local<String> key, const AccessorInfo&) {
1860 ApiTestFuzzer::Fuzz(); 1859 ApiTestFuzzer::Fuzz();
(...skipping 2608 matching lines...) Expand 10 before | Expand all | Expand 10 after
4469 4468
4470 ExpectBoolean("Object.isExtensible(undetectable)", true); 4469 ExpectBoolean("Object.isExtensible(undetectable)", true);
4471 4470
4472 source = v8_str("Object.preventExtensions(undetectable);"); 4471 source = v8_str("Object.preventExtensions(undetectable);");
4473 script = Script::Compile(source); 4472 script = Script::Compile(source);
4474 script->Run(); 4473 script->Run();
4475 ExpectBoolean("Object.isExtensible(undetectable)", false); 4474 ExpectBoolean("Object.isExtensible(undetectable)", false);
4476 4475
4477 source = v8_str("undetectable.y = 2000;"); 4476 source = v8_str("undetectable.y = 2000;");
4478 script = Script::Compile(source); 4477 script = Script::Compile(source);
4479 Local<Value> result(script->Run()); 4478 script->Run();
4480 ExpectBoolean("undetectable.y == undefined", true); 4479 ExpectBoolean("undetectable.y == undefined", true);
4481 } 4480 }
4482 4481
4483 4482
4484 4483
4485 THREADED_TEST(UndetectableString) { 4484 THREADED_TEST(UndetectableString) {
4486 v8::HandleScope scope; 4485 v8::HandleScope scope;
4487 LocalContext env; 4486 LocalContext env;
4488 4487
4489 Local<String> obj = String::NewUndetectable("foo"); 4488 Local<String> obj = String::NewUndetectable("foo");
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
4822 4821
4823 THREADED_TEST(NativeFunctionDeclarationError) { 4822 THREADED_TEST(NativeFunctionDeclarationError) {
4824 v8::HandleScope handle_scope; 4823 v8::HandleScope handle_scope;
4825 const char* name = "nativedeclerr"; 4824 const char* name = "nativedeclerr";
4826 // Syntax error in extension code. 4825 // Syntax error in extension code.
4827 v8::RegisterExtension(new NativeFunctionExtension(name, 4826 v8::RegisterExtension(new NativeFunctionExtension(name,
4828 "native\nfunction foo();")); 4827 "native\nfunction foo();"));
4829 const char* extension_names[] = { name }; 4828 const char* extension_names[] = { name };
4830 v8::ExtensionConfiguration extensions(1, extension_names); 4829 v8::ExtensionConfiguration extensions(1, extension_names);
4831 v8::Handle<Context> context(Context::New(&extensions)); 4830 v8::Handle<Context> context(Context::New(&extensions));
4832 ASSERT(context.IsEmpty()); 4831 CHECK(context.IsEmpty());
4833 } 4832 }
4834 4833
4834
4835 THREADED_TEST(NativeFunctionDeclarationErrorEscape) { 4835 THREADED_TEST(NativeFunctionDeclarationErrorEscape) {
4836 v8::HandleScope handle_scope; 4836 v8::HandleScope handle_scope;
4837 const char* name = "nativedeclerresc"; 4837 const char* name = "nativedeclerresc";
4838 // Syntax error in extension code - escape code in "native" means that 4838 // Syntax error in extension code - escape code in "native" means that
4839 // it's not treated as a keyword. 4839 // it's not treated as a keyword.
4840 v8::RegisterExtension(new NativeFunctionExtension( 4840 v8::RegisterExtension(new NativeFunctionExtension(
4841 name, 4841 name,
4842 "nativ\\u0065 function foo();")); 4842 "nativ\\u0065 function foo();"));
4843 const char* extension_names[] = { name }; 4843 const char* extension_names[] = { name };
4844 v8::ExtensionConfiguration extensions(1, extension_names); 4844 v8::ExtensionConfiguration extensions(1, extension_names);
4845 v8::Handle<Context> context(Context::New(&extensions)); 4845 v8::Handle<Context> context(Context::New(&extensions));
4846 ASSERT(context.IsEmpty()); 4846 CHECK(context.IsEmpty());
4847 } 4847 }
4848 4848
4849 4849
4850 static void CheckDependencies(const char* name, const char* expected) { 4850 static void CheckDependencies(const char* name, const char* expected) {
4851 v8::HandleScope handle_scope; 4851 v8::HandleScope handle_scope;
4852 v8::ExtensionConfiguration config(1, &name); 4852 v8::ExtensionConfiguration config(1, &name);
4853 LocalContext context(&config); 4853 LocalContext context(&config);
4854 CHECK_EQ(String::New(expected), context->Global()->Get(v8_str("loaded"))); 4854 CHECK_EQ(String::New(expected), context->Global()->Get(v8_str("loaded")));
4855 } 4855 }
4856 4856
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
5002 5002
5003 5003
5004 TEST(RegexpOutOfMemory) { 5004 TEST(RegexpOutOfMemory) {
5005 // Execute a script that causes out of memory when flattening a string. 5005 // Execute a script that causes out of memory when flattening a string.
5006 v8::HandleScope scope; 5006 v8::HandleScope scope;
5007 v8::V8::SetFatalErrorHandler(OOMCallback); 5007 v8::V8::SetFatalErrorHandler(OOMCallback);
5008 LocalContext context; 5008 LocalContext context;
5009 Local<Script> script = 5009 Local<Script> script =
5010 Script::Compile(String::New(js_code_causing_huge_string_flattening)); 5010 Script::Compile(String::New(js_code_causing_huge_string_flattening));
5011 last_location = NULL; 5011 last_location = NULL;
5012 Local<Value> result(script->Run()); 5012 script->Run();
5013 5013
5014 CHECK(false); // Should not return. 5014 CHECK(false); // Should not return.
5015 } 5015 }
5016 5016
5017 5017
5018 static void MissingScriptInfoMessageListener(v8::Handle<v8::Message> message, 5018 static void MissingScriptInfoMessageListener(v8::Handle<v8::Message> message,
5019 v8::Handle<Value> data) { 5019 v8::Handle<Value> data) {
5020 CHECK_EQ(v8::Undefined(), data); 5020 CHECK_EQ(v8::Undefined(), data);
5021 CHECK(message->GetScriptResourceName()->IsUndefined()); 5021 CHECK(message->GetScriptResourceName()->IsUndefined());
5022 CHECK_EQ(v8::Undefined(), message->GetScriptResourceName()); 5022 CHECK_EQ(v8::Undefined(), message->GetScriptResourceName());
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after
5780 5780
5781 5781
5782 THREADED_TEST(ErrorConstruction) { 5782 THREADED_TEST(ErrorConstruction) {
5783 v8::HandleScope scope; 5783 v8::HandleScope scope;
5784 LocalContext context; 5784 LocalContext context;
5785 5785
5786 v8::Handle<String> foo = v8_str("foo"); 5786 v8::Handle<String> foo = v8_str("foo");
5787 v8::Handle<String> message = v8_str("message"); 5787 v8::Handle<String> message = v8_str("message");
5788 v8::Handle<Value> range_error = v8::Exception::RangeError(foo); 5788 v8::Handle<Value> range_error = v8::Exception::RangeError(foo);
5789 CHECK(range_error->IsObject()); 5789 CHECK(range_error->IsObject());
5790 v8::Handle<v8::Object> range_obj(range_error.As<v8::Object>());
5791 CHECK(range_error.As<v8::Object>()->Get(message)->Equals(foo)); 5790 CHECK(range_error.As<v8::Object>()->Get(message)->Equals(foo));
5792 v8::Handle<Value> reference_error = v8::Exception::ReferenceError(foo); 5791 v8::Handle<Value> reference_error = v8::Exception::ReferenceError(foo);
5793 CHECK(reference_error->IsObject()); 5792 CHECK(reference_error->IsObject());
5794 CHECK(reference_error.As<v8::Object>()->Get(message)->Equals(foo)); 5793 CHECK(reference_error.As<v8::Object>()->Get(message)->Equals(foo));
5795 v8::Handle<Value> syntax_error = v8::Exception::SyntaxError(foo); 5794 v8::Handle<Value> syntax_error = v8::Exception::SyntaxError(foo);
5796 CHECK(syntax_error->IsObject()); 5795 CHECK(syntax_error->IsObject());
5797 CHECK(syntax_error.As<v8::Object>()->Get(message)->Equals(foo)); 5796 CHECK(syntax_error.As<v8::Object>()->Get(message)->Equals(foo));
5798 v8::Handle<Value> type_error = v8::Exception::TypeError(foo); 5797 v8::Handle<Value> type_error = v8::Exception::TypeError(foo);
5799 CHECK(type_error->IsObject()); 5798 CHECK(type_error->IsObject());
5800 CHECK(type_error.As<v8::Object>()->Get(message)->Equals(foo)); 5799 CHECK(type_error.As<v8::Object>()->Get(message)->Equals(foo));
(...skipping 1549 matching lines...) Expand 10 before | Expand all | Expand 10 after
7350 // Hold on to the global object so it can be used again in another 7349 // Hold on to the global object so it can be used again in another
7351 // environment initialization. 7350 // environment initialization.
7352 global_object = env->Global(); 7351 global_object = env->Global();
7353 foo = Script::Compile(v8_str(script))->Run(); 7352 foo = Script::Compile(v8_str(script))->Run();
7354 } 7353 }
7355 7354
7356 { 7355 {
7357 // Create new environment reusing the global object. 7356 // Create new environment reusing the global object.
7358 LocalContext env(NULL, instance_template, global_object); 7357 LocalContext env(NULL, instance_template, global_object);
7359 env->Global()->Set(v8_str("foo"), foo); 7358 env->Global()->Set(v8_str("foo"), foo);
7360 Local<Value> value(Script::Compile(v8_str("foo()"))->Run()); 7359 Script::Compile(v8_str("foo()"))->Run();
7361 } 7360 }
7362 } 7361 }
7363 7362
7364 7363
7365 static v8::Handle<Value> ShadowFunctionCallback(const v8::Arguments& args) { 7364 static v8::Handle<Value> ShadowFunctionCallback(const v8::Arguments& args) {
7366 ApiTestFuzzer::Fuzz(); 7365 ApiTestFuzzer::Fuzz();
7367 return v8_num(42); 7366 return v8_num(42);
7368 } 7367 }
7369 7368
7370 7369
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
7676 7675
7677 THREADED_TEST(Constructor) { 7676 THREADED_TEST(Constructor) {
7678 v8::HandleScope handle_scope; 7677 v8::HandleScope handle_scope;
7679 LocalContext context; 7678 LocalContext context;
7680 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); 7679 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New();
7681 templ->SetClassName(v8_str("Fun")); 7680 templ->SetClassName(v8_str("Fun"));
7682 Local<Function> cons = templ->GetFunction(); 7681 Local<Function> cons = templ->GetFunction();
7683 context->Global()->Set(v8_str("Fun"), cons); 7682 context->Global()->Set(v8_str("Fun"), cons);
7684 Local<v8::Object> inst = cons->NewInstance(); 7683 Local<v8::Object> inst = cons->NewInstance();
7685 i::Handle<i::JSObject> obj(v8::Utils::OpenHandle(*inst)); 7684 i::Handle<i::JSObject> obj(v8::Utils::OpenHandle(*inst));
7685 CHECK(obj->IsJSObject());
7686 Local<Value> value = CompileRun("(new Fun()).constructor === Fun"); 7686 Local<Value> value = CompileRun("(new Fun()).constructor === Fun");
7687 CHECK(value->BooleanValue()); 7687 CHECK(value->BooleanValue());
7688 } 7688 }
7689 7689
7690 7690
7691 static Handle<Value> ConstructorCallback(const Arguments& args) { 7691 static Handle<Value> ConstructorCallback(const Arguments& args) {
7692 ApiTestFuzzer::Fuzz(); 7692 ApiTestFuzzer::Fuzz();
7693 Local<Object> This; 7693 Local<Object> This;
7694 7694
7695 if (args.IsConstructCall()) { 7695 if (args.IsConstructCall()) {
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
8147 // Check that the call-as-function handler can be called through 8147 // Check that the call-as-function handler can be called through
8148 // the API. 8148 // the API.
8149 v8::Handle<Value> args[] = { v8_num(28) }; 8149 v8::Handle<Value> args[] = { v8_num(28) };
8150 value = instance->CallAsFunction(instance, 1, args); 8150 value = instance->CallAsFunction(instance, 1, args);
8151 CHECK(!try_catch.HasCaught()); 8151 CHECK(!try_catch.HasCaught());
8152 CHECK_EQ(28, value->Int32Value()); 8152 CHECK_EQ(28, value->Int32Value());
8153 } 8153 }
8154 8154
8155 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); 8155 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New();
8156 Local<ObjectTemplate> instance_template(t->InstanceTemplate()); 8156 Local<ObjectTemplate> instance_template(t->InstanceTemplate());
8157 USE(instance_template);
8157 Local<v8::Object> instance = t->GetFunction()->NewInstance(); 8158 Local<v8::Object> instance = t->GetFunction()->NewInstance();
8158 context->Global()->Set(v8_str("obj2"), instance); 8159 context->Global()->Set(v8_str("obj2"), instance);
8159 v8::TryCatch try_catch; 8160 v8::TryCatch try_catch;
8160 Local<Value> value; 8161 Local<Value> value;
8161 CHECK(!try_catch.HasCaught()); 8162 CHECK(!try_catch.HasCaught());
8162 8163
8163 // Call an object without call-as-function handler through the JS 8164 // Call an object without call-as-function handler through the JS
8164 value = CompileRun("obj2(28)"); 8165 value = CompileRun("obj2(28)");
8165 CHECK(value.IsEmpty()); 8166 CHECK(value.IsEmpty());
8166 CHECK(try_catch.HasCaught()); 8167 CHECK(try_catch.HasCaught());
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
8776 8777
8777 // This test should hit the store IC for the interceptor case. 8778 // This test should hit the store IC for the interceptor case.
8778 THREADED_TEST(InterceptorStoreIC) { 8779 THREADED_TEST(InterceptorStoreIC) {
8779 v8::HandleScope scope; 8780 v8::HandleScope scope;
8780 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 8781 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
8781 templ->SetNamedPropertyHandler(InterceptorLoadICGetter, 8782 templ->SetNamedPropertyHandler(InterceptorLoadICGetter,
8782 InterceptorStoreICSetter, 8783 InterceptorStoreICSetter,
8783 0, 0, 0, v8_str("data")); 8784 0, 0, 0, v8_str("data"));
8784 LocalContext context; 8785 LocalContext context;
8785 context->Global()->Set(v8_str("o"), templ->NewInstance()); 8786 context->Global()->Set(v8_str("o"), templ->NewInstance());
8786 v8::Handle<Value> value(CompileRun( 8787 CompileRun(
8787 "for (var i = 0; i < 1000; i++) {" 8788 "for (var i = 0; i < 1000; i++) {"
8788 " o.x = 42;" 8789 " o.x = 42;"
8789 "}")); 8790 "}");
8790 } 8791 }
8791 8792
8792 8793
8793 THREADED_TEST(InterceptorStoreICWithNoSetter) { 8794 THREADED_TEST(InterceptorStoreICWithNoSetter) {
8794 v8::HandleScope scope; 8795 v8::HandleScope scope;
8795 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 8796 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
8796 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter); 8797 templ->SetNamedPropertyHandler(InterceptorLoadXICGetter);
8797 LocalContext context; 8798 LocalContext context;
8798 context->Global()->Set(v8_str("o"), templ->NewInstance()); 8799 context->Global()->Set(v8_str("o"), templ->NewInstance());
8799 v8::Handle<Value> value = CompileRun( 8800 v8::Handle<Value> value = CompileRun(
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
9247 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9248 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9248 proto_templ->Set(v8_str("method"), method_templ); 9249 proto_templ->Set(v8_str("method"), method_templ);
9249 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 9250 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
9250 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 9251 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
9251 NULL, NULL, NULL, NULL, 9252 NULL, NULL, NULL, NULL,
9252 v8::External::Wrap(&interceptor_call_count)); 9253 v8::External::Wrap(&interceptor_call_count));
9253 LocalContext context; 9254 LocalContext context;
9254 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9255 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9255 GenerateSomeGarbage(); 9256 GenerateSomeGarbage();
9256 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9257 context->Global()->Set(v8_str("o"), fun->NewInstance());
9257 v8::Handle<Value> value(CompileRun( 9258 CompileRun(
9258 "var result = 0;" 9259 "var result = 0;"
9259 "for (var i = 0; i < 100; i++) {" 9260 "for (var i = 0; i < 100; i++) {"
9260 " result = o.method(41);" 9261 " result = o.method(41);"
9261 "}")); 9262 "}");
9262 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 9263 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
9263 CHECK_EQ(100, interceptor_call_count); 9264 CHECK_EQ(100, interceptor_call_count);
9264 } 9265 }
9265 9266
9266 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature) { 9267 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature) {
9267 int interceptor_call_count = 0; 9268 int interceptor_call_count = 0;
9268 v8::HandleScope scope; 9269 v8::HandleScope scope;
9269 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 9270 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
9270 v8::Handle<v8::FunctionTemplate> method_templ = 9271 v8::Handle<v8::FunctionTemplate> method_templ =
9271 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 9272 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
9272 v8_str("method_data"), 9273 v8_str("method_data"),
9273 v8::Signature::New(fun_templ)); 9274 v8::Signature::New(fun_templ));
9274 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9275 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9275 proto_templ->Set(v8_str("method"), method_templ); 9276 proto_templ->Set(v8_str("method"), method_templ);
9276 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 9277 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
9277 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 9278 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
9278 NULL, NULL, NULL, NULL, 9279 NULL, NULL, NULL, NULL,
9279 v8::External::Wrap(&interceptor_call_count)); 9280 v8::External::Wrap(&interceptor_call_count));
9280 LocalContext context; 9281 LocalContext context;
9281 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9282 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9282 GenerateSomeGarbage(); 9283 GenerateSomeGarbage();
9283 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9284 context->Global()->Set(v8_str("o"), fun->NewInstance());
9284 v8::Handle<Value> value(CompileRun( 9285 CompileRun(
9285 "o.foo = 17;" 9286 "o.foo = 17;"
9286 "var receiver = {};" 9287 "var receiver = {};"
9287 "receiver.__proto__ = o;" 9288 "receiver.__proto__ = o;"
9288 "var result = 0;" 9289 "var result = 0;"
9289 "for (var i = 0; i < 100; i++) {" 9290 "for (var i = 0; i < 100; i++) {"
9290 " result = receiver.method(41);" 9291 " result = receiver.method(41);"
9291 "}")); 9292 "}");
9292 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 9293 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
9293 CHECK_EQ(100, interceptor_call_count); 9294 CHECK_EQ(100, interceptor_call_count);
9294 } 9295 }
9295 9296
9296 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { 9297 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) {
9297 int interceptor_call_count = 0; 9298 int interceptor_call_count = 0;
9298 v8::HandleScope scope; 9299 v8::HandleScope scope;
9299 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 9300 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
9300 v8::Handle<v8::FunctionTemplate> method_templ = 9301 v8::Handle<v8::FunctionTemplate> method_templ =
9301 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 9302 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
9302 v8_str("method_data"), 9303 v8_str("method_data"),
9303 v8::Signature::New(fun_templ)); 9304 v8::Signature::New(fun_templ));
9304 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9305 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9305 proto_templ->Set(v8_str("method"), method_templ); 9306 proto_templ->Set(v8_str("method"), method_templ);
9306 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 9307 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
9307 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 9308 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
9308 NULL, NULL, NULL, NULL, 9309 NULL, NULL, NULL, NULL,
9309 v8::External::Wrap(&interceptor_call_count)); 9310 v8::External::Wrap(&interceptor_call_count));
9310 LocalContext context; 9311 LocalContext context;
9311 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9312 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9312 GenerateSomeGarbage(); 9313 GenerateSomeGarbage();
9313 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9314 context->Global()->Set(v8_str("o"), fun->NewInstance());
9314 v8::Handle<Value> value(CompileRun( 9315 CompileRun(
9315 "o.foo = 17;" 9316 "o.foo = 17;"
9316 "var receiver = {};" 9317 "var receiver = {};"
9317 "receiver.__proto__ = o;" 9318 "receiver.__proto__ = o;"
9318 "var result = 0;" 9319 "var result = 0;"
9319 "var saved_result = 0;" 9320 "var saved_result = 0;"
9320 "for (var i = 0; i < 100; i++) {" 9321 "for (var i = 0; i < 100; i++) {"
9321 " result = receiver.method(41);" 9322 " result = receiver.method(41);"
9322 " if (i == 50) {" 9323 " if (i == 50) {"
9323 " saved_result = result;" 9324 " saved_result = result;"
9324 " receiver = {method: function(x) { return x - 1 }};" 9325 " receiver = {method: function(x) { return x - 1 }};"
9325 " }" 9326 " }"
9326 "}")); 9327 "}");
9327 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); 9328 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value());
9328 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 9329 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
9329 CHECK_GE(interceptor_call_count, 50); 9330 CHECK_GE(interceptor_call_count, 50);
9330 } 9331 }
9331 9332
9332 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { 9333 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) {
9333 int interceptor_call_count = 0; 9334 int interceptor_call_count = 0;
9334 v8::HandleScope scope; 9335 v8::HandleScope scope;
9335 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 9336 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
9336 v8::Handle<v8::FunctionTemplate> method_templ = 9337 v8::Handle<v8::FunctionTemplate> method_templ =
9337 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 9338 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
9338 v8_str("method_data"), 9339 v8_str("method_data"),
9339 v8::Signature::New(fun_templ)); 9340 v8::Signature::New(fun_templ));
9340 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9341 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9341 proto_templ->Set(v8_str("method"), method_templ); 9342 proto_templ->Set(v8_str("method"), method_templ);
9342 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 9343 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
9343 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 9344 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
9344 NULL, NULL, NULL, NULL, 9345 NULL, NULL, NULL, NULL,
9345 v8::External::Wrap(&interceptor_call_count)); 9346 v8::External::Wrap(&interceptor_call_count));
9346 LocalContext context; 9347 LocalContext context;
9347 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9348 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9348 GenerateSomeGarbage(); 9349 GenerateSomeGarbage();
9349 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9350 context->Global()->Set(v8_str("o"), fun->NewInstance());
9350 v8::Handle<Value> value(CompileRun( 9351 CompileRun(
9351 "o.foo = 17;" 9352 "o.foo = 17;"
9352 "var receiver = {};" 9353 "var receiver = {};"
9353 "receiver.__proto__ = o;" 9354 "receiver.__proto__ = o;"
9354 "var result = 0;" 9355 "var result = 0;"
9355 "var saved_result = 0;" 9356 "var saved_result = 0;"
9356 "for (var i = 0; i < 100; i++) {" 9357 "for (var i = 0; i < 100; i++) {"
9357 " result = receiver.method(41);" 9358 " result = receiver.method(41);"
9358 " if (i == 50) {" 9359 " if (i == 50) {"
9359 " saved_result = result;" 9360 " saved_result = result;"
9360 " o.method = function(x) { return x - 1 };" 9361 " o.method = function(x) { return x - 1 };"
9361 " }" 9362 " }"
9362 "}")); 9363 "}");
9363 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); 9364 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value());
9364 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 9365 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
9365 CHECK_GE(interceptor_call_count, 50); 9366 CHECK_GE(interceptor_call_count, 50);
9366 } 9367 }
9367 9368
9368 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { 9369 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) {
9369 int interceptor_call_count = 0; 9370 int interceptor_call_count = 0;
9370 v8::HandleScope scope; 9371 v8::HandleScope scope;
9371 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 9372 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
9372 v8::Handle<v8::FunctionTemplate> method_templ = 9373 v8::Handle<v8::FunctionTemplate> method_templ =
9373 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 9374 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
9374 v8_str("method_data"), 9375 v8_str("method_data"),
9375 v8::Signature::New(fun_templ)); 9376 v8::Signature::New(fun_templ));
9376 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9377 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9377 proto_templ->Set(v8_str("method"), method_templ); 9378 proto_templ->Set(v8_str("method"), method_templ);
9378 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 9379 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
9379 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 9380 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
9380 NULL, NULL, NULL, NULL, 9381 NULL, NULL, NULL, NULL,
9381 v8::External::Wrap(&interceptor_call_count)); 9382 v8::External::Wrap(&interceptor_call_count));
9382 LocalContext context; 9383 LocalContext context;
9383 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9384 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9384 GenerateSomeGarbage(); 9385 GenerateSomeGarbage();
9385 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9386 context->Global()->Set(v8_str("o"), fun->NewInstance());
9386 v8::TryCatch try_catch; 9387 v8::TryCatch try_catch;
9387 v8::Handle<Value> value(CompileRun( 9388 CompileRun(
9388 "o.foo = 17;" 9389 "o.foo = 17;"
9389 "var receiver = {};" 9390 "var receiver = {};"
9390 "receiver.__proto__ = o;" 9391 "receiver.__proto__ = o;"
9391 "var result = 0;" 9392 "var result = 0;"
9392 "var saved_result = 0;" 9393 "var saved_result = 0;"
9393 "for (var i = 0; i < 100; i++) {" 9394 "for (var i = 0; i < 100; i++) {"
9394 " result = receiver.method(41);" 9395 " result = receiver.method(41);"
9395 " if (i == 50) {" 9396 " if (i == 50) {"
9396 " saved_result = result;" 9397 " saved_result = result;"
9397 " receiver = 333;" 9398 " receiver = 333;"
9398 " }" 9399 " }"
9399 "}")); 9400 "}");
9400 CHECK(try_catch.HasCaught()); 9401 CHECK(try_catch.HasCaught());
9401 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), 9402 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"),
9402 try_catch.Exception()->ToString()); 9403 try_catch.Exception()->ToString());
9403 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 9404 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
9404 CHECK_GE(interceptor_call_count, 50); 9405 CHECK_GE(interceptor_call_count, 50);
9405 } 9406 }
9406 9407
9407 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { 9408 THREADED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) {
9408 int interceptor_call_count = 0; 9409 int interceptor_call_count = 0;
9409 v8::HandleScope scope; 9410 v8::HandleScope scope;
9410 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 9411 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
9411 v8::Handle<v8::FunctionTemplate> method_templ = 9412 v8::Handle<v8::FunctionTemplate> method_templ =
9412 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 9413 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
9413 v8_str("method_data"), 9414 v8_str("method_data"),
9414 v8::Signature::New(fun_templ)); 9415 v8::Signature::New(fun_templ));
9415 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9416 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9416 proto_templ->Set(v8_str("method"), method_templ); 9417 proto_templ->Set(v8_str("method"), method_templ);
9417 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 9418 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
9418 templ->SetNamedPropertyHandler(InterceptorCallICFastApi, 9419 templ->SetNamedPropertyHandler(InterceptorCallICFastApi,
9419 NULL, NULL, NULL, NULL, 9420 NULL, NULL, NULL, NULL,
9420 v8::External::Wrap(&interceptor_call_count)); 9421 v8::External::Wrap(&interceptor_call_count));
9421 LocalContext context; 9422 LocalContext context;
9422 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9423 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9423 GenerateSomeGarbage(); 9424 GenerateSomeGarbage();
9424 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9425 context->Global()->Set(v8_str("o"), fun->NewInstance());
9425 v8::TryCatch try_catch; 9426 v8::TryCatch try_catch;
9426 v8::Handle<Value> value(CompileRun( 9427 CompileRun(
9427 "o.foo = 17;" 9428 "o.foo = 17;"
9428 "var receiver = {};" 9429 "var receiver = {};"
9429 "receiver.__proto__ = o;" 9430 "receiver.__proto__ = o;"
9430 "var result = 0;" 9431 "var result = 0;"
9431 "var saved_result = 0;" 9432 "var saved_result = 0;"
9432 "for (var i = 0; i < 100; i++) {" 9433 "for (var i = 0; i < 100; i++) {"
9433 " result = receiver.method(41);" 9434 " result = receiver.method(41);"
9434 " if (i == 50) {" 9435 " if (i == 50) {"
9435 " saved_result = result;" 9436 " saved_result = result;"
9436 " receiver = {method: receiver.method};" 9437 " receiver = {method: receiver.method};"
9437 " }" 9438 " }"
9438 "}")); 9439 "}");
9439 CHECK(try_catch.HasCaught()); 9440 CHECK(try_catch.HasCaught());
9440 CHECK_EQ(v8_str("TypeError: Illegal invocation"), 9441 CHECK_EQ(v8_str("TypeError: Illegal invocation"),
9441 try_catch.Exception()->ToString()); 9442 try_catch.Exception()->ToString());
9442 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 9443 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
9443 CHECK_GE(interceptor_call_count, 50); 9444 CHECK_GE(interceptor_call_count, 50);
9444 } 9445 }
9445 9446
9446 THREADED_TEST(CallICFastApi_TrivialSignature) { 9447 THREADED_TEST(CallICFastApi_TrivialSignature) {
9447 v8::HandleScope scope; 9448 v8::HandleScope scope;
9448 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 9449 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
9449 v8::Handle<v8::FunctionTemplate> method_templ = 9450 v8::Handle<v8::FunctionTemplate> method_templ =
9450 v8::FunctionTemplate::New(FastApiCallback_TrivialSignature, 9451 v8::FunctionTemplate::New(FastApiCallback_TrivialSignature,
9451 v8_str("method_data"), 9452 v8_str("method_data"),
9452 v8::Handle<v8::Signature>()); 9453 v8::Handle<v8::Signature>());
9453 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9454 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9454 proto_templ->Set(v8_str("method"), method_templ); 9455 proto_templ->Set(v8_str("method"), method_templ);
9455 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 9456 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
9457 USE(templ);
9456 LocalContext context; 9458 LocalContext context;
9457 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9459 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9458 GenerateSomeGarbage(); 9460 GenerateSomeGarbage();
9459 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9461 context->Global()->Set(v8_str("o"), fun->NewInstance());
9460 v8::Handle<Value> value(CompileRun( 9462 CompileRun(
9461 "var result = 0;" 9463 "var result = 0;"
9462 "for (var i = 0; i < 100; i++) {" 9464 "for (var i = 0; i < 100; i++) {"
9463 " result = o.method(41);" 9465 " result = o.method(41);"
9464 "}")); 9466 "}");
9465 9467
9466 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 9468 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
9467 } 9469 }
9468 9470
9469 THREADED_TEST(CallICFastApi_SimpleSignature) { 9471 THREADED_TEST(CallICFastApi_SimpleSignature) {
9470 v8::HandleScope scope; 9472 v8::HandleScope scope;
9471 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 9473 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
9472 v8::Handle<v8::FunctionTemplate> method_templ = 9474 v8::Handle<v8::FunctionTemplate> method_templ =
9473 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 9475 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
9474 v8_str("method_data"), 9476 v8_str("method_data"),
9475 v8::Signature::New(fun_templ)); 9477 v8::Signature::New(fun_templ));
9476 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9478 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9477 proto_templ->Set(v8_str("method"), method_templ); 9479 proto_templ->Set(v8_str("method"), method_templ);
9478 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 9480 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
9481 CHECK(!templ.IsEmpty());
9479 LocalContext context; 9482 LocalContext context;
9480 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9483 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9481 GenerateSomeGarbage(); 9484 GenerateSomeGarbage();
9482 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9485 context->Global()->Set(v8_str("o"), fun->NewInstance());
9483 v8::Handle<Value> value(CompileRun( 9486 CompileRun(
9484 "o.foo = 17;" 9487 "o.foo = 17;"
9485 "var receiver = {};" 9488 "var receiver = {};"
9486 "receiver.__proto__ = o;" 9489 "receiver.__proto__ = o;"
9487 "var result = 0;" 9490 "var result = 0;"
9488 "for (var i = 0; i < 100; i++) {" 9491 "for (var i = 0; i < 100; i++) {"
9489 " result = receiver.method(41);" 9492 " result = receiver.method(41);"
9490 "}")); 9493 "}");
9491 9494
9492 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 9495 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
9493 } 9496 }
9494 9497
9495 THREADED_TEST(CallICFastApi_SimpleSignature_Miss1) { 9498 THREADED_TEST(CallICFastApi_SimpleSignature_Miss1) {
9496 v8::HandleScope scope; 9499 v8::HandleScope scope;
9497 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 9500 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
9498 v8::Handle<v8::FunctionTemplate> method_templ = 9501 v8::Handle<v8::FunctionTemplate> method_templ =
9499 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 9502 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
9500 v8_str("method_data"), 9503 v8_str("method_data"),
9501 v8::Signature::New(fun_templ)); 9504 v8::Signature::New(fun_templ));
9502 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9505 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9503 proto_templ->Set(v8_str("method"), method_templ); 9506 proto_templ->Set(v8_str("method"), method_templ);
9504 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 9507 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
9508 CHECK(!templ.IsEmpty());
9505 LocalContext context; 9509 LocalContext context;
9506 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9510 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9507 GenerateSomeGarbage(); 9511 GenerateSomeGarbage();
9508 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9512 context->Global()->Set(v8_str("o"), fun->NewInstance());
9509 v8::Handle<Value> value(CompileRun( 9513 CompileRun(
9510 "o.foo = 17;" 9514 "o.foo = 17;"
9511 "var receiver = {};" 9515 "var receiver = {};"
9512 "receiver.__proto__ = o;" 9516 "receiver.__proto__ = o;"
9513 "var result = 0;" 9517 "var result = 0;"
9514 "var saved_result = 0;" 9518 "var saved_result = 0;"
9515 "for (var i = 0; i < 100; i++) {" 9519 "for (var i = 0; i < 100; i++) {"
9516 " result = receiver.method(41);" 9520 " result = receiver.method(41);"
9517 " if (i == 50) {" 9521 " if (i == 50) {"
9518 " saved_result = result;" 9522 " saved_result = result;"
9519 " receiver = {method: function(x) { return x - 1 }};" 9523 " receiver = {method: function(x) { return x - 1 }};"
9520 " }" 9524 " }"
9521 "}")); 9525 "}");
9522 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); 9526 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value());
9523 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 9527 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
9524 } 9528 }
9525 9529
9526 THREADED_TEST(CallICFastApi_SimpleSignature_Miss2) { 9530 THREADED_TEST(CallICFastApi_SimpleSignature_Miss2) {
9527 v8::HandleScope scope; 9531 v8::HandleScope scope;
9528 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); 9532 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New();
9529 v8::Handle<v8::FunctionTemplate> method_templ = 9533 v8::Handle<v8::FunctionTemplate> method_templ =
9530 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature, 9534 v8::FunctionTemplate::New(FastApiCallback_SimpleSignature,
9531 v8_str("method_data"), 9535 v8_str("method_data"),
9532 v8::Signature::New(fun_templ)); 9536 v8::Signature::New(fun_templ));
9533 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 9537 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
9534 proto_templ->Set(v8_str("method"), method_templ); 9538 proto_templ->Set(v8_str("method"), method_templ);
9535 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 9539 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
9540 CHECK(!templ.IsEmpty());
9536 LocalContext context; 9541 LocalContext context;
9537 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 9542 v8::Handle<v8::Function> fun = fun_templ->GetFunction();
9538 GenerateSomeGarbage(); 9543 GenerateSomeGarbage();
9539 context->Global()->Set(v8_str("o"), fun->NewInstance()); 9544 context->Global()->Set(v8_str("o"), fun->NewInstance());
9540 v8::TryCatch try_catch; 9545 v8::TryCatch try_catch;
9541 v8::Handle<Value> value(CompileRun( 9546 CompileRun(
9542 "o.foo = 17;" 9547 "o.foo = 17;"
9543 "var receiver = {};" 9548 "var receiver = {};"
9544 "receiver.__proto__ = o;" 9549 "receiver.__proto__ = o;"
9545 "var result = 0;" 9550 "var result = 0;"
9546 "var saved_result = 0;" 9551 "var saved_result = 0;"
9547 "for (var i = 0; i < 100; i++) {" 9552 "for (var i = 0; i < 100; i++) {"
9548 " result = receiver.method(41);" 9553 " result = receiver.method(41);"
9549 " if (i == 50) {" 9554 " if (i == 50) {"
9550 " saved_result = result;" 9555 " saved_result = result;"
9551 " receiver = 333;" 9556 " receiver = 333;"
9552 " }" 9557 " }"
9553 "}")); 9558 "}");
9554 CHECK(try_catch.HasCaught()); 9559 CHECK(try_catch.HasCaught());
9555 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), 9560 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"),
9556 try_catch.Exception()->ToString()); 9561 try_catch.Exception()->ToString());
9557 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 9562 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
9558 } 9563 }
9559 9564
9560 9565
9561 v8::Handle<Value> keyed_call_ic_function; 9566 v8::Handle<Value> keyed_call_ic_function;
9562 9567
9563 static v8::Handle<Value> InterceptorKeyedCallICGetter( 9568 static v8::Handle<Value> InterceptorKeyedCallICGetter(
9564 Local<String> name, const AccessorInfo& info) { 9569 Local<String> name, const AccessorInfo& info) {
9565 ApiTestFuzzer::Fuzz(); 9570 ApiTestFuzzer::Fuzz();
9566 if (v8_str("x")->Equals(name)) { 9571 if (v8_str("x")->Equals(name)) {
9567 return keyed_call_ic_function; 9572 return keyed_call_ic_function;
9568 } 9573 }
9569 return v8::Handle<Value>(); 9574 return v8::Handle<Value>();
9570 } 9575 }
9571 9576
9572 9577
9573 // Test the case when we stored cacheable lookup into 9578 // Test the case when we stored cacheable lookup into
9574 // a stub, but the function name changed (to another cacheable function). 9579 // a stub, but the function name changed (to another cacheable function).
9575 THREADED_TEST(InterceptorKeyedCallICKeyChange1) { 9580 THREADED_TEST(InterceptorKeyedCallICKeyChange1) {
9576 v8::HandleScope scope; 9581 v8::HandleScope scope;
9577 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 9582 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
9578 templ->SetNamedPropertyHandler(NoBlockGetterX); 9583 templ->SetNamedPropertyHandler(NoBlockGetterX);
9579 LocalContext context; 9584 LocalContext context;
9580 context->Global()->Set(v8_str("o"), templ->NewInstance()); 9585 context->Global()->Set(v8_str("o"), templ->NewInstance());
9581 v8::Handle<Value> value(CompileRun( 9586 CompileRun(
9582 "proto = new Object();" 9587 "proto = new Object();"
9583 "proto.y = function(x) { return x + 1; };" 9588 "proto.y = function(x) { return x + 1; };"
9584 "proto.z = function(x) { return x - 1; };" 9589 "proto.z = function(x) { return x - 1; };"
9585 "o.__proto__ = proto;" 9590 "o.__proto__ = proto;"
9586 "var result = 0;" 9591 "var result = 0;"
9587 "var method = 'y';" 9592 "var method = 'y';"
9588 "for (var i = 0; i < 10; i++) {" 9593 "for (var i = 0; i < 10; i++) {"
9589 " if (i == 5) { method = 'z'; };" 9594 " if (i == 5) { method = 'z'; };"
9590 " result += o[method](41);" 9595 " result += o[method](41);"
9591 "}")); 9596 "}");
9592 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 9597 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
9593 } 9598 }
9594 9599
9595 9600
9596 // Test the case when we stored cacheable lookup into 9601 // Test the case when we stored cacheable lookup into
9597 // a stub, but the function name changed (and the new function is present 9602 // a stub, but the function name changed (and the new function is present
9598 // both before and after the interceptor in the prototype chain). 9603 // both before and after the interceptor in the prototype chain).
9599 THREADED_TEST(InterceptorKeyedCallICKeyChange2) { 9604 THREADED_TEST(InterceptorKeyedCallICKeyChange2) {
9600 v8::HandleScope scope; 9605 v8::HandleScope scope;
9601 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 9606 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
9602 templ->SetNamedPropertyHandler(InterceptorKeyedCallICGetter); 9607 templ->SetNamedPropertyHandler(InterceptorKeyedCallICGetter);
9603 LocalContext context; 9608 LocalContext context;
9604 context->Global()->Set(v8_str("proto1"), templ->NewInstance()); 9609 context->Global()->Set(v8_str("proto1"), templ->NewInstance());
9605 keyed_call_ic_function = 9610 keyed_call_ic_function =
9606 v8_compile("function f(x) { return x - 1; }; f")->Run(); 9611 v8_compile("function f(x) { return x - 1; }; f")->Run();
9607 v8::Handle<Value> value(CompileRun( 9612 CompileRun(
9608 "o = new Object();" 9613 "o = new Object();"
9609 "proto2 = new Object();" 9614 "proto2 = new Object();"
9610 "o.y = function(x) { return x + 1; };" 9615 "o.y = function(x) { return x + 1; };"
9611 "proto2.y = function(x) { return x + 2; };" 9616 "proto2.y = function(x) { return x + 2; };"
9612 "o.__proto__ = proto1;" 9617 "o.__proto__ = proto1;"
9613 "proto1.__proto__ = proto2;" 9618 "proto1.__proto__ = proto2;"
9614 "var result = 0;" 9619 "var result = 0;"
9615 "var method = 'x';" 9620 "var method = 'x';"
9616 "for (var i = 0; i < 10; i++) {" 9621 "for (var i = 0; i < 10; i++) {"
9617 " if (i == 5) { method = 'y'; };" 9622 " if (i == 5) { method = 'y'; };"
9618 " result += o[method](41);" 9623 " result += o[method](41);"
9619 "}")); 9624 "}");
9620 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 9625 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
9621 } 9626 }
9622 9627
9623 9628
9624 // Same as InterceptorKeyedCallICKeyChange1 only the cacheable function sit 9629 // Same as InterceptorKeyedCallICKeyChange1 only the cacheable function sit
9625 // on the global object. 9630 // on the global object.
9626 THREADED_TEST(InterceptorKeyedCallICKeyChangeOnGlobal) { 9631 THREADED_TEST(InterceptorKeyedCallICKeyChangeOnGlobal) {
9627 v8::HandleScope scope; 9632 v8::HandleScope scope;
9628 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); 9633 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New();
9629 templ->SetNamedPropertyHandler(NoBlockGetterX); 9634 templ->SetNamedPropertyHandler(NoBlockGetterX);
9630 LocalContext context; 9635 LocalContext context;
9631 context->Global()->Set(v8_str("o"), templ->NewInstance()); 9636 context->Global()->Set(v8_str("o"), templ->NewInstance());
9632 v8::Handle<Value> value(CompileRun( 9637 CompileRun(
9633 "function inc(x) { return x + 1; };" 9638 "function inc(x) { return x + 1; };"
9634 "inc(1);" 9639 "inc(1);"
9635 "function dec(x) { return x - 1; };" 9640 "function dec(x) { return x - 1; };"
9636 "dec(1);" 9641 "dec(1);"
9637 "o.__proto__ = this;" 9642 "o.__proto__ = this;"
9638 "this.__proto__.x = inc;" 9643 "this.__proto__.x = inc;"
9639 "this.__proto__.y = dec;" 9644 "this.__proto__.y = dec;"
9640 "var result = 0;" 9645 "var result = 0;"
9641 "var method = 'x';" 9646 "var method = 'x';"
9642 "for (var i = 0; i < 10; i++) {" 9647 "for (var i = 0; i < 10; i++) {"
9643 " if (i == 5) { method = 'y'; };" 9648 " if (i == 5) { method = 'y'; };"
9644 " result += o[method](41);" 9649 " result += o[method](41);"
9645 "}")); 9650 "}");
9646 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 9651 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
9647 } 9652 }
9648 9653
9649 9654
9650 // Test the case when actual function to call sits on global object. 9655 // Test the case when actual function to call sits on global object.
9651 THREADED_TEST(InterceptorKeyedCallICFromGlobal) { 9656 THREADED_TEST(InterceptorKeyedCallICFromGlobal) {
9652 v8::HandleScope scope; 9657 v8::HandleScope scope;
9653 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 9658 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
9654 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 9659 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
9655 LocalContext context; 9660 LocalContext context;
9656 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 9661 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
9657 9662
9658 v8::Handle<Value> value(CompileRun( 9663 CompileRun(
9659 "function len(x) { return x.length; };" 9664 "function len(x) { return x.length; };"
9660 "o.__proto__ = this;" 9665 "o.__proto__ = this;"
9661 "var m = 'parseFloat';" 9666 "var m = 'parseFloat';"
9662 "var result = 0;" 9667 "var result = 0;"
9663 "for (var i = 0; i < 10; i++) {" 9668 "for (var i = 0; i < 10; i++) {"
9664 " if (i == 5) {" 9669 " if (i == 5) {"
9665 " m = 'len';" 9670 " m = 'len';"
9666 " saved_result = result;" 9671 " saved_result = result;"
9667 " };" 9672 " };"
9668 " result = o[m]('239');" 9673 " result = o[m]('239');"
9669 "}")); 9674 "}");
9670 CHECK_EQ(3, context->Global()->Get(v8_str("result"))->Int32Value()); 9675 CHECK_EQ(3, context->Global()->Get(v8_str("result"))->Int32Value());
9671 CHECK_EQ(239, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 9676 CHECK_EQ(239, context->Global()->Get(v8_str("saved_result"))->Int32Value());
9672 } 9677 }
9673 9678
9674 // Test the map transition before the interceptor. 9679 // Test the map transition before the interceptor.
9675 THREADED_TEST(InterceptorKeyedCallICMapChangeBefore) { 9680 THREADED_TEST(InterceptorKeyedCallICMapChangeBefore) {
9676 v8::HandleScope scope; 9681 v8::HandleScope scope;
9677 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 9682 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
9678 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 9683 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
9679 LocalContext context; 9684 LocalContext context;
9680 context->Global()->Set(v8_str("proto"), templ_o->NewInstance()); 9685 context->Global()->Set(v8_str("proto"), templ_o->NewInstance());
9681 9686
9682 v8::Handle<Value> value(CompileRun( 9687 CompileRun(
9683 "var o = new Object();" 9688 "var o = new Object();"
9684 "o.__proto__ = proto;" 9689 "o.__proto__ = proto;"
9685 "o.method = function(x) { return x + 1; };" 9690 "o.method = function(x) { return x + 1; };"
9686 "var m = 'method';" 9691 "var m = 'method';"
9687 "var result = 0;" 9692 "var result = 0;"
9688 "for (var i = 0; i < 10; i++) {" 9693 "for (var i = 0; i < 10; i++) {"
9689 " if (i == 5) { o.method = function(x) { return x - 1; }; };" 9694 " if (i == 5) { o.method = function(x) { return x - 1; }; };"
9690 " result += o[m](41);" 9695 " result += o[m](41);"
9691 "}")); 9696 "}");
9692 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 9697 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
9693 } 9698 }
9694 9699
9695 9700
9696 // Test the map transition after the interceptor. 9701 // Test the map transition after the interceptor.
9697 THREADED_TEST(InterceptorKeyedCallICMapChangeAfter) { 9702 THREADED_TEST(InterceptorKeyedCallICMapChangeAfter) {
9698 v8::HandleScope scope; 9703 v8::HandleScope scope;
9699 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New(); 9704 v8::Handle<v8::ObjectTemplate> templ_o = ObjectTemplate::New();
9700 templ_o->SetNamedPropertyHandler(NoBlockGetterX); 9705 templ_o->SetNamedPropertyHandler(NoBlockGetterX);
9701 LocalContext context; 9706 LocalContext context;
9702 context->Global()->Set(v8_str("o"), templ_o->NewInstance()); 9707 context->Global()->Set(v8_str("o"), templ_o->NewInstance());
9703 9708
9704 v8::Handle<Value> value(CompileRun( 9709 CompileRun(
9705 "var proto = new Object();" 9710 "var proto = new Object();"
9706 "o.__proto__ = proto;" 9711 "o.__proto__ = proto;"
9707 "proto.method = function(x) { return x + 1; };" 9712 "proto.method = function(x) { return x + 1; };"
9708 "var m = 'method';" 9713 "var m = 'method';"
9709 "var result = 0;" 9714 "var result = 0;"
9710 "for (var i = 0; i < 10; i++) {" 9715 "for (var i = 0; i < 10; i++) {"
9711 " if (i == 5) { proto.method = function(x) { return x - 1; }; };" 9716 " if (i == 5) { proto.method = function(x) { return x - 1; }; };"
9712 " result += o[m](41);" 9717 " result += o[m](41);"
9713 "}")); 9718 "}");
9714 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 9719 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
9715 } 9720 }
9716 9721
9717 9722
9718 static int interceptor_call_count = 0; 9723 static int interceptor_call_count = 0;
9719 9724
9720 static v8::Handle<Value> InterceptorICRefErrorGetter(Local<String> name, 9725 static v8::Handle<Value> InterceptorICRefErrorGetter(Local<String> name,
9721 const AccessorInfo& info) { 9726 const AccessorInfo& info) {
9722 ApiTestFuzzer::Fuzz(); 9727 ApiTestFuzzer::Fuzz();
9723 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) { 9728 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) {
(...skipping 896 matching lines...) Expand 10 before | Expand all | Expand 10 after
10620 return value; 10625 return value;
10621 } 10626 }
10622 10627
10623 10628
10624 THREADED_TEST(NestedHandleScopeAndContexts) { 10629 THREADED_TEST(NestedHandleScopeAndContexts) {
10625 v8::HandleScope outer; 10630 v8::HandleScope outer;
10626 v8::Persistent<Context> env = Context::New(); 10631 v8::Persistent<Context> env = Context::New();
10627 env->Enter(); 10632 env->Enter();
10628 v8::Handle<Value> value = NestedScope(env); 10633 v8::Handle<Value> value = NestedScope(env);
10629 v8::Handle<String> str(value->ToString()); 10634 v8::Handle<String> str(value->ToString());
10635 CHECK(!str.IsEmpty());
10630 env->Exit(); 10636 env->Exit();
10631 env.Dispose(); 10637 env.Dispose();
10632 } 10638 }
10633 10639
10634 10640
10635 THREADED_TEST(ExternalAllocatedMemory) { 10641 THREADED_TEST(ExternalAllocatedMemory) {
10636 v8::HandleScope outer; 10642 v8::HandleScope outer;
10637 v8::Persistent<Context> env(Context::New()); 10643 v8::Persistent<Context> env(Context::New());
10644 CHECK(!env.IsEmpty());
10638 const int kSize = 1024*1024; 10645 const int kSize = 1024*1024;
10639 CHECK_EQ(v8::V8::AdjustAmountOfExternalAllocatedMemory(kSize), kSize); 10646 CHECK_EQ(v8::V8::AdjustAmountOfExternalAllocatedMemory(kSize), kSize);
10640 CHECK_EQ(v8::V8::AdjustAmountOfExternalAllocatedMemory(-kSize), 0); 10647 CHECK_EQ(v8::V8::AdjustAmountOfExternalAllocatedMemory(-kSize), 0);
10641 } 10648 }
10642 10649
10643 10650
10644 THREADED_TEST(DisposeEnteredContext) { 10651 THREADED_TEST(DisposeEnteredContext) {
10645 v8::HandleScope scope; 10652 v8::HandleScope scope;
10646 LocalContext outer; 10653 LocalContext outer;
10647 { v8::Persistent<v8::Context> inner = v8::Context::New(); 10654 { v8::Persistent<v8::Context> inner = v8::Context::New();
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
10966 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 10973 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
10967 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker, 10974 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker,
10968 IndexedSetAccessBlocker); 10975 IndexedSetAccessBlocker);
10969 i::Handle<i::ObjectTemplateInfo> internal_template = 10976 i::Handle<i::ObjectTemplateInfo> internal_template =
10970 v8::Utils::OpenHandle(*global_template); 10977 v8::Utils::OpenHandle(*global_template);
10971 CHECK(!internal_template->constructor()->IsUndefined()); 10978 CHECK(!internal_template->constructor()->IsUndefined());
10972 i::Handle<i::FunctionTemplateInfo> constructor( 10979 i::Handle<i::FunctionTemplateInfo> constructor(
10973 i::FunctionTemplateInfo::cast(internal_template->constructor())); 10980 i::FunctionTemplateInfo::cast(internal_template->constructor()));
10974 CHECK(!constructor->access_check_info()->IsUndefined()); 10981 CHECK(!constructor->access_check_info()->IsUndefined());
10975 v8::Persistent<Context> context0(Context::New(NULL, global_template)); 10982 v8::Persistent<Context> context0(Context::New(NULL, global_template));
10983 CHECK(!context0.IsEmpty());
10976 CHECK(!constructor->access_check_info()->IsUndefined()); 10984 CHECK(!constructor->access_check_info()->IsUndefined());
10977 } 10985 }
10978 10986
10979 10987
10980 THREADED_TEST(TurnOnAccessCheck) { 10988 THREADED_TEST(TurnOnAccessCheck) {
10981 v8::HandleScope handle_scope; 10989 v8::HandleScope handle_scope;
10982 10990
10983 // Create an environment with access check to the global object disabled by 10991 // Create an environment with access check to the global object disabled by
10984 // default. 10992 // default.
10985 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 10993 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
(...skipping 2055 matching lines...) Expand 10 before | Expand all | Expand 10 after
13041 // Test more complex manipulations which cause eax to contain values 13049 // Test more complex manipulations which cause eax to contain values
13042 // that won't be completely overwritten by loads from the arrays. 13050 // that won't be completely overwritten by loads from the arrays.
13043 // This catches bugs in the instructions used for the KeyedLoadIC 13051 // This catches bugs in the instructions used for the KeyedLoadIC
13044 // for byte and word types. 13052 // for byte and word types.
13045 { 13053 {
13046 const int kXSize = 300; 13054 const int kXSize = 300;
13047 const int kYSize = 300; 13055 const int kYSize = 300;
13048 const int kLargeElementCount = kXSize * kYSize * 4; 13056 const int kLargeElementCount = kXSize * kYSize * 4;
13049 ElementType* large_array_data = 13057 ElementType* large_array_data =
13050 static_cast<ElementType*>(malloc(kLargeElementCount * element_size)); 13058 static_cast<ElementType*>(malloc(kLargeElementCount * element_size));
13051 i::Handle<ExternalArrayClass> large_array(
13052 i::Handle<ExternalArrayClass>::cast(
13053 FACTORY->NewExternalArray(kLargeElementCount,
13054 array_type,
13055 array_data)));
13056 v8::Handle<v8::Object> large_obj = v8::Object::New(); 13059 v8::Handle<v8::Object> large_obj = v8::Object::New();
13057 // Set the elements to be the external array. 13060 // Set the elements to be the external array.
13058 large_obj->SetIndexedPropertiesToExternalArrayData(large_array_data, 13061 large_obj->SetIndexedPropertiesToExternalArrayData(large_array_data,
13059 array_type, 13062 array_type,
13060 kLargeElementCount); 13063 kLargeElementCount);
13061 context->Global()->Set(v8_str("large_array"), large_obj); 13064 context->Global()->Set(v8_str("large_array"), large_obj);
13062 // Initialize contents of a few rows. 13065 // Initialize contents of a few rows.
13063 for (int x = 0; x < 300; x++) { 13066 for (int x = 0; x < 300; x++) {
13064 int row = 0; 13067 int row = 0;
13065 int offset = row * 300 * 4; 13068 int offset = row * 300 * 4;
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
13446 " var y; AnalyzeStackInNativeCode(1);\n" 13449 " var y; AnalyzeStackInNativeCode(1);\n"
13447 "}\n" 13450 "}\n"
13448 "function foo() {\n" 13451 "function foo() {\n"
13449 "\n" 13452 "\n"
13450 " bar();\n" 13453 " bar();\n"
13451 "}\n" 13454 "}\n"
13452 "var x;eval('new foo();');"; 13455 "var x;eval('new foo();');";
13453 v8::Handle<v8::String> overview_src = v8::String::New(overview_source); 13456 v8::Handle<v8::String> overview_src = v8::String::New(overview_source);
13454 v8::Handle<Value> overview_result( 13457 v8::Handle<Value> overview_result(
13455 v8::Script::New(overview_src, origin)->Run()); 13458 v8::Script::New(overview_src, origin)->Run());
13456 ASSERT(!overview_result.IsEmpty()); 13459 CHECK(!overview_result.IsEmpty());
13457 ASSERT(overview_result->IsObject()); 13460 CHECK(overview_result->IsObject());
13458 13461
13459 // Test getting DETAILED information. 13462 // Test getting DETAILED information.
13460 const char *detailed_source = 13463 const char *detailed_source =
13461 "function bat() {AnalyzeStackInNativeCode(2);\n" 13464 "function bat() {AnalyzeStackInNativeCode(2);\n"
13462 "}\n" 13465 "}\n"
13463 "\n" 13466 "\n"
13464 "function baz() {\n" 13467 "function baz() {\n"
13465 " bat();\n" 13468 " bat();\n"
13466 "}\n" 13469 "}\n"
13467 "eval('new baz();');"; 13470 "eval('new baz();');";
13468 v8::Handle<v8::String> detailed_src = v8::String::New(detailed_source); 13471 v8::Handle<v8::String> detailed_src = v8::String::New(detailed_source);
13469 // Make the script using a non-zero line and column offset. 13472 // Make the script using a non-zero line and column offset.
13470 v8::Handle<v8::Integer> line_offset = v8::Integer::New(3); 13473 v8::Handle<v8::Integer> line_offset = v8::Integer::New(3);
13471 v8::Handle<v8::Integer> column_offset = v8::Integer::New(5); 13474 v8::Handle<v8::Integer> column_offset = v8::Integer::New(5);
13472 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); 13475 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset);
13473 v8::Handle<v8::Script> detailed_script( 13476 v8::Handle<v8::Script> detailed_script(
13474 v8::Script::New(detailed_src, &detailed_origin)); 13477 v8::Script::New(detailed_src, &detailed_origin));
13475 v8::Handle<Value> detailed_result(detailed_script->Run()); 13478 v8::Handle<Value> detailed_result(detailed_script->Run());
13476 ASSERT(!detailed_result.IsEmpty()); 13479 CHECK(!detailed_result.IsEmpty());
13477 ASSERT(detailed_result->IsObject()); 13480 CHECK(detailed_result->IsObject());
13478 } 13481 }
13479 13482
13480 13483
13481 static void StackTraceForUncaughtExceptionListener( 13484 static void StackTraceForUncaughtExceptionListener(
13482 v8::Handle<v8::Message> message, 13485 v8::Handle<v8::Message> message,
13483 v8::Handle<Value>) { 13486 v8::Handle<Value>) {
13484 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); 13487 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace();
13485 CHECK_EQ(2, stack_trace->GetFrameCount()); 13488 CHECK_EQ(2, stack_trace->GetFrameCount());
13486 checkStackFrame("origin", "foo", 2, 3, false, false, 13489 checkStackFrame("origin", "foo", 2, 3, false, false,
13487 stack_trace->GetFrame(0)); 13490 stack_trace->GetFrame(0));
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
13887 #endif 13890 #endif
13888 } 13891 }
13889 } 13892 }
13890 } 13893 }
13891 13894
13892 13895
13893 static v8::Handle<Value> SpaghettiIncident(const v8::Arguments& args) { 13896 static v8::Handle<Value> SpaghettiIncident(const v8::Arguments& args) {
13894 v8::HandleScope scope; 13897 v8::HandleScope scope;
13895 v8::TryCatch tc; 13898 v8::TryCatch tc;
13896 v8::Handle<v8::String> str(args[0]->ToString()); 13899 v8::Handle<v8::String> str(args[0]->ToString());
13900 USE(str);
13897 if (tc.HasCaught()) 13901 if (tc.HasCaught())
13898 return tc.ReThrow(); 13902 return tc.ReThrow();
13899 return v8::Undefined(); 13903 return v8::Undefined();
13900 } 13904 }
13901 13905
13902 13906
13903 // Test that an exception can be propagated down through a spaghetti 13907 // Test that an exception can be propagated down through a spaghetti
13904 // stack using ReThrow. 13908 // stack using ReThrow.
13905 THREADED_TEST(SpaghettiStackReThrow) { 13909 THREADED_TEST(SpaghettiStackReThrow) {
13906 v8::HandleScope scope; 13910 v8::HandleScope scope;
(...skipping 1278 matching lines...) Expand 10 before | Expand all | Expand 10 after
15185 CHECK(re->GetSource()->Equals(v8_str("foobarbaz"))); 15189 CHECK(re->GetSource()->Equals(v8_str("foobarbaz")));
15186 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline, 15190 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline,
15187 static_cast<int>(re->GetFlags())); 15191 static_cast<int>(re->GetFlags()));
15188 15192
15189 context->Global()->Set(v8_str("re"), re); 15193 context->Global()->Set(v8_str("re"), re);
15190 ExpectTrue("re.test('FoobarbaZ')"); 15194 ExpectTrue("re.test('FoobarbaZ')");
15191 15195
15192 // RegExps are objects on which you can set properties. 15196 // RegExps are objects on which you can set properties.
15193 re->Set(v8_str("property"), v8::Integer::New(32)); 15197 re->Set(v8_str("property"), v8::Integer::New(32));
15194 v8::Handle<v8::Value> value(CompileRun("re.property")); 15198 v8::Handle<v8::Value> value(CompileRun("re.property"));
15195 ASSERT_EQ(32, value->Int32Value()); 15199 CHECK_EQ(32, value->Int32Value());
15196 15200
15197 v8::TryCatch try_catch; 15201 v8::TryCatch try_catch;
15198 re = v8::RegExp::New(v8_str("foo["), v8::RegExp::kNone); 15202 re = v8::RegExp::New(v8_str("foo["), v8::RegExp::kNone);
15199 CHECK(re.IsEmpty()); 15203 CHECK(re.IsEmpty());
15200 CHECK(try_catch.HasCaught()); 15204 CHECK(try_catch.HasCaught());
15201 context->Global()->Set(v8_str("ex"), try_catch.Exception()); 15205 context->Global()->Set(v8_str("ex"), try_catch.Exception());
15202 ExpectTrue("ex instanceof SyntaxError"); 15206 ExpectTrue("ex instanceof SyntaxError");
15203 } 15207 }
15204 15208
15205 15209
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after
15926 CompileRun("throw 'exception';"); 15930 CompileRun("throw 'exception';");
15927 } 15931 }
15928 15932
15929 15933
15930 TEST(CallCompletedCallbackTwoExceptions) { 15934 TEST(CallCompletedCallbackTwoExceptions) {
15931 v8::HandleScope scope; 15935 v8::HandleScope scope;
15932 LocalContext env; 15936 LocalContext env;
15933 v8::V8::AddCallCompletedCallback(CallCompletedCallbackException); 15937 v8::V8::AddCallCompletedCallback(CallCompletedCallbackException);
15934 CompileRun("throw 'first exception';"); 15938 CompileRun("throw 'first exception';");
15935 } 15939 }
OLDNEW
« no previous file with comments | « src/x64/lithium-x64.cc ('k') | test/cctest/test-compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698