| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index 16420a5db6bfebbad212bab994b9294ea98a88f4..08ca3f6882bf05f3b5fc114b95808f2007d43d14 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -133,7 +133,7 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name,
|
|
|
| LoadStubCompiler compiler(isolate_);
|
| Handle<Code> code =
|
| - compiler.CompileLoadNonexistent(cache_name, receiver, current, global);
|
| + compiler.CompileLoadNonexistent(receiver, current, cache_name, global);
|
| PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name));
|
| GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code));
|
| JSObject::UpdateMapCodeCache(receiver, cache_name, code);
|
| @@ -144,7 +144,7 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name,
|
| Handle<Code> StubCache::ComputeLoadField(Handle<String> name,
|
| Handle<JSObject> receiver,
|
| Handle<JSObject> holder,
|
| - PropertyIndex field_index) {
|
| + PropertyIndex field) {
|
| InlineCacheHolderFlag cache_holder =
|
| IC::GetCodeCacheForObject(*receiver, *holder);
|
| Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder));
|
| @@ -154,8 +154,7 @@ Handle<Code> StubCache::ComputeLoadField(Handle<String> name,
|
| if (probe->IsCode()) return Handle<Code>::cast(probe);
|
|
|
| LoadStubCompiler compiler(isolate_);
|
| - Handle<Code> code =
|
| - compiler.CompileLoadField(receiver, holder, field_index, name);
|
| + Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field);
|
| PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
| GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| JSObject::UpdateMapCodeCache(map_holder, name, code);
|
| @@ -179,7 +178,7 @@ Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name,
|
|
|
| LoadStubCompiler compiler(isolate_);
|
| Handle<Code> code =
|
| - compiler.CompileLoadCallback(name, receiver, holder, callback);
|
| + compiler.CompileLoadCallback(receiver, holder, name, callback);
|
| PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
| GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| JSObject::UpdateMapCodeCache(map_holder, name, code);
|
| @@ -202,7 +201,7 @@ Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name,
|
|
|
| LoadStubCompiler compiler(isolate_);
|
| Handle<Code> code =
|
| - compiler.CompileLoadViaGetter(name, receiver, holder, getter);
|
| + compiler.CompileLoadViaGetter(receiver, holder, name, getter);
|
| PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
| GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| JSObject::UpdateMapCodeCache(map_holder, name, code);
|
| @@ -225,7 +224,7 @@ Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name,
|
|
|
| LoadStubCompiler compiler(isolate_);
|
| Handle<Code> code =
|
| - compiler.CompileLoadConstant(receiver, holder, value, name);
|
| + compiler.CompileLoadConstant(receiver, holder, name, value);
|
| PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
| GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
|
| JSObject::UpdateMapCodeCache(map_holder, name, code);
|
| @@ -287,7 +286,7 @@ Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name,
|
| Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name,
|
| Handle<JSObject> receiver,
|
| Handle<JSObject> holder,
|
| - PropertyIndex field_index) {
|
| + PropertyIndex field) {
|
| InlineCacheHolderFlag cache_holder =
|
| IC::GetCodeCacheForObject(*receiver, *holder);
|
| Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder));
|
| @@ -298,8 +297,7 @@ Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name,
|
| if (probe->IsCode()) return Handle<Code>::cast(probe);
|
|
|
| KeyedLoadStubCompiler compiler(isolate_);
|
| - Handle<Code> code =
|
| - compiler.CompileLoadField(name, receiver, holder, field_index);
|
| + Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field);
|
| PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name));
|
| GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code));
|
| JSObject::UpdateMapCodeCache(map_holder, name, code);
|
| @@ -322,7 +320,7 @@ Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name,
|
|
|
| KeyedLoadStubCompiler compiler(isolate_);
|
| Handle<Code> code =
|
| - compiler.CompileLoadConstant(name, receiver, holder, value);
|
| + compiler.CompileLoadConstant(receiver, holder, name, value);
|
| PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name));
|
| GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code));
|
| JSObject::UpdateMapCodeCache(map_holder, name, code);
|
| @@ -367,7 +365,7 @@ Handle<Code> StubCache::ComputeKeyedLoadCallback(
|
|
|
| KeyedLoadStubCompiler compiler(isolate_);
|
| Handle<Code> code =
|
| - compiler.CompileLoadCallback(name, receiver, holder, callback);
|
| + compiler.CompileLoadCallback(receiver, holder, name, callback);
|
| PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name));
|
| GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code));
|
| JSObject::UpdateMapCodeCache(map_holder, name, code);
|
| @@ -1384,8 +1382,95 @@ void StubCompiler::LookupPostInterceptor(Handle<JSObject> holder,
|
| }
|
|
|
|
|
| +#define __ ACCESS_MASM(masm())
|
| +
|
| +
|
| +Handle<Code> BaseLoadStubCompiler::CompileLoadField(Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<String> name,
|
| + PropertyIndex index) {
|
| + Label miss;
|
| +
|
| + GenerateNameCheck(name, this->name(), &miss);
|
| + GenerateLoadField(object, holder, receiver(),
|
| + scratch1(), scratch2(), scratch3(),
|
| + index, name, &miss);
|
| + __ bind(&miss);
|
| + GenerateLoadMiss(masm(), kind());
|
| +
|
| + // Return the generated code.
|
| + return GetCode(Code::FIELD, name);
|
| +}
|
| +
|
| +
|
| +Handle<Code> BaseLoadStubCompiler::CompileLoadCallback(
|
| + Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<String> name,
|
| + Handle<AccessorInfo> callback) {
|
| + Label miss;
|
| +
|
| + GenerateNameCheck(name, this->name(), &miss);
|
| + GenerateLoadCallback(object, holder, receiver(), this->name(),
|
| + scratch1(), scratch2(), scratch3(), scratch4(),
|
| + callback, name, &miss);
|
| + __ bind(&miss);
|
| + GenerateLoadMiss(masm(), kind());
|
| +
|
| + // Return the generated code.
|
| + return GetCode(Code::CALLBACKS, name);
|
| +}
|
| +
|
| +
|
| +Handle<Code> BaseLoadStubCompiler::CompileLoadConstant(
|
| + Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<String> name,
|
| + Handle<JSFunction> value) {
|
| + Label miss;
|
| +
|
| + GenerateNameCheck(name, this->name(), &miss);
|
| + GenerateLoadConstant(object, holder, receiver(),
|
| + scratch1(), scratch2(), scratch3(),
|
| + value, name, &miss);
|
| + __ bind(&miss);
|
| + GenerateLoadMiss(masm(), kind());
|
| +
|
| + // Return the generated code.
|
| + return GetCode(Code::CONSTANT_FUNCTION, name);
|
| +}
|
| +
|
| +
|
| +Handle<Code> BaseLoadStubCompiler::CompileLoadInterceptor(
|
| + Handle<JSObject> object,
|
| + Handle<JSObject> holder,
|
| + Handle<String> name) {
|
| + Label miss;
|
| +
|
| + LookupResult lookup(isolate());
|
| + LookupPostInterceptor(holder, name, &lookup);
|
| +
|
| + GenerateNameCheck(name, this->name(), &miss);
|
| + // TODO(368): Compile in the whole chain: all the interceptors in
|
| + // prototypes and ultimate answer.
|
| + GenerateLoadInterceptor(object, holder, &lookup, receiver(), this->name(),
|
| + scratch1(), scratch2(), scratch3(),
|
| + name, &miss);
|
| +
|
| + __ bind(&miss);
|
| + GenerateLoadMiss(masm(), kind());
|
| +
|
| + // Return the generated code.
|
| + return GetCode(Code::INTERCEPTOR, name);
|
| +}
|
| +
|
| +
|
| +#undef __
|
| +
|
| +
|
| Handle<Code> LoadStubCompiler::GetCode(Code::StubType type,
|
| - Handle<String> name) {
|
| + Handle<String> name,
|
| + InlineCacheState state) {
|
| Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type);
|
| Handle<Code> code = GetCodeWithFlags(flags, name);
|
| PROFILE(isolate(), CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
|
|
|