prism 0.26.0 → 0.27.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.
data/sig/prism.rbs CHANGED
@@ -17,7 +17,7 @@ module Prism
17
17
  ?frozen_string_literal: bool,
18
18
  ?verbose: bool,
19
19
  ?scopes: Array[Array[Symbol]]
20
- ) -> ParseResult[ProgramNode]
20
+ ) -> ParseResult
21
21
 
22
22
  def self.lex: (
23
23
  String source,
@@ -28,7 +28,7 @@ module Prism
28
28
  ?frozen_string_literal: bool,
29
29
  ?verbose: bool,
30
30
  ?scopes: Array[Array[Symbol]]
31
- ) -> ParseResult[Array[[Token, Integer]]]
31
+ ) -> LexResult
32
32
 
33
33
  def self.lex_compat: (
34
34
  String source,
@@ -39,7 +39,7 @@ module Prism
39
39
  ?frozen_string_literal: bool,
40
40
  ?verbose: bool,
41
41
  ?scopes: Array[Array[Symbol]]
42
- ) -> ParseResult[Array[[[Integer, Integer], Symbol, String, untyped]]]
42
+ ) -> LexCompat::Result
43
43
 
44
44
  def self.parse_lex: (
45
45
  String source,
@@ -50,7 +50,7 @@ module Prism
50
50
  ?frozen_string_literal: bool,
51
51
  ?verbose: bool,
52
52
  ?scopes: Array[Array[Symbol]]
53
- ) -> ParseResult[[ProgramNode, Array[[Token, Integer]]]]
53
+ ) -> ParseLexResult
54
54
 
55
55
  def self.dump: (
56
56
  String source,
@@ -99,7 +99,7 @@ module Prism
99
99
  def self.load: (
100
100
  String source,
101
101
  String serialized
102
- ) -> ParseResult[ProgramNode]
102
+ ) -> ParseResult
103
103
 
104
104
  def self.lex_ripper: (
105
105
  String source
@@ -115,7 +115,7 @@ module Prism
115
115
  ?frozen_string_literal: bool,
116
116
  ?verbose: bool,
117
117
  ?scopes: Array[Array[Symbol]]
118
- ) -> ParseResult[ProgramNode]
118
+ ) -> ParseResult
119
119
 
120
120
  def self.lex_file: (
121
121
  String filepath,
@@ -125,7 +125,7 @@ module Prism
125
125
  ?frozen_string_literal: bool,
126
126
  ?verbose: bool,
127
127
  ?scopes: Array[Array[Symbol]]
128
- ) -> ParseResult[Array[[Token, Integer]]]
128
+ ) -> LexResult
129
129
 
130
130
  def self.parse_lex_file: (
131
131
  String filepath,
@@ -135,7 +135,7 @@ module Prism
135
135
  ?frozen_string_literal: bool,
136
136
  ?verbose: bool,
137
137
  ?scopes: Array[Array[Symbol]]
138
- ) -> ParseResult[[ProgramNode, Array[[Token, Integer]]]]
138
+ ) -> ParseLexResult
139
139
 
140
140
  def self.dump_file: (
141
141
  String filepath,
@@ -190,5 +190,5 @@ module Prism
190
190
  ?frozen_string_literal: bool,
191
191
  ?verbose: bool,
192
192
  ?scopes: Array[Array[Symbol]]
193
- ) -> ParseResult[ProgramNode]
193
+ ) -> ParseResult
194
194
  end
data/src/diagnostic.c CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  #include "prism/diagnostic.h"
10
10
 
11
- #define PM_DIAGNOSTIC_ID_MAX 281
11
+ #define PM_DIAGNOSTIC_ID_MAX 284
12
12
 
13
13
  /** This struct holds the data for each diagnostic. */
