Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/debug/debug-evaluate.h" | 8 #include "src/debug/debug-evaluate.h" |
| 9 #include "src/debug/debug-frames.h" | 9 #include "src/debug/debug-frames.h" |
| 10 #include "src/debug/debug-scopes.h" | 10 #include "src/debug/debug-scopes.h" |
| (...skipping 1544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1555 FixedArray* line_ends_array = FixedArray::cast(script_handle->line_ends()); | 1555 FixedArray* line_ends_array = FixedArray::cast(script_handle->line_ends()); |
| 1556 const int line_count = line_ends_array->length(); | 1556 const int line_count = line_ends_array->length(); |
| 1557 | 1557 |
| 1558 if (line < 0 || line >= line_count) { | 1558 if (line < 0 || line >= line_count) { |
| 1559 return Smi::FromInt(-1); | 1559 return Smi::FromInt(-1); |
| 1560 } else { | 1560 } else { |
| 1561 return Smi::cast(line_ends_array->get(line)); | 1561 return Smi::cast(line_ends_array->get(line)); |
| 1562 } | 1562 } |
| 1563 } | 1563 } |
| 1564 | 1564 |
| 1565 RUNTIME_FUNCTION(Runtime_ScriptPositionInfo) { | 1565 static Object* GetJSPositionInfo(Handle<Script> script, int position, |
|
Yang
2016/05/24 07:54:31
Let's return a handle and let the call site derefe
jgruber
2016/05/24 10:52:55
Done.
| |
| 1566 HandleScope scope(isolate); | 1566 Script::OffsetFlag offset_flag, |
| 1567 DCHECK(args.length() == 3); | 1567 Isolate* isolate) { |
| 1568 CONVERT_ARG_CHECKED(JSValue, script, 0); | |
| 1569 CONVERT_NUMBER_CHECKED(int32_t, position, Int32, args[1]); | |
| 1570 CONVERT_BOOLEAN_ARG_CHECKED(with_offset, 2); | |
| 1571 | |
| 1572 RUNTIME_ASSERT(script->value()->IsScript()); | |
| 1573 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | |
| 1574 | |
| 1575 Script::PositionInfo info; | 1568 Script::PositionInfo info; |
| 1576 const Script::OffsetFlag offset_flag = | 1569 if (!script->GetPositionInfo(position, &info, offset_flag)) { |
| 1577 with_offset ? Script::WITH_OFFSET : Script::NO_OFFSET; | |
| 1578 if (!script_handle->GetPositionInfo(position, &info, offset_flag)) { | |
| 1579 return isolate->heap()->null_value(); | 1570 return isolate->heap()->null_value(); |
| 1580 } | 1571 } |
| 1581 | 1572 |
| 1582 Handle<String> source = | 1573 Handle<String> source = handle(String::cast(script->source()), isolate); |
| 1583 handle(String::cast(script_handle->source()), isolate); | |
| 1584 Handle<String> sourceText = | 1574 Handle<String> sourceText = |
| 1585 isolate->factory()->NewSubString(source, info.line_start, info.line_end); | 1575 isolate->factory()->NewSubString(source, info.line_start, info.line_end); |
| 1586 | 1576 |
| 1587 Handle<JSObject> jsinfo = | 1577 Handle<JSObject> jsinfo = |
| 1588 isolate->factory()->NewJSObject(isolate->object_function()); | 1578 isolate->factory()->NewJSObject(isolate->object_function()); |
| 1589 | 1579 |
| 1590 JSObject::AddProperty(jsinfo, isolate->factory()->script_string(), | 1580 JSObject::AddProperty(jsinfo, isolate->factory()->script_string(), script, |
| 1591 script_handle, NONE); | 1581 NONE); |
| 1592 JSObject::AddProperty(jsinfo, isolate->factory()->position_string(), | 1582 JSObject::AddProperty(jsinfo, isolate->factory()->position_string(), |
| 1593 handle(Smi::FromInt(position), isolate), NONE); | 1583 handle(Smi::FromInt(position), isolate), NONE); |
| 1594 JSObject::AddProperty(jsinfo, isolate->factory()->line_string(), | 1584 JSObject::AddProperty(jsinfo, isolate->factory()->line_string(), |
| 1595 handle(Smi::FromInt(info.line), isolate), NONE); | 1585 handle(Smi::FromInt(info.line), isolate), NONE); |
| 1596 JSObject::AddProperty(jsinfo, isolate->factory()->column_string(), | 1586 JSObject::AddProperty(jsinfo, isolate->factory()->column_string(), |
| 1597 handle(Smi::FromInt(info.column), isolate), NONE); | 1587 handle(Smi::FromInt(info.column), isolate), NONE); |
| 1598 JSObject::AddProperty(jsinfo, isolate->factory()->sourceText_string(), | 1588 JSObject::AddProperty(jsinfo, isolate->factory()->sourceText_string(), |
| 1599 sourceText, NONE); | 1589 sourceText, NONE); |
| 1600 | 1590 |
| 1601 return *jsinfo; | 1591 return *jsinfo; |
| 1602 } | 1592 } |
| 1603 | 1593 |
| 1594 // Get information on a specific source line and column possibly offset by a | |
| 1595 // fixed source position. This function is used to find a source position from | |
| 1596 // a line and column position. The fixed source position offset is typically | |
| 1597 // used to find a source position in a function based on a line and column in | |
| 1598 // the source for the function alone. The offset passed will then be the | |
| 1599 // start position of the source for the function within the full script source. | |
| 1600 // Note that incoming line and column parameters are assumed to be passed *with* | |
| 1601 // offsets. | |
| 1602 RUNTIME_FUNCTION(Runtime_ScriptLocationFromLine) { | |
| 1603 HandleScope scope(isolate); | |
| 1604 DCHECK(args.length() == 4); | |
| 1605 CONVERT_ARG_CHECKED(JSValue, script, 0); | |
| 1606 CONVERT_NUMBER_CHECKED(int32_t, line, Int32, args[1]); | |
| 1607 CONVERT_NUMBER_CHECKED(int32_t, column, Int32, args[2]); | |
| 1608 CONVERT_NUMBER_CHECKED(int32_t, offset_position, Int32, args[3]); | |
| 1609 | |
| 1610 RUNTIME_ASSERT(script->value()->IsScript()); | |
| 1611 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | |
| 1612 | |
| 1613 // Subtract any offsets from line and column. | |
| 1614 line -= script_handle->line_offset(); | |
| 1615 if (line == 0) column -= script_handle->column_offset(); | |
| 1616 | |
| 1617 if (line < 0 || column < 0 || offset_position < 0) { | |
| 1618 return isolate->heap()->null_value(); | |
| 1619 } | |
| 1620 | |
| 1621 Script::InitLineEnds(script_handle); | |
| 1622 | |
| 1623 FixedArray* line_ends_array = FixedArray::cast(script_handle->line_ends()); | |
| 1624 const int line_count = line_ends_array->length(); | |
| 1625 | |
| 1626 int position; | |
| 1627 if (line == 0) { | |
| 1628 position = offset_position + column; | |
| 1629 } else { | |
| 1630 Script::PositionInfo info; | |
| 1631 if (!script_handle->GetPositionInfo(offset_position, &info, | |
| 1632 Script::NO_OFFSET) || | |
| 1633 info.line + line >= line_count) { | |
| 1634 return isolate->heap()->null_value(); | |
| 1635 } | |
| 1636 | |
| 1637 const int offset_line = info.line + line; | |
| 1638 const int offset_line_position = | |
| 1639 (offset_line == 0) | |
| 1640 ? 0 | |
| 1641 : Smi::cast(line_ends_array->get(offset_line - 1))->value() + 1; | |
| 1642 position = offset_line_position + column; | |
| 1643 } | |
| 1644 | |
| 1645 return GetJSPositionInfo(script_handle, position, Script::NO_OFFSET, isolate); | |
| 1646 } | |
| 1647 | |
| 1648 RUNTIME_FUNCTION(Runtime_ScriptPositionInfo) { | |
| 1649 HandleScope scope(isolate); | |
| 1650 DCHECK(args.length() == 3); | |
| 1651 CONVERT_ARG_CHECKED(JSValue, script, 0); | |
| 1652 CONVERT_NUMBER_CHECKED(int32_t, position, Int32, args[1]); | |
| 1653 CONVERT_BOOLEAN_ARG_CHECKED(with_offset, 2); | |
| 1654 | |
| 1655 RUNTIME_ASSERT(script->value()->IsScript()); | |
| 1656 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | |
| 1657 | |
| 1658 const Script::OffsetFlag offset_flag = | |
| 1659 with_offset ? Script::WITH_OFFSET : Script::NO_OFFSET; | |
| 1660 return GetJSPositionInfo(script_handle, position, offset_flag, isolate); | |
| 1661 } | |
| 1662 | |
| 1663 // Returns the given line as a string, or null if line is out of bounds. | |
| 1664 // The parameter line is expected to include the script's line offset. | |
| 1665 RUNTIME_FUNCTION(Runtime_ScriptSourceLine) { | |
| 1666 HandleScope scope(isolate); | |
| 1667 DCHECK(args.length() == 2); | |
| 1668 CONVERT_ARG_CHECKED(JSValue, script, 0); | |
| 1669 CONVERT_NUMBER_CHECKED(int32_t, line, Int32, args[1]); | |
| 1670 | |
| 1671 RUNTIME_ASSERT(script->value()->IsScript()); | |
| 1672 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | |
| 1673 | |
| 1674 Script::InitLineEnds(script_handle); | |
| 1675 | |
| 1676 FixedArray* line_ends_array = FixedArray::cast(script_handle->line_ends()); | |
| 1677 const int line_count = line_ends_array->length(); | |
| 1678 | |
| 1679 line -= script_handle->line_offset(); | |
| 1680 if (line < 0 || line_count <= line) { | |
| 1681 return isolate->heap()->null_value(); | |
| 1682 } | |
| 1683 | |
| 1684 const int start = | |
| 1685 (line == 0) ? 0 : Smi::cast(line_ends_array->get(line - 1))->value() + 1; | |
| 1686 const int end = Smi::cast(line_ends_array->get(line))->value(); | |
| 1687 | |
| 1688 Handle<String> source = | |
| 1689 handle(String::cast(script_handle->source()), isolate); | |
| 1690 Handle<String> str = isolate->factory()->NewSubString(source, start, end); | |
| 1691 | |
| 1692 return *str; | |
| 1693 } | |
| 1694 | |
| 1604 // Set one shot breakpoints for the callback function that is passed to a | 1695 // Set one shot breakpoints for the callback function that is passed to a |
| 1605 // built-in function such as Array.forEach to enable stepping into the callback, | 1696 // built-in function such as Array.forEach to enable stepping into the callback, |
| 1606 // if we are indeed stepping and the callback is subject to debugging. | 1697 // if we are indeed stepping and the callback is subject to debugging. |
| 1607 RUNTIME_FUNCTION(Runtime_DebugPrepareStepInIfStepping) { | 1698 RUNTIME_FUNCTION(Runtime_DebugPrepareStepInIfStepping) { |
| 1608 HandleScope scope(isolate); | 1699 HandleScope scope(isolate); |
| 1609 DCHECK_EQ(1, args.length()); | 1700 DCHECK_EQ(1, args.length()); |
| 1610 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | 1701 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
| 1611 isolate->debug()->PrepareStepIn(fun); | 1702 isolate->debug()->PrepareStepIn(fun); |
| 1612 return isolate->heap()->undefined_value(); | 1703 return isolate->heap()->undefined_value(); |
| 1613 } | 1704 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1647 return Smi::FromInt(isolate->debug()->is_active()); | 1738 return Smi::FromInt(isolate->debug()->is_active()); |
| 1648 } | 1739 } |
| 1649 | 1740 |
| 1650 | 1741 |
| 1651 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { | 1742 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { |
| 1652 UNIMPLEMENTED(); | 1743 UNIMPLEMENTED(); |
| 1653 return NULL; | 1744 return NULL; |
| 1654 } | 1745 } |
| 1655 } // namespace internal | 1746 } // namespace internal |
| 1656 } // namespace v8 | 1747 } // namespace v8 |
| OLD | NEW |