prism 0.13.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -39,9 +39,21 @@ size_t pm_constant_id_list_memsize(pm_constant_id_list_t *list);
39
39
  // Free the memory associated with a list of constant ids.
40
40
  void pm_constant_id_list_free(pm_constant_id_list_t *list);
41
41
 
42
+ // Constant pool buckets can have a couple of different types.
43
+ typedef unsigned int pm_constant_pool_bucket_type_t;
44
+
45
+ // By default, each constant is a slice of the source.
46
+ static const pm_constant_pool_bucket_type_t PM_CONSTANT_POOL_BUCKET_DEFAULT = 0;
47
+
48
+ // An owned constant is one for which memory has been allocated.
49
+ static const pm_constant_pool_bucket_type_t PM_CONSTANT_POOL_BUCKET_OWNED = 1;
50
+
51
+ // A constant constant is known at compile time.
52
+ static const pm_constant_pool_bucket_type_t PM_CONSTANT_POOL_BUCKET_CONSTANT = 2;
53
+
42
54
  typedef struct {
43
- unsigned int id: 31;
44
- bool owned: 1;
55
+ unsigned int id: 30;
56
+ pm_constant_pool_bucket_type_t type: 2;
45
57
  uint32_t hash;
46
58
  } pm_constant_pool_bucket_t;
47
59
 
