Commit 8c990d17 authored by dcarney's avatar dcarney Committed by Commit bot

add stub for api function calls with known number of parameters

BUG=449930
LOG=N

Review URL: https://codereview.chromium.org/859783002

Cr-Commit-Position: refs/heads/master@{#26137}
parent 09abbaae
......@@ -4748,7 +4748,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
void CallApiAccessorStub::Generate(MacroAssembler* masm) {
bool is_store = this->is_store();
int argc = is_store ? 1 : 0;
int argc = this->argc();
bool call_data_undefined = this->call_data_undefined();
CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
call_data_undefined);
......
......@@ -5175,7 +5175,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
void CallApiAccessorStub::Generate(MacroAssembler* masm) {
bool is_store = this->is_store();
int argc = is_store ? 1 : 0;
int argc = this->argc();
bool call_data_undefined = this->call_data_undefined();
CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
call_data_undefined);
......
......@@ -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) {}
......
......@@ -8776,6 +8776,16 @@ bool HOptimizedGraphBuilder::TryInlineApiCall(Handle<JSFunction> function,
call = New<HCallWithDescriptor>(
code_value, argc + 1, descriptor,
Vector<HValue*>(op_vals, descriptor.GetEnvironmentLength()));
} else if (argc <= CallApiFunctionWithFixedArgsStub::kMaxFixedArgs) {
CallApiFunctionWithFixedArgsStub stub(isolate(), argc, call_data_undefined);
Handle<Code> code = stub.GetCode();
HConstant* code_value = Add<HConstant>(code);
ApiFunctionWithFixedArgsDescriptor descriptor(isolate());
DCHECK(arraysize(op_vals) - 1 == descriptor.GetEnvironmentLength());
call = New<HCallWithDescriptor>(
code_value, argc + 1, descriptor,
Vector<HValue*>(op_vals, descriptor.GetEnvironmentLength()));
Drop(1); // Drop function.
} else {
op_vals[arraysize(op_vals) - 1] = Add<HConstant>(argc);
CallApiFunctionStub stub(isolate(), call_data_undefined);
......
......@@ -4829,7 +4829,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
void CallApiAccessorStub::Generate(MacroAssembler* masm) {
bool is_store = this->is_store();
int argc = is_store ? 1 : 0;
int argc = this->argc();
bool call_data_undefined = this->call_data_undefined();
CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
call_data_undefined);
......
......@@ -4962,7 +4962,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
void CallApiAccessorStub::Generate(MacroAssembler* masm) {
bool is_store = this->is_store();
int argc = is_store ? 1 : 0;
int argc = this->argc();
bool call_data_undefined = this->call_data_undefined();
CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
call_data_undefined);
......
......@@ -5001,7 +5001,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
void CallApiAccessorStub::Generate(MacroAssembler* masm) {
bool is_store = this->is_store();
int argc = is_store ? 1 : 0;
int argc = this->argc();
bool call_data_undefined = this->call_data_undefined();
CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
call_data_undefined);
......
......@@ -4772,7 +4772,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
void CallApiAccessorStub::Generate(MacroAssembler* masm) {
bool is_store = this->is_store();
int argc = is_store ? 1 : 0;
int argc = this->argc();
bool call_data_undefined = this->call_data_undefined();
CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
call_data_undefined);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment