Commit 26a6692f authored by mark.lam@apple.com's avatar mark.lam@apple.com

Removing CodeBlock::opDebugBytecodeOffsetForLineAndColumn() and friends.

<https://webkit.org/b/127321>

Reviewed by Geoffrey Garen.

We're changing plans and will be going with CodeBlock level breakpoints
instead of bytecode level breakpoints. As a result, we no longer need
the services of CodeBlock::opDebugBytecodeOffsetForLineAndColumn() (and
friends). This patch will remove that unused code.

* GNUmakefile.list.am:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
* JavaScriptCore.xcodeproj/project.pbxproj:
* bytecode/CodeBlock.cpp:
* bytecode/CodeBlock.h:
* bytecode/LineColumnInfo.h: Removed.
* bytecode/UnlinkedCodeBlock.cpp:
(JSC::UnlinkedCodeBlock::dumpExpressionRangeInfo):
* bytecode/UnlinkedCodeBlock.h:



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@162389 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent f9ad2c92
2014-01-20 Mark Lam <mark.lam@apple.com>
Removing CodeBlock::opDebugBytecodeOffsetForLineAndColumn() and friends.
<https://webkit.org/b/127321>
Reviewed by Geoffrey Garen.
We're changing plans and will be going with CodeBlock level breakpoints
instead of bytecode level breakpoints. As a result, we no longer need
the services of CodeBlock::opDebugBytecodeOffsetForLineAndColumn() (and
friends). This patch will remove that unused code.
* GNUmakefile.list.am:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
* JavaScriptCore.xcodeproj/project.pbxproj:
* bytecode/CodeBlock.cpp:
* bytecode/CodeBlock.h:
* bytecode/LineColumnInfo.h: Removed.
* bytecode/UnlinkedCodeBlock.cpp:
(JSC::UnlinkedCodeBlock::dumpExpressionRangeInfo):
* bytecode/UnlinkedCodeBlock.h:
2014-01-20 Mark Hahnenberg <mhahnenberg@apple.com>
CodeBlockSet::traceMarked doesn't need to visit the ownerExecutable
......
......@@ -152,7 +152,6 @@ javascriptcore_sources += \
Source/JavaScriptCore/bytecode/LLIntCallLinkInfo.h \
Source/JavaScriptCore/bytecode/LazyOperandValueProfile.cpp \
Source/JavaScriptCore/bytecode/LazyOperandValueProfile.h \
Source/JavaScriptCore/bytecode/LineColumnInfo.h \
Source/JavaScriptCore/bytecode/MethodOfGettingAValueProfile.cpp \
Source/JavaScriptCore/bytecode/MethodOfGettingAValueProfile.h \
Source/JavaScriptCore/bytecode/ObjectAllocationProfile.h \
......
......@@ -816,7 +816,6 @@
<ClInclude Include="..\bytecode\Instruction.h" />
<ClInclude Include="..\bytecode\JumpTable.h" />
<ClInclude Include="..\bytecode\LazyOperandValueProfile.h" />
<ClInclude Include="..\bytecode\LineColumnInfo.h" />
<ClInclude Include="..\bytecode\LLIntCallLinkInfo.h" />
<ClInclude Include="..\bytecode\MethodOfGettingAValueProfile.h" />
<ClInclude Include="..\bytecode\Opcode.h" />
......
......@@ -1502,9 +1502,6 @@
<ClInclude Include="..\bytecode\LazyOperandValueProfile.h">
<Filter>bytecode</Filter>
</ClInclude>
<ClInclude Include="..\bytecode\LineColumnInfo.h">
<Filter>bytecode</Filter>
</ClInclude>
<ClInclude Include="..\bytecode\LLIntCallLinkInfo.h">
<Filter>bytecode</Filter>
</ClInclude>
......
......@@ -1312,7 +1312,6 @@
E49DC16D12EF295300184A1F /* SourceProviderCacheItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E49DC14912EF261A00184A1F /* SourceProviderCacheItem.h */; settings = {ATTRIBUTES = (Private, ); }; };
FE20CE9D15F04A9500DF3430 /* LLIntCLoop.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE20CE9B15F04A9500DF3430 /* LLIntCLoop.cpp */; };
FE20CE9E15F04A9500DF3430 /* LLIntCLoop.h in Headers */ = {isa = PBXBuildFile; fileRef = FE20CE9C15F04A9500DF3430 /* LLIntCLoop.h */; settings = {ATTRIBUTES = (Private, ); }; };
FE37DD56183C1E880018B2F0 /* LineColumnInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = FE37DD55183C1E880018B2F0 /* LineColumnInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
FE4A331F15BD2E07006F54F3 /* VMInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE4A331D15BD2E07006F54F3 /* VMInspector.cpp */; };
FE4A332015BD2E07006F54F3 /* VMInspector.h in Headers */ = {isa = PBXBuildFile; fileRef = FE4A331E15BD2E07006F54F3 /* VMInspector.h */; settings = {ATTRIBUTES = (Private, ); }; };
FE5932A7183C5A2600A1ECCC /* VMEntryScope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5932A5183C5A2600A1ECCC /* VMEntryScope.cpp */; };
......@@ -2722,7 +2721,6 @@
F692A8870255597D01FF60F7 /* JSCJSValue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCJSValue.cpp; sourceTree = "<group>"; tabWidth = 8; };
FE20CE9B15F04A9500DF3430 /* LLIntCLoop.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LLIntCLoop.cpp; path = llint/LLIntCLoop.cpp; sourceTree = "<group>"; };
FE20CE9C15F04A9500DF3430 /* LLIntCLoop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LLIntCLoop.h; path = llint/LLIntCLoop.h; sourceTree = "<group>"; };
FE37DD55183C1E880018B2F0 /* LineColumnInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineColumnInfo.h; sourceTree = "<group>"; };
FE4A331D15BD2E07006F54F3 /* VMInspector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VMInspector.cpp; sourceTree = "<group>"; };
FE4A331E15BD2E07006F54F3 /* VMInspector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VMInspector.h; sourceTree = "<group>"; };
FE5932A5183C5A2600A1ECCC /* VMEntryScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VMEntryScope.cpp; sourceTree = "<group>"; };
......@@ -4230,7 +4228,6 @@
969A078F0ED1D3AE00F1F681 /* bytecode */ = {
isa = PBXGroup;
children = (
FE37DD55183C1E880018B2F0 /* LineColumnInfo.h */,
0F8335B41639C1E3001443B5 /* ArrayAllocationProfile.cpp */,
0F8335B51639C1E3001443B5 /* ArrayAllocationProfile.h */,
0F63945115D07051006A597C /* ArrayProfile.cpp */,
......@@ -4471,7 +4468,6 @@
C2FCAE1117A9C24E0034C735 /* BytecodeBasicBlock.h in Headers */,
A532439418569709002ED692 /* generate-combined-inspector-json.py in Headers */,
C2FCAE1317A9C24E0034C735 /* BytecodeLivenessAnalysis.h in Headers */,
FE37DD56183C1E880018B2F0 /* LineColumnInfo.h in Headers */,
0F8335B81639C1EA001443B5 /* ArrayAllocationProfile.h in Headers */,
A5840E29187CA5E600843B10 /* inline-and-minify-stylesheets-and-scripts.py in Headers */,
A5840E2B187CA75B00843B10 /* jsmin.py in Headers */,
......
......@@ -2564,23 +2564,6 @@ void CodeBlock::expressionRangeForBytecodeOffset(unsigned bytecodeOffset, int& d
line += m_ownerExecutable->lineNo();
}
unsigned CodeBlock::opDebugBytecodeOffsetForLineAndColumn(unsigned& line, unsigned& column)
{
unsigned lineAdjustment = m_ownerExecutable->lineNo();
ASSERT(line >= lineAdjustment);
unsigned unlinkedLine = line - lineAdjustment;
unsigned columnAdjustment = unlinkedLine ? 1 : firstLineColumnOffset();
ASSERT(column >= columnAdjustment);
unsigned unlinkedColumn = column - columnAdjustment;
unsigned bytecodeOffset = m_unlinkedCode->opDebugBytecodeOffsetForLineAndColumn(unlinkedLine, unlinkedColumn);
if (bytecodeOffset != static_cast<unsigned>(WTF::notFound)) {
line = unlinkedLine + lineAdjustment;
column = unlinkedColumn + (unlinkedLine ? 1 : firstLineColumnOffset());
}
return bytecodeOffset;
}
void CodeBlock::shrinkToFit(ShrinkMode shrinkMode)
{
m_rareCaseProfiles.shrinkToFit();
......
......@@ -174,7 +174,6 @@ public:
unsigned columnNumberForBytecodeOffset(unsigned bytecodeOffset);
void expressionRangeForBytecodeOffset(unsigned bytecodeOffset, int& divot,
int& startOffset, int& endOffset, unsigned& line, unsigned& column);
unsigned opDebugBytecodeOffsetForLineAndColumn(unsigned& line, unsigned& column);
#if ENABLE(JIT)
StructureStubInfo* addStubInfo();
......
/*
* Copyright (C) 2014 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef LineColumnInfo_h
#define LineColumnInfo_h
namespace JSC {
struct LineColumnInfo {
unsigned instructionOffset;
unsigned line;
unsigned column;
bool operator <(const LineColumnInfo& other) const
{
if (line == other.line) {
if (column == other.column)
return instructionOffset < other.instructionOffset;
return column < other.column;
}
return line < other.line;
}
struct LineColumnPair {
LineColumnPair(unsigned line, unsigned column)
: line(line), column(column)
{
}
unsigned line;
unsigned column;
};
bool operator ==(const LineColumnPair& pair) const
{
return (line == pair.line) && (column == pair.column);
}
bool operator !=(const LineColumnPair& pair) const
{
return (line != pair.line) || (column != pair.column);
}
bool operator <(const LineColumnPair& pair) const
{
if (line == pair.line)
return column < pair.column;
return line < pair.line;
}
bool operator <=(const LineColumnPair& pair) const
{
if (line == pair.line)
return column <= pair.column;
return line < pair.line;
}
bool operator >(const LineColumnPair& pair) const
{
if (line == pair.line)
return column > pair.column;
return line > pair.line;
}
bool operator >=(const LineColumnPair& pair) const
{
if (line == pair.line)
return column >= pair.column;
return line > pair.line;
}
};
} // namespace JSC
#endif // LineColumnInfo_h
......@@ -310,19 +310,6 @@ void UnlinkedCodeBlock::dumpExpressionRangeInfo()
}
dataLog("}\n");
}
void UnlinkedCodeBlock::dumpOpDebugLineColumnInfoList()
{
LineColumnInfoList& infoList = this->opDebugLineColumnInfoList();
size_t size = infoList.size();
dataLogF("UnlinkedCodeBlock %p opDebugLineColumnInfoList[%zu] {\n", this, size);
for (size_t i = 0; i < size; i++) {
LineColumnInfo& info = infoList[i];
dumpLineColumnEntry(i, instructions(), info.instructionOffset, info.line, info.column);
}
dataLog("}\n");
}
#endif
void UnlinkedCodeBlock::expressionRangeForBytecodeOffset(unsigned bytecodeOffset,
......@@ -361,77 +348,6 @@ void UnlinkedCodeBlock::expressionRangeForBytecodeOffset(unsigned bytecodeOffset
getLineAndColumn(info, line, column);
}
unsigned UnlinkedCodeBlock::opDebugBytecodeOffsetForLineAndColumn(unsigned& line, unsigned& column)
{
if (!m_expressionInfo.size())
return static_cast<unsigned>(WTF::notFound);
LineColumnInfo::LineColumnPair target(line, column);
LineColumnInfoList& list = opDebugLineColumnInfoList();
// Find the earliest op_debug bytecode whose line and column matches the
// target line and column values. If an exact match is not found, then
// find the nearest op_debug bytecode that precedes the target line and
// column values. If there are more than one op_debug at that preceding
// line and column value, then select the earliest of those.
//
// We want the earliest one because when we have multiple op_debug bytecodes
// that map to a given line and column, a debugger user would expect to break
// on the first one and step through the rest thereafter if needed.
LineColumnInfoList::iterator it = std::lower_bound(list.begin(), list.end(), target);
if (it == list.end() || *it > target)
--it;
ASSERT(it >= list.begin() && it < list.end() && *it <= target);
ASSERT(it == list.begin() || *(it - 1) < *it);
line = it->line;
column = it->column;
unsigned offset = it->instructionOffset;
ASSERT(instructions()[offset].u.opcode == op_debug);
return offset;
}
static bool compareLineColumnInfo(const LineColumnInfo& first, const LineColumnInfo& second)
{
return first < second;
}
UnlinkedCodeBlock::LineColumnInfoList& UnlinkedCodeBlock::opDebugLineColumnInfoList()
{
createRareDataIfNecessary();
if (m_rareData->m_opDebugLineColumnInfoList) {
ASSERT(m_rareData->m_opDebugLineColumnInfoList->size() <= m_expressionInfo.size());
return *m_rareData->m_opDebugLineColumnInfoList;
}
Vector<ExpressionRangeInfo>& expressionInfo = m_expressionInfo;
size_t size = m_expressionInfo.size();
m_rareData->m_opDebugLineColumnInfoList = std::make_unique<LineColumnInfoList>();
LineColumnInfoList& infoList = *m_rareData->m_opDebugLineColumnInfoList;
for (size_t src = 0; src < size; src++) {
ExpressionRangeInfo& exprInfo = expressionInfo[src];
unsigned instructionOffset = exprInfo.instructionOffset;
OpcodeID opcode = instructions()[instructionOffset].u.opcode;
if (opcode == op_debug) {
LineColumnInfo info;
info.instructionOffset = instructionOffset;
getLineAndColumn(exprInfo, info.line, info.column);
infoList.append(info);
}
}
infoList.shrinkToFit();
std::sort(infoList.begin(), infoList.end(), compareLineColumnInfo);
return *m_rareData->m_opDebugLineColumnInfoList.get();
}
void UnlinkedCodeBlock::addExpressionInfo(unsigned instructionOffset,
int divot, int startOffset, int endOffset, unsigned line, unsigned column)
{
......
......@@ -33,7 +33,6 @@
#include "Identifier.h"
#include "JSCell.h"
#include "JSString.h"
#include "LineColumnInfo.h"
#include "ParserModes.h"
#include "RegExp.h"
#include "SpecialPointer.h"
......@@ -42,7 +41,6 @@
#include <wtf/Compression.h>
#include <wtf/RefCountedArray.h>
#include <wtf/StdLibExtras.h>
#include <wtf/Vector.h>
namespace JSC {
......@@ -445,7 +443,6 @@ public:
void expressionRangeForBytecodeOffset(unsigned bytecodeOffset, int& divot,
int& startOffset, int& endOffset, unsigned& line, unsigned& column);
unsigned opDebugBytecodeOffsetForLineAndColumn(unsigned& line, unsigned& column);
void recordParse(CodeFeatures features, bool hasCapturedVariables, unsigned firstLine, unsigned lineCount, unsigned endColumn)
{
......@@ -465,7 +462,6 @@ public:
unsigned endColumn() const { return m_endColumn; }
void dumpExpressionRangeInfo(); // For debugging purpose only.
void dumpOpDebugLineColumnInfoList(); // For debugging purpose only.
protected:
UnlinkedCodeBlock(VM*, Structure*, CodeType, const ExecutableInfo&);
......@@ -489,9 +485,6 @@ private:
void getLineAndColumn(ExpressionRangeInfo&, unsigned& line, unsigned& column);
typedef Vector<LineColumnInfo> LineColumnInfoList;
LineColumnInfoList& opDebugLineColumnInfoList();
RefCountedArray<UnlinkedInstruction> m_unlinkedInstructions;
int m_numParameters;
......@@ -556,7 +549,6 @@ public:
Vector<UnlinkedStringJumpTable> m_stringSwitchJumpTables;
Vector<ExpressionRangeInfo::FatPosition> m_expressionInfoFatPositions;
std::unique_ptr<LineColumnInfoList> m_opDebugLineColumnInfoList;
};
private:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment