summaryrefslogtreecommitdiff
path: root/universal_parser.c
blob: 14759ad56f143b5f78cd692247f36ef9aa955550 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
#include <alloca.h>
#include <string.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>

/* Dependency */
#include "internal/parse.h"
#include "node.h"
#include "id.h"

#include "internal/compilers.h"
#include "ruby/backward/2/inttypes.h"
#include "probes.h"

#define LIKELY(x) RB_LIKELY(x)
#define UNLIKELY(x) RB_UNLIKELY(x)
#ifndef TRUE
# define TRUE    1
#endif

#ifndef FALSE
# define FALSE   0
#endif
#define numberof(array) ((int)(sizeof(array) / sizeof((array)[0])))
#define rb_strlen_lit(str) (sizeof(str "") - 1)
#undef FIXNUM_MAX
#define FIXNUM_MAX (LONG_MAX / 2)
#undef RSTRING_GETMEM
#define RSTRING_GETMEM(str, ptrvar, lenvar) \
    ((ptrvar) = RSTRING_PTR(str),           \
     (lenvar) = RSTRING_LEN(str))
#if defined(USE_FLONUM)
# /* Take that. */
#elif SIZEOF_VALUE >= SIZEOF_DOUBLE
# define USE_FLONUM 1
#else
# define USE_FLONUM 0
#endif

/* parser_st */
#define st_table parser_st_table
#define st_data_t parser_st_data_t
#define st_hash_type parser_st_hash_type
#define ST_CONTINUE ST2_CONTINUE
#define ST_STOP ST2_STOP
#define ST_DELETE ST2_DELETE
#define ST_CHECK ST2_CHECK
#define ST_REPLACE ST2_REPLACE
#undef st_init_numtable
#define st_init_numtable rb_parser_st_init_numtable
#undef st_free_table
#define st_free_table rb_parser_st_free_table
#undef st_init_table_with_size
#define st_init_table_with_size rb_parser_st_init_table_with_size
#undef st_insert
#define st_insert rb_parser_st_insert
#undef st_foreach
#define st_foreach rb_parser_st_foreach
#undef st_delete
#define st_delete rb_parser_st_delete
#undef st_is_member
#define st_is_member parser_st_is_member

#define rb_encoding void

#undef T_FLOAT
#define T_FLOAT    0x04
#undef T_REGEXP
#define T_REGEXP   0x06
#undef T_HASH
#define T_HASH     0x08
#undef T_BIGNUM
#define T_BIGNUM   0x0a
#undef T_COMPLEX
#define T_COMPLEX  0x0e
#undef T_RATIONAL
#define T_RATIONAL 0x0f

#ifndef INTERNAL_IMEMO_H
struct rb_imemo_tmpbuf_struct {
    VALUE flags;
    VALUE reserved;
    VALUE *ptr; /* malloc'ed buffer */
    struct rb_imemo_tmpbuf_struct *next; /* next imemo */
    size_t cnt; /* buffer size in VALUE */
};
#endif

#undef xmalloc
#define xmalloc p->config->malloc
#undef xcalloc
#define xcalloc p->config->calloc
#undef xrealloc
#define xrealloc p->config->realloc
#undef ALLOC_N
#define ALLOC_N(type,n)  ((type *)p->config->alloc_n((n), sizeof(type)))
#undef ALLOC
#define ALLOC(type)      ((type *)p->config->alloc(sizeof(type)))
#undef xfree
#define xfree p->config->free
#undef ALLOCA_N
// alloca(rbimpl_size_mul_or_raise(x, y));
#define ALLOCA_N(type,n) ((type *)alloca(sizeof(type) * (n)))
#undef REALLOC_N
#define REALLOC_N(var,type,n) ((var) = (type *)p->config->realloc_n((void *)var, n, sizeof(type)))
#undef ZALLOC
#define ZALLOC(type) ((type *)p->config->zalloc(sizeof(type)))
#undef MEMMOVE
#define MEMMOVE(p1,p2,type,n) (p->config->rb_memmove((p1), (p2), sizeof(type), (n)))
#undef MEMCPY
#define MEMCPY(p1,p2,type,n) (p->config->nonempty_memcpy((p1), (p2), sizeof(type), (n)))

