void UnlinkedCodeBlock::addTypeProfilerExpressionInfo(unsigned instructionOffset, unsigned startDivot, unsigned endDivot) { createRareDataIfNecessary(); RareData::TypeProfilerExpressionRange range; range.m_startDivot = startDivot; range.m_endDivot = endDivot; m_rareData->m_typeProfilerInfoMap.set(instructionOffset, range); }
void UnlinkedCodeBlock::addExpressionInfo(unsigned instructionOffset, int divot, int startOffset, int endOffset, unsigned line, unsigned column) { if (divot > ExpressionRangeInfo::MaxDivot) { // Overflow has occurred, we can only give line number info for errors for this region divot = 0; startOffset = 0; endOffset = 0; } else if (startOffset > ExpressionRangeInfo::MaxOffset) { // If the start offset is out of bounds we clear both offsets // so we only get the divot marker. Error message will have to be reduced // to line and charPosition number. startOffset = 0; endOffset = 0; } else if (endOffset > ExpressionRangeInfo::MaxOffset) { // The end offset is only used for additional context, and is much more likely // to overflow (eg. function call arguments) so we are willing to drop it without // dropping the rest of the range. endOffset = 0; } unsigned positionMode = (line <= ExpressionRangeInfo::MaxFatLineModeLine && column <= ExpressionRangeInfo::MaxFatLineModeColumn) ? ExpressionRangeInfo::FatLineMode : (line <= ExpressionRangeInfo::MaxFatColumnModeLine && column <= ExpressionRangeInfo::MaxFatColumnModeColumn) ? ExpressionRangeInfo::FatColumnMode : ExpressionRangeInfo::FatLineAndColumnMode; ExpressionRangeInfo info; info.instructionOffset = instructionOffset; info.divotPoint = divot; info.startOffset = startOffset; info.endOffset = endOffset; info.mode = positionMode; switch (positionMode) { case ExpressionRangeInfo::FatLineMode: info.encodeFatLineMode(line, column); break; case ExpressionRangeInfo::FatColumnMode: info.encodeFatColumnMode(line, column); break; case ExpressionRangeInfo::FatLineAndColumnMode: { createRareDataIfNecessary(); unsigned fatIndex = m_rareData->m_expressionInfoFatPositions.size(); ExpressionRangeInfo::FatPosition fatPos = { line, column }; m_rareData->m_expressionInfoFatPositions.append(fatPos); info.position = fatIndex; } } // switch m_expressionInfo.append(info); }