Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index 4fa440bb70658f9131bf71d36e674a9623b50ef4..03075d92372fe7da40c6244ab42d0c2cd3e80b38 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -1153,7 +1153,18 @@ class CallApiAccessorStub : public PlatformCodeStub { |
CallApiAccessorStub(Isolate* isolate, bool is_store, bool call_data_undefined) |
: PlatformCodeStub(isolate) { |
minor_key_ = IsStoreBits::encode(is_store) | |
- CallDataUndefinedBits::encode(call_data_undefined); |
+ CallDataUndefinedBits::encode(call_data_undefined) | |
+ ArgumentBits::encode(is_store ? 1 : 0); |
+ } |
+ |
+ protected: |
+ // For CallApiFunctionWithFixedArgsStub, see below. |
+ static const int kArgBits = 3; |
+ CallApiAccessorStub(Isolate* isolate, int argc, bool call_data_undefined) |
+ : PlatformCodeStub(isolate) { |
+ minor_key_ = IsStoreBits::encode(false) | |
+ CallDataUndefinedBits::encode(call_data_undefined) | |
+ ArgumentBits::encode(argc); |
} |
private: |
@@ -1161,15 +1172,35 @@ class CallApiAccessorStub : public PlatformCodeStub { |
bool call_data_undefined() const { |
return CallDataUndefinedBits::decode(minor_key_); |
} |
+ int argc() const { return ArgumentBits::decode(minor_key_); } |
class IsStoreBits: public BitField<bool, 0, 1> {}; |
class CallDataUndefinedBits: public BitField<bool, 1, 1> {}; |
+ class ArgumentBits : public BitField<int, 2, kArgBits> {}; |
DEFINE_CALL_INTERFACE_DESCRIPTOR(ApiAccessor); |
DEFINE_PLATFORM_CODE_STUB(CallApiAccessor, PlatformCodeStub); |
}; |
+// TODO(dcarney): see if it's possible to remove this later without performance |
+// degradation. |
+// This is not a real stub, but a way of generating the CallApiAccessorStub |
+// (which has the same abi) which makes it clear that it is not an accessor. |
+class CallApiFunctionWithFixedArgsStub : public CallApiAccessorStub { |
+ public: |
+ static const int kMaxFixedArgs = (1 << kArgBits) - 1; |
+ CallApiFunctionWithFixedArgsStub(Isolate* isolate, int argc, |
+ bool call_data_undefined) |
+ : CallApiAccessorStub(isolate, argc, call_data_undefined) { |
+ DCHECK(0 <= argc && argc <= kMaxFixedArgs); |
+ } |
+}; |
+ |
+ |
+typedef ApiAccessorDescriptor ApiFunctionWithFixedArgsDescriptor; |
+ |
+ |
class CallApiGetterStub : public PlatformCodeStub { |
public: |
explicit CallApiGetterStub(Isolate* isolate) : PlatformCodeStub(isolate) {} |