OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 // prototype cannot hold multiple handlers, one for each of the string maps, | 139 // prototype cannot hold multiple handlers, one for each of the string maps, |
140 // for a single name. Hence, turn off caching of the IC. | 140 // for a single name. Hence, turn off caching of the IC. |
141 bool can_be_cached = !type->Is(Type::String()); | 141 bool can_be_cached = !type->Is(Type::String()); |
142 if (can_be_cached) { | 142 if (can_be_cached) { |
143 stub_holder = IC::GetCodeCacheHolder(flag, *type, isolate()); | 143 stub_holder = IC::GetCodeCacheHolder(flag, *type, isolate()); |
144 ic = FindIC(name, stub_holder, kind, extra_ic_state, flag); | 144 ic = FindIC(name, stub_holder, kind, extra_ic_state, flag); |
145 if (!ic.is_null()) return ic; | 145 if (!ic.is_null()) return ic; |
146 } | 146 } |
147 | 147 |
148 if (kind == Code::LOAD_IC) { | 148 if (kind == Code::LOAD_IC) { |
149 LoadStubCompiler ic_compiler(isolate(), flag); | 149 LoadStubCompiler ic_compiler(isolate(), extra_ic_state, flag); |
150 ic = ic_compiler.CompileMonomorphicIC(type, handler, name); | 150 ic = ic_compiler.CompileMonomorphicIC(type, handler, name); |
151 } else if (kind == Code::KEYED_LOAD_IC) { | 151 } else if (kind == Code::KEYED_LOAD_IC) { |
152 KeyedLoadStubCompiler ic_compiler(isolate(), flag); | 152 KeyedLoadStubCompiler ic_compiler(isolate(), extra_ic_state, flag); |
153 ic = ic_compiler.CompileMonomorphicIC(type, handler, name); | 153 ic = ic_compiler.CompileMonomorphicIC(type, handler, name); |
154 } else if (kind == Code::STORE_IC) { | 154 } else if (kind == Code::STORE_IC) { |
155 StoreStubCompiler ic_compiler(isolate(), extra_ic_state); | 155 StoreStubCompiler ic_compiler(isolate(), extra_ic_state); |
156 ic = ic_compiler.CompileMonomorphicIC(type, handler, name); | 156 ic = ic_compiler.CompileMonomorphicIC(type, handler, name); |
157 } else { | 157 } else { |
158 ASSERT(kind == Code::KEYED_STORE_IC); | 158 ASSERT(kind == Code::KEYED_STORE_IC); |
159 ASSERT(STANDARD_STORE == | 159 ASSERT(STANDARD_STORE == |
160 KeyedStoreIC::GetKeyedAccessStoreMode(extra_ic_state)); | 160 KeyedStoreIC::GetKeyedAccessStoreMode(extra_ic_state)); |
161 KeyedStoreStubCompiler ic_compiler(isolate(), extra_ic_state); | 161 KeyedStoreStubCompiler ic_compiler(isolate(), extra_ic_state); |
162 ic = ic_compiler.CompileMonomorphicIC(type, handler, name); | 162 ic = ic_compiler.CompileMonomorphicIC(type, handler, name); |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 static void FillCache(Isolate* isolate, Handle<Code> code) { | 411 static void FillCache(Isolate* isolate, Handle<Code> code) { |
412 Handle<UnseededNumberDictionary> dictionary = | 412 Handle<UnseededNumberDictionary> dictionary = |
413 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), | 413 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), |
414 code->flags(), | 414 code->flags(), |
415 code); | 415 code); |
416 isolate->heap()->public_set_non_monomorphic_cache(*dictionary); | 416 isolate->heap()->public_set_non_monomorphic_cache(*dictionary); |
417 } | 417 } |
418 | 418 |
419 | 419 |
420 Code* StubCache::FindCallInitialize(int argc, | 420 Code* StubCache::FindCallInitialize(int argc, |
421 RelocInfo::Mode mode, | 421 ContextualMode mode, |
422 Code::Kind kind) { | 422 Code::Kind kind) { |
423 ExtraICState extra_state = | 423 ExtraICState extra_state = |
424 CallICBase::StringStubState::encode(DEFAULT_STRING_STUB) | | 424 CallICBase::StringStubState::encode(DEFAULT_STRING_STUB) | |
425 CallICBase::Contextual::encode(mode == RelocInfo::CODE_TARGET_CONTEXT | 425 CallICBase::Contextual::encode(mode); |
426 ? CONTEXTUAL : NOT_CONTEXTUAL); | |
427 Code::Flags flags = | 426 Code::Flags flags = |
428 Code::ComputeFlags(kind, UNINITIALIZED, extra_state, Code::NORMAL, argc); | 427 Code::ComputeFlags(kind, UNINITIALIZED, extra_state, Code::NORMAL, argc); |
429 UnseededNumberDictionary* dictionary = | 428 UnseededNumberDictionary* dictionary = |
430 isolate()->heap()->non_monomorphic_cache(); | 429 isolate()->heap()->non_monomorphic_cache(); |
431 int entry = dictionary->FindEntry(isolate(), flags); | 430 int entry = dictionary->FindEntry(isolate(), flags); |
432 ASSERT(entry != -1); | 431 ASSERT(entry != -1); |
433 Object* code = dictionary->ValueAt(entry); | 432 Object* code = dictionary->ValueAt(entry); |
434 // This might be called during the marking phase of the collector | 433 // This might be called during the marking phase of the collector |
435 // hence the unchecked cast. | 434 // hence the unchecked cast. |
436 return reinterpret_cast<Code*>(code); | 435 return reinterpret_cast<Code*>(code); |
437 } | 436 } |
438 | 437 |
439 | 438 |
440 Handle<Code> StubCache::ComputeCallInitialize(int argc, | 439 Handle<Code> StubCache::ComputeCallInitialize(int argc, |
441 RelocInfo::Mode mode, | 440 ContextualMode mode, |
442 Code::Kind kind) { | 441 Code::Kind kind) { |
443 ExtraICState extra_state = | 442 ExtraICState extra_state = |
444 CallICBase::StringStubState::encode(DEFAULT_STRING_STUB) | | 443 CallICBase::ComputeExtraICState(mode, DEFAULT_STRING_STUB); |
445 CallICBase::Contextual::encode(mode == RelocInfo::CODE_TARGET_CONTEXT | |
446 ? CONTEXTUAL : NOT_CONTEXTUAL); | |
447 Code::Flags flags = | 444 Code::Flags flags = |
448 Code::ComputeFlags(kind, UNINITIALIZED, extra_state, Code::NORMAL, argc); | 445 Code::ComputeFlags(kind, UNINITIALIZED, extra_state, Code::NORMAL, argc); |
449 Handle<UnseededNumberDictionary> cache = | 446 Handle<UnseededNumberDictionary> cache = |
450 isolate_->factory()->non_monomorphic_cache(); | 447 isolate_->factory()->non_monomorphic_cache(); |
451 int entry = cache->FindEntry(isolate_, flags); | 448 int entry = cache->FindEntry(isolate_, flags); |
452 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); | 449 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
453 | 450 |
454 StubCompiler compiler(isolate_); | 451 StubCompiler compiler(isolate_); |
455 Handle<Code> code = compiler.CompileCallInitialize(flags); | 452 Handle<Code> code = compiler.CompileCallInitialize(flags); |
456 FillCache(isolate_, code); | 453 FillCache(isolate_, code); |
457 return code; | 454 return code; |
458 } | 455 } |
459 | 456 |
460 | 457 |
461 Handle<Code> StubCache::ComputeCallInitialize(int argc, RelocInfo::Mode mode) { | 458 Handle<Code> StubCache::ComputeCallInitialize(int argc, ContextualMode mode) { |
462 return ComputeCallInitialize(argc, mode, Code::CALL_IC); | 459 return ComputeCallInitialize(argc, mode, Code::CALL_IC); |
463 } | 460 } |
464 | 461 |
465 | 462 |
466 Handle<Code> StubCache::ComputeKeyedCallInitialize(int argc) { | 463 Handle<Code> StubCache::ComputeKeyedCallInitialize(int argc) { |
467 return ComputeCallInitialize(argc, RelocInfo::CODE_TARGET, | 464 return ComputeCallInitialize(argc, NOT_CONTEXTUAL, Code::KEYED_CALL_IC); |
468 Code::KEYED_CALL_IC); | |
469 } | 465 } |
470 | 466 |
471 | 467 |
472 Handle<Code> StubCache::ComputeCallPreMonomorphic( | 468 Handle<Code> StubCache::ComputeCallPreMonomorphic( |
473 int argc, | 469 int argc, |
474 Code::Kind kind, | 470 Code::Kind kind, |
475 ExtraICState extra_state) { | 471 ExtraICState extra_state) { |
476 Code::Flags flags = | 472 Code::Flags flags = |
477 Code::ComputeFlags(kind, PREMONOMORPHIC, extra_state, Code::NORMAL, argc); | 473 Code::ComputeFlags(kind, PREMONOMORPHIC, extra_state, Code::NORMAL, argc); |
478 Handle<UnseededNumberDictionary> cache = | 474 Handle<UnseededNumberDictionary> cache = |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 CodeHandleList* handlers, | 606 CodeHandleList* handlers, |
611 int number_of_valid_types, | 607 int number_of_valid_types, |
612 Handle<Name> name, | 608 Handle<Name> name, |
613 ExtraICState extra_ic_state) { | 609 ExtraICState extra_ic_state) { |
614 | 610 |
615 Handle<Code> handler = handlers->at(0); | 611 Handle<Code> handler = handlers->at(0); |
616 Code::Kind kind = handler->handler_kind(); | 612 Code::Kind kind = handler->handler_kind(); |
617 Code::StubType type = number_of_valid_types == 1 ? handler->type() | 613 Code::StubType type = number_of_valid_types == 1 ? handler->type() |
618 : Code::NORMAL; | 614 : Code::NORMAL; |
619 if (kind == Code::LOAD_IC) { | 615 if (kind == Code::LOAD_IC) { |
620 LoadStubCompiler ic_compiler(isolate_); | 616 LoadStubCompiler ic_compiler(isolate_, extra_ic_state); |
621 return ic_compiler.CompilePolymorphicIC( | 617 return ic_compiler.CompilePolymorphicIC( |
622 types, handlers, name, type, PROPERTY); | 618 types, handlers, name, type, PROPERTY); |
623 } else { | 619 } else { |
624 ASSERT(kind == Code::STORE_IC); | 620 ASSERT(kind == Code::STORE_IC); |
625 StrictModeFlag strict_mode = StoreIC::GetStrictMode(extra_ic_state); | 621 StoreStubCompiler ic_compiler(isolate_, extra_ic_state); |
626 StoreStubCompiler ic_compiler(isolate_, strict_mode); | |
627 return ic_compiler.CompilePolymorphicIC( | 622 return ic_compiler.CompilePolymorphicIC( |
628 types, handlers, name, type, PROPERTY); | 623 types, handlers, name, type, PROPERTY); |
629 } | 624 } |
630 } | 625 } |
631 | 626 |
632 | 627 |
633 Handle<Code> StubCache::ComputeStoreElementPolymorphic( | 628 Handle<Code> StubCache::ComputeStoreElementPolymorphic( |
634 MapHandleList* receiver_maps, | 629 MapHandleList* receiver_maps, |
635 KeyedAccessStoreMode store_mode, | 630 KeyedAccessStoreMode store_mode, |
636 StrictModeFlag strict_mode) { | 631 StrictModeFlag strict_mode) { |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 } | 821 } |
827 | 822 |
828 | 823 |
829 static MaybeObject* ThrowReferenceError(Isolate* isolate, Name* name) { | 824 static MaybeObject* ThrowReferenceError(Isolate* isolate, Name* name) { |
830 // If the load is non-contextual, just return the undefined result. | 825 // If the load is non-contextual, just return the undefined result. |
831 // Note that both keyed and non-keyed loads may end up here, so we | 826 // Note that both keyed and non-keyed loads may end up here, so we |
832 // can't use either LoadIC or KeyedLoadIC constructors. | 827 // can't use either LoadIC or KeyedLoadIC constructors. |
833 HandleScope scope(isolate); | 828 HandleScope scope(isolate); |
834 IC ic(IC::NO_EXTRA_FRAME, isolate); | 829 IC ic(IC::NO_EXTRA_FRAME, isolate); |
835 ASSERT(ic.IsLoadStub()); | 830 ASSERT(ic.IsLoadStub()); |
836 if (!ic.SlowIsUndeclaredGlobal()) return isolate->heap()->undefined_value(); | 831 if (ic.contextual_mode() == NOT_CONTEXTUAL) { |
| 832 return isolate->heap()->undefined_value(); |
| 833 } |
837 | 834 |
838 // Throw a reference error. | 835 // Throw a reference error. |
839 Handle<Name> name_handle(name); | 836 Handle<Name> name_handle(name); |
840 Handle<Object> error = | 837 Handle<Object> error = |
841 isolate->factory()->NewReferenceError("not_defined", | 838 isolate->factory()->NewReferenceError("not_defined", |
842 HandleVector(&name_handle, 1)); | 839 HandleVector(&name_handle, 1)); |
843 return isolate->Throw(*error); | 840 return isolate->Throw(*error); |
844 } | 841 } |
845 | 842 |
846 | 843 |
(...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1897 Handle<FunctionTemplateInfo>( | 1894 Handle<FunctionTemplateInfo>( |
1898 FunctionTemplateInfo::cast(signature->receiver())); | 1895 FunctionTemplateInfo::cast(signature->receiver())); |
1899 } | 1896 } |
1900 } | 1897 } |
1901 | 1898 |
1902 is_simple_api_call_ = true; | 1899 is_simple_api_call_ = true; |
1903 } | 1900 } |
1904 | 1901 |
1905 | 1902 |
1906 } } // namespace v8::internal | 1903 } } // namespace v8::internal |
OLD | NEW |