14
14
  typedef struct {
@@ -224,6 +224,8 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
224
224
  [PM_ERR_INSTANCE_VARIABLE_BARE] = { "'@' without identifiers is not allowed as an instance variable name", PM_ERROR_LEVEL_SYNTAX },
225
225
  [PM_ERR_INVALID_BLOCK_EXIT] = { "Invalid %s", PM_ERROR_LEVEL_SYNTAX },
226
226
  [PM_ERR_INVALID_FLOAT_EXPONENT] = { "invalid exponent", PM_ERROR_LEVEL_SYNTAX },
227
+ [PM_ERR_INVALID_LOCAL_VARIABLE_READ] = { "identifier %.*s is not valid to get", PM_ERROR_LEVEL_SYNTAX },
228
+ [PM_ERR_INVALID_LOCAL_VARIABLE_WRITE] = { "identifier %.*s is not valid to set", PM_ERROR_LEVEL_SYNTAX },
227
229
  [PM_ERR_INVALID_NUMBER_BINARY] = { "invalid binary number", PM_ERROR_LEVEL_SYNTAX },
228
230
  [PM_ERR_INVALID_NUMBER_DECIMAL] = { "invalid decimal number", PM_ERROR_LEVEL_SYNTAX },
229
231
  [PM_ERR_INVALID_NUMBER_HEXADECIMAL] = { "invalid hexadecimal number", PM_ERROR_LEVEL_SYNTAX },
@@ -297,6 +299,7 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
297
299
  [PM_ERR_PATTERN_HASH_KEY] = { "expected a key in the hash pattern", PM_ERROR_LEVEL_SYNTAX },
298
300
  [PM_ERR_PATTERN_HASH_KEY_DUPLICATE] = { "duplicated key name", PM_ERROR_LEVEL_SYNTAX },
299
301
  [PM_ERR_PATTERN_HASH_KEY_LABEL] = { "expected a label as the key in the hash pattern", PM_ERROR_LEVEL_SYNTAX }, // TODO // THIS // AND // ABOVE // IS WEIRD
302
+ [PM_ERR_PATTERN_HASH_KEY_LOCALS] = { "key must be valid as local variables", PM_ERROR_LEVEL_SYNTAX },
300
303
  [PM_ERR_PATTERN_IDENT_AFTER_HROCKET] = { "expected an identifier after the `=>` operator", PM_ERROR_LEVEL_SYNTAX },
301
304
  [PM_ERR_PATTERN_LABEL_AFTER_COMMA] = { "expected a label after the `,` in the hash pattern", PM_ERROR_LEVEL_SYNTAX },
302
305
  [PM_ERR_PATTERN_REST] = { "unexpected rest pattern", PM_ERROR_LEVEL_SYNTAX },
@@ -515,6 +518,8 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
515
518
  case PM_ERR_INVALID_CHARACTER: return "invalid_character";
516
519
  case PM_ERR_INVALID_ENCODING_MAGIC_COMMENT: return "invalid_encoding_magic_comment";
517
520
  case PM_ERR_INVALID_FLOAT_EXPONENT: return "invalid_float_exponent";
521
+ case PM_ERR_INVALID_LOCAL_VARIABLE_READ: return "invalid_local_variable_read";
522
+ case PM_ERR_INVALID_LOCAL_VARIABLE_WRITE: return "invalid_local_variable_write";
518
523
  case PM_ERR_INVALID_MULTIBYTE_CHAR: return "invalid_multibyte_char";
519
524
  case PM_ERR_INVALID_MULTIBYTE_CHARACTER: return "invalid_multibyte_character";
520
525
  case PM_ERR_INVALID_MULTIBYTE_ESCAPE: return "invalid_multibyte_escape";
@@ -587,6 +592,7 @@ pm_diagnostic_id_human(pm_diagnostic_id_t diag_id) {
587
592
  case PM_ERR_PATTERN_HASH_KEY: return "pattern_hash_key";
588
593
  case PM_ERR_PATTERN_HASH_KEY_DUPLICATE: return "pattern_hash_key_duplicate";
589
594
  case PM_ERR_PATTERN_HASH_KEY_LABEL: return "pattern_hash_key_label";
595
+ case PM_ERR_PATTERN_HASH_KEY_LOCALS: return "pattern_hash_key_locals";
590
596
  case PM_ERR_PATTERN_IDENT_AFTER_HROCKET: return "pattern_ident_after_hrocket";
591
597
  case PM_ERR_PATTERN_LABEL_AFTER_COMMA: return "pattern_label_after_comma";
592
598
  case PM_ERR_PATTERN_REST: return "pattern_rest";
data/src/prism.c CHANGED
@@ -13234,9 +13234,15 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod
13234
13234
  pm_token_t constant = { .type = PM_TOKEN_CONSTANT, .start = label.start, .end = label.end - 1 };
13235
13235
  value = (pm_node_t *) pm_constant_read_node_create(parser, &constant);
13236
13236
  } else {
13237
- int depth = pm_parser_local_depth(parser, &((pm_token_t) { .type = PM_TOKEN_IDENTIFIER, .start = label.start, .end = label.end - 1 }));
13237
+ int depth = -1;
13238
13238
  pm_token_t identifier = { .type = PM_TOKEN_IDENTIFIER, .start = label.start, .end = label.end - 1 };
13239
13239
 
13240
+ if (identifier.end[-1] == '!' || identifier.end[-1] == '?') {
13241
+ PM_PARSER_ERR_TOKEN_FORMAT_CONTENT(parser, identifier, PM_ERR_INVALID_LOCAL_VARIABLE_READ);
13242
+ } else {
13243
+ depth = pm_parser_local_depth(parser, &identifier);
13244
+ }
13245
+
13240
13246
  if (depth == -1) {
13241
13247
  value = (pm_node_t *) pm_call_node_variable_call_create(parser, &identifier);
13242
13248
  } else {
@@ -15643,8 +15649,15 @@ parse_pattern_hash_implicit_value(pm_parser_t *parser, pm_constant_id_list_t *ca
15643
15649
  const pm_location_t *value_loc = &((pm_symbol_node_t *) key)->value_loc;
15644
15650
  pm_constant_id_t constant_id = pm_parser_constant_id_location(parser, value_loc->start, value_loc->end);
15645
15651
 
15646
- int depth;
15647
- if ((depth = pm_parser_local_depth_constant_id(parser, constant_id)) == -1) {
15652
+ int depth = -1;
15653
+ if (value_loc->end[-1] == '!' || value_loc->end[-1] == '?') {
15654
+ pm_parser_err(parser, key->base.location.start, key->base.location.end, PM_ERR_PATTERN_HASH_KEY_LOCALS);
15655
+ PM_PARSER_ERR_LOCATION_FORMAT(parser, value_loc, PM_ERR_INVALID_LOCAL_VARIABLE_WRITE, (int) (value_loc->end - value_loc->start), (const char *) value_loc->start);
15656
+ } else {
15657
+ depth = pm_parser_local_depth_constant_id(parser, constant_id);
15658
+ }
15659
+
15660
+ if (depth == -1) {
15648
15661
  pm_parser_local_add(parser, constant_id, value_loc->start, value_loc->end, 0);
15649
15662
  }
15650
15663
 
@@ -135,12 +135,19 @@ karatsuba_multiply(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *
135
135
  }
136
136
 
137
137
  if (left_length * 2 <= right_length) {
138
- uint32_t *values = (uint32_t*) xcalloc(left_length + right_length, sizeof(uint32_t));
138
+ uint32_t *values = (uint32_t *) xcalloc(left_length + right_length, sizeof(uint32_t));
139
139
 
140
140
  for (size_t start_offset = 0; start_offset < right_length; start_offset += left_length) {
141
141
  size_t end_offset = start_offset + left_length;
142
142
  if (end_offset > right_length) end_offset = right_length;
143
143
 
144
+ pm_integer_t sliced_left = {
145
+ .value = 0,
146
+ .length = left_length,
147
+ .values = left_values,
148
+ .negative = false
149
+ };
150
+
144
151
  pm_integer_t sliced_right = {
145
152
  .value = 0,
146
153
  .length = end_offset - start_offset,
@@ -149,7 +156,7 @@ karatsuba_multiply(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *
149
156
  };
150
157
 
151
158
  pm_integer_t product;
152
- karatsuba_multiply(&product, left, &sliced_right, base);
159
+ karatsuba_multiply(&product, &sliced_left, &sliced_right, base);
153
160
 
154
161
  uint32_t carry = 0;
155
162
  for (size_t index = 0; index < product.length; index++) {
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.26.0
4
+ version: 0.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-18 00:00:00.000000000 Z
11
+ date: 2024-04-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: