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 |