diff options
Diffstat (limited to 'Source/JavaScriptCore/bytecode/ExpressionRangeInfo.h')
-rw-r--r-- | Source/JavaScriptCore/bytecode/ExpressionRangeInfo.h | 71 |
1 files changed, 68 insertions, 3 deletions
diff --git a/Source/JavaScriptCore/bytecode/ExpressionRangeInfo.h b/Source/JavaScriptCore/bytecode/ExpressionRangeInfo.h index f4949a686..855738aec 100644 --- a/Source/JavaScriptCore/bytecode/ExpressionRangeInfo.h +++ b/Source/JavaScriptCore/bytecode/ExpressionRangeInfo.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Apple Inc. All rights reserved. + * Copyright (C) 2012, 2013 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,14 +31,79 @@ namespace JSC { struct ExpressionRangeInfo { + // Line and column values are encoded in 1 of 3 modes depending on the size + // of their values. These modes are: + // + // 1. FatLine: 22-bit line, 8-bit column. + // 2. FatColumn: 8-bit line, 22-bit column. + // 3. FatLineAndColumn: 32-bit line, 32-bit column. + // + // For the first 2 modes, the line and column will be encoded in the 30-bit + // position field in the ExpressionRangeInfo. For the FatLineAndColumn mode, + // the position field will hold an index into a FatPosition vector which + // holds the FatPosition records with the full 32-bit line and column values. + + enum { + FatLineMode, + FatColumnMode, + FatLineAndColumnMode + }; + + struct FatPosition { + uint32_t line; + uint32_t column; + }; + + enum { + FatLineModeLineShift = 8, + FatLineModeLineMask = (1 << 22) - 1, + FatLineModeColumnMask = (1 << 8) - 1, + FatColumnModeLineShift = 22, + FatColumnModeLineMask = (1 << 8) - 1, + FatColumnModeColumnMask = (1 << 22) - 1 + }; + enum { MaxOffset = (1 << 7) - 1, - MaxDivot = (1 << 25) - 1 + MaxDivot = (1 << 25) - 1, + MaxFatLineModeLine = (1 << 22) - 1, + MaxFatLineModeColumn = (1 << 8) - 1, + MaxFatColumnModeLine = (1 << 8) - 1, + MaxFatColumnModeColumn = (1 << 22) - 1 }; + + void encodeFatLineMode(unsigned line, unsigned column) + { + ASSERT(line <= MaxFatLineModeLine); + ASSERT(column <= MaxFatLineModeColumn); + position = ((line & FatLineModeLineMask) << FatLineModeLineShift | (column & FatLineModeColumnMask)); + } + + void encodeFatColumnMode(unsigned line, unsigned column) + { + ASSERT(line <= MaxFatColumnModeLine); + ASSERT(column <= MaxFatColumnModeColumn); + position = ((line & FatColumnModeLineMask) << FatColumnModeLineShift | (column & FatColumnModeColumnMask)); + } + + void decodeFatLineMode(unsigned& line, unsigned& column) + { + line = (position >> FatLineModeLineShift) & FatLineModeLineMask; + column = position & FatLineModeColumnMask; + } + + void decodeFatColumnMode(unsigned& line, unsigned& column) + { + line = (position >> FatColumnModeLineShift) & FatColumnModeLineMask; + column = position & FatColumnModeColumnMask; + } + uint32_t instructionOffset : 25; - uint32_t divotPoint : 25; uint32_t startOffset : 7; + uint32_t divotPoint : 25; uint32_t endOffset : 7; + uint32_t mode : 2; + uint32_t position : 30; }; } // namespace JSC |