OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 } | 57 } |
58 } | 58 } |
59 | 59 |
60 | 60 |
61 Code* StubCache::Set(String* name, Map* map, Code* code) { | 61 Code* StubCache::Set(String* name, Map* map, Code* code) { |
62 // Get the flags from the code. | 62 // Get the flags from the code. |
63 Code::Flags flags = Code::RemoveTypeFromFlags(code->flags()); | 63 Code::Flags flags = Code::RemoveTypeFromFlags(code->flags()); |
64 | 64 |
65 // Validate that the name does not move on scavenge, and that we | 65 // Validate that the name does not move on scavenge, and that we |
66 // can use identity checks instead of string equality checks. | 66 // can use identity checks instead of string equality checks. |
67 ASSERT(!isolate_->heap()->InNewSpace(name)); | 67 ASSERT(!heap()->InNewSpace(name)); |
68 ASSERT(name->IsSymbol()); | 68 ASSERT(name->IsSymbol()); |
69 | 69 |
70 // The state bits are not important to the hash function because | 70 // The state bits are not important to the hash function because |
71 // the stub cache only contains monomorphic stubs. Make sure that | 71 // the stub cache only contains monomorphic stubs. Make sure that |
72 // the bits are the least significant so they will be the ones | 72 // the bits are the least significant so they will be the ones |
73 // masked out. | 73 // masked out. |
74 ASSERT(Code::ExtractICStateFromFlags(flags) == MONOMORPHIC); | 74 ASSERT(Code::ExtractICStateFromFlags(flags) == MONOMORPHIC); |
75 ASSERT(Code::kFlagsICStateShift == 0); | 75 ASSERT(Code::kFlagsICStateShift == 0); |
76 | 76 |
77 // Make sure that the code type is not included in the hash. | 77 // Make sure that the code type is not included in the hash. |
(...skipping 23 matching lines...) Expand all Loading... |
101 | 101 |
102 MaybeObject* StubCache::ComputeLoadNonexistent(String* name, | 102 MaybeObject* StubCache::ComputeLoadNonexistent(String* name, |
103 JSObject* receiver) { | 103 JSObject* receiver) { |
104 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); | 104 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); |
105 // If no global objects are present in the prototype chain, the load | 105 // If no global objects are present in the prototype chain, the load |
106 // nonexistent IC stub can be shared for all names for a given map | 106 // nonexistent IC stub can be shared for all names for a given map |
107 // and we use the empty string for the map cache in that case. If | 107 // and we use the empty string for the map cache in that case. If |
108 // there are global objects involved, we need to check global | 108 // there are global objects involved, we need to check global |
109 // property cells in the stub and therefore the stub will be | 109 // property cells in the stub and therefore the stub will be |
110 // specific to the name. | 110 // specific to the name. |
111 String* cache_name = isolate_->heap()->empty_string(); | 111 String* cache_name = heap()->empty_string(); |
112 if (receiver->IsGlobalObject()) cache_name = name; | 112 if (receiver->IsGlobalObject()) cache_name = name; |
113 JSObject* last = receiver; | 113 JSObject* last = receiver; |
114 while (last->GetPrototype() != isolate_->heap()->null_value()) { | 114 while (last->GetPrototype() != heap()->null_value()) { |
115 last = JSObject::cast(last->GetPrototype()); | 115 last = JSObject::cast(last->GetPrototype()); |
116 if (last->IsGlobalObject()) cache_name = name; | 116 if (last->IsGlobalObject()) cache_name = name; |
117 } | 117 } |
118 // Compile the stub that is either shared for all names or | 118 // Compile the stub that is either shared for all names or |
119 // name specific if there are global objects involved. | 119 // name specific if there are global objects involved. |
120 Code::Flags flags = | 120 Code::Flags flags = |
121 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); | 121 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); |
122 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); | 122 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); |
123 if (code->IsUndefined()) { | 123 if (code->IsUndefined()) { |
124 LoadStubCompiler compiler; | 124 LoadStubCompiler compiler; |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 | 459 |
460 MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) { | 460 MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) { |
461 // Using NORMAL as the PropertyType for array element loads is a misuse. The | 461 // Using NORMAL as the PropertyType for array element loads is a misuse. The |
462 // generated stub always accesses fast elements, not slow-mode fields, but | 462 // generated stub always accesses fast elements, not slow-mode fields, but |
463 // some property type is required for the stub lookup. Note that overloading | 463 // some property type is required for the stub lookup. Note that overloading |
464 // the NORMAL PropertyType is only safe as long as no stubs are generated for | 464 // the NORMAL PropertyType is only safe as long as no stubs are generated for |
465 // other keyed field loads. This is guaranteed to be the case since all field | 465 // other keyed field loads. This is guaranteed to be the case since all field |
466 // keyed loads that are not array elements go through a generic builtin stub. | 466 // keyed loads that are not array elements go through a generic builtin stub. |
467 Code::Flags flags = | 467 Code::Flags flags = |
468 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL); | 468 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL); |
469 String* name = isolate_->heap()->KeyedLoadSpecialized_symbol(); | 469 String* name = heap()->KeyedLoadSpecialized_symbol(); |
470 Object* code = receiver->map()->FindInCodeCache(name, flags); | 470 Object* code = receiver->map()->FindInCodeCache(name, flags); |
471 if (code->IsUndefined()) { | 471 if (code->IsUndefined()) { |
472 KeyedLoadStubCompiler compiler; | 472 KeyedLoadStubCompiler compiler; |
473 { MaybeObject* maybe_code = compiler.CompileLoadSpecialized(receiver); | 473 { MaybeObject* maybe_code = compiler.CompileLoadSpecialized(receiver); |
474 if (!maybe_code->ToObject(&code)) return maybe_code; | 474 if (!maybe_code->ToObject(&code)) return maybe_code; |
475 } | 475 } |
476 PROFILE(isolate_, | 476 PROFILE(isolate_, |
477 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), 0)); | 477 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), 0)); |
478 Object* result; | 478 Object* result; |
479 { MaybeObject* maybe_result = | 479 { MaybeObject* maybe_result = |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 } | 511 } |
512 return code; | 512 return code; |
513 } | 513 } |
514 | 514 |
515 | 515 |
516 MaybeObject* StubCache::ComputeKeyedStoreSpecialized( | 516 MaybeObject* StubCache::ComputeKeyedStoreSpecialized( |
517 JSObject* receiver, | 517 JSObject* receiver, |
518 StrictModeFlag strict_mode) { | 518 StrictModeFlag strict_mode) { |
519 Code::Flags flags = | 519 Code::Flags flags = |
520 Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); | 520 Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); |
521 String* name = isolate_->heap()->KeyedStoreSpecialized_symbol(); | 521 String* name = heap()->KeyedStoreSpecialized_symbol(); |
522 Object* code = receiver->map()->FindInCodeCache(name, flags); | 522 Object* code = receiver->map()->FindInCodeCache(name, flags); |
523 if (code->IsUndefined()) { | 523 if (code->IsUndefined()) { |
524 KeyedStoreStubCompiler compiler(strict_mode); | 524 KeyedStoreStubCompiler compiler(strict_mode); |
525 { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver); | 525 { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver); |
526 if (!maybe_code->ToObject(&code)) return maybe_code; | 526 if (!maybe_code->ToObject(&code)) return maybe_code; |
527 } | 527 } |
528 PROFILE(isolate_, | 528 PROFILE(isolate_, |
529 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, Code::cast(code), 0)); | 529 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, Code::cast(code), 0)); |
530 Object* result; | 530 Object* result; |
531 { MaybeObject* maybe_result = | 531 { MaybeObject* maybe_result = |
(...skipping 24 matching lines...) Expand all Loading... |
556 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 556 case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
557 return kExternalFloatArray; | 557 return kExternalFloatArray; |
558 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 558 case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
559 return kExternalPixelArray; | 559 return kExternalPixelArray; |
560 default: | 560 default: |
561 UNREACHABLE(); | 561 UNREACHABLE(); |
562 return static_cast<ExternalArrayType>(0); | 562 return static_cast<ExternalArrayType>(0); |
563 } | 563 } |
564 } | 564 } |
565 | 565 |
566 String* ExternalArrayTypeToStubName(ExternalArrayType array_type, | 566 String* ExternalArrayTypeToStubName(Heap* heap, |
| 567 ExternalArrayType array_type, |
567 bool is_store) { | 568 bool is_store) { |
568 if (is_store) { | 569 if (is_store) { |
569 switch (array_type) { | 570 switch (array_type) { |
570 case kExternalByteArray: | 571 case kExternalByteArray: |
571 return HEAP->KeyedStoreExternalByteArray_symbol(); | 572 return heap->KeyedStoreExternalByteArray_symbol(); |
572 case kExternalUnsignedByteArray: | 573 case kExternalUnsignedByteArray: |
573 return HEAP->KeyedStoreExternalUnsignedByteArray_symbol(); | 574 return heap->KeyedStoreExternalUnsignedByteArray_symbol(); |
574 case kExternalShortArray: | 575 case kExternalShortArray: |
575 return HEAP->KeyedStoreExternalShortArray_symbol(); | 576 return heap->KeyedStoreExternalShortArray_symbol(); |
576 case kExternalUnsignedShortArray: | 577 case kExternalUnsignedShortArray: |
577 return HEAP->KeyedStoreExternalUnsignedShortArray_symbol(); | 578 return heap->KeyedStoreExternalUnsignedShortArray_symbol(); |
578 case kExternalIntArray: | 579 case kExternalIntArray: |
579 return HEAP->KeyedStoreExternalIntArray_symbol(); | 580 return heap->KeyedStoreExternalIntArray_symbol(); |
580 case kExternalUnsignedIntArray: | 581 case kExternalUnsignedIntArray: |
581 return HEAP->KeyedStoreExternalUnsignedIntArray_symbol(); | 582 return heap->KeyedStoreExternalUnsignedIntArray_symbol(); |
582 case kExternalFloatArray: | 583 case kExternalFloatArray: |
583 return HEAP->KeyedStoreExternalFloatArray_symbol(); | 584 return heap->KeyedStoreExternalFloatArray_symbol(); |
584 case kExternalPixelArray: | 585 case kExternalPixelArray: |
585 return HEAP->KeyedStoreExternalPixelArray_symbol(); | 586 return heap->KeyedStoreExternalPixelArray_symbol(); |
586 default: | 587 default: |
587 UNREACHABLE(); | 588 UNREACHABLE(); |
588 return NULL; | 589 return NULL; |
589 } | 590 } |
590 } else { | 591 } else { |
591 switch (array_type) { | 592 switch (array_type) { |
592 case kExternalByteArray: | 593 case kExternalByteArray: |
593 return HEAP->KeyedLoadExternalByteArray_symbol(); | 594 return heap->KeyedLoadExternalByteArray_symbol(); |
594 case kExternalUnsignedByteArray: | 595 case kExternalUnsignedByteArray: |
595 return HEAP->KeyedLoadExternalUnsignedByteArray_symbol(); | 596 return heap->KeyedLoadExternalUnsignedByteArray_symbol(); |
596 case kExternalShortArray: | 597 case kExternalShortArray: |
597 return HEAP->KeyedLoadExternalShortArray_symbol(); | 598 return heap->KeyedLoadExternalShortArray_symbol(); |
598 case kExternalUnsignedShortArray: | 599 case kExternalUnsignedShortArray: |
599 return HEAP->KeyedLoadExternalUnsignedShortArray_symbol(); | 600 return heap->KeyedLoadExternalUnsignedShortArray_symbol(); |
600 case kExternalIntArray: | 601 case kExternalIntArray: |
601 return HEAP->KeyedLoadExternalIntArray_symbol(); | 602 return heap->KeyedLoadExternalIntArray_symbol(); |
602 case kExternalUnsignedIntArray: | 603 case kExternalUnsignedIntArray: |
603 return HEAP->KeyedLoadExternalUnsignedIntArray_symbol(); | 604 return heap->KeyedLoadExternalUnsignedIntArray_symbol(); |
604 case kExternalFloatArray: | 605 case kExternalFloatArray: |
605 return HEAP->KeyedLoadExternalFloatArray_symbol(); | 606 return heap->KeyedLoadExternalFloatArray_symbol(); |
606 case kExternalPixelArray: | 607 case kExternalPixelArray: |
607 return HEAP->KeyedLoadExternalPixelArray_symbol(); | 608 return heap->KeyedLoadExternalPixelArray_symbol(); |
608 default: | 609 default: |
609 UNREACHABLE(); | 610 UNREACHABLE(); |
610 return NULL; | 611 return NULL; |
611 } | 612 } |
612 } | 613 } |
613 } | 614 } |
614 | 615 |
615 } // anonymous namespace | 616 } // anonymous namespace |
616 | 617 |
617 | 618 |
618 MaybeObject* StubCache::ComputeKeyedLoadOrStoreExternalArray( | 619 MaybeObject* StubCache::ComputeKeyedLoadOrStoreExternalArray( |
619 JSObject* receiver, | 620 JSObject* receiver, |
620 bool is_store, | 621 bool is_store, |
621 StrictModeFlag strict_mode) { | 622 StrictModeFlag strict_mode) { |
622 Code::Flags flags = | 623 Code::Flags flags = |
623 Code::ComputeMonomorphicFlags( | 624 Code::ComputeMonomorphicFlags( |
624 is_store ? Code::KEYED_EXTERNAL_ARRAY_STORE_IC : | 625 is_store ? Code::KEYED_EXTERNAL_ARRAY_STORE_IC : |
625 Code::KEYED_EXTERNAL_ARRAY_LOAD_IC, | 626 Code::KEYED_EXTERNAL_ARRAY_LOAD_IC, |
626 NORMAL, | 627 NORMAL, |
627 strict_mode); | 628 strict_mode); |
628 ExternalArrayType array_type = | 629 ExternalArrayType array_type = |
629 ElementsKindToExternalArrayType(receiver->GetElementsKind()); | 630 ElementsKindToExternalArrayType(receiver->GetElementsKind()); |
630 String* name = ExternalArrayTypeToStubName(array_type, is_store); | 631 String* name = ExternalArrayTypeToStubName(heap(), array_type, is_store); |
631 Object* code = receiver->map()->FindInCodeCache(name, flags); | 632 Object* code = receiver->map()->FindInCodeCache(name, flags); |
632 if (code->IsUndefined()) { | 633 if (code->IsUndefined()) { |
633 ExternalArrayStubCompiler compiler; | 634 ExternalArrayStubCompiler compiler; |
634 { MaybeObject* maybe_code = | 635 { MaybeObject* maybe_code = |
635 is_store ? | 636 is_store ? |
636 compiler.CompileKeyedStoreStub(receiver, array_type, flags) : | 637 compiler.CompileKeyedStoreStub(receiver, array_type, flags) : |
637 compiler.CompileKeyedLoadStub(receiver, array_type, flags); | 638 compiler.CompileKeyedLoadStub(receiver, array_type, flags); |
638 if (!maybe_code->ToObject(&code)) return maybe_code; | 639 if (!maybe_code->ToObject(&code)) return maybe_code; |
639 } | 640 } |
640 Code::cast(code)->set_external_array_type(array_type); | 641 Code::cast(code)->set_external_array_type(array_type); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 753 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
753 Code::Flags flags = Code::ComputeMonomorphicFlags( | 754 Code::Flags flags = Code::ComputeMonomorphicFlags( |
754 Code::KEYED_STORE_IC, type, strict_mode); | 755 Code::KEYED_STORE_IC, type, strict_mode); |
755 Object* code = receiver->map()->FindInCodeCache(name, flags); | 756 Object* code = receiver->map()->FindInCodeCache(name, flags); |
756 if (code->IsUndefined()) { | 757 if (code->IsUndefined()) { |
757 KeyedStoreStubCompiler compiler(strict_mode); | 758 KeyedStoreStubCompiler compiler(strict_mode); |
758 { MaybeObject* maybe_code = | 759 { MaybeObject* maybe_code = |
759 compiler.CompileStoreField(receiver, field_index, transition, name); | 760 compiler.CompileStoreField(receiver, field_index, transition, name); |
760 if (!maybe_code->ToObject(&code)) return maybe_code; | 761 if (!maybe_code->ToObject(&code)) return maybe_code; |
761 } | 762 } |
762 PROFILE(isolate_, | 763 PROFILE(isolate(), |
763 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 764 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
764 Code::cast(code), name)); | 765 Code::cast(code), name)); |
765 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); | 766 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); |
766 Object* result; | 767 Object* result; |
767 { MaybeObject* maybe_result = | 768 { MaybeObject* maybe_result = |
768 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 769 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
769 if (!maybe_result->ToObject(&result)) return maybe_result; | 770 if (!maybe_result->ToObject(&result)) return maybe_result; |
770 } | 771 } |
771 } | 772 } |
772 return code; | 773 return code; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 argc); | 911 argc); |
911 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 912 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
912 if (code->IsUndefined()) { | 913 if (code->IsUndefined()) { |
913 CallStubCompiler compiler( | 914 CallStubCompiler compiler( |
914 argc, NOT_IN_LOOP, kind, Code::kNoExtraICState, cache_holder); | 915 argc, NOT_IN_LOOP, kind, Code::kNoExtraICState, cache_holder); |
915 { MaybeObject* maybe_code = | 916 { MaybeObject* maybe_code = |
916 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); | 917 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); |
917 if (!maybe_code->ToObject(&code)) return maybe_code; | 918 if (!maybe_code->ToObject(&code)) return maybe_code; |
918 } | 919 } |
919 ASSERT_EQ(flags, Code::cast(code)->flags()); | 920 ASSERT_EQ(flags, Code::cast(code)->flags()); |
920 PROFILE(isolate_, | 921 PROFILE(isolate(), |
921 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 922 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
922 Code::cast(code), name)); | 923 Code::cast(code), name)); |
923 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 924 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
924 Object* result; | 925 Object* result; |
925 { MaybeObject* maybe_result = | 926 { MaybeObject* maybe_result = |
926 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 927 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
927 if (!maybe_result->ToObject(&result)) return maybe_result; | 928 if (!maybe_result->ToObject(&result)) return maybe_result; |
928 } | 929 } |
929 } | 930 } |
930 return code; | 931 return code; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 // internal error which will make sure we do not update any | 969 // internal error which will make sure we do not update any |
969 // caches. | 970 // caches. |
970 if (!function->is_compiled()) return Failure::InternalError(); | 971 if (!function->is_compiled()) return Failure::InternalError(); |
971 CallStubCompiler compiler( | 972 CallStubCompiler compiler( |
972 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); | 973 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); |
973 { MaybeObject* maybe_code = | 974 { MaybeObject* maybe_code = |
974 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 975 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
975 if (!maybe_code->ToObject(&code)) return maybe_code; | 976 if (!maybe_code->ToObject(&code)) return maybe_code; |
976 } | 977 } |
977 ASSERT_EQ(flags, Code::cast(code)->flags()); | 978 ASSERT_EQ(flags, Code::cast(code)->flags()); |
978 PROFILE(isolate_, | 979 PROFILE(isolate(), |
979 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 980 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
980 Code::cast(code), name)); | 981 Code::cast(code), name)); |
981 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 982 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
982 Object* result; | 983 Object* result; |
983 { MaybeObject* maybe_result = | 984 { MaybeObject* maybe_result = |
984 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 985 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
985 if (!maybe_result->ToObject(&result)) return maybe_result; | 986 if (!maybe_result->ToObject(&result)) return maybe_result; |
986 } | 987 } |
987 } | 988 } |
988 return code; | 989 return code; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1039 | 1040 |
1040 Code* StubCache::FindCallInitialize(int argc, | 1041 Code* StubCache::FindCallInitialize(int argc, |
1041 InLoopFlag in_loop, | 1042 InLoopFlag in_loop, |
1042 Code::Kind kind) { | 1043 Code::Kind kind) { |
1043 Code::Flags flags = Code::ComputeFlags(kind, | 1044 Code::Flags flags = Code::ComputeFlags(kind, |
1044 in_loop, | 1045 in_loop, |
1045 UNINITIALIZED, | 1046 UNINITIALIZED, |
1046 Code::kNoExtraICState, | 1047 Code::kNoExtraICState, |
1047 NORMAL, | 1048 NORMAL, |
1048 argc); | 1049 argc); |
1049 Object* result = ProbeCache(isolate_, flags)->ToObjectUnchecked(); | 1050 Object* result = ProbeCache(isolate(), flags)->ToObjectUnchecked(); |
1050 ASSERT(result != isolate_->heap()->undefined_value()); | 1051 ASSERT(result != heap()->undefined_value()); |
1051 // This might be called during the marking phase of the collector | 1052 // This might be called during the marking phase of the collector |
1052 // hence the unchecked cast. | 1053 // hence the unchecked cast. |
1053 return reinterpret_cast<Code*>(result); | 1054 return reinterpret_cast<Code*>(result); |
1054 } | 1055 } |
1055 | 1056 |
1056 | 1057 |
1057 MaybeObject* StubCache::ComputeCallInitialize(int argc, | 1058 MaybeObject* StubCache::ComputeCallInitialize(int argc, |
1058 InLoopFlag in_loop, | 1059 InLoopFlag in_loop, |
1059 Code::Kind kind) { | 1060 Code::Kind kind) { |
1060 Code::Flags flags = Code::ComputeFlags(kind, | 1061 Code::Flags flags = Code::ComputeFlags(kind, |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1212 } | 1213 } |
1213 if (!probe->IsUndefined()) return probe; | 1214 if (!probe->IsUndefined()) return probe; |
1214 StubCompiler compiler; | 1215 StubCompiler compiler; |
1215 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); | 1216 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); |
1216 } | 1217 } |
1217 #endif | 1218 #endif |
1218 | 1219 |
1219 | 1220 |
1220 void StubCache::Clear() { | 1221 void StubCache::Clear() { |
1221 for (int i = 0; i < kPrimaryTableSize; i++) { | 1222 for (int i = 0; i < kPrimaryTableSize; i++) { |
1222 primary_[i].key = isolate_->heap()->empty_string(); | 1223 primary_[i].key = heap()->empty_string(); |
1223 primary_[i].value = isolate_->builtins()->builtin( | 1224 primary_[i].value = isolate_->builtins()->builtin( |
1224 Builtins::kIllegal); | 1225 Builtins::kIllegal); |
1225 } | 1226 } |
1226 for (int j = 0; j < kSecondaryTableSize; j++) { | 1227 for (int j = 0; j < kSecondaryTableSize; j++) { |
1227 secondary_[j].key = isolate_->heap()->empty_string(); | 1228 secondary_[j].key = heap()->empty_string(); |
1228 secondary_[j].value = isolate_->builtins()->builtin( | 1229 secondary_[j].value = isolate_->builtins()->builtin( |
1229 Builtins::kIllegal); | 1230 Builtins::kIllegal); |
1230 } | 1231 } |
1231 } | 1232 } |
1232 | 1233 |
1233 | 1234 |
1234 void StubCache::CollectMatchingMaps(ZoneMapList* types, | 1235 void StubCache::CollectMatchingMaps(ZoneMapList* types, |
1235 String* name, | 1236 String* name, |
1236 Code::Flags flags) { | 1237 Code::Flags flags) { |
1237 for (int i = 0; i < kPrimaryTableSize; i++) { | 1238 for (int i = 0; i < kPrimaryTableSize; i++) { |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1661 #undef CALL_LOGGER_TAG | 1662 #undef CALL_LOGGER_TAG |
1662 | 1663 |
1663 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, | 1664 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, |
1664 const char* name) { | 1665 const char* name) { |
1665 // Check for allocation failures during stub compilation. | 1666 // Check for allocation failures during stub compilation. |
1666 if (failure_->IsFailure()) return failure_; | 1667 if (failure_->IsFailure()) return failure_; |
1667 | 1668 |
1668 // Create code object in the heap. | 1669 // Create code object in the heap. |
1669 CodeDesc desc; | 1670 CodeDesc desc; |
1670 masm_.GetCode(&desc); | 1671 masm_.GetCode(&desc); |
1671 MaybeObject* result = HEAP->CreateCode(desc, flags, masm_.CodeObject()); | 1672 MaybeObject* result = heap()->CreateCode(desc, flags, masm_.CodeObject()); |
1672 #ifdef ENABLE_DISASSEMBLER | 1673 #ifdef ENABLE_DISASSEMBLER |
1673 if (FLAG_print_code_stubs && !result->IsFailure()) { | 1674 if (FLAG_print_code_stubs && !result->IsFailure()) { |
1674 Code::cast(result->ToObjectUnchecked())->Disassemble(name); | 1675 Code::cast(result->ToObjectUnchecked())->Disassemble(name); |
1675 } | 1676 } |
1676 #endif | 1677 #endif |
1677 return result; | 1678 return result; |
1678 } | 1679 } |
1679 | 1680 |
1680 | 1681 |
1681 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, String* name) { | 1682 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, String* name) { |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1937 } | 1938 } |
1938 Code* code = Code::cast(result); | 1939 Code* code = Code::cast(result); |
1939 USE(code); | 1940 USE(code); |
1940 PROFILE(isolate(), | 1941 PROFILE(isolate(), |
1941 CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")); | 1942 CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")); |
1942 return result; | 1943 return result; |
1943 } | 1944 } |
1944 | 1945 |
1945 | 1946 |
1946 } } // namespace v8::internal | 1947 } } // namespace v8::internal |
OLD | NEW |