summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/bytecode/ExpressionRangeInfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/bytecode/ExpressionRangeInfo.h')
-rw-r--r--Source/JavaScriptCore/bytecode/ExpressionRangeInfo.h71
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