| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index fee040271d286c772906ca8bc20c9c46bac31302..6f94007f11361ab95edc2e6a95a3e6112d0edae2 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -21939,7 +21939,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.
|
| @@ -21952,8 +21972,15 @@ class ApiCallOptimizationChecker {
|
| Local<v8::FunctionTemplate> 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();
|
| }
|
| @@ -21967,15 +21994,17 @@ class ApiCallOptimizationChecker {
|
| // Get the holder objects.
|
| Local<Object> inner_global =
|
| Local<Object>::Cast(context->Global()->GetPrototype());
|
| - Local<Object> function_holder =
|
| - Local<Object>::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<FunctionTemplate> function_template = FunctionTemplate::New(
|
| isolate, OptimizationCallback, data, signature);
|
| Local<Function> function = function_template->GetFunction();
|
| - Local<Object> global_holder = Local<Object>::Cast(
|
| - inner_global->GetPrototype());
|
| + Local<Object> global_holder = inner_global;
|
| + Local<Object> function_holder = function_receiver;
|
| + if (signature_type == kSignatureOnPrototype) {
|
| + function_holder = Local<Object>::Cast(function_holder->GetPrototype());
|
| + global_holder = Local<Object>::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);
|
| @@ -21990,7 +22019,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<Object>::Cast(CompileRun(
|
| "var receiver_subclass = {};\n"
|
| "receiver_subclass.__proto__ = function_receiver;\n"
|
| @@ -22002,9 +22031,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<char> wrap_function(200);
|
| if (global) {
|
| i::OS::SNPrintF(
|
| @@ -22063,8 +22091,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();
|
| }
|
|
|