summaryrefslogtreecommitdiffstats
path: root/third_party/rust/jsparagus-stencil/src/bytecode_offset.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /third_party/rust/jsparagus-stencil/src/bytecode_offset.rs
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/jsparagus-stencil/src/bytecode_offset.rs')
-rw-r--r--third_party/rust/jsparagus-stencil/src/bytecode_offset.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/third_party/rust/jsparagus-stencil/src/bytecode_offset.rs b/third_party/rust/jsparagus-stencil/src/bytecode_offset.rs
new file mode 100644
index 0000000000..3583ec6728
--- /dev/null
+++ b/third_party/rust/jsparagus-stencil/src/bytecode_offset.rs
@@ -0,0 +1,60 @@
+/// For tracking bytecode offsets in jumps
+#[derive(Clone, Copy, PartialEq, Debug)]
+#[must_use]
+pub struct BytecodeOffset {
+ pub offset: usize,
+}
+
+impl BytecodeOffset {
+ fn new(offset: usize) -> Self {
+ Self { offset }
+ }
+
+ /// diff_from is useful for finding the offset between two bytecodes. This is usually
+ /// used for jumps and jump_targets.
+ ///
+ /// For a forward jump, self will be a larger number, and start will be smaller
+ /// the output will be a positive number. for a backward jump, the reverse
+ /// will be true, and the number will be negative. So it is important to use this api
+ /// consistently in both cases.
+ ///
+ /// Examples:
+ /// let offset_diff: BytecodeOffsetDiff = forward_jump_target_offset.diff_from(jump)
+ /// let offset_diff: BytecodeOffsetDiff = backward_jump_target_offset.diff_from(jump)
+ pub fn diff_from(self, start: BytecodeOffset) -> BytecodeOffsetDiff {
+ BytecodeOffsetDiff::new(self, start)
+ }
+}
+
+impl From<BytecodeOffset> for usize {
+ fn from(offset: BytecodeOffset) -> usize {
+ offset.offset
+ }
+}
+
+impl From<usize> for BytecodeOffset {
+ fn from(offset: usize) -> BytecodeOffset {
+ BytecodeOffset::new(offset)
+ }
+}
+
+pub struct BytecodeOffsetDiff {
+ diff: i32,
+}
+
+impl BytecodeOffsetDiff {
+ fn new(end: BytecodeOffset, start: BytecodeOffset) -> Self {
+ let diff = (end.offset as i128 - start.offset as i128) as i32;
+ Self { diff }
+ }
+
+ pub fn uninitialized() -> Self {
+ Self { diff: 0i32 }
+ }
+}
+
+impl From<BytecodeOffsetDiff> for i32 {
+ fn from(offset: BytecodeOffsetDiff) -> i32 {
+ offset.diff
+ }
+}