Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(125)

Side by Side Diff: src/objects.cc

Issue 15691017: Make assertion scopes thread safe. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 return false; 1038 return false;
1039 } 1039 }
1040 1040
1041 1041
1042 MaybeObject* String::SlowTryFlatten(PretenureFlag pretenure) { 1042 MaybeObject* String::SlowTryFlatten(PretenureFlag pretenure) {
1043 #ifdef DEBUG 1043 #ifdef DEBUG
1044 // Do not attempt to flatten in debug mode when allocation is not 1044 // Do not attempt to flatten in debug mode when allocation is not
1045 // allowed. This is to avoid an assertion failure when allocating. 1045 // allowed. This is to avoid an assertion failure when allocating.
1046 // Flattening strings is the only case where we always allow 1046 // Flattening strings is the only case where we always allow
1047 // allocation because no GC is performed if the allocation fails. 1047 // allocation because no GC is performed if the allocation fails.
1048 if (!HEAP->IsAllocationAllowed()) return this; 1048 if (!AllowHeapAllocation::IsAllowed()) return this;
1049 #endif 1049 #endif
1050 1050
1051 Heap* heap = GetHeap(); 1051 Heap* heap = GetHeap();
1052 switch (StringShape(this).representation_tag()) { 1052 switch (StringShape(this).representation_tag()) {
1053 case kConsStringTag: { 1053 case kConsStringTag: {
1054 ConsString* cs = ConsString::cast(this); 1054 ConsString* cs = ConsString::cast(this);
1055 if (cs->second()->length() == 0) { 1055 if (cs->second()->length() == 0) {
1056 return cs->first(); 1056 return cs->first();
1057 } 1057 }
1058 // There's little point in putting the flat string in new space if the 1058 // There's little point in putting the flat string in new space if the
(...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after
2621 return maybe_map; 2621 return maybe_map;
2622 } 2622 }
2623 } 2623 }
2624 2624
2625 new_map->set_owns_descriptors(true); 2625 new_map->set_owns_descriptors(true);
2626 return new_map; 2626 return new_map;
2627 } 2627 }
2628 2628
2629 2629
2630 Map* Map::CurrentMapForDeprecated() { 2630 Map* Map::CurrentMapForDeprecated() {
2631 AssertNoAllocation no_allocation; 2631 DisallowHeapAllocation no_allocation;
2632 if (!is_deprecated()) return this; 2632 if (!is_deprecated()) return this;
2633 2633
2634 DescriptorArray* old_descriptors = instance_descriptors(); 2634 DescriptorArray* old_descriptors = instance_descriptors();
2635 2635
2636 int descriptors = NumberOfOwnDescriptors(); 2636 int descriptors = NumberOfOwnDescriptors();
2637 Map* root_map = FindRootMap(); 2637 Map* root_map = FindRootMap();
2638 2638
2639 // Check the state of the root map. 2639 // Check the state of the root map.
2640 if (!EquivalentToForTransition(root_map)) return NULL; 2640 if (!EquivalentToForTransition(root_map)) return NULL;
2641 int verbatim = root_map->NumberOfOwnDescriptors(); 2641 int verbatim = root_map->NumberOfOwnDescriptors();
(...skipping 2552 matching lines...) Expand 10 before | Expand all | Expand 10 after
5194 if (!key->IsUndefined()) return true; 5194 if (!key->IsUndefined()) return true;
5195 } 5195 }
5196 return false; 5196 return false;
5197 } 5197 }
5198 5198
5199 5199
5200 // Check whether this object references another object. 5200 // Check whether this object references another object.
5201 bool JSObject::ReferencesObject(Object* obj) { 5201 bool JSObject::ReferencesObject(Object* obj) {
5202 Map* map_of_this = map(); 5202 Map* map_of_this = map();
5203 Heap* heap = GetHeap(); 5203 Heap* heap = GetHeap();
5204 AssertNoAllocation no_alloc; 5204 DisallowHeapAllocation no_allocation;
5205 5205
5206 // Is the object the constructor for this object? 5206 // Is the object the constructor for this object?
5207 if (map_of_this->constructor() == obj) { 5207 if (map_of_this->constructor() == obj) {
5208 return true; 5208 return true;
5209 } 5209 }
5210 5210
5211 // Is the object the prototype for this object? 5211 // Is the object the prototype for this object?
5212 if (map_of_this->prototype() == obj) { 5212 if (map_of_this->prototype() == obj) {
5213 return true; 5213 return true;
5214 } 5214 }
(...skipping 2323 matching lines...) Expand 10 before | Expand all | Expand 10 after
7538 7538
7539 MaybeObject* FixedArray::CopySize(int new_length) { 7539 MaybeObject* FixedArray::CopySize(int new_length) {
7540 Heap* heap = GetHeap(); 7540 Heap* heap = GetHeap();
7541 if (new_length == 0) return heap->empty_fixed_array(); 7541 if (new_length == 0) return heap->empty_fixed_array();
7542 Object* obj; 7542 Object* obj;
7543 { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length); 7543 { MaybeObject* maybe_obj = heap->AllocateFixedArray(new_length);
7544 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 7544 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
7545 } 7545 }
7546 FixedArray* result = FixedArray::cast(obj); 7546 FixedArray* result = FixedArray::cast(obj);
7547 // Copy the content 7547 // Copy the content
7548 AssertNoAllocation no_gc; 7548 DisallowHeapAllocation no_gc;
7549 int len = length(); 7549 int len = length();
7550 if (new_length < len) len = new_length; 7550 if (new_length < len) len = new_length;
7551 // We are taking the map from the old fixed array so the map is sure to 7551 // We are taking the map from the old fixed array so the map is sure to
7552 // be an immortal immutable object. 7552 // be an immortal immutable object.
7553 result->set_map_no_write_barrier(map()); 7553 result->set_map_no_write_barrier(map());
7554 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); 7554 WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc);
7555 for (int i = 0; i < len; i++) { 7555 for (int i = 0; i < len; i++) {
7556 result->set(i, get(i), mode); 7556 result->set(i, get(i), mode);
7557 } 7557 }
7558 return result; 7558 return result;
7559 } 7559 }
7560 7560
7561 7561
7562 void FixedArray::CopyTo(int pos, FixedArray* dest, int dest_pos, int len) { 7562 void FixedArray::CopyTo(int pos, FixedArray* dest, int dest_pos, int len) {
7563 AssertNoAllocation no_gc; 7563 DisallowHeapAllocation no_gc;
7564 WriteBarrierMode mode = dest->GetWriteBarrierMode(no_gc); 7564 WriteBarrierMode mode = dest->GetWriteBarrierMode(no_gc);
7565 for (int index = 0; index < len; index++) { 7565 for (int index = 0; index < len; index++) {
7566 dest->set(dest_pos+index, get(pos+index), mode); 7566 dest->set(dest_pos+index, get(pos+index), mode);
7567 } 7567 }
7568 } 7568 }
7569 7569
7570 7570
7571 #ifdef DEBUG 7571 #ifdef DEBUG
7572 bool FixedArray::IsEqualTo(FixedArray* other) { 7572 bool FixedArray::IsEqualTo(FixedArray* other) {
7573 if (length() != other->length()) return false; 7573 if (length() != other->length()) return false;
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
7837 #endif 7837 #endif
7838 7838
7839 7839
7840 bool String::LooksValid() { 7840 bool String::LooksValid() {
7841 if (!Isolate::Current()->heap()->Contains(this)) return false; 7841 if (!Isolate::Current()->heap()->Contains(this)) return false;
7842 return true; 7842 return true;
7843 } 7843 }
7844 7844
7845 7845
7846 String::FlatContent String::GetFlatContent() { 7846 String::FlatContent String::GetFlatContent() {
7847 ASSERT(!GetHeap()->allow_allocation(false)); 7847 ASSERT(!AllowHeapAllocation::IsAllowed());
7848 int length = this->length(); 7848 int length = this->length();
7849 StringShape shape(this); 7849 StringShape shape(this);
7850 String* string = this; 7850 String* string = this;
7851 int offset = 0; 7851 int offset = 0;
7852 if (shape.representation_tag() == kConsStringTag) { 7852 if (shape.representation_tag() == kConsStringTag) {
7853 ConsString* cons = ConsString::cast(string); 7853 ConsString* cons = ConsString::cast(string);
7854 if (cons->second()->length() != 0) { 7854 if (cons->second()->length() != 0) {
7855 return FlatContent(); 7855 return FlatContent();
7856 } 7856 }
7857 string = cons->first(); 7857 string = cons->first();
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
8064 str_(0), 8064 str_(0),
8065 is_ascii_(true), 8065 is_ascii_(true),
8066 length_(input.length()), 8066 length_(input.length()),
8067 start_(input.start()) { } 8067 start_(input.start()) { }
8068 8068
8069 8069
8070 void FlatStringReader::PostGarbageCollection() { 8070 void FlatStringReader::PostGarbageCollection() {
8071 if (str_ == NULL) return; 8071 if (str_ == NULL) return;
8072 Handle<String> str(str_); 8072 Handle<String> str(str_);
8073 ASSERT(str->IsFlat()); 8073 ASSERT(str->IsFlat());
8074 AssertNoAllocation no_gc; 8074 DisallowHeapAllocation no_gc;
8075 // This does not actually prevent the vector from being relocated later. 8075 // This does not actually prevent the vector from being relocated later.
8076 String::FlatContent content = str->GetFlatContent(); 8076 String::FlatContent content = str->GetFlatContent();
8077 ASSERT(content.IsFlat()); 8077 ASSERT(content.IsFlat());
8078 is_ascii_ = content.IsAscii(); 8078 is_ascii_ = content.IsAscii();
8079 if (is_ascii_) { 8079 if (is_ascii_) {
8080 start_ = content.ToOneByteVector().start(); 8080 start_ = content.ToOneByteVector().start();
8081 } else { 8081 } else {
8082 start_ = content.ToUC16Vector().start(); 8082 start_ = content.ToUC16Vector().start();
8083 } 8083 }
8084 } 8084 }
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after
8617 utf8_data += cursor; 8617 utf8_data += cursor;
8618 remaining_in_str -= cursor; 8618 remaining_in_str -= cursor;
8619 } 8619 }
8620 return (allow_prefix_match || i == slen) && remaining_in_str == 0; 8620 return (allow_prefix_match || i == slen) && remaining_in_str == 0;
8621 } 8621 }
8622 8622
8623 8623
8624 bool String::IsOneByteEqualTo(Vector<const uint8_t> str) { 8624 bool String::IsOneByteEqualTo(Vector<const uint8_t> str) {
8625 int slen = length(); 8625 int slen = length();
8626 if (str.length() != slen) return false; 8626 if (str.length() != slen) return false;
8627 AssertNoAllocation no_gc; 8627 DisallowHeapAllocation no_gc;
8628 FlatContent content = GetFlatContent(); 8628 FlatContent content = GetFlatContent();
8629 if (content.IsAscii()) { 8629 if (content.IsAscii()) {
8630 return CompareChars(content.ToOneByteVector().start(), 8630 return CompareChars(content.ToOneByteVector().start(),
8631 str.start(), slen) == 0; 8631 str.start(), slen) == 0;
8632 } 8632 }
8633 for (int i = 0; i < slen; i++) { 8633 for (int i = 0; i < slen; i++) {
8634 if (Get(i) != static_cast<uint16_t>(str[i])) return false; 8634 if (Get(i) != static_cast<uint16_t>(str[i])) return false;
8635 } 8635 }
8636 return true; 8636 return true;
8637 } 8637 }
8638 8638
8639 8639
8640 bool String::IsTwoByteEqualTo(Vector<const uc16> str) { 8640 bool String::IsTwoByteEqualTo(Vector<const uc16> str) {
8641 int slen = length(); 8641 int slen = length();
8642 if (str.length() != slen) return false; 8642 if (str.length() != slen) return false;
8643 AssertNoAllocation no_gc; 8643 DisallowHeapAllocation no_gc;
8644 FlatContent content = GetFlatContent(); 8644 FlatContent content = GetFlatContent();
8645 if (content.IsTwoByte()) { 8645 if (content.IsTwoByte()) {
8646 return CompareChars(content.ToUC16Vector().start(), str.start(), slen) == 0; 8646 return CompareChars(content.ToUC16Vector().start(), str.start(), slen) == 0;
8647 } 8647 }
8648 for (int i = 0; i < slen; i++) { 8648 for (int i = 0; i < slen; i++) {
8649 if (Get(i) != str[i]) return false; 8649 if (Get(i) != str[i]) return false;
8650 } 8650 }
8651 return true; 8651 return true;
8652 } 8652 }
8653 8653
(...skipping 1110 matching lines...) Expand 10 before | Expand all | Expand 10 after
9764 if (length != recompiled_relocation->length()) return false; 9764 if (length != recompiled_relocation->length()) return false;
9765 int compare = memcmp(code_relocation->GetDataStartAddress(), 9765 int compare = memcmp(code_relocation->GetDataStartAddress(),
9766 recompiled_relocation->GetDataStartAddress(), 9766 recompiled_relocation->GetDataStartAddress(),
9767 length); 9767 length);
9768 return compare == 0; 9768 return compare == 0;
9769 } 9769 }
9770 9770
9771 9771
9772 void SharedFunctionInfo::EnableDeoptimizationSupport(Code* recompiled) { 9772 void SharedFunctionInfo::EnableDeoptimizationSupport(Code* recompiled) {
9773 ASSERT(!has_deoptimization_support()); 9773 ASSERT(!has_deoptimization_support());
9774 AssertNoAllocation no_allocation; 9774 DisallowHeapAllocation no_allocation;
9775 Code* code = this->code(); 9775 Code* code = this->code();
9776 if (IsCodeEquivalent(code, recompiled)) { 9776 if (IsCodeEquivalent(code, recompiled)) {
9777 // Copy the deoptimization data from the recompiled code. 9777 // Copy the deoptimization data from the recompiled code.
9778 code->set_deoptimization_data(recompiled->deoptimization_data()); 9778 code->set_deoptimization_data(recompiled->deoptimization_data());
9779 code->set_has_deoptimization_support(true); 9779 code->set_has_deoptimization_support(true);
9780 } else { 9780 } else {
9781 // TODO(3025757): In case the recompiled isn't equivalent to the 9781 // TODO(3025757): In case the recompiled isn't equivalent to the
9782 // old code, we have to replace it. We should try to avoid this 9782 // old code, we have to replace it. We should try to avoid this
9783 // altogether because it flushes valuable type feedback by 9783 // altogether because it flushes valuable type feedback by
9784 // effectively resetting all IC state. 9784 // effectively resetting all IC state.
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
10081 10081
10082 // unbox handles and relocate 10082 // unbox handles and relocate
10083 intptr_t delta = instruction_start() - desc.buffer; 10083 intptr_t delta = instruction_start() - desc.buffer;
10084 int mode_mask = RelocInfo::kCodeTargetMask | 10084 int mode_mask = RelocInfo::kCodeTargetMask |
10085 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | 10085 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
10086 RelocInfo::ModeMask(RelocInfo::GLOBAL_PROPERTY_CELL) | 10086 RelocInfo::ModeMask(RelocInfo::GLOBAL_PROPERTY_CELL) |
10087 RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) | 10087 RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
10088 RelocInfo::kApplyMask; 10088 RelocInfo::kApplyMask;
10089 // Needed to find target_object and runtime_entry on X64 10089 // Needed to find target_object and runtime_entry on X64
10090 Assembler* origin = desc.origin; 10090 Assembler* origin = desc.origin;
10091 ALLOW_HANDLE_DEREF(GetIsolate(), "embedding raw addresses into code"); 10091 ALLOW_DEFERRED_HANDLE_DEREF(GetIsolate(),
10092 "embedding raw addresses into code");
10092 for (RelocIterator it(this, mode_mask); !it.done(); it.next()) { 10093 for (RelocIterator it(this, mode_mask); !it.done(); it.next()) {
10093 RelocInfo::Mode mode = it.rinfo()->rmode(); 10094 RelocInfo::Mode mode = it.rinfo()->rmode();
10094 if (mode == RelocInfo::EMBEDDED_OBJECT) { 10095 if (mode == RelocInfo::EMBEDDED_OBJECT) {
10095 Handle<Object> p = it.rinfo()->target_object_handle(origin); 10096 Handle<Object> p = it.rinfo()->target_object_handle(origin);
10096 it.rinfo()->set_target_object(*p, SKIP_WRITE_BARRIER); 10097 it.rinfo()->set_target_object(*p, SKIP_WRITE_BARRIER);
10097 } else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) { 10098 } else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
10098 Handle<JSGlobalPropertyCell> cell = it.rinfo()->target_cell_handle(); 10099 Handle<JSGlobalPropertyCell> cell = it.rinfo()->target_cell_handle();
10099 it.rinfo()->set_target_cell(*cell, SKIP_WRITE_BARRIER); 10100 it.rinfo()->set_target_cell(*cell, SKIP_WRITE_BARRIER);
10100 } else if (RelocInfo::IsCodeTarget(mode)) { 10101 } else if (RelocInfo::IsCodeTarget(mode)) {
10101 // rewrite code handles in inline cache targets to direct 10102 // rewrite code handles in inline cache targets to direct
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
10172 10173
10173 10174
10174 SafepointEntry Code::GetSafepointEntry(Address pc) { 10175 SafepointEntry Code::GetSafepointEntry(Address pc) {
10175 SafepointTable table(this); 10176 SafepointTable table(this);
10176 return table.FindEntry(pc); 10177 return table.FindEntry(pc);
10177 } 10178 }
10178 10179
10179 10180
10180 Map* Code::FindFirstMap() { 10181 Map* Code::FindFirstMap() {
10181 ASSERT(is_inline_cache_stub()); 10182 ASSERT(is_inline_cache_stub());
10182 AssertNoAllocation no_allocation; 10183 DisallowHeapAllocation no_allocation;
10183 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10184 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10184 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10185 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10185 RelocInfo* info = it.rinfo(); 10186 RelocInfo* info = it.rinfo();
10186 Object* object = info->target_object(); 10187 Object* object = info->target_object();
10187 if (object->IsMap()) return Map::cast(object); 10188 if (object->IsMap()) return Map::cast(object);
10188 } 10189 }
10189 return NULL; 10190 return NULL;
10190 } 10191 }
10191 10192
10192 10193
10193 void Code::ReplaceFirstMap(Map* replace_with) { 10194 void Code::ReplaceFirstMap(Map* replace_with) {
10194 ASSERT(is_inline_cache_stub()); 10195 ASSERT(is_inline_cache_stub());
10195 AssertNoAllocation no_allocation; 10196 DisallowHeapAllocation no_allocation;
10196 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10197 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10197 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10198 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10198 RelocInfo* info = it.rinfo(); 10199 RelocInfo* info = it.rinfo();
10199 Object* object = info->target_object(); 10200 Object* object = info->target_object();
10200 if (object->IsMap()) { 10201 if (object->IsMap()) {
10201 info->set_target_object(replace_with); 10202 info->set_target_object(replace_with);
10202 return; 10203 return;
10203 } 10204 }
10204 } 10205 }
10205 UNREACHABLE(); 10206 UNREACHABLE();
10206 } 10207 }
10207 10208
10208 10209
10209 void Code::FindAllMaps(MapHandleList* maps) { 10210 void Code::FindAllMaps(MapHandleList* maps) {
10210 ASSERT(is_inline_cache_stub()); 10211 ASSERT(is_inline_cache_stub());
10211 AssertNoAllocation no_allocation; 10212 DisallowHeapAllocation no_allocation;
10212 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10213 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10213 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10214 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10214 RelocInfo* info = it.rinfo(); 10215 RelocInfo* info = it.rinfo();
10215 Object* object = info->target_object(); 10216 Object* object = info->target_object();
10216 if (object->IsMap()) maps->Add(Handle<Map>(Map::cast(object))); 10217 if (object->IsMap()) maps->Add(Handle<Map>(Map::cast(object)));
10217 } 10218 }
10218 } 10219 }
10219 10220
10220 10221
10221 Code* Code::FindFirstCode() { 10222 Code* Code::FindFirstCode() {
10222 ASSERT(is_inline_cache_stub()); 10223 ASSERT(is_inline_cache_stub());
10223 AssertNoAllocation no_allocation; 10224 DisallowHeapAllocation no_allocation;
10224 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); 10225 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET);
10225 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10226 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10226 RelocInfo* info = it.rinfo(); 10227 RelocInfo* info = it.rinfo();
10227 return Code::GetCodeFromTargetAddress(info->target_address()); 10228 return Code::GetCodeFromTargetAddress(info->target_address());
10228 } 10229 }
10229 return NULL; 10230 return NULL;
10230 } 10231 }
10231 10232
10232 10233
10233 void Code::FindAllCode(CodeHandleList* code_list, int length) { 10234 void Code::FindAllCode(CodeHandleList* code_list, int length) {
10234 ASSERT(is_inline_cache_stub()); 10235 ASSERT(is_inline_cache_stub());
10235 AssertNoAllocation no_allocation; 10236 DisallowHeapAllocation no_allocation;
10236 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); 10237 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET);
10237 int i = 0; 10238 int i = 0;
10238 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10239 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10239 if (i++ == length) return; 10240 if (i++ == length) return;
10240 RelocInfo* info = it.rinfo(); 10241 RelocInfo* info = it.rinfo();
10241 Code* code = Code::GetCodeFromTargetAddress(info->target_address()); 10242 Code* code = Code::GetCodeFromTargetAddress(info->target_address());
10242 ASSERT(code->kind() == Code::STUB); 10243 ASSERT(code->kind() == Code::STUB);
10243 code_list->Add(Handle<Code>(code)); 10244 code_list->Add(Handle<Code>(code));
10244 } 10245 }
10245 UNREACHABLE(); 10246 UNREACHABLE();
10246 } 10247 }
10247 10248
10248 10249
10249 Name* Code::FindFirstName() { 10250 Name* Code::FindFirstName() {
10250 ASSERT(is_inline_cache_stub()); 10251 ASSERT(is_inline_cache_stub());
10251 AssertNoAllocation no_allocation; 10252 DisallowHeapAllocation no_allocation;
10252 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); 10253 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
10253 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10254 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10254 RelocInfo* info = it.rinfo(); 10255 RelocInfo* info = it.rinfo();
10255 Object* object = info->target_object(); 10256 Object* object = info->target_object();
10256 if (object->IsName()) return Name::cast(object); 10257 if (object->IsName()) return Name::cast(object);
10257 } 10258 }
10258 return NULL; 10259 return NULL;
10259 } 10260 }
10260 10261
10261 10262
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after
11128 public: 11129 public:
11129 virtual bool TakeFunction(JSFunction* function) { 11130 virtual bool TakeFunction(JSFunction* function) {
11130 return function->code()->marked_for_deoptimization(); 11131 return function->code()->marked_for_deoptimization();
11131 } 11132 }
11132 }; 11133 };
11133 11134
11134 11135
11135 void DependentCode::DeoptimizeDependentCodeGroup( 11136 void DependentCode::DeoptimizeDependentCodeGroup(
11136 Isolate* isolate, 11137 Isolate* isolate,
11137 DependentCode::DependencyGroup group) { 11138 DependentCode::DependencyGroup group) {
11138 AssertNoAllocation no_allocation_scope; 11139 DisallowHeapAllocation no_allocation_scope;
11139 DependentCode::GroupStartIndexes starts(this); 11140 DependentCode::GroupStartIndexes starts(this);
11140 int start = starts.at(group); 11141 int start = starts.at(group);
11141 int end = starts.at(group + 1); 11142 int end = starts.at(group + 1);
11142 int number_of_entries = starts.at(DependentCode::kGroupCount); 11143 int number_of_entries = starts.at(DependentCode::kGroupCount);
11143 if (start == end) return; 11144 if (start == end) return;
11144 for (int i = start; i < end; i++) { 11145 for (int i = start; i < end; i++) {
11145 Code* code = code_at(i); 11146 Code* code = code_at(i);
11146 code->set_marked_for_deoptimization(true); 11147 code->set_marked_for_deoptimization(true);
11147 } 11148 }
11148 // Compact the array by moving all subsequent groups to fill in the new holes. 11149 // Compact the array by moving all subsequent groups to fill in the new holes.
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after
12547 } 12548 }
12548 } 12549 }
12549 } 12550 }
12550 #endif 12551 #endif
12551 12552
12552 12553
12553 template<typename Shape, typename Key> 12554 template<typename Shape, typename Key>
12554 void Dictionary<Shape, Key>::CopyValuesTo(FixedArray* elements) { 12555 void Dictionary<Shape, Key>::CopyValuesTo(FixedArray* elements) {
12555 int pos = 0; 12556 int pos = 0;
12556 int capacity = HashTable<Shape, Key>::Capacity(); 12557 int capacity = HashTable<Shape, Key>::Capacity();
12557 AssertNoAllocation no_gc; 12558 DisallowHeapAllocation no_gc;
12558 WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc); 12559 WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc);
12559 for (int i = 0; i < capacity; i++) { 12560 for (int i = 0; i < capacity; i++) {
12560 Object* k = Dictionary<Shape, Key>::KeyAt(i); 12561 Object* k = Dictionary<Shape, Key>::KeyAt(i);
12561 if (Dictionary<Shape, Key>::IsKey(k)) { 12562 if (Dictionary<Shape, Key>::IsKey(k)) {
12562 elements->set(pos++, ValueAt(i), mode); 12563 elements->set(pos++, ValueAt(i), mode);
12563 } 12564 }
12564 } 12565 }
12565 ASSERT(pos == elements->length()); 12566 ASSERT(pos == elements->length());
12566 } 12567 }
12567 12568
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after
13428 entry = NextProbe(entry, count++, capacity); 13429 entry = NextProbe(entry, count++, capacity);
13429 } 13430 }
13430 return kNotFound; 13431 return kNotFound;
13431 } 13432 }
13432 13433
13433 13434
13434 template<typename Shape, typename Key> 13435 template<typename Shape, typename Key>
13435 MaybeObject* HashTable<Shape, Key>::Rehash(HashTable* new_table, Key key) { 13436 MaybeObject* HashTable<Shape, Key>::Rehash(HashTable* new_table, Key key) {
13436 ASSERT(NumberOfElements() < new_table->Capacity()); 13437 ASSERT(NumberOfElements() < new_table->Capacity());
13437 13438
13438 AssertNoAllocation no_gc; 13439 DisallowHeapAllocation no_gc;
13439 WriteBarrierMode mode = new_table->GetWriteBarrierMode(no_gc); 13440 WriteBarrierMode mode = new_table->GetWriteBarrierMode(no_gc);
13440 13441
13441 // Copy prefix to new array. 13442 // Copy prefix to new array.
13442 for (int i = kPrefixStartIndex; 13443 for (int i = kPrefixStartIndex;
13443 i < kPrefixStartIndex + Shape::kPrefixSize; 13444 i < kPrefixStartIndex + Shape::kPrefixSize;
13444 i++) { 13445 i++) {
13445 new_table->set(i, get(i), mode); 13446 new_table->set(i, get(i), mode);
13446 } 13447 }
13447 13448
13448 // Rehash the elements. 13449 // Rehash the elements.
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
13671 result_double = HeapNumber::cast(new_double); 13672 result_double = HeapNumber::cast(new_double);
13672 } 13673 }
13673 13674
13674 Object* obj; 13675 Object* obj;
13675 { MaybeObject* maybe_obj = 13676 { MaybeObject* maybe_obj =
13676 SeededNumberDictionary::Allocate(GetHeap(), dict->NumberOfElements()); 13677 SeededNumberDictionary::Allocate(GetHeap(), dict->NumberOfElements());
13677 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 13678 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
13678 } 13679 }
13679 SeededNumberDictionary* new_dict = SeededNumberDictionary::cast(obj); 13680 SeededNumberDictionary* new_dict = SeededNumberDictionary::cast(obj);
13680 13681
13681 AssertNoAllocation no_alloc; 13682 DisallowHeapAllocation no_alloc;
13682 13683
13683 uint32_t pos = 0; 13684 uint32_t pos = 0;
13684 uint32_t undefs = 0; 13685 uint32_t undefs = 0;
13685 int capacity = dict->Capacity(); 13686 int capacity = dict->Capacity();
13686 for (int i = 0; i < capacity; i++) { 13687 for (int i = 0; i < capacity; i++) {
13687 Object* k = dict->KeyAt(i); 13688 Object* k = dict->KeyAt(i);
13688 if (dict->IsKey(k)) { 13689 if (dict->IsKey(k)) {
13689 ASSERT(k->IsNumber()); 13690 ASSERT(k->IsNumber());
13690 ASSERT(!k->IsSmi() || Smi::cast(k)->value() >= 0); 13691 ASSERT(!k->IsSmi() || Smi::cast(k)->value() >= 0);
13691 ASSERT(!k->IsHeapNumber() || HeapNumber::cast(k)->value() >= 0); 13692 ASSERT(!k->IsHeapNumber() || HeapNumber::cast(k)->value() >= 0);
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
13843 } 13844 }
13844 } 13845 }
13845 } 13846 }
13846 result = holes; 13847 result = holes;
13847 while (holes < limit) { 13848 while (holes < limit) {
13848 elements->set_the_hole(holes); 13849 elements->set_the_hole(holes);
13849 holes++; 13850 holes++;
13850 } 13851 }
13851 } else { 13852 } else {
13852 FixedArray* elements = FixedArray::cast(elements_base); 13853 FixedArray* elements = FixedArray::cast(elements_base);
13853 AssertNoAllocation no_alloc; 13854 DisallowHeapAllocation no_gc;
13854 13855
13855 // Split elements into defined, undefined and the_hole, in that order. Only 13856 // Split elements into defined, undefined and the_hole, in that order. Only
13856 // count locations for undefined and the hole, and fill them afterwards. 13857 // count locations for undefined and the hole, and fill them afterwards.
13857 WriteBarrierMode write_barrier = elements->GetWriteBarrierMode(no_alloc); 13858 WriteBarrierMode write_barrier = elements->GetWriteBarrierMode(no_gc);
13858 unsigned int undefs = limit; 13859 unsigned int undefs = limit;
13859 unsigned int holes = limit; 13860 unsigned int holes = limit;
13860 // Assume most arrays contain no holes and undefined values, so minimize the 13861 // Assume most arrays contain no holes and undefined values, so minimize the
13861 // number of stores of non-undefined, non-the-hole values. 13862 // number of stores of non-undefined, non-the-hole values.
13862 for (unsigned int i = 0; i < undefs; i++) { 13863 for (unsigned int i = 0; i < undefs; i++) {
13863 Object* current = elements->get(i); 13864 Object* current = elements->get(i);
13864 if (current->IsTheHole()) { 13865 if (current->IsTheHole()) {
13865 holes--; 13866 holes--;
13866 undefs--; 13867 undefs--;
13867 } else if (current->IsUndefined()) { 13868 } else if (current->IsUndefined()) {
(...skipping 1367 matching lines...) Expand 10 before | Expand all | Expand 10 after
15235 int previous_length = 15236 int previous_length =
15236 previous.is_null() ? 0 : previous->serialized_data()->length(); 15237 previous.is_null() ? 0 : previous->serialized_data()->length();
15237 int length = sizeof(descriptor) + previous_length; 15238 int length = sizeof(descriptor) + previous_length;
15238 Handle<ByteArray> serialized_descriptor = 15239 Handle<ByteArray> serialized_descriptor =
15239 isolate->factory()->NewByteArray(length); 15240 isolate->factory()->NewByteArray(length);
15240 Handle<DeclaredAccessorDescriptor> value = 15241 Handle<DeclaredAccessorDescriptor> value =
15241 isolate->factory()->NewDeclaredAccessorDescriptor(); 15242 isolate->factory()->NewDeclaredAccessorDescriptor();
15242 value->set_serialized_data(*serialized_descriptor); 15243 value->set_serialized_data(*serialized_descriptor);
15243 // Copy in the data. 15244 // Copy in the data.
15244 { 15245 {
15245 AssertNoAllocation no_allocation; 15246 DisallowHeapAllocation no_allocation;
15246 uint8_t* array = serialized_descriptor->GetDataStartAddress(); 15247 uint8_t* array = serialized_descriptor->GetDataStartAddress();
15247 if (previous_length != 0) { 15248 if (previous_length != 0) {
15248 uint8_t* previous_array = 15249 uint8_t* previous_array =
15249 previous->serialized_data()->GetDataStartAddress(); 15250 previous->serialized_data()->GetDataStartAddress();
15250 OS::MemCopy(array, previous_array, previous_length); 15251 OS::MemCopy(array, previous_array, previous_length);
15251 array += previous_length; 15252 array += previous_length;
15252 } 15253 }
15253 ASSERT(reinterpret_cast<uintptr_t>(array) % sizeof(uintptr_t) == 0); 15254 ASSERT(reinterpret_cast<uintptr_t>(array) % sizeof(uintptr_t) == 0);
15254 DeclaredAccessorDescriptorData* data = 15255 DeclaredAccessorDescriptorData* data =
15255 reinterpret_cast<DeclaredAccessorDescriptorData*>(array); 15256 reinterpret_cast<DeclaredAccessorDescriptorData*>(array);
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
15637 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 15638 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
15638 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 15639 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
15639 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 15640 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
15640 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 15641 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
15641 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 15642 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
15642 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 15643 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
15643 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 15644 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
15644 } 15645 }
15645 15646
15646 } } // namespace v8::internal 15647 } } // namespace v8::internal
OLDNEW
« src/isolate.cc ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698