#define rb_imemo_tmpbuf_parser_heap p->config->tmpbuf_parser_heap

#define compile_callback         p->config->compile_callback
#define reg_named_capture_assign p->config->reg_named_capture_assign
#define script_lines_defined     p->config->script_lines_defined
#define script_lines_get         p->config->script_lines_get

#define rb_obj_freeze p->config->obj_freeze
#define rb_obj_hide p->config->obj_hide
#undef RB_OBJ_FROZEN
#define RB_OBJ_FROZEN p->config->obj_frozen
#undef RB_TYPE_P
#define RB_TYPE_P p->config->type_p
#undef OBJ_FREEZE_RAW
#define OBJ_FREEZE_RAW p->config->obj_freeze_raw

#undef FIXNUM_P
#define FIXNUM_P p->config->fixnum_p
#undef SYMBOL_P
#define SYMBOL_P p->config->symbol_p

#define rb_attr_get p->config->attr_get

#define rb_ary_new           p->config->ary_new
#define rb_ary_push          p->config->ary_push
#undef rb_ary_new_from_args
#define rb_ary_new_from_args p->config->ary_new_from_args
#define rb_ary_pop           p->config->ary_pop
#define rb_ary_last          p->config->ary_last
#define rb_ary_unshift       p->config->ary_unshift
#undef rb_ary_new2
#define rb_ary_new2          p->config->ary_new2
#define rb_ary_entry         p->config->ary_entry
#define rb_ary_join          p->config->ary_join
#define rb_ary_reverse       p->config->ary_reverse
#define rb_ary_clear         p->config->ary_clear
#undef RARRAY_LEN
#define RARRAY_LEN           p->config->array_len
#define RARRAY_AREF          p->config->array_aref

#undef rb_sym_intern_ascii_cstr
#define rb_sym_intern_ascii_cstr p->config->sym_intern_ascii_cstr
#define rb_make_temporary_id     p->config->make_temporary_id
#define is_local_id              p->config->is_local_id
#define is_attrset_id            p->config->is_attrset_id
#define is_global_name_punct     p->config->is_global_name_punct
#define id_type                  p->config->id_type
#define rb_id_attrset            p->config->id_attrset
#undef rb_intern
#define rb_intern                p->config->intern
#define rb_intern2               p->config->intern2
#define rb_intern3               p->config->intern3
#define rb_intern_str            p->config->intern_str
#define is_notop_id              p->config->is_notop_id
#define rb_enc_symname_type      p->config->enc_symname_type
#define rb_str_intern            p->config->str_intern
#define rb_id2name               p->config->id2name
#define rb_id2str                p->config->id2str
#define rb_id2sym                p->config->id2sym
#undef ID2SYM
#define ID2SYM                   p->config->id2sym
#undef SYM2ID
#define SYM2ID                   p->config->sym2id

#define rb_str_catf                       p->config->str_catf
#undef rb_str_cat_cstr
#define rb_str_cat_cstr                   p->config->str_cat_cstr
#define rb_str_subseq                     p->config->str_subseq
#define rb_str_dup                        p->config->str_dup
#define rb_str_new_frozen                 p->config->str_new_frozen
#define rb_str_buf_new                    p->config->str_buf_new
#undef rb_str_buf_cat
#define rb_str_buf_cat                    p->config->str_buf_cat
#define rb_str_modify                     p->config->str_modify
#define rb_str_set_len                    p->config->str_set_len
#define rb_str_cat                        p->config->str_cat
#define rb_str_resize                     p->config->str_resize
#undef rb_str_new
#define rb_str_new                        p->config->str_new
#undef rb_str_new_cstr
#define rb_str_new_cstr                   p->config->str_new_cstr
#define rb_fstring                        p->config->fstring
#define is_ascii_string                   p->config->is_ascii_string
#define rb_enc_str_new                    p->config->enc_str_new
#define rb_enc_str_buf_cat                p->config->enc_str_buf_cat
#define rb_str_buf_append                 p->config->str_buf_append
#define rb_str_vcatf                      p->config->str_vcatf
#undef StringValueCStr
#define StringValueCStr(v)                p->config->string_value_cstr(&(v))
#define rb_sprintf                        p->config->rb_sprintf
#undef RSTRING_PTR
#define RSTRING_PTR                       p->config->rstring_ptr
#undef RSTRING_END
#define RSTRING_END                       p->config->rstring_end
#undef RSTRING_LEN
#define RSTRING_LEN                       p->config->rstring_len
#define rb_filesystem_str_new_cstr        p->config->filesystem_str_new_cstr
#define rb_obj_as_string                  p->config->obj_as_string

