From ce789e88909a85c3656c2b577eb5210148a929df Mon Sep 17 00:00:00 2001 From: "dcarney@chromium.org" Date: Tue, 11 Feb 2014 12:49:15 +0000 Subject: [PATCH] Add more test cases for api function inlining R=verwaest@chromium.org BUG= Review URL: https://codereview.chromium.org/154283003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19278 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- test/cctest/test-api.cc | 55 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index 447cd26..2047370 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -21836,7 +21836,27 @@ class ApiCallOptimizationChecker { } public: - void Run(bool use_signature, bool global) { + enum SignatureType { + kNoSignature, + kSignatureOnReceiver, + kSignatureOnPrototype + }; + + void RunAll() { + SignatureType signature_types[] = + {kNoSignature, kSignatureOnReceiver, kSignatureOnPrototype}; + for (unsigned i = 0; i < ARRAY_SIZE(signature_types); i++) { + SignatureType signature_type = signature_types[i]; + for (int j = 0; j < 2; j++) { + bool global = j == 0; + int key = signature_type + + ARRAY_SIZE(signature_types) * (global ? 1 : 0); + Run(signature_type, global, key); + } + } + } + + void Run(SignatureType signature_type, bool global, int key) { v8::Isolate* isolate = CcTest::isolate(); v8::HandleScope scope(isolate); // Build a template for signature checks. @@ -21849,8 +21869,15 @@ class ApiCallOptimizationChecker { Local function_template = FunctionTemplate::New(isolate); function_template->Inherit(parent_template); - if (use_signature) { - signature = v8::Signature::New(isolate, parent_template); + switch (signature_type) { + case kNoSignature: + break; + case kSignatureOnReceiver: + signature = v8::Signature::New(isolate, function_template); + break; + case kSignatureOnPrototype: + signature = v8::Signature::New(isolate, parent_template); + break; } signature_template = function_template->InstanceTemplate(); } @@ -21864,15 +21891,17 @@ class ApiCallOptimizationChecker { // Get the holder objects. Local inner_global = Local::Cast(context->Global()->GetPrototype()); - Local function_holder = - Local::Cast(function_receiver->GetPrototype()); - // Install function on hidden prototype object. + // Install functions on hidden prototype object if there is one. data = Object::New(isolate); Local function_template = FunctionTemplate::New( isolate, OptimizationCallback, data, signature); Local function = function_template->GetFunction(); - Local global_holder = Local::Cast( - inner_global->GetPrototype()); + Local global_holder = inner_global; + Local function_holder = function_receiver; + if (signature_type == kSignatureOnPrototype) { + function_holder = Local::Cast(function_holder->GetPrototype()); + global_holder = Local::Cast(global_holder->GetPrototype()); + } global_holder->Set(v8_str("g_f"), function); SetAccessorProperty(global_holder, v8_str("g_acc"), function, function); function_holder->Set(v8_str("f"), function); @@ -21887,7 +21916,7 @@ class ApiCallOptimizationChecker { holder = function_receiver; // If not using a signature, add something else to the prototype chain // to test the case that holder != receiver - if (!use_signature) { + if (signature_type == kNoSignature) { receiver = Local::Cast(CompileRun( "var receiver_subclass = {};\n" "receiver_subclass.__proto__ = function_receiver;\n" @@ -21899,9 +21928,8 @@ class ApiCallOptimizationChecker { } } // With no signature, the holder is not set. - if (!use_signature) holder = receiver; + if (signature_type == kNoSignature) holder = receiver; // build wrap_function - int key = (use_signature ? 1 : 0) + 2 * (global ? 1 : 0); i::ScopedVector wrap_function(200); if (global) { i::OS::SNPrintF( @@ -21960,8 +21988,5 @@ int ApiCallOptimizationChecker::count = 0; TEST(TestFunctionCallOptimization) { i::FLAG_allow_natives_syntax = true; ApiCallOptimizationChecker checker; - checker.Run(true, true); - checker.Run(false, true); - checker.Run(true, false); - checker.Run(false, false); + checker.RunAll(); } -- 2.7.4