| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/v8.h" | 5 #include "src/v8.h" | 
| 6 | 6 | 
| 7 #include "src/cpu-profiler.h" | 7 #include "src/cpu-profiler.h" | 
| 8 #include "src/ic/call-optimization.h" | 8 #include "src/ic/call-optimization.h" | 
| 9 #include "src/ic/handler-compiler.h" | 9 #include "src/ic/handler-compiler.h" | 
| 10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" | 
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 304         Handle<Map> receiver_map = map(); | 304         Handle<Map> receiver_map = map(); | 
| 305         inline_followup = call_optimization.is_simple_api_call() && | 305         inline_followup = call_optimization.is_simple_api_call() && | 
| 306                           call_optimization.IsCompatibleReceiverMap( | 306                           call_optimization.IsCompatibleReceiverMap( | 
| 307                               receiver_map, property_holder); | 307                               receiver_map, property_holder); | 
| 308       } | 308       } | 
| 309     } | 309     } | 
| 310   } | 310   } | 
| 311 | 311 | 
| 312   Label miss; | 312   Label miss; | 
| 313   InterceptorVectorSlotPush(receiver()); | 313   InterceptorVectorSlotPush(receiver()); | 
|  | 314   auto holder_orig = holder(); | 
|  | 315   // Temporarily swap holder to check entire chain.  What could go wrong? | 
|  | 316   if (holder()->GetNamedInterceptor()->non_masking()) { | 
|  | 317     DCHECK(!inline_followup); | 
|  | 318     JSObject* last = *holder(); | 
|  | 319     PrototypeIterator iter(isolate(), last); | 
|  | 320     while (!iter.IsAtEnd()) { | 
|  | 321       last = JSObject::cast(iter.GetCurrent()); | 
|  | 322       iter.Advance(); | 
|  | 323     } | 
|  | 324     auto last_handle = handle(last); | 
|  | 325     set_holder(last_handle); | 
|  | 326   } | 
| 314   Register reg = FrontendHeader(receiver(), it->name(), &miss); | 327   Register reg = FrontendHeader(receiver(), it->name(), &miss); | 
|  | 328   // Now do the check again, getting the holder into the right register... | 
|  | 329   if (holder_orig->GetNamedInterceptor()->non_masking()) { | 
|  | 330     set_holder(holder_orig); | 
|  | 331     reg = FrontendHeader(receiver(), it->name(), &miss); | 
|  | 332   } | 
| 315   FrontendFooter(it->name(), &miss); | 333   FrontendFooter(it->name(), &miss); | 
| 316   InterceptorVectorSlotPop(reg); | 334   InterceptorVectorSlotPop(reg); | 
| 317 | 335 | 
| 318   if (inline_followup) { | 336   if (inline_followup) { | 
| 319     // TODO(368): Compile in the whole chain: all the interceptors in | 337     // TODO(368): Compile in the whole chain: all the interceptors in | 
| 320     // prototypes and ultimate answer. | 338     // prototypes and ultimate answer. | 
| 321     GenerateLoadInterceptorWithFollowup(it, reg); | 339     GenerateLoadInterceptorWithFollowup(it, reg); | 
| 322   } else { | 340   } else { | 
|  | 341     // TODO(dcarney): add a function for calling nonmasking interceptors. | 
| 323     GenerateLoadInterceptor(reg); | 342     GenerateLoadInterceptor(reg); | 
| 324   } | 343   } | 
| 325   return GetCode(kind(), Code::FAST, it->name()); | 344   return GetCode(kind(), Code::FAST, it->name()); | 
| 326 } | 345 } | 
| 327 | 346 | 
| 328 | 347 | 
| 329 void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor( | 348 void NamedLoadHandlerCompiler::GenerateLoadPostInterceptor( | 
| 330     LookupIterator* it, Register interceptor_reg) { | 349     LookupIterator* it, Register interceptor_reg) { | 
| 331   Handle<JSObject> real_named_property_holder(it->GetHolder<JSObject>()); | 350   Handle<JSObject> real_named_property_holder(it->GetHolder<JSObject>()); | 
| 332 | 351 | 
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 513         DCHECK(elements_kind == DICTIONARY_ELEMENTS); | 532         DCHECK(elements_kind == DICTIONARY_ELEMENTS); | 
| 514         cached_stub = LoadDictionaryElementStub(isolate()).GetCode(); | 533         cached_stub = LoadDictionaryElementStub(isolate()).GetCode(); | 
| 515       } | 534       } | 
| 516     } | 535     } | 
| 517 | 536 | 
| 518     handlers->Add(cached_stub); | 537     handlers->Add(cached_stub); | 
| 519   } | 538   } | 
| 520 } | 539 } | 
| 521 } | 540 } | 
| 522 }  // namespace v8::internal | 541 }  // namespace v8::internal | 
| OLD | NEW | 
|---|