Reviewers: dcarney,
Message:
PTAL. Instead of embedding the callback and calling runtime, we embed the
accessor index and then fetch the callback in runtime.
Description:
Do not embedd store callback in handler.
BUG=v8:3629
LOG=N
Please review this at https://codereview.chromium.org/881783003/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+22, -24 lines):
M src/ic/arm/handler-compiler-arm.cc
M src/ic/arm64/handler-compiler-arm64.cc
M src/ic/handler-compiler.h
M src/ic/ia32/handler-compiler-ia32.cc
M src/ic/ic.cc
M src/ic/mips/handler-compiler-mips.cc
M src/ic/mips64/handler-compiler-mips64.cc
M src/ic/x64/handler-compiler-x64.cc
M src/ic/x87/handler-compiler-x87.cc
Index: src/ic/arm/handler-compiler-arm.cc
diff --git a/src/ic/arm/handler-compiler-arm.cc
b/src/ic/arm/handler-compiler-arm.cc
index
d0db7904c858270797ea88716c9f373e40c43755..0f7f8090ff18bb1d0c168d2731b3ee47558994a5
100644
--- a/src/ic/arm/handler-compiler-arm.cc
+++ b/src/ic/arm/handler-compiler-arm.cc
@@ -674,13 +674,12 @@ void
NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) {
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
- Handle<JSObject> object, Handle<Name> name,
- Handle<ExecutableAccessorInfo> callback) {
+ Handle<JSObject> object, Handle<Name> name, int accessor_index) {
Register holder_reg = Frontend(name);
__ push(receiver()); // receiver
__ push(holder_reg);
- __ mov(ip, Operand(callback)); // callback info
+ __ mov(ip, Smi::FromInt(accessor_index));
__ push(ip);
__ mov(ip, Operand(name));
__ Push(ip, value());
Index: src/ic/arm64/handler-compiler-arm64.cc
diff --git a/src/ic/arm64/handler-compiler-arm64.cc
b/src/ic/arm64/handler-compiler-arm64.cc
index
3a6d156943aa8f4e1f23224ffccd2ca81608aa01..df0022b22ca2d136e4bd3a86096956e0abcbb698
100644
--- a/src/ic/arm64/handler-compiler-arm64.cc
+++ b/src/ic/arm64/handler-compiler-arm64.cc
@@ -739,8 +739,7 @@ void
NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) {
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
- Handle<JSObject> object, Handle<Name> name,
- Handle<ExecutableAccessorInfo> callback) {
+ Handle<JSObject> object, Handle<Name> name, int accessor_index) {
ASM_LOCATION("NamedStoreHandlerCompiler::CompileStoreCallback");
Register holder_reg = Frontend(name);
@@ -750,7 +749,7 @@ Handle<Code>
NamedStoreHandlerCompiler::CompileStoreCallback(
// receiver() and holder_reg can alias.
DCHECK(!AreAliased(receiver(), scratch1(), scratch2(), value()));
DCHECK(!AreAliased(holder_reg, scratch1(), scratch2(), value()));
- __ Mov(scratch1(), Operand(callback));
+ __ Mov(scratch1(), Operand(Smi::FromInt(accessor_index)));
__ Mov(scratch2(), Operand(name));
__ Push(receiver(), holder_reg, scratch1(), scratch2(), value());
Index: src/ic/handler-compiler.h
diff --git a/src/ic/handler-compiler.h b/src/ic/handler-compiler.h
index
b7a60b5cd7791a7743ba542ccaa005e7bf90a8bb..2a497dd36ff710735e238526cd89650b4ba731da
100644
--- a/src/ic/handler-compiler.h
+++ b/src/ic/handler-compiler.h
@@ -225,7 +225,7 @@ class NamedStoreHandlerCompiler : public
PropertyHandlerCompiler {
Handle<Name> name);
Handle<Code> CompileStoreField(LookupIterator* it);
Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name>
name,
- Handle<ExecutableAccessorInfo>
callback);
+ int accessor_index);
Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name>
name,
const CallOptimization&
call_optimization,
int accessor_index);
Index: src/ic/ia32/handler-compiler-ia32.cc
diff --git a/src/ic/ia32/handler-compiler-ia32.cc
b/src/ic/ia32/handler-compiler-ia32.cc
index
65adbff48eb683766c22b9425a50d199f3e9dd12..d1eb9924775063b098edf16013f092b9bb19f7ca
100644
--- a/src/ic/ia32/handler-compiler-ia32.cc
+++ b/src/ic/ia32/handler-compiler-ia32.cc
@@ -690,14 +690,13 @@ void
NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) {
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
- Handle<JSObject> object, Handle<Name> name,
- Handle<ExecutableAccessorInfo> callback) {
+ Handle<JSObject> object, Handle<Name> name, int accessor_index) {
Register holder_reg = Frontend(name);
__ pop(scratch1()); // remove the return address
__ push(receiver());
__ push(holder_reg);
- __ Push(callback);
+ __ Push(Smi::FromInt(accessor_index));
__ Push(name);
__ push(value());
__ push(scratch1()); // restore return address
Index: src/ic/ic.cc
diff --git a/src/ic/ic.cc b/src/ic/ic.cc
index
6d002919c23d92215633f5cc22bffe339ea72555..8aa6ecd2fb8c925de8be2b8a8978f8a5cd90e570
100644
--- a/src/ic/ic.cc
+++ b/src/ic/ic.cc
@@ -1720,7 +1720,8 @@ Handle<Code> StoreIC::CompileHandler(LookupIterator*
lookup,
break;
}
NamedStoreHandlerCompiler compiler(isolate(), receiver_type(),
holder);
- return compiler.CompileStoreCallback(receiver, lookup->name(),
info);
+ return compiler.CompileStoreCallback(receiver, lookup->name(),
+ lookup->GetAccessorIndex());
} else if (accessors->IsAccessorPair()) {
Handle<Object>
setter(Handle<AccessorPair>::cast(accessors)->setter(),
isolate());
@@ -2808,11 +2809,15 @@ RUNTIME_FUNCTION(ToBooleanIC_Miss) {
RUNTIME_FUNCTION(StoreCallbackProperty) {
Handle<JSObject> receiver = args.at<JSObject>(0);
Handle<JSObject> holder = args.at<JSObject>(1);
- Handle<ExecutableAccessorInfo> callback =
args.at<ExecutableAccessorInfo>(2);
+ Handle<Smi> accessor_index = args.at<Smi>(2);
Handle<Name> name = args.at<Name>(3);
Handle<Object> value = args.at<Object>(4);
HandleScope scope(isolate);
+ Handle<ExecutableAccessorInfo> callback(ExecutableAccessorInfo::cast(
+ holder->map()->instance_descriptors()->GetCallbacksObject(
+ accessor_index->value())));
+
DCHECK(callback->IsCompatibleReceiver(*receiver));
Address setter_address = v8::ToCData<Address>(callback->setter());
Index: src/ic/mips/handler-compiler-mips.cc
diff --git a/src/ic/mips/handler-compiler-mips.cc
b/src/ic/mips/handler-compiler-mips.cc
index
6e2903d428fd0131ffb3c1be8244d0b7f02630e1..ac7760e2466145c7d23690c508c3e30d461e07c9
100644
--- a/src/ic/mips/handler-compiler-mips.cc
+++ b/src/ic/mips/handler-compiler-mips.cc
@@ -666,12 +666,11 @@ void
NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) {
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
- Handle<JSObject> object, Handle<Name> name,
- Handle<ExecutableAccessorInfo> callback) {
+ Handle<JSObject> object, Handle<Name> name, int accessor_index) {
Register holder_reg = Frontend(name);
__ Push(receiver(), holder_reg); // Receiver.
- __ li(at, Operand(callback)); // Callback info.
+ __ li(at, Operand(Smi::FromInt(accessor_index)));
__ push(at);
__ li(at, Operand(name));
__ Push(at, value());
Index: src/ic/mips64/handler-compiler-mips64.cc
diff --git a/src/ic/mips64/handler-compiler-mips64.cc
b/src/ic/mips64/handler-compiler-mips64.cc
index
65f0902377453d2396b05ba8713eb917072e170a..45c4a8d50762bfd79a7ad850831cfad4357612a1
100644
--- a/src/ic/mips64/handler-compiler-mips64.cc
+++ b/src/ic/mips64/handler-compiler-mips64.cc
@@ -667,12 +667,11 @@ void
NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) {
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
- Handle<JSObject> object, Handle<Name> name,
- Handle<ExecutableAccessorInfo> callback) {
+ Handle<JSObject> object, Handle<Name> name, int accessor_index) {
Register holder_reg = Frontend(name);
__ Push(receiver(), holder_reg); // Receiver.
- __ li(at, Operand(callback)); // Callback info.
+ __ li(at, Operand(Smi::FromInt(accessor_index)));
__ push(at);
__ li(at, Operand(name));
__ Push(at, value());
Index: src/ic/x64/handler-compiler-x64.cc
diff --git a/src/ic/x64/handler-compiler-x64.cc
b/src/ic/x64/handler-compiler-x64.cc
index
cdc5b5e38cda59d6a53934aab75452b96c7b0306..fd2b09264227fa09241e80a0bc3cb7152accdcef
100644
--- a/src/ic/x64/handler-compiler-x64.cc
+++ b/src/ic/x64/handler-compiler-x64.cc
@@ -678,14 +678,13 @@ void
NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) {
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
- Handle<JSObject> object, Handle<Name> name,
- Handle<ExecutableAccessorInfo> callback) {
+ Handle<JSObject> object, Handle<Name> name, int accessor_index) {
Register holder_reg = Frontend(name);
__ PopReturnAddressTo(scratch1());
__ Push(receiver());
__ Push(holder_reg);
- __ Push(callback); // callback info
+ __ Push(Smi::FromInt(accessor_index));
__ Push(name);
__ Push(value());
__ PushReturnAddressFrom(scratch1());
Index: src/ic/x87/handler-compiler-x87.cc
diff --git a/src/ic/x87/handler-compiler-x87.cc
b/src/ic/x87/handler-compiler-x87.cc
index
1110410771d2d277c65dfe5a251b5952bcdf690d..1ff1785df4c4fdbb40d26482da7dbb9e0347855e
100644
--- a/src/ic/x87/handler-compiler-x87.cc
+++ b/src/ic/x87/handler-compiler-x87.cc
@@ -691,14 +691,13 @@ void
NamedLoadHandlerCompiler::GenerateLoadInterceptor(Register holder_reg) {
Handle<Code> NamedStoreHandlerCompiler::CompileStoreCallback(
- Handle<JSObject> object, Handle<Name> name,
- Handle<ExecutableAccessorInfo> callback) {
+ Handle<JSObject> object, Handle<Name> name, int accessor_index) {
Register holder_reg = Frontend(name);
__ pop(scratch1()); // remove the return address
__ push(receiver());
__ push(holder_reg);
- __ Push(callback);
+ __ Push(Smi::FromInt(accessor_index));
__ Push(name);
__ push(value());
__ push(scratch1()); // restore return address
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.