src/hotspot/share/oops/method.inline.hpp
changeset 54042 6dd6f988b4e4
parent 53244 9807daeb47c4
child 59247 56bf71d64d51
--- a/src/hotspot/share/oops/method.inline.hpp	Fri Mar 08 16:21:16 2019 -0500
+++ b/src/hotspot/share/oops/method.inline.hpp	Fri Mar 08 23:02:06 2019 +0100
@@ -48,6 +48,39 @@
   return OrderAccess::load_acquire(&_code);
 }
 
+// Write (bci, line number) pair to stream
+inline void CompressedLineNumberWriteStream::write_pair_regular(int bci_delta, int line_delta) {
+  // bci and line number does not compress into single byte.
+  // Write out escape character and use regular compression for bci and line number.
+  write_byte((jubyte)0xFF);
+  write_signed_int(bci_delta);
+  write_signed_int(line_delta);
+}
+
+inline void CompressedLineNumberWriteStream::write_pair_inline(int bci, int line) {
+  int bci_delta = bci - _bci;
+  int line_delta = line - _line;
+  _bci = bci;
+  _line = line;
+  // Skip (0,0) deltas - they do not add information and conflict with terminator.
+  if (bci_delta == 0 && line_delta == 0) return;
+  // Check if bci is 5-bit and line number 3-bit unsigned.
+  if (((bci_delta & ~0x1F) == 0) && ((line_delta & ~0x7) == 0)) {
+    // Compress into single byte.
+    jubyte value = ((jubyte) bci_delta << 3) | (jubyte) line_delta;
+    // Check that value doesn't match escape character.
+    if (value != 0xFF) {
+      write_byte(value);
+      return;
+    }
+  }
+  write_pair_regular(bci_delta, line_delta);
+}
+
+inline void CompressedLineNumberWriteStream::write_pair(int bci, int line) {
+  write_pair_inline(bci, line);
+}
+
 inline bool Method::has_compiled_code() const { return code() != NULL; }
 
 #endif // SHARE_OOPS_METHOD_INLINE_HPP