+inline void UnlinkedCodeBlock::getLineAndColumn(ExpressionRangeInfo& info,
+ unsigned& line, unsigned& column)
+{
+ switch (info.mode) {
+ case ExpressionRangeInfo::FatLineMode:
+ info.decodeFatLineMode(line, column);
+ break;
+ case ExpressionRangeInfo::FatColumnMode:
+ info.decodeFatColumnMode(line, column);
+ break;
+ case ExpressionRangeInfo::FatLineAndColumnMode: {
+ unsigned fatIndex = info.position;
+ ExpressionRangeInfo::FatPosition& fatPos = m_rareData->m_expressionInfoFatPositions[fatIndex];
+ line = fatPos.line;
+ column = fatPos.column;
+ break;
+ }
+ } // switch
+}
+
+#ifndef NDEBUG
+static void dumpLineColumnEntry(size_t index, const UnlinkedInstructionStream& instructionStream, unsigned instructionOffset, unsigned line, unsigned column)
+{
+ const auto& instructions = instructionStream.unpackForDebugging();
+ OpcodeID opcode = instructions[instructionOffset].u.opcode;
+ const char* event = "";
+ if (opcode == op_debug) {
+ switch (instructions[instructionOffset + 1].u.operand) {
+ case WillExecuteProgram: event = " WillExecuteProgram"; break;
+ case DidExecuteProgram: event = " DidExecuteProgram"; break;
+ case DidEnterCallFrame: event = " DidEnterCallFrame"; break;
+ case DidReachBreakpoint: event = " DidReachBreakpoint"; break;
+ case WillLeaveCallFrame: event = " WillLeaveCallFrame"; break;
+ case WillExecuteStatement: event = " WillExecuteStatement"; break;
+ }
+ }
+ dataLogF(" [%zu] pc %u @ line %u col %u : %s%s\n", index, instructionOffset, line, column, opcodeNames[opcode], event);
+}
+
+void UnlinkedCodeBlock::dumpExpressionRangeInfo()
+{
+ Vector<ExpressionRangeInfo>& expressionInfo = m_expressionInfo;
+
+ size_t size = m_expressionInfo.size();
+ dataLogF("UnlinkedCodeBlock %p expressionRangeInfo[%zu] {\n", this, size);
+ for (size_t i = 0; i < size; i++) {
+ ExpressionRangeInfo& info = expressionInfo[i];
+ unsigned line;
+ unsigned column;
+ getLineAndColumn(info, line, column);
+ dumpLineColumnEntry(i, instructions(), info.instructionOffset, line, column);
+ }
+ dataLog("}\n");
+}
+#endif
+