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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -1
  3. data/Makefile +6 -0
  4. data/README.md +2 -0
  5. data/config.yml +21 -20
  6. data/docs/configuration.md +2 -0
  7. data/docs/javascript.md +90 -0
  8. data/docs/releasing.md +27 -0
  9. data/docs/ruby_api.md +2 -0
  10. data/ext/prism/api_node.c +66 -68
  11. data/ext/prism/extension.c +73 -0
  12. data/ext/prism/extension.h +1 -1
  13. data/include/prism/ast.h +40 -40
  14. data/include/prism/defines.h +9 -0
  15. data/include/prism/enc/pm_encoding.h +1 -0
  16. data/include/prism/node.h +0 -17
  17. data/include/prism/parser.h +1 -0
  18. data/include/prism/prettyprint.h +15 -0
  19. data/include/prism/util/pm_buffer.h +10 -4
  20. data/include/prism/util/pm_constant_pool.h +1 -1
  21. data/include/prism/util/pm_newline_list.h +1 -1
  22. data/include/prism/version.h +2 -2
  23. data/include/prism.h +11 -11
  24. data/lib/prism/compiler.rb +0 -3
  25. data/lib/prism/debug.rb +20 -6
  26. data/lib/prism/desugar_compiler.rb +1 -1
  27. data/lib/prism/dispatcher.rb +0 -14
  28. data/lib/prism/dsl.rb +8 -13
  29. data/lib/prism/ffi.rb +25 -0
  30. data/lib/prism/lex_compat.rb +1 -1
  31. data/lib/prism/mutation_compiler.rb +3 -8
  32. data/lib/prism/node.rb +123 -159
  33. data/lib/prism/node_ext.rb +23 -16
  34. data/lib/prism/parse_result.rb +21 -5
  35. data/lib/prism/pattern.rb +3 -3
  36. data/lib/prism/serialize.rb +900 -304
  37. data/lib/prism/visitor.rb +0 -3
  38. data/prism.gemspec +8 -1
  39. data/rbi/prism.rbi +7261 -0
  40. data/rbi/prism_static.rbi +182 -0
  41. data/sig/prism.rbs +4439 -0
  42. data/sig/prism_static.rbs +110 -0
  43. data/src/enc/pm_unicode.c +1 -1
  44. data/src/node.c +28 -29
  45. data/src/prettyprint.c +7674 -1647
  46. data/src/prism.c +353 -300
  47. data/src/regexp.c +2 -0
  48. data/src/serialize.c +392 -381
  49. data/src/util/pm_buffer.c +47 -12
  50. data/src/util/pm_constant_pool.c +2 -2
  51. data/src/util/pm_newline_list.c +8 -54
  52. 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
- do {
43
+ if (buffer->capacity == 0) {
44
+ buffer->capacity = 1;
45
+ }
46
+
47
+ while (next_length > buffer->capacity) {
44
48
  buffer->capacity *= 2;
45
- } while (next_length > buffer->capacity);
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 + (buffer->length - length), source, length);
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 + (buffer->length - length), 0, length);
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
- pm_buffer_append_str(pm_buffer_t *buffer, const char *value, size_t length) {
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
- pm_buffer_append_u8(pm_buffer_t *buffer, uint8_t value) {
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
- pm_buffer_append_u32(pm_buffer_t *buffer, uint32_t value) {
115
+ pm_buffer_append_varint(pm_buffer_t *buffer, uint32_t value) {
89
116
  if (value < 128) {
90
- pm_buffer_append_u8(buffer, (uint8_t) value);
117
+ pm_buffer_append_byte(buffer, (uint8_t) value);
91
118
  } else {
92
119
  uint32_t n = value;
93
120
  while (n >= 128) {
94
- pm_buffer_append_u8(buffer, (uint8_t) (n | 128));
121
+ pm_buffer_append_byte(buffer, (uint8_t) (n | 128));
95
122
  n >>= 7;
96
123
  }
97
- pm_buffer_append_u8(buffer, (uint8_t) n);
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);
@@ -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;
@@ -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, assuming we don't have any
57
- // information about the previous index that we found.
58
- static pm_line_column_t
59
- pm_newline_list_line_column_search(pm_newline_list_t *list, size_t offset) {
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.15.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-18 00:00:00.000000000 Z
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