#define rb_hash_clear     p->config->hash_clear
#define rb_hash_new       p->config->hash_new
#define rb_hash_aset      p->config->hash_aset
#define rb_hash_lookup    p->config->hash_lookup
#define rb_ident_hash_new p->config->ident_hash_new

#undef INT2FIX
#define INT2FIX  p->config->int2fix
#undef LONG2FIX
#define LONG2FIX p->config->int2fix

#define bignum_negate p->config->bignum_negate
#define rb_big_norm   p->config->big_norm
#define rb_cstr_to_inum p->config->cstr_to_inum

#define rb_float_new   p->config->float_new
#undef RFLOAT_VALUE
#define RFLOAT_VALUE   p->config->float_value
#undef DBL2NUM
#define DBL2NUM p->config->float_new

#undef NUM2INT
#define NUM2INT             p->config->num2int
#define rb_int_positive_pow p->config->int_positive_pow
#undef INT2NUM
#define INT2NUM             p->config->int2num
#undef FIX2LONG
#define FIX2LONG            p->config->fix2long

#define rb_rational_new  p->config->rational_new
#undef rb_rational_raw1
#define rb_rational_raw1 p->config->rational_raw1
#define rational_set_num p->config->rational_set_num
#define rational_get_num p->config->rational_get_num

#define rb_complex_raw    p->config->complex_raw
#define rcomplex_set_real p->config->rcomplex_set_real
#define rcomplex_set_imag p->config->rcomplex_set_imag
#define rcomplex_get_real p->config->rcomplex_get_real
#define rcomplex_get_imag p->config->rcomplex_get_imag

#define rb_stderr_tty_p    p->config->stderr_tty_p
#define rb_write_error_str p->config->write_error_str
#define rb_default_rs      p->config->default_rs()
#define rb_io_write        p->config->io_write
#define rb_io_flush        p->config->io_flush
#define rb_io_puts         p->config->io_puts
#define rb_io_gets_internal p->config->io_gets_internal

#define rb_ractor_stdout   p->config->debug_output_stdout
#define rb_ractor_stderr   p->config->debug_output_stderr

#define rb_is_usascii_enc       p->config->is_usascii_enc
#define rb_enc_isalnum          p->config->enc_isalnum
#define rb_enc_precise_mbclen   p->config->enc_precise_mbclen
#define MBCLEN_CHARFOUND_P      p->config->mbclen_charfound_p
#define rb_enc_name             p->config->enc_name
#define rb_enc_prev_char        p->config->enc_prev_char
#define rb_enc_get              p->config->enc_get
#define rb_enc_asciicompat      p->config->enc_asciicompat
#define rb_utf8_encoding        p->config->utf8_encoding
#define rb_enc_associate        p->config->enc_associate
#define rb_ascii8bit_encoding   p->config->ascii8bit_encoding
#define rb_enc_codelen          p->config->enc_codelen
#define rb_enc_mbcput           p->config->enc_mbcput
#define rb_char_to_option_kcode p->config->char_to_option_kcode
#define rb_ascii8bit_encindex   p->config->ascii8bit_encindex
#define rb_enc_find_index       p->config->enc_find_index
#define rb_enc_from_index       p->config->enc_from_index
#define rb_enc_associate_index  p->config->enc_associate_index
#define rb_enc_isspace          p->config->enc_isspace
#define ENC_CODERANGE_7BIT      p->config->enc_coderange_7bit
#define ENC_CODERANGE_UNKNOWN   p->config->enc_coderange_unknown
#define rb_enc_compatible       p->config->enc_compatible
#define rb_enc_from_encoding    p->config->enc_from_encoding
#define ENCODING_GET            p->config->encoding_get
#define ENCODING_SET            p->config->encoding_set
#define ENCODING_IS_ASCII8BIT   p->config->encoding_is_ascii8bit
#define rb_usascii_encoding     p->config->usascii_encoding

#define rb_ractor_make_shareable p->config->ractor_make_shareable

#define ruby_vm_keep_script_lines p->config->vm_keep_script_lines()
#define rb_local_defined          p->config->local_defined
#define rb_dvar_defined           p->config->dvar_defined

#define literal_cmp  p->config->literal_cmp
#define literal_hash p->config->literal_hash

#define rb_builtin_class_name p->config->builtin_class_name
#define rb_syntax_error_append p->config->syntax_error_append
#define rb_raise p->config->raise
#define syntax_error_new p->config->syntax_error_new

#define rb_errinfo p->config->errinfo
#define rb_set_errinfo p->config->set_errinfo
#define rb_exc_raise p->config->exc_raise
#define rb_make_exception p->config->make_exception

#define ruby_sized_xfree p->config->sized_xfree
#define SIZED_REALLOC_N(v, T, m, n) ((v) = (T *)p->config->sized_realloc_n((void *)(v), (m), sizeof(T), (n)))
#undef RB_OBJ_WRITE
#define RB_OBJ_WRITE(old, slot, young) p->config->obj_write((VALUE)(old), (VALUE *)(slot), (VALUE)(young))
#undef RB_OBJ_WRITTEN
#define RB_OBJ_WRITTEN(old, oldv, young) p->config->obj_written((VALUE)(old), (VALUE)(oldv), (VALUE)(young))
#define rb_gc_register_mark_object p->config->gc_register_mark_object
#undef RB_GC_GUARD
#define RB_GC_GUARD p->config->gc_guard
#define rb_gc_mark p->config->gc_mark

#define rb_reg_compile          p->config->reg_compile
#define rb_reg_check_preprocess p->config->reg_check_preprocess
#define rb_memcicmp p->config->memcicmp

#define rb_compile_warn    p->config->compile_warn
#define rb_compile_warning p->config->compile_warning
#define rb_bug             p->config->bug
#define rb_fatal           p->config->fatal
#undef ruby_verbose
#define ruby_verbose       p->config->verbose()

#define rb_make_backtrace p->config->make_backtrace

#define ruby_scan_hex    p->config->scan_hex
#define ruby_scan_oct    p->config->scan_oct
#define ruby_scan_digits p->config->scan_digits
#define strtod           p->config->strtod

#undef RBOOL
#define RBOOL p->config->rbool
#undef UNDEF_P
#define UNDEF_P p->config->undef_p
#undef RTEST
#define RTEST p->config->rtest
#undef NIL_P
#define NIL_P p->config->nil_p
#undef FLONUM_P
#define FLONUM_P p->config->flonum_p
#undef Qnil
#define Qnil  p->config->qnil
#undef Qtrue
#define Qtrue p->config->qtrue
#undef Qfalse
#define Qfalse p->config->qfalse
#undef Qundef
#define Qundef p->config->qundef
#define rb_eArgError p->config->eArgError
#define rb_mRubyVMFrozenCore p->config->mRubyVMFrozenCore
#undef rb_long2int
#define rb_long2int p->config->long2int
#undef SPECIAL_CONST_P
#define SPECIAL_CONST_P p->config->special_const_p
#undef BUILTIN_TYPE
#define BUILTIN_TYPE p->config->builtin_type
#define ruby_snprintf p->config->snprintf

#define rb_node_case_when_optimizable_literal p->config->node_case_when_optimizable_literal

#undef st_init_table_with_size
#define st_init_table_with_size rb_parser_st_init_table_with_size

#define rb_ast_new() \
    rb_ast_new(p->config)