summaryrefslogtreecommitdiff
path: root/prism/util
diff options
context:
space:
mode:
authorJean Boussier <[email protected]>2023-11-29 11:46:33 +0100
committergit <[email protected]>2023-11-29 13:56:19 +0000
commit2af82e23165180f20ca2af374aedb7a45dedcc20 (patch)
tree1bd829f6f15140c645496167a208d38736ac8d81 /prism/util
parent2653404840952d25bbdd7deaf599fbfb1f5287f0 (diff)
[ruby/prism] Convert start line to signed integers
Ruby allows for 0 or negative line start, this is often used with `eval` calls to get a correct offset when prefixing a snippet. e.g. ```ruby caller = caller_locations(1, 1).first class_eval <<~RUBY, caller.path, caller.line - 2 # frozen_string_literal: true def some_method #{caller_provided_code_snippet} end RUBY ``` https://github.com/ruby/prism/commit/0d14ed1452
Diffstat (limited to 'prism/util')
-rw-r--r--prism/util/pm_buffer.c9
-rw-r--r--prism/util/pm_buffer.h8
2 files changed, 17 insertions, 0 deletions
diff --git a/prism/util/pm_buffer.c b/prism/util/pm_buffer.c
index dcdf1770bb..307b55d030 100644
--- a/prism/util/pm_buffer.c
+++ b/prism/util/pm_buffer.c
@@ -152,6 +152,15 @@ pm_buffer_append_varuint(pm_buffer_t *buffer, uint32_t value) {
}
/**
+ * Append a 32-bit signed integer to the buffer as a variable-length integer.
+ */
+void
+pm_buffer_append_varsint(pm_buffer_t *buffer, int32_t value) {
+ uint32_t unsigned_int = ((uint32_t)(value) << 1) ^ ((uint32_t)(value >> 31));
+ pm_buffer_append_varuint(buffer, unsigned_int);
+}
+
+/**
* Concatenate one buffer onto another.
*/
void
diff --git a/prism/util/pm_buffer.h b/prism/util/pm_buffer.h
index a8596be476..ec11d05e9b 100644
--- a/prism/util/pm_buffer.h
+++ b/prism/util/pm_buffer.h
@@ -121,6 +121,14 @@ void pm_buffer_append_byte(pm_buffer_t *buffer, uint8_t value);
void pm_buffer_append_varuint(pm_buffer_t *buffer, uint32_t value);
/**
+ * Append a 32-bit signed integer to the buffer as a variable-length integer.
+ *
+ * @param buffer The buffer to append to.
+ * @param value The integer to append.
+ */
+void pm_buffer_append_varsint(pm_buffer_t *buffer, int32_t value);
+
+/**
* Concatenate one buffer onto another.
*
* @param destination The buffer to concatenate onto.