@@ -63,6 +75,9 @@ typedef struct {
63
75
  // Initialize a new constant pool with a given capacity.
64
76
  bool pm_constant_pool_init(pm_constant_pool_t *pool, uint32_t capacity);
65
77
 
78
+ // Return a pointer to the constant indicated by the given constant id.
79
+ pm_constant_t * pm_constant_pool_id_to_constant(pm_constant_pool_t *pool, pm_constant_id_t constant_id);
80
+
66
81
  // Insert a constant into a constant pool that is a slice of a source string.
67
82
  // Returns the id of the constant, or 0 if any potential calls to resize fail.
68
83
  pm_constant_id_t pm_constant_pool_insert_shared(pm_constant_pool_t *pool, const uint8_t *start, size_t length);
@@ -72,6 +87,10 @@ pm_constant_id_t pm_constant_pool_insert_shared(pm_constant_pool_t *pool, const
72
87
  // resize fail.
73
88
  pm_constant_id_t pm_constant_pool_insert_owned(pm_constant_pool_t *pool, const uint8_t *start, size_t length);
74
89
 
90
+ // Insert a constant into a constant pool from memory that is constant. Returns
91
+ // the id of the constant, or 0 if any potential calls to resize fail.
92
+ pm_constant_id_t pm_constant_pool_insert_constant(pm_constant_pool_t *pool, const uint8_t *start, size_t length);
93
+
75
94
  // Free the memory associated with a constant pool.
76
95
  void pm_constant_pool_free(pm_constant_pool_t *pool);
77
96
 
@@ -11,9 +11,10 @@
11
11
 
12
12
  // This struct represents a string value.
13
13
  typedef struct {
14
- enum { PM_STRING_SHARED, PM_STRING_OWNED, PM_STRING_CONSTANT, PM_STRING_MAPPED } type;
15
14
  const uint8_t *source;
16
15
  size_t length;
16
+ // This field is not the first one, because otherwise things like .pm_string_t_field = 123/pm_constant_id_t does not warn or error
17
+ enum { PM_STRING_SHARED, PM_STRING_OWNED, PM_STRING_CONSTANT, PM_STRING_MAPPED } type;
17
18
  } pm_string_t;
18
19
 
19
20
  #define PM_EMPTY_STRING ((pm_string_t) { .type = PM_STRING_CONSTANT, .source = NULL, .length = 0 })
@@ -1,4 +1,4 @@
1
1
  #define PRISM_VERSION_MAJOR 0
2
- #define PRISM_VERSION_MINOR 13
2
+ #define PRISM_VERSION_MINOR 15
3
3
  #define PRISM_VERSION_PATCH 0
4
- #define PRISM_VERSION "0.13.0"
4
+ #define PRISM_VERSION "0.15.0"
data/include/prism.h CHANGED
@@ -8,7 +8,6 @@
8
8
  #include "prism/pack.h"
9
9
  #include "prism/parser.h"
10
10
  #include "prism/regexp.h"
11
- #include "prism/unescape.h"
12
11
  #include "prism/util/pm_buffer.h"
13
12
  #include "prism/util/pm_char.h"
14
13
  #include "prism/util/pm_memchr.h"
@@ -35,7 +34,7 @@ void pm_print_node(pm_parser_t *parser, pm_node_t *node);
35
34
  void pm_parser_metadata(pm_parser_t *parser, const char *metadata);
36
35
 
37
36
  // Generate a scope node from the given node.
38
- void pm_scope_node_init(pm_node_t *node, pm_scope_node_t *dest);
37
+ void pm_scope_node_init(const pm_node_t *node, pm_scope_node_t *scope, pm_scope_node_t *previous, pm_parser_t *parser);
39
38
 
40
39
  // The prism version and the serialization format.
41
40
  PRISM_EXPORTED_FUNCTION const char * pm_version(void);
@@ -39,426 +39,435 @@ module Prism
39
39
  node.compact_child_nodes.map { |node| node.accept(self) }
40
40
  end
41
41
 
42
- # Compile a AliasGlobalVariableNode node
42
+ # Compile a AliasGlobalVariableNode node
43
43
  alias visit_alias_global_variable_node visit_child_nodes
44
-
44
+
45
45
  # Compile a AliasMethodNode node
46
46
  alias visit_alias_method_node visit_child_nodes
47
-
47
+
48
48
  # Compile a AlternationPatternNode node
49
49
  alias visit_alternation_pattern_node visit_child_nodes
50
-
50
+
51
51
  # Compile a AndNode node
52
52
  alias visit_and_node visit_child_nodes
53
-
53
+
54
54
  # Compile a ArgumentsNode node
55
55
  alias visit_arguments_node visit_child_nodes
56
-
56
+
57
57
  # Compile a ArrayNode node
58
58
  alias visit_array_node visit_child_nodes
59
-
59
+
60
60
  # Compile a ArrayPatternNode node
61
61
  alias visit_array_pattern_node visit_child_nodes
62
-
62
+
63
63
  # Compile a AssocNode node
64
64
  alias visit_assoc_node visit_child_nodes
65
-
65
+
66
66
  # Compile a AssocSplatNode node
67
67
  alias visit_assoc_splat_node visit_child_nodes
68
-
68
+
69
69
  # Compile a BackReferenceReadNode node
70
70
  alias visit_back_reference_read_node visit_child_nodes
71
-
71
+
72
72
  # Compile a BeginNode node
73
73
  alias visit_begin_node visit_child_nodes
74
-
74
+
75
75
  # Compile a BlockArgumentNode node
76
76
  alias visit_block_argument_node visit_child_nodes
77
-
77
+
78
78
  # Compile a BlockLocalVariableNode node
79
79
  alias visit_block_local_variable_node visit_child_nodes
80
-
80
+
81
81
  # Compile a BlockNode node
82
82
  alias visit_block_node visit_child_nodes
83
-
83
+
84
84
  # Compile a BlockParameterNode node
85
85
  alias visit_block_parameter_node visit_child_nodes
86
-
86
+
87
87
  # Compile a BlockParametersNode node
88
88
  alias visit_block_parameters_node visit_child_nodes
89
-
89
+
90
90
  # Compile a BreakNode node
91
91
  alias visit_break_node visit_child_nodes
92
-
92
+
93
93
  # Compile a CallAndWriteNode node
94
94
  alias visit_call_and_write_node visit_child_nodes
95
-
95
+
96
96
  # Compile a CallNode node
97
97
  alias visit_call_node visit_child_nodes
98
-
98
+
99
99
  # Compile a CallOperatorWriteNode node
100
100
  alias visit_call_operator_write_node visit_child_nodes
101
-
101
+
102
102
  # Compile a CallOrWriteNode node
103
103
  alias visit_call_or_write_node visit_child_nodes
104
-
104
+
105
105
  # Compile a CapturePatternNode node
106
106
  alias visit_capture_pattern_node visit_child_nodes
107
-
107
+
108
108
  # Compile a CaseNode node
109
109
  alias visit_case_node visit_child_nodes
110
-
110
+
111
111
  # Compile a ClassNode node
112
112
  alias visit_class_node visit_child_nodes
113
-
113
+
114
114
  # Compile a ClassVariableAndWriteNode node
115
115
  alias visit_class_variable_and_write_node visit_child_nodes
116
-
116
+
117
117
  # Compile a ClassVariableOperatorWriteNode node
118
118
  alias visit_class_variable_operator_write_node visit_child_nodes
119
-
119
+
120
120
  # Compile a ClassVariableOrWriteNode node
121
121
  alias visit_class_variable_or_write_node visit_child_nodes
122
-
122
+
123
123
  # Compile a ClassVariableReadNode node
124
124
  alias visit_class_variable_read_node visit_child_nodes
125
-
125
+
126
126
  # Compile a ClassVariableTargetNode node
127
127
  alias visit_class_variable_target_node visit_child_nodes
128
-
128
+
129
129
  # Compile a ClassVariableWriteNode node
130
130
  alias visit_class_variable_write_node visit_child_nodes
131
-
131
+
132
132
  # Compile a ConstantAndWriteNode node
133
133
  alias visit_constant_and_write_node visit_child_nodes
134
-
134
+
135
135
  # Compile a ConstantOperatorWriteNode node
136
136
  alias visit_constant_operator_write_node visit_child_nodes
137
-
137
+
138
138
  # Compile a ConstantOrWriteNode node
139
139
  alias visit_constant_or_write_node visit_child_nodes
140
-
140
+
141
141
  # Compile a ConstantPathAndWriteNode node
142
142
  alias visit_constant_path_and_write_node visit_child_nodes
143
-
143
+
144
144
  # Compile a ConstantPathNode node
145
145
  alias visit_constant_path_node visit_child_nodes
146
-
146
+
147
147
  # Compile a ConstantPathOperatorWriteNode node
148
148
  alias visit_constant_path_operator_write_node visit_child_nodes
149
-
149
+
150
150
  # Compile a ConstantPathOrWriteNode node
151
151
  alias visit_constant_path_or_write_node visit_child_nodes
152
-
152
+
153
153
  # Compile a ConstantPathTargetNode node
154
154
  alias visit_constant_path_target_node visit_child_nodes
155
-
155
+
156
156
  # Compile a ConstantPathWriteNode node
157
157
  alias visit_constant_path_write_node visit_child_nodes
158
-
158
+
159
159
  # Compile a ConstantReadNode node
160
160
  alias visit_constant_read_node visit_child_nodes
161
-
161
+
162
162
  # Compile a ConstantTargetNode node
163
163
  alias visit_constant_target_node visit_child_nodes
164
-
164
+
165
165
  # Compile a ConstantWriteNode node
166
166
  alias visit_constant_write_node visit_child_nodes
167
-
167
+
168
168
  # Compile a DefNode node
169
169
  alias visit_def_node visit_child_nodes
170
-
170
+
171
171
  # Compile a DefinedNode node
172
172
  alias visit_defined_node visit_child_nodes
173
-
173
+
174
174
  # Compile a ElseNode node
175
175
  alias visit_else_node visit_child_nodes
176
-
176
+
177
177
  # Compile a EmbeddedStatementsNode node
178
178
  alias visit_embedded_statements_node visit_child_nodes
179
-
179
+
180
180
  # Compile a EmbeddedVariableNode node
181
181
  alias visit_embedded_variable_node visit_child_nodes
182
-
182
+
183
183
  # Compile a EnsureNode node
184
184
  alias visit_ensure_node visit_child_nodes
185
-
185
+
186
186
  # Compile a FalseNode node
187
187
  alias visit_false_node visit_child_nodes
188
-
188
+
189
189
  # Compile a FindPatternNode node
190
190
  alias visit_find_pattern_node visit_child_nodes
191
-
191
+
192
192
  # Compile a FlipFlopNode node
193
193
  alias visit_flip_flop_node visit_child_nodes
194
-
194
+
195
195
  # Compile a FloatNode node
196
196
  alias visit_float_node visit_child_nodes
197
-
197
+
198
198
  # Compile a ForNode node
199
199
  alias visit_for_node visit_child_nodes
200
-
200
+
201
201
  # Compile a ForwardingArgumentsNode node
202
202
  alias visit_forwarding_arguments_node visit_child_nodes
203
-
203
+
204
204
  # Compile a ForwardingParameterNode node
205
205
  alias visit_forwarding_parameter_node visit_child_nodes
206
-
206
+
207
207
  # Compile a ForwardingSuperNode node
208
208
  alias visit_forwarding_super_node visit_child_nodes
209
-
209
+
210
210
  # Compile a GlobalVariableAndWriteNode node
211
211
  alias visit_global_variable_and_write_node visit_child_nodes
212
-
212
+
213
213
  # Compile a GlobalVariableOperatorWriteNode node
214
214
  alias visit_global_variable_operator_write_node visit_child_nodes
215
-
215
+
216
216
  # Compile a GlobalVariableOrWriteNode node
217
217
  alias visit_global_variable_or_write_node visit_child_nodes
218
-
218
+
219
219
  # Compile a GlobalVariableReadNode node
220
220
  alias visit_global_variable_read_node visit_child_nodes
221
-
221
+
222
222
  # Compile a GlobalVariableTargetNode node
223
223
  alias visit_global_variable_target_node visit_child_nodes
224
-
224
+
225
225
  # Compile a GlobalVariableWriteNode node
226
226
  alias visit_global_variable_write_node visit_child_nodes
227
-
227
+
228
228
  # Compile a HashNode node
229
229
  alias visit_hash_node visit_child_nodes
230
-
230
+
231
231
  # Compile a HashPatternNode node
232
232
  alias visit_hash_pattern_node visit_child_nodes
233
-
233
+
234
234
  # Compile a IfNode node
235
235
  alias visit_if_node visit_child_nodes
236
-
236
+
237
237
  # Compile a ImaginaryNode node
238
238
  alias visit_imaginary_node visit_child_nodes
239
-
239
+
240
240
  # Compile a ImplicitNode node
241
241
  alias visit_implicit_node visit_child_nodes
242
-
242
+
243
243
  # Compile a InNode node
244
244
  alias visit_in_node visit_child_nodes
245
-
245
+
246
+ # Compile a IndexAndWriteNode node
247
+ alias visit_index_and_write_node visit_child_nodes
248
+
249
+ # Compile a IndexOperatorWriteNode node
250
+ alias visit_index_operator_write_node visit_child_nodes
251
+
252
+ # Compile a IndexOrWriteNode node
253
+ alias visit_index_or_write_node visit_child_nodes
254
+
246
255
  # Compile a InstanceVariableAndWriteNode node
247
256
  alias visit_instance_variable_and_write_node visit_child_nodes
248
-
257
+
249
258
  # Compile a InstanceVariableOperatorWriteNode node
250
259
  alias visit_instance_variable_operator_write_node visit_child_nodes
251
-
260
+
252
261
  # Compile a InstanceVariableOrWriteNode node
253
262
  alias visit_instance_variable_or_write_node visit_child_nodes
254
-
263
+
255
264
  # Compile a InstanceVariableReadNode node
256
265
  alias visit_instance_variable_read_node visit_child_nodes
257
-
266
+
258
267
  # Compile a InstanceVariableTargetNode node
259
268
  alias visit_instance_variable_target_node visit_child_nodes
260
-
269
+
261
270
  # Compile a InstanceVariableWriteNode node
262
271
  alias visit_instance_variable_write_node visit_child_nodes
263
-
272
+
264
273
  # Compile a IntegerNode node
265
274
  alias visit_integer_node visit_child_nodes
266
-
275
+
267
276
  # Compile a InterpolatedMatchLastLineNode node
268
277
  alias visit_interpolated_match_last_line_node visit_child_nodes
269
-
278
+
270
279
  # Compile a InterpolatedRegularExpressionNode node
271
280
  alias visit_interpolated_regular_expression_node visit_child_nodes
272
-
281
+
273
282
  # Compile a InterpolatedStringNode node
274
283
  alias visit_interpolated_string_node visit_child_nodes
275
-
284
+
276
285
  # Compile a InterpolatedSymbolNode node
277
286
  alias visit_interpolated_symbol_node visit_child_nodes
278
-
287
+
279
288
  # Compile a InterpolatedXStringNode node
280
289
  alias visit_interpolated_x_string_node visit_child_nodes
281
-
290
+
282
291
  # Compile a KeywordHashNode node
283
292
  alias visit_keyword_hash_node visit_child_nodes
284
-
293
+
285
294
  # Compile a KeywordParameterNode node
286
295
  alias visit_keyword_parameter_node visit_child_nodes
287
-
296
+
288
297
  # Compile a KeywordRestParameterNode node
289
298
  alias visit_keyword_rest_parameter_node visit_child_nodes
290
-
299
+
291
300
  # Compile a LambdaNode node
292
301
  alias visit_lambda_node visit_child_nodes
293
-
302
+
294
303
  # Compile a LocalVariableAndWriteNode node
295
304
  alias visit_local_variable_and_write_node visit_child_nodes
296
-
305
+
297
306
  # Compile a LocalVariableOperatorWriteNode node
298
307
  alias visit_local_variable_operator_write_node visit_child_nodes
299
-
308
+
300
309
  # Compile a LocalVariableOrWriteNode node
301
310
  alias visit_local_variable_or_write_node visit_child_nodes
302
-
311
+
303
312
  # Compile a LocalVariableReadNode node
304
313
  alias visit_local_variable_read_node visit_child_nodes
305
-
314
+
306
315
  # Compile a LocalVariableTargetNode node
307
316
  alias visit_local_variable_target_node visit_child_nodes
308
-
317
+
309
318
  # Compile a LocalVariableWriteNode node
310
319
  alias visit_local_variable_write_node visit_child_nodes
311
-
320
+
312
321
  # Compile a MatchLastLineNode node
313
322
  alias visit_match_last_line_node visit_child_nodes
314
-
323
+
315
324
  # Compile a MatchPredicateNode node
316
325
  alias visit_match_predicate_node visit_child_nodes
317
-
326
+
318
327
  # Compile a MatchRequiredNode node
319
328
  alias visit_match_required_node visit_child_nodes
320
-
329
+
321
330
  # Compile a MatchWriteNode node
322
331
  alias visit_match_write_node visit_child_nodes
323
-
332
+
324
333
  # Compile a MissingNode node
325
334
  alias visit_missing_node visit_child_nodes
326
-
335
+
327
336
  # Compile a ModuleNode node
328
337
  alias visit_module_node visit_child_nodes
329
-
338
+
330
339
  # Compile a MultiTargetNode node
331
340
  alias visit_multi_target_node visit_child_nodes
332
-
341
+
333
342
  # Compile a MultiWriteNode node
334
343
  alias visit_multi_write_node visit_child_nodes
335
-
344
+
336
345
  # Compile a NextNode node
337
346
  alias visit_next_node visit_child_nodes
338
-
347
+
339
348
  # Compile a NilNode node
340
349
  alias visit_nil_node visit_child_nodes
341
-
350
+
342
351
  # Compile a NoKeywordsParameterNode node
343
352
  alias visit_no_keywords_parameter_node visit_child_nodes
344
-
353
+
345
354
  # Compile a NumberedReferenceReadNode node
346
355
  alias visit_numbered_reference_read_node visit_child_nodes
347
-
356
+
348
357
  # Compile a OptionalParameterNode node
349
358
  alias visit_optional_parameter_node visit_child_nodes
350
-
359
+
351
360
  # Compile a OrNode node
352
361
  alias visit_or_node visit_child_nodes
353
-
362
+
354
363
  # Compile a ParametersNode node
355
364
  alias visit_parameters_node visit_child_nodes
356
-
365
+
357
366
  # Compile a ParenthesesNode node
358
367
  alias visit_parentheses_node visit_child_nodes
359
-
368
+
360
369
  # Compile a PinnedExpressionNode node
361
370
  alias visit_pinned_expression_node visit_child_nodes
362
-
371
+
363
372
  # Compile a PinnedVariableNode node
364
373
  alias visit_pinned_variable_node visit_child_nodes
365
-
374
+
366
375
  # Compile a PostExecutionNode node
367
376
  alias visit_post_execution_node visit_child_nodes
368
-
377
+
369
378
  # Compile a PreExecutionNode node
370
379
  alias visit_pre_execution_node visit_child_nodes
371
-
380
+
372
381
  # Compile a ProgramNode node
373
382
  alias visit_program_node visit_child_nodes
374
-
383
+
375
384
  # Compile a RangeNode node
376
385
  alias visit_range_node visit_child_nodes
377
-
386
+
378
387
  # Compile a RationalNode node
379
388
  alias visit_rational_node visit_child_nodes
380
-
389
+
381
390
  # Compile a RedoNode node
382
391
  alias visit_redo_node visit_child_nodes
383
-
392
+
384
393
  # Compile a RegularExpressionNode node
385
394
  alias visit_regular_expression_node visit_child_nodes
386
-
395
+
387
396
  # Compile a RequiredDestructuredParameterNode node
388
397
  alias visit_required_destructured_parameter_node visit_child_nodes
389
-
398
+
390
399
  # Compile a RequiredParameterNode node
391
400
  alias visit_required_parameter_node visit_child_nodes
392
-
401
+
393
402
  # Compile a RescueModifierNode node
394
403
  alias visit_rescue_modifier_node visit_child_nodes
395
-
404
+
396
405
  # Compile a RescueNode node
397
406
  alias visit_rescue_node visit_child_nodes
398
-
407
+
399
408
  # Compile a RestParameterNode node
400
409
  alias visit_rest_parameter_node visit_child_nodes
401
-
410
+
402
411
  # Compile a RetryNode node
403
412
  alias visit_retry_node visit_child_nodes
404
-
413
+
405
414
  # Compile a ReturnNode node
406
415
  alias visit_return_node visit_child_nodes
407
-
416
+
408
417
  # Compile a SelfNode node
409
418
  alias visit_self_node visit_child_nodes
410
-
419
+
411
420
  # Compile a SingletonClassNode node
412
421
  alias visit_singleton_class_node visit_child_nodes
413
-
422
+
414
423
  # Compile a SourceEncodingNode node
415
424
  alias visit_source_encoding_node visit_child_nodes
416
-
425
+
417
426
  # Compile a SourceFileNode node
418
427
  alias visit_source_file_node visit_child_nodes
419
-
428
+
420
429
  # Compile a SourceLineNode node
421
430
  alias visit_source_line_node visit_child_nodes
422
-
431
+
423
432
  # Compile a SplatNode node
424
433
  alias visit_splat_node visit_child_nodes
425
-
434
+
426
435
  # Compile a StatementsNode node
427
436
  alias visit_statements_node visit_child_nodes
428
-
437
+
429
438
  # Compile a StringConcatNode node
430
439
  alias visit_string_concat_node visit_child_nodes
431
-
440
+
432
441
  # Compile a StringNode node
433
442
  alias visit_string_node visit_child_nodes
434
-
443
+
435
444
  # Compile a SuperNode node
436
445
  alias visit_super_node visit_child_nodes
437
-
446
+
438
447
  # Compile a SymbolNode node
439
448
  alias visit_symbol_node visit_child_nodes
440
-
449
+
441
450
  # Compile a TrueNode node
442
451
  alias visit_true_node visit_child_nodes
443
-
452
+
444
453
  # Compile a UndefNode node
445
454
  alias visit_undef_node visit_child_nodes
446
-
455
+
447
456
  # Compile a UnlessNode node
448
457
  alias visit_unless_node visit_child_nodes
449
-
458
+
450
459
  # Compile a UntilNode node
451
460
  alias visit_until_node visit_child_nodes
452
-
461
+
453
462
  # Compile a WhenNode node
454
463
  alias visit_when_node visit_child_nodes
455
-
464
+
456
465
  # Compile a WhileNode node
457
466
  alias visit_while_node visit_child_nodes
458
-
467
+
459
468
  # Compile a XStringNode node
460
469
  alias visit_x_string_node visit_child_nodes
461
-
470
+
462
471
  # Compile a YieldNode node
463
472
  alias visit_yield_node visit_child_nodes
464
473
  end