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

Side by Side Diff: src/liveedit.cc

Issue 430503007: Rename ASSERT* to DCHECK*. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE and fixes Created 6 years, 4 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
« no previous file with comments | « src/lithium-inl.h ('k') | src/log.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 5
6 #include "src/v8.h" 6 #include "src/v8.h"
7 7
8 #include "src/liveedit.h" 8 #include "src/liveedit.h"
9 9
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 return (len2_ - pos2) << kDirectionSizeBits; 154 return (len2_ - pos2) << kDirectionSizeBits;
155 } 155 }
156 } 156 }
157 157
158 inline int& get_cell(int i1, int i2) { 158 inline int& get_cell(int i1, int i2) {
159 return buffer_[i1 + i2 * len1_]; 159 return buffer_[i1 + i2 * len1_];
160 } 160 }
161 161
162 // Each cell keeps a value plus direction. Value is multiplied by 4. 162 // Each cell keeps a value plus direction. Value is multiplied by 4.
163 void set_value4_and_dir(int i1, int i2, int value4, Direction dir) { 163 void set_value4_and_dir(int i1, int i2, int value4, Direction dir) {
164 ASSERT((value4 & kDirectionMask) == 0); 164 DCHECK((value4 & kDirectionMask) == 0);
165 get_cell(i1, i2) = value4 | dir; 165 get_cell(i1, i2) = value4 | dir;
166 } 166 }
167 167
168 int get_value4(int i1, int i2) { 168 int get_value4(int i1, int i2) {
169 return get_cell(i1, i2) & (kMaxUInt32 ^ kDirectionMask); 169 return get_cell(i1, i2) & (kMaxUInt32 ^ kDirectionMask);
170 } 170 }
171 Direction get_direction(int i1, int i2) { 171 Direction get_direction(int i1, int i2) {
172 return static_cast<Direction>(get_cell(i1, i2) & kDirectionMask); 172 return static_cast<Direction>(get_cell(i1, i2) & kDirectionMask);
173 } 173 }
174 174
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 static void ReplaceCodeObject(Handle<Code> original, 969 static void ReplaceCodeObject(Handle<Code> original,
970 Handle<Code> substitution) { 970 Handle<Code> substitution) {
971 // Perform a full GC in order to ensure that we are not in the middle of an 971 // Perform a full GC in order to ensure that we are not in the middle of an
972 // incremental marking phase when we are replacing the code object. 972 // incremental marking phase when we are replacing the code object.
973 // Since we are not in an incremental marking phase we can write pointers 973 // Since we are not in an incremental marking phase we can write pointers
974 // to code objects (that are never in new space) without worrying about 974 // to code objects (that are never in new space) without worrying about
975 // write barriers. 975 // write barriers.
976 Heap* heap = original->GetHeap(); 976 Heap* heap = original->GetHeap();
977 HeapIterator iterator(heap); 977 HeapIterator iterator(heap);
978 978
979 ASSERT(!heap->InNewSpace(*substitution)); 979 DCHECK(!heap->InNewSpace(*substitution));
980 980
981 ReplacingVisitor visitor(*original, *substitution); 981 ReplacingVisitor visitor(*original, *substitution);
982 982
983 // Iterate over all roots. Stack frames may have pointer into original code, 983 // Iterate over all roots. Stack frames may have pointer into original code,
984 // so temporary replace the pointers with offset numbers 984 // so temporary replace the pointers with offset numbers
985 // in prologue/epilogue. 985 // in prologue/epilogue.
986 heap->IterateRoots(&visitor, VISIT_ALL); 986 heap->IterateRoots(&visitor, VISIT_ALL);
987 987
988 // Now iterate over all pointers of all objects, including code_target 988 // Now iterate over all pointers of all objects, including code_target
989 // implicit pointers. 989 // implicit pointers.
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 SharedFunctionInfo* shared_info_; 1153 SharedFunctionInfo* shared_info_;
1154 bool found_; 1154 bool found_;
1155 1155
1156 explicit DependentFunctionMarker(SharedFunctionInfo* shared_info) 1156 explicit DependentFunctionMarker(SharedFunctionInfo* shared_info)
1157 : shared_info_(shared_info), found_(false) { } 1157 : shared_info_(shared_info), found_(false) { }
1158 1158
1159 virtual void EnterContext(Context* context) { } // Don't care. 1159 virtual void EnterContext(Context* context) { } // Don't care.
1160 virtual void LeaveContext(Context* context) { } // Don't care. 1160 virtual void LeaveContext(Context* context) { } // Don't care.
1161 virtual void VisitFunction(JSFunction* function) { 1161 virtual void VisitFunction(JSFunction* function) {
1162 // It should be guaranteed by the iterator that everything is optimized. 1162 // It should be guaranteed by the iterator that everything is optimized.
1163 ASSERT(function->code()->kind() == Code::OPTIMIZED_FUNCTION); 1163 DCHECK(function->code()->kind() == Code::OPTIMIZED_FUNCTION);
1164 if (shared_info_ == function->shared() || 1164 if (shared_info_ == function->shared() ||
1165 IsInlined(function, shared_info_)) { 1165 IsInlined(function, shared_info_)) {
1166 // Mark the code for deoptimization. 1166 // Mark the code for deoptimization.
1167 function->code()->set_marked_for_deoptimization(true); 1167 function->code()->set_marked_for_deoptimization(true);
1168 found_ = true; 1168 found_ = true;
1169 } 1169 }
1170 } 1170 }
1171 }; 1171 };
1172 1172
1173 1173
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 CHECK(element->IsSmi()); 1272 CHECK(element->IsSmi());
1273 int chunk_start = Handle<Smi>::cast(element)->value(); 1273 int chunk_start = Handle<Smi>::cast(element)->value();
1274 if (original_position < chunk_start) { 1274 if (original_position < chunk_start) {
1275 break; 1275 break;
1276 } 1276 }
1277 element = Object::GetElement( 1277 element = Object::GetElement(
1278 isolate, position_change_array, i + 1).ToHandleChecked(); 1278 isolate, position_change_array, i + 1).ToHandleChecked();
1279 CHECK(element->IsSmi()); 1279 CHECK(element->IsSmi());
1280 int chunk_end = Handle<Smi>::cast(element)->value(); 1280 int chunk_end = Handle<Smi>::cast(element)->value();
1281 // Position mustn't be inside a chunk. 1281 // Position mustn't be inside a chunk.
1282 ASSERT(original_position >= chunk_end); 1282 DCHECK(original_position >= chunk_end);
1283 element = Object::GetElement( 1283 element = Object::GetElement(
1284 isolate, position_change_array, i + 2).ToHandleChecked(); 1284 isolate, position_change_array, i + 2).ToHandleChecked();
1285 CHECK(element->IsSmi()); 1285 CHECK(element->IsSmi());
1286 int chunk_changed_end = Handle<Smi>::cast(element)->value(); 1286 int chunk_changed_end = Handle<Smi>::cast(element)->value();
1287 position_diff = chunk_changed_end - chunk_end; 1287 position_diff = chunk_changed_end - chunk_end;
1288 } 1288 }
1289 1289
1290 return original_position + position_diff; 1290 return original_position + position_diff;
1291 } 1291 }
1292 1292
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1572 // the value that is called 'restarter_frame_function_pointer'. The value 1572 // the value that is called 'restarter_frame_function_pointer'. The value
1573 // at this address (possibly updated by GC) may be used later when preparing 1573 // at this address (possibly updated by GC) may be used later when preparing
1574 // 'step in' operation. 1574 // 'step in' operation.
1575 // Frame structure (conforms InternalFrame structure): 1575 // Frame structure (conforms InternalFrame structure):
1576 // -- code 1576 // -- code
1577 // -- SMI maker 1577 // -- SMI maker
1578 // -- function (slot is called "context") 1578 // -- function (slot is called "context")
1579 // -- frame base 1579 // -- frame base
1580 static Object** SetUpFrameDropperFrame(StackFrame* bottom_js_frame, 1580 static Object** SetUpFrameDropperFrame(StackFrame* bottom_js_frame,
1581 Handle<Code> code) { 1581 Handle<Code> code) {
1582 ASSERT(bottom_js_frame->is_java_script()); 1582 DCHECK(bottom_js_frame->is_java_script());
1583 1583
1584 Address fp = bottom_js_frame->fp(); 1584 Address fp = bottom_js_frame->fp();
1585 1585
1586 // Move function pointer into "context" slot. 1586 // Move function pointer into "context" slot.
1587 Memory::Object_at(fp + StandardFrameConstants::kContextOffset) = 1587 Memory::Object_at(fp + StandardFrameConstants::kContextOffset) =
1588 Memory::Object_at(fp + JavaScriptFrameConstants::kFunctionOffset); 1588 Memory::Object_at(fp + JavaScriptFrameConstants::kFunctionOffset);
1589 1589
1590 Memory::Object_at(fp + InternalFrameConstants::kCodeOffset) = *code; 1590 Memory::Object_at(fp + InternalFrameConstants::kCodeOffset) = *code;
1591 Memory::Object_at(fp + StandardFrameConstants::kMarkerOffset) = 1591 Memory::Object_at(fp + StandardFrameConstants::kMarkerOffset) =
1592 Smi::FromInt(StackFrame::INTERNAL); 1592 Smi::FromInt(StackFrame::INTERNAL);
(...skipping 13 matching lines...) Expand all
1606 LiveEdit::FrameDropMode* mode, 1606 LiveEdit::FrameDropMode* mode,
1607 Object*** restarter_frame_function_pointer) { 1607 Object*** restarter_frame_function_pointer) {
1608 if (!LiveEdit::kFrameDropperSupported) { 1608 if (!LiveEdit::kFrameDropperSupported) {
1609 return "Stack manipulations are not supported in this architecture."; 1609 return "Stack manipulations are not supported in this architecture.";
1610 } 1610 }
1611 1611
1612 StackFrame* pre_top_frame = frames[top_frame_index - 1]; 1612 StackFrame* pre_top_frame = frames[top_frame_index - 1];
1613 StackFrame* top_frame = frames[top_frame_index]; 1613 StackFrame* top_frame = frames[top_frame_index];
1614 StackFrame* bottom_js_frame = frames[bottom_js_frame_index]; 1614 StackFrame* bottom_js_frame = frames[bottom_js_frame_index];
1615 1615
1616 ASSERT(bottom_js_frame->is_java_script()); 1616 DCHECK(bottom_js_frame->is_java_script());
1617 1617
1618 // Check the nature of the top frame. 1618 // Check the nature of the top frame.
1619 Isolate* isolate = bottom_js_frame->isolate(); 1619 Isolate* isolate = bottom_js_frame->isolate();
1620 Code* pre_top_frame_code = pre_top_frame->LookupCode(); 1620 Code* pre_top_frame_code = pre_top_frame->LookupCode();
1621 bool frame_has_padding = true; 1621 bool frame_has_padding = true;
1622 if (pre_top_frame_code->is_inline_cache_stub() && 1622 if (pre_top_frame_code->is_inline_cache_stub() &&
1623 pre_top_frame_code->is_debug_stub()) { 1623 pre_top_frame_code->is_debug_stub()) {
1624 // OK, we can drop inline cache calls. 1624 // OK, we can drop inline cache calls.
1625 *mode = LiveEdit::FRAME_DROPPED_IN_IC_CALL; 1625 *mode = LiveEdit::FRAME_DROPPED_IN_IC_CALL;
1626 } else if (pre_top_frame_code == 1626 } else if (pre_top_frame_code ==
(...skipping 15 matching lines...) Expand all
1642 // Entry from our unit tests on 'debugger' statement. 1642 // Entry from our unit tests on 'debugger' statement.
1643 // It's fine, we support this case. 1643 // It's fine, we support this case.
1644 *mode = LiveEdit::FRAME_DROPPED_IN_DIRECT_CALL; 1644 *mode = LiveEdit::FRAME_DROPPED_IN_DIRECT_CALL;
1645 // We don't have a padding from 'debugger' statement call. 1645 // We don't have a padding from 'debugger' statement call.
1646 // Here the stub is CEntry, it's not debug-only and can't be padded. 1646 // Here the stub is CEntry, it's not debug-only and can't be padded.
1647 // If anyone would complain, a proxy padded stub could be added. 1647 // If anyone would complain, a proxy padded stub could be added.
1648 frame_has_padding = false; 1648 frame_has_padding = false;
1649 } else if (pre_top_frame->type() == StackFrame::ARGUMENTS_ADAPTOR) { 1649 } else if (pre_top_frame->type() == StackFrame::ARGUMENTS_ADAPTOR) {
1650 // This must be adaptor that remain from the frame dropping that 1650 // This must be adaptor that remain from the frame dropping that
1651 // is still on stack. A frame dropper frame must be above it. 1651 // is still on stack. A frame dropper frame must be above it.
1652 ASSERT(frames[top_frame_index - 2]->LookupCode() == 1652 DCHECK(frames[top_frame_index - 2]->LookupCode() ==
1653 isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit)); 1653 isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit));
1654 pre_top_frame = frames[top_frame_index - 3]; 1654 pre_top_frame = frames[top_frame_index - 3];
1655 top_frame = frames[top_frame_index - 2]; 1655 top_frame = frames[top_frame_index - 2];
1656 *mode = LiveEdit::CURRENTLY_SET_MODE; 1656 *mode = LiveEdit::CURRENTLY_SET_MODE;
1657 frame_has_padding = false; 1657 frame_has_padding = false;
1658 } else { 1658 } else {
1659 return "Unknown structure of stack above changing function"; 1659 return "Unknown structure of stack above changing function";
1660 } 1660 }
1661 1661
1662 Address unused_stack_top = top_frame->sp(); 1662 Address unused_stack_top = top_frame->sp();
1663 int new_frame_size = LiveEdit::kFrameDropperFrameSize * kPointerSize; 1663 int new_frame_size = LiveEdit::kFrameDropperFrameSize * kPointerSize;
1664 Address unused_stack_bottom = bottom_js_frame->fp() 1664 Address unused_stack_bottom = bottom_js_frame->fp()
1665 - new_frame_size + kPointerSize; // Bigger address end is exclusive. 1665 - new_frame_size + kPointerSize; // Bigger address end is exclusive.
1666 1666
1667 Address* top_frame_pc_address = top_frame->pc_address(); 1667 Address* top_frame_pc_address = top_frame->pc_address();
1668 1668
1669 // top_frame may be damaged below this point. Do not used it. 1669 // top_frame may be damaged below this point. Do not used it.
1670 ASSERT(!(top_frame = NULL)); 1670 DCHECK(!(top_frame = NULL));
1671 1671
1672 if (unused_stack_top > unused_stack_bottom) { 1672 if (unused_stack_top > unused_stack_bottom) {
1673 if (frame_has_padding) { 1673 if (frame_has_padding) {
1674 int shortage_bytes = 1674 int shortage_bytes =
1675 static_cast<int>(unused_stack_top - unused_stack_bottom); 1675 static_cast<int>(unused_stack_top - unused_stack_bottom);
1676 1676
1677 Address padding_start = pre_top_frame->fp() - 1677 Address padding_start = pre_top_frame->fp() -
1678 LiveEdit::kFrameDropperFrameSize * kPointerSize; 1678 LiveEdit::kFrameDropperFrameSize * kPointerSize;
1679 1679
1680 Address padding_pointer = padding_start; 1680 Address padding_pointer = padding_start;
(...skipping 24 matching lines...) Expand all
1705 top_frame_pc_address -= shortage_bytes / kPointerSize; 1705 top_frame_pc_address -= shortage_bytes / kPointerSize;
1706 } else { 1706 } else {
1707 return "Not enough space for frame dropper frame"; 1707 return "Not enough space for frame dropper frame";
1708 } 1708 }
1709 } 1709 }
1710 1710
1711 // Committing now. After this point we should return only NULL value. 1711 // Committing now. After this point we should return only NULL value.
1712 1712
1713 FixTryCatchHandler(pre_top_frame, bottom_js_frame); 1713 FixTryCatchHandler(pre_top_frame, bottom_js_frame);
1714 // Make sure FixTryCatchHandler is idempotent. 1714 // Make sure FixTryCatchHandler is idempotent.
1715 ASSERT(!FixTryCatchHandler(pre_top_frame, bottom_js_frame)); 1715 DCHECK(!FixTryCatchHandler(pre_top_frame, bottom_js_frame));
1716 1716
1717 Handle<Code> code = isolate->builtins()->FrameDropper_LiveEdit(); 1717 Handle<Code> code = isolate->builtins()->FrameDropper_LiveEdit();
1718 *top_frame_pc_address = code->entry(); 1718 *top_frame_pc_address = code->entry();
1719 pre_top_frame->SetCallerFp(bottom_js_frame->fp()); 1719 pre_top_frame->SetCallerFp(bottom_js_frame->fp());
1720 1720
1721 *restarter_frame_function_pointer = 1721 *restarter_frame_function_pointer =
1722 SetUpFrameDropperFrame(bottom_js_frame, code); 1722 SetUpFrameDropperFrame(bottom_js_frame, code);
1723 1723
1724 ASSERT((**restarter_frame_function_pointer)->IsJSFunction()); 1724 DCHECK((**restarter_frame_function_pointer)->IsJSFunction());
1725 1725
1726 for (Address a = unused_stack_top; 1726 for (Address a = unused_stack_top;
1727 a < unused_stack_bottom; 1727 a < unused_stack_bottom;
1728 a += kPointerSize) { 1728 a += kPointerSize) {
1729 Memory::Object_at(a) = Smi::FromInt(0); 1729 Memory::Object_at(a) = Smi::FromInt(0);
1730 } 1730 }
1731 1731
1732 return NULL; 1732 return NULL;
1733 } 1733 }
1734 1734
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1888 return NULL; 1888 return NULL;
1889 } 1889 }
1890 1890
1891 1891
1892 bool LiveEdit::FindActiveGenerators(Handle<FixedArray> shared_info_array, 1892 bool LiveEdit::FindActiveGenerators(Handle<FixedArray> shared_info_array,
1893 Handle<FixedArray> result, 1893 Handle<FixedArray> result,
1894 int len) { 1894 int len) {
1895 Isolate* isolate = shared_info_array->GetIsolate(); 1895 Isolate* isolate = shared_info_array->GetIsolate();
1896 bool found_suspended_activations = false; 1896 bool found_suspended_activations = false;
1897 1897
1898 ASSERT_LE(len, result->length()); 1898 DCHECK_LE(len, result->length());
1899 1899
1900 FunctionPatchabilityStatus active = FUNCTION_BLOCKED_ACTIVE_GENERATOR; 1900 FunctionPatchabilityStatus active = FUNCTION_BLOCKED_ACTIVE_GENERATOR;
1901 1901
1902 Heap* heap = isolate->heap(); 1902 Heap* heap = isolate->heap();
1903 HeapIterator iterator(heap); 1903 HeapIterator iterator(heap);
1904 HeapObject* obj = NULL; 1904 HeapObject* obj = NULL;
1905 while ((obj = iterator.next()) != NULL) { 1905 while ((obj = iterator.next()) != NULL) {
1906 if (!obj->IsJSGeneratorObject()) continue; 1906 if (!obj->IsJSGeneratorObject()) continue;
1907 1907
1908 JSGeneratorObject* gen = JSGeneratorObject::cast(obj); 1908 JSGeneratorObject* gen = JSGeneratorObject::cast(obj);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1950 Handle<JSArray> result_; 1950 Handle<JSArray> result_;
1951 bool has_blocked_functions_; 1951 bool has_blocked_functions_;
1952 }; 1952 };
1953 1953
1954 1954
1955 Handle<JSArray> LiveEdit::CheckAndDropActivations( 1955 Handle<JSArray> LiveEdit::CheckAndDropActivations(
1956 Handle<JSArray> shared_info_array, bool do_drop) { 1956 Handle<JSArray> shared_info_array, bool do_drop) {
1957 Isolate* isolate = shared_info_array->GetIsolate(); 1957 Isolate* isolate = shared_info_array->GetIsolate();
1958 int len = GetArrayLength(shared_info_array); 1958 int len = GetArrayLength(shared_info_array);
1959 1959
1960 ASSERT(shared_info_array->HasFastElements()); 1960 DCHECK(shared_info_array->HasFastElements());
1961 Handle<FixedArray> shared_info_array_elements( 1961 Handle<FixedArray> shared_info_array_elements(
1962 FixedArray::cast(shared_info_array->elements())); 1962 FixedArray::cast(shared_info_array->elements()));
1963 1963
1964 Handle<JSArray> result = isolate->factory()->NewJSArray(len); 1964 Handle<JSArray> result = isolate->factory()->NewJSArray(len);
1965 Handle<FixedArray> result_elements = 1965 Handle<FixedArray> result_elements =
1966 JSObject::EnsureWritableFastElements(result); 1966 JSObject::EnsureWritableFastElements(result);
1967 1967
1968 // Fill the default values. 1968 // Fill the default values.
1969 for (int i = 0; i < len; i++) { 1969 for (int i = 0; i < len; i++) {
1970 FunctionPatchabilityStatus status = FUNCTION_AVAILABLE_FOR_PATCH; 1970 FunctionPatchabilityStatus status = FUNCTION_AVAILABLE_FOR_PATCH;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) { 2078 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) {
2079 isolate_->active_function_info_listener()->FunctionCode(code); 2079 isolate_->active_function_info_listener()->FunctionCode(code);
2080 } 2080 }
2081 2081
2082 2082
2083 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { 2083 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) {
2084 return isolate->active_function_info_listener() != NULL; 2084 return isolate->active_function_info_listener() != NULL;
2085 } 2085 }
2086 2086
2087 } } // namespace v8::internal 2087 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/lithium-inl.h ('k') | src/log.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698