From 6cff35044d1876b5b89b70abd045d92098724a3b Mon Sep 17 00:00:00 2001 From: "antonm@chromium.org" Date: Thu, 29 Apr 2010 13:58:39 +0000 Subject: [PATCH] Add ability to bail out from custom call generators to x64 and ARM platforms. http://code.google.com/p/v8/source/detail?r=4503 added this functionality to ia32. Review URL: http://codereview.chromium.org/1694018 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4549 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/stub-cache-arm.cc | 16 +++++++++++++++- src/x64/stub-cache-x64.cc | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc index 18a55c1..fd0d248 100644 --- a/src/arm/stub-cache-arm.cc +++ b/src/arm/stub-cache-arm.cc @@ -1087,6 +1087,11 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, // -- lr : return address // ----------------------------------- + // If object is not an array, bail out to regular call. + if (!object->IsJSArray()) { + return Heap::undefined_value(); + } + // TODO(639): faster implementation. ASSERT(check == RECEIVER_MAP_CHECK); @@ -1136,6 +1141,11 @@ Object* CallStubCompiler::CompileArrayPopCall(Object* object, // -- lr : return address // ----------------------------------- + // If object is not an array, bail out to regular call. + if (!object->IsJSArray()) { + return Heap::undefined_value(); + } + // TODO(642): faster implementation. ASSERT(check == RECEIVER_MAP_CHECK); @@ -1188,7 +1198,11 @@ Object* CallStubCompiler::CompileCallConstant(Object* object, if (function_info->HasCustomCallGenerator()) { CustomCallGenerator generator = ToCData(function_info->function_data()); - return generator(this, object, holder, function, name, check); + Object* result = generator(this, object, holder, function, name, check); + // undefined means bail out to regular compiler. + if (!result->IsUndefined()) { + return result; + } } Label miss_in_smi_check; diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc index bc82fc9..94f5efa 100644 --- a/src/x64/stub-cache-x64.cc +++ b/src/x64/stub-cache-x64.cc @@ -869,6 +869,11 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, // rsp[(argc + 1) * 8] : argument 0 = receiver // ----------------------------------- + // If object is not an array, bail out to regular call. + if (!object->IsJSArray()) { + return Heap::undefined_value(); + } + // TODO(639): faster implementation. ASSERT(check == RECEIVER_MAP_CHECK); @@ -925,6 +930,11 @@ Object* CallStubCompiler::CompileArrayPopCall(Object* object, // rsp[(argc + 1) * 8] : argument 0 = receiver // ----------------------------------- + // If object is not an array, bail out to regular call. + if (!object->IsJSArray()) { + return Heap::undefined_value(); + } + // TODO(642): faster implementation. ASSERT(check == RECEIVER_MAP_CHECK); @@ -985,7 +995,11 @@ Object* CallStubCompiler::CompileCallConstant(Object* object, if (function_info->HasCustomCallGenerator()) { CustomCallGenerator generator = ToCData(function_info->function_data()); - return generator(this, object, holder, function, name, check); + Object* result = generator(this, object, holder, function, name, check); + // undefined means bail out to regular compiler. + if (!result->IsUndefined()) { + return result; + } } Label miss_in_smi_check; -- 2.7.4