Index: src/stub-cache.cc |
diff --git a/src/stub-cache.cc b/src/stub-cache.cc |
index ac94fffebd0553b34a3fdf315d1220506178b833..bda659048142d9275d1ff1f10cd61bafe1f52518 100644 |
--- a/src/stub-cache.cc |
+++ b/src/stub-cache.cc |
@@ -233,6 +233,27 @@ Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, |
} |
+Handle<Code> StubCache::ComputeLoadArrayLength(Handle<Name> name, |
danno
2013/03/12 11:16:16
Instead of adding these, how about just make Compi
|
+ Handle<JSObject> receiver, |
+ Handle<JSObject> holder) { |
+ ASSERT(name->Equals(isolate_->heap()->length_string())); |
+ if (receiver.is_identical_to(holder)) { |
+ FastArrayLengthStub stub(LoadStubCompiler::receiver()); |
+ return stub.GetCode(isolate_); |
+ } |
+ |
+ Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
+ Handle<Code> stub = FindStub( |
+ name, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
+ if (!stub.is_null()) return stub; |
+ |
+ LoadStubCompiler ic_compiler(isolate_); |
+ Handle<Code> ic = ic_compiler.CompileArrayLength(receiver, holder, name); |
+ JSObject::UpdateMapCodeCache(stub_holder, name, ic); |
+ return ic; |
+} |
+ |
+ |
Handle<Code> StubCache::ComputeLoadCallback( |
Handle<Name> name, |
Handle<JSObject> receiver, |
@@ -1462,6 +1483,23 @@ Handle<Code> BaseLoadStubCompiler::CompileLoadField(Handle<JSObject> object, |
} |
+Handle<Code> BaseLoadStubCompiler::CompileArrayLength(Handle<JSObject> object, |
+ Handle<JSObject> holder, |
+ Handle<Name> name) { |
+ ASSERT(name->Equals(isolate()->heap()->length_string())); |
+ Label miss; |
+ |
+ Register reg = HandlerFrontendHeader(object, receiver(), holder, name, &miss); |
+ FastArrayLengthStub stub(reg); |
+ GenerateTailCall(stub.GetCode(isolate())); |
+ |
+ __ bind(&miss); |
+ GenerateLoadMiss(masm(), kind()); |
+ |
+ return GetCode(kind(), Code::CALLBACKS, name); |
+} |
+ |
+ |
Handle<Code> BaseLoadStubCompiler::CompileLoadConstant( |
Handle<JSObject> object, |
Handle<JSObject> holder, |