prism 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -1
- data/Makefile +6 -0
- data/README.md +2 -0
- data/config.yml +21 -20
- data/docs/configuration.md +2 -0
- data/docs/javascript.md +90 -0
- data/docs/releasing.md +27 -0
- data/docs/ruby_api.md +2 -0
- data/ext/prism/api_node.c +66 -68
- data/ext/prism/extension.c +73 -0
- data/ext/prism/extension.h +1 -1
- data/include/prism/ast.h +40 -40
- data/include/prism/defines.h +9 -0
- data/include/prism/enc/pm_encoding.h +1 -0
- data/include/prism/node.h +0 -17
- data/include/prism/parser.h +1 -0
- data/include/prism/prettyprint.h +15 -0
- data/include/prism/util/pm_buffer.h +10 -4
- data/include/prism/util/pm_constant_pool.h +1 -1
- data/include/prism/util/pm_newline_list.h +1 -1
- data/include/prism/version.h +2 -2
- data/include/prism.h +11 -11
- data/lib/prism/compiler.rb +0 -3
- data/lib/prism/debug.rb +20 -6
- data/lib/prism/desugar_compiler.rb +1 -1
- data/lib/prism/dispatcher.rb +0 -14
- data/lib/prism/dsl.rb +8 -13
- data/lib/prism/ffi.rb +25 -0
- data/lib/prism/lex_compat.rb +1 -1
- data/lib/prism/mutation_compiler.rb +3 -8
- data/lib/prism/node.rb +123 -159
- data/lib/prism/node_ext.rb +23 -16
- data/lib/prism/parse_result.rb +21 -5
- data/lib/prism/pattern.rb +3 -3
- data/lib/prism/serialize.rb +900 -304
- data/lib/prism/visitor.rb +0 -3
- data/prism.gemspec +8 -1
- data/rbi/prism.rbi +7261 -0
- data/rbi/prism_static.rbi +182 -0
- data/sig/prism.rbs +4439 -0
- data/sig/prism_static.rbs +110 -0
- data/src/enc/pm_unicode.c +1 -1
- data/src/node.c +28 -29
- data/src/prettyprint.c +7674 -1647
- data/src/prism.c +353 -300
- data/src/regexp.c +2 -0
- data/src/serialize.c +392 -381
- data/src/util/pm_buffer.c +47 -12
- data/src/util/pm_constant_pool.c +2 -2
- data/src/util/pm_newline_list.c +8 -54
- metadata +9 -2
data/src/util/pm_buffer.c
CHANGED
@@ -40,9 +40,13 @@ pm_buffer_append_length(pm_buffer_t *buffer, size_t length) {
|
|
40
40
|
size_t next_length = buffer->length + length;
|
41
41
|
|
42
42
|
if (next_length > buffer->capacity) {
|
43
|
-
|
43
|
+
if (buffer->capacity == 0) {
|
44
|
+
buffer->capacity = 1;
|
45
|
+
}
|
46
|
+
|
47
|
+
while (next_length > buffer->capacity) {
|
44
48
|
buffer->capacity *= 2;
|
45
|
-
}
|
49
|
+
}
|
46
50
|
|
47
51
|
buffer->value = realloc(buffer->value, buffer->capacity);
|
48
52
|
}
|
@@ -53,20 +57,43 @@ pm_buffer_append_length(pm_buffer_t *buffer, size_t length) {
|
|
53
57
|
// Append a generic pointer to memory to the buffer.
|
54
58
|
static inline void
|
55
59
|
pm_buffer_append(pm_buffer_t *buffer, const void *source, size_t length) {
|
60
|
+
size_t cursor = buffer->length;
|
56
61
|
pm_buffer_append_length(buffer, length);
|
57
|
-
memcpy(buffer->value +
|
62
|
+
memcpy(buffer->value + cursor, source, length);
|
58
63
|
}
|
59
64
|
|
60
65
|
// Append the given amount of space as zeroes to the buffer.
|
61
66
|
void
|
62
67
|
pm_buffer_append_zeroes(pm_buffer_t *buffer, size_t length) {
|
68
|
+
size_t cursor = buffer->length;
|
63
69
|
pm_buffer_append_length(buffer, length);
|
64
|
-
memset(buffer->value +
|
70
|
+
memset(buffer->value + cursor, 0, length);
|
71
|
+
}
|
72
|
+
|
73
|
+
// Append a formatted string to the buffer.
|
74
|
+
void
|
75
|
+
pm_buffer_append_format(pm_buffer_t *buffer, const char *format, ...) {
|
76
|
+
va_list arguments;
|
77
|
+
va_start(arguments, format);
|
78
|
+
int result = vsnprintf(NULL, 0, format, arguments);
|
79
|
+
va_end(arguments);
|
80
|
+
|
81
|
+
if (result < 0) return;
|
82
|
+
size_t length = (size_t) (result + 1);
|
83
|
+
|
84
|
+
size_t cursor = buffer->length;
|
85
|
+
pm_buffer_append_length(buffer, length);
|
86
|
+
|
87
|
+
va_start(arguments, format);
|
88
|
+
vsnprintf(buffer->value + cursor, length, format, arguments);
|
89
|
+
va_end(arguments);
|
90
|
+
|
91
|
+
buffer->length--;
|
65
92
|
}
|
66
93
|
|
67
94
|
// Append a string to the buffer.
|
68
95
|
void
|
69
|
-
|
96
|
+
pm_buffer_append_string(pm_buffer_t *buffer, const char *value, size_t length) {
|
70
97
|
pm_buffer_append(buffer, value, length);
|
71
98
|
}
|
72
99
|
|
@@ -78,27 +105,35 @@ pm_buffer_append_bytes(pm_buffer_t *buffer, const uint8_t *value, size_t length)
|
|
78
105
|
|
79
106
|
// Append a single byte to the buffer.
|
80
107
|
void
|
81
|
-
|
108
|
+
pm_buffer_append_byte(pm_buffer_t *buffer, uint8_t value) {
|
82
109
|
const void *source = &value;
|
83
110
|
pm_buffer_append(buffer, source, sizeof(uint8_t));
|
84
111
|
}
|
85
112
|
|
86
|
-
// Append a 32-bit unsigned integer to the buffer.
|
113
|
+
// Append a 32-bit unsigned integer to the buffer as a variable-length integer.
|
87
114
|
void
|
88
|
-
|
115
|
+
pm_buffer_append_varint(pm_buffer_t *buffer, uint32_t value) {
|
89
116
|
if (value < 128) {
|
90
|
-
|
117
|
+
pm_buffer_append_byte(buffer, (uint8_t) value);
|
91
118
|
} else {
|
92
119
|
uint32_t n = value;
|
93
120
|
while (n >= 128) {
|
94
|
-
|
121
|
+
pm_buffer_append_byte(buffer, (uint8_t) (n | 128));
|
95
122
|
n >>= 7;
|
96
123
|
}
|
97
|
-
|
124
|
+
pm_buffer_append_byte(buffer, (uint8_t) n);
|
125
|
+
}
|
126
|
+
}
|
127
|
+
|
128
|
+
// Concatenate one buffer onto another.
|
129
|
+
void
|
130
|
+
pm_buffer_concat(pm_buffer_t *destination, const pm_buffer_t *source) {
|
131
|
+
if (source->length > 0) {
|
132
|
+
pm_buffer_append(destination, source->value, source->length);
|
98
133
|
}
|
99
134
|
}
|
100
135
|
|
101
|
-
// Free the memory associated with the buffer.
|
136
|
+
// Free the internal memory associated with the buffer.
|
102
137
|
void
|
103
138
|
pm_buffer_free(pm_buffer_t *buffer) {
|
104
139
|
free(buffer->value);
|
data/src/util/pm_constant_pool.c
CHANGED
@@ -156,7 +156,7 @@ pm_constant_pool_init(pm_constant_pool_t *pool, uint32_t capacity) {
|
|
156
156
|
|
157
157
|
// Return a pointer to the constant indicated by the given constant id.
|
158
158
|
pm_constant_t *
|
159
|
-
pm_constant_pool_id_to_constant(pm_constant_pool_t *pool, pm_constant_id_t constant_id) {
|
159
|
+
pm_constant_pool_id_to_constant(const pm_constant_pool_t *pool, pm_constant_id_t constant_id) {
|
160
160
|
assert(constant_id > 0 && constant_id <= pool->size);
|
161
161
|
return &pool->constants[constant_id - 1];
|
162
162
|
}
|
@@ -197,7 +197,7 @@ pm_constant_pool_insert(pm_constant_pool_t *pool, const uint8_t *start, size_t l
|
|
197
197
|
// constant and replace it with the shared constant.
|
198
198
|
free((void *) constant->start);
|
199
199
|
constant->start = start;
|
200
|
-
bucket->type = PM_CONSTANT_POOL_BUCKET_DEFAULT;
|
200
|
+
bucket->type = (unsigned int) (PM_CONSTANT_POOL_BUCKET_DEFAULT & 0x3);
|
201
201
|
}
|
202
202
|
|
203
203
|
return bucket->id;
|
data/src/util/pm_newline_list.c
CHANGED
@@ -53,10 +53,14 @@ pm_newline_list_check_append(pm_newline_list_t *list, const uint8_t *cursor) {
|
|
53
53
|
return pm_newline_list_append(list, cursor);
|
54
54
|
}
|
55
55
|
|
56
|
-
// Returns the line and column of the given offset
|
57
|
-
//
|
58
|
-
|
59
|
-
|
56
|
+
// Returns the line and column of the given offset. If the offset is not in the
|
57
|
+
// list, the line and column of the closest offset less than the given offset
|
58
|
+
// are returned.
|
59
|
+
pm_line_column_t
|
60
|
+
pm_newline_list_line_column(const pm_newline_list_t *list, const uint8_t *cursor) {
|
61
|
+
assert(cursor >= list->start);
|
62
|
+
size_t offset = (size_t) (cursor - list->start);
|
63
|
+
|
60
64
|
size_t left = 0;
|
61
65
|
size_t right = list->size - 1;
|
62
66
|
|
@@ -77,56 +81,6 @@ pm_newline_list_line_column_search(pm_newline_list_t *list, size_t offset) {
|
|
77
81
|
return ((pm_line_column_t) { left - 1, offset - list->offsets[left - 1] });
|
78
82
|
}
|
79
83
|
|
80
|
-
// Returns the line and column of the given offset, assuming we know the last
|
81
|
-
// index that we found.
|
82
|
-
static pm_line_column_t
|
83
|
-
pm_newline_list_line_column_scan(pm_newline_list_t *list, size_t offset) {
|
84
|
-
if (offset > list->last_offset) {
|
85
|
-
size_t index = list->last_index;
|
86
|
-
while (index < list->size && list->offsets[index] < offset) {
|
87
|
-
index++;
|
88
|
-
}
|
89
|
-
|
90
|
-
if (index == list->size) {
|
91
|
-
return ((pm_line_column_t) { index - 1, offset - list->offsets[index - 1] });
|
92
|
-
}
|
93
|
-
|
94
|
-
return ((pm_line_column_t) { index, 0 });
|
95
|
-
} else {
|
96
|
-
size_t index = list->last_index;
|
97
|
-
while (index > 0 && list->offsets[index] > offset) {
|
98
|
-
index--;
|
99
|
-
}
|
100
|
-
|
101
|
-
if (index == 0) {
|
102
|
-
return ((pm_line_column_t) { 0, offset });
|
103
|
-
}
|
104
|
-
|
105
|
-
return ((pm_line_column_t) { index, offset - list->offsets[index - 1] });
|
106
|
-
}
|
107
|
-
}
|
108
|
-
|
109
|
-
// Returns the line and column of the given offset. If the offset is not in the
|
110
|
-
// list, the line and column of the closest offset less than the given offset
|
111
|
-
// are returned.
|
112
|
-
pm_line_column_t
|
113
|
-
pm_newline_list_line_column(pm_newline_list_t *list, const uint8_t *cursor) {
|
114
|
-
assert(cursor >= list->start);
|
115
|
-
size_t offset = (size_t) (cursor - list->start);
|
116
|
-
pm_line_column_t result;
|
117
|
-
|
118
|
-
if (list->last_offset == 0) {
|
119
|
-
result = pm_newline_list_line_column_search(list, offset);
|
120
|
-
} else {
|
121
|
-
result = pm_newline_list_line_column_scan(list, offset);
|
122
|
-
}
|
123
|
-
|
124
|
-
list->last_index = result.line;
|
125
|
-
list->last_offset = offset;
|
126
|
-
|
127
|
-
return result;
|
128
|
-
}
|
129
|
-
|
130
84
|
// Free the internal memory allocated for the newline list.
|
131
85
|
void
|
132
86
|
pm_newline_list_free(pm_newline_list_t *list) {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prism
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -32,8 +32,10 @@ files:
|
|
32
32
|
- docs/encoding.md
|
33
33
|
- docs/fuzzing.md
|
34
34
|
- docs/heredocs.md
|
35
|
+
- docs/javascript.md
|
35
36
|
- docs/mapping.md
|
36
37
|
- docs/prism.png
|
38
|
+
- docs/releasing.md
|
37
39
|
- docs/ripper.md
|
38
40
|
- docs/ruby_api.md
|
39
41
|
- docs/serialization.md
|
@@ -51,6 +53,7 @@ files:
|
|
51
53
|
- include/prism/node.h
|
52
54
|
- include/prism/pack.h
|
53
55
|
- include/prism/parser.h
|
56
|
+
- include/prism/prettyprint.h
|
54
57
|
- include/prism/regexp.h
|
55
58
|
- include/prism/util/pm_buffer.h
|
56
59
|
- include/prism/util/pm_char.h
|
@@ -84,6 +87,10 @@ files:
|
|
84
87
|
- lib/prism/serialize.rb
|
85
88
|
- lib/prism/visitor.rb
|
86
89
|
- prism.gemspec
|
90
|
+
- rbi/prism.rbi
|
91
|
+
- rbi/prism_static.rbi
|
92
|
+
- sig/prism.rbs
|
93
|
+
- sig/prism_static.rbs
|
87
94
|
- src/diagnostic.c
|
88
95
|
- src/enc/pm_big5.c
|
89
96
|
- src/enc/pm_euc_jp.c
|