12#ifdef UNIVERSAL_PARSER
14#include "rubyparser.h"
18#include "internal/variable.h"
21#define NODE_BUF_DEFAULT_SIZE (sizeof(struct RNode) * 16)
24init_node_buffer_elem(node_buffer_elem_t *nbe,
size_t allocated,
void *
xmalloc(
size_t))
26 nbe->allocated = allocated;
35 init_node_buffer_elem(head, NODE_BUF_DEFAULT_SIZE,
xmalloc);
36 nb->head = nb->last = head;
37 nb->head->next = NULL;
40#ifdef UNIVERSAL_PARSER
41#define ruby_xmalloc config->malloc
44#ifdef UNIVERSAL_PARSER
46rb_node_buffer_new(
const rb_parser_config_t *config)
49rb_node_buffer_new(
void)
52 const size_t bucket_size = offsetof(node_buffer_elem_t, buf) + NODE_BUF_DEFAULT_SIZE;
53 const size_t alloc_size =
sizeof(
node_buffer_t) + (bucket_size);
56 offsetof(node_buffer_elem_t, buf) + NODE_BUF_DEFAULT_SIZE
59 init_node_buffer_list(&nb->buffer_list, (node_buffer_elem_t*)&nb[1], ruby_xmalloc);
65#ifdef UNIVERSAL_PARSER
67#define ruby_xmalloc ast->config->malloc
69#define xfree ast->config->free
70#define rb_xmalloc_mul_add ast->config->xmalloc_mul_add
71#define ruby_xrealloc(var,size) (ast->config->realloc_n((void *)var, 1, size))
74typedef void node_itr_t(
rb_ast_t *ast,
void *ctx,
NODE *node);
78rb_node_init(
NODE *n,
enum node_type
type)
81 nd_init_type(RNODE(n),
type);
82 RNODE(n)->nd_loc.beg_pos.lineno = 0;
83 RNODE(n)->nd_loc.beg_pos.column = 0;
84 RNODE(n)->nd_loc.end_pos.lineno = 0;
85 RNODE(n)->nd_loc.end_pos.column = 0;
86 RNODE(n)->node_id = -1;
93#include "node_name.inc"
99#ifdef UNIVERSAL_PARSER
101ruby_node_name(
int node)
103 return rb_node_name(node);
107ruby_node_name(
int node)
109 const char *name = rb_node_name(node);
111 if (!name) rb_bug(
"unknown node: %d", node);
119 node_buffer_elem_t *nbe = nb->head;
120 while (nbe != nb->last) {
136 ID ids[FLEX_ARY_LEN];
152 parser_string_free(ast, token->str);
159 for (
long i = 0; i < tokens->len; i++) {
160 parser_ast_token_free(ast, tokens->data[i]);
177 switch (nd_type(node)) {
179 parser_string_free(ast, RNODE_STR(node)->
string);
182 parser_string_free(ast, RNODE_DSTR(node)->
string);
185 parser_string_free(ast, RNODE_XSTR(node)->
string);
188 parser_string_free(ast, RNODE_DXSTR(node)->
string);
191 parser_string_free(ast, RNODE_SYM(node)->
string);
195 parser_string_free(ast, RNODE_REGX(node)->
string);
198 parser_string_free(ast, RNODE_DSYM(node)->
string);
201 parser_string_free(ast, RNODE_DREGX(node)->
string);
204 parser_string_free(ast, RNODE_FILE(node)->path);
207 xfree(RNODE_INTEGER(node)->val);
210 xfree(RNODE_FLOAT(node)->val);
213 xfree(RNODE_RATIONAL(node)->val);
216 xfree(RNODE_IMAGINARY(node)->val);
219 parser_nodes_free(ast, RNODE_UNDEF(node)->nd_undefs);
230 parser_tokens_free(ast, nb->tokens);
232 iterate_node_values(ast, &nb->buffer_list, free_ast_value, NULL);
233 node_buffer_list_free(ast, &nb->buffer_list);
235 while (local_table) {
238 local_table = next_table;
243#define buf_add_offset(nbe, offset) ((char *)(nbe->buf) + (offset))
251 padding = alignment - (size_t)buf_add_offset(nb->head, nb->head->used) % alignment;
252 padding = padding == alignment ? 0 : padding;
254 if (nb->head->used + size + padding > nb->head->allocated) {
255 size_t n = nb->head->allocated * 2;
256 node_buffer_elem_t *nbe;
257 nbe = rb_xmalloc_mul_add(n,
sizeof(
char *), offsetof(node_buffer_elem_t, buf));
258 init_node_buffer_elem(nbe, n, ruby_xmalloc);
259 nbe->next = nb->head;
264 ptr = (
NODE *)buf_add_offset(nb->head, nb->head->used + padding);
265 nb->head->used += (size + padding);
266 nb->head->nodes[nb->head->len++] = ptr;
271rb_ast_newnode(
rb_ast_t *ast,
enum node_type
type,
size_t size,
size_t alignment)
275 return ast_newnode_in_bucket(ast, bucket, size, alignment);
279rb_ast_new_local_table(
rb_ast_t *ast,
int size)
283 link->next = ast->node_buffer->local_tables;
284 ast->node_buffer->local_tables = link;
291rb_ast_resize_latest_local_table(
rb_ast_t *ast,
int size)
295 link = ruby_xrealloc(link, alloc_size);
296 ast->node_buffer->local_tables = link;
310#ifdef UNIVERSAL_PARSER
312rb_ast_new(
const rb_parser_config_t *config)
316 ast->config = config;
317 ast->node_buffer = nb;
326 ast->node_buffer = nb;
332iterate_buffer_elements(
rb_ast_t *ast, node_buffer_elem_t *nbe,
long len, node_itr_t *func,
void *ctx)
335 for (cursor = 0; cursor <
len; cursor++) {
336 func(ast, ctx, nbe->nodes[cursor]);
343 node_buffer_elem_t *nbe = nb->head;
346 iterate_buffer_elements(ast, nbe, nbe->len, func, ctx);
354 if (!script_lines)
return;
355 for (
long i = 0; i < script_lines->len; i++) {
358 xfree(script_lines->data);
373 node_buffer_elem_t *nbe = nb->head;
374 while (nbe != nb->last) {
375 size += offsetof(node_buffer_elem_t, buf) + nbe->used;
394 size += buffer_list_size(&nb->buffer_list);
395 link = nb->local_tables;
401 size += link->size *
sizeof(
ID);
407 for (i = 0; i < tokens->len; i++) {
411 size += token->str->len + 1;
417 for (i = 0; i < script_lines->len; i++) {
429 if (ast && ast->node_buffer) {
430 script_lines_free(ast, ast->body.script_lines);
431 ast->body.script_lines = NULL;
432 rb_node_buffer_free(ast, ast->node_buffer);
433 ast->node_buffer = 0;
438rb_node_set_type(
NODE *n,
enum node_type t)
440 return nd_init_type(n, t);
444rb_node_get_type(
const NODE *n)
446 return (
enum node_type)nd_type(n);
#define xfree
Old name of ruby_xfree.
#define xmalloc
Old name of ruby_xmalloc.
int len
Length of the buffer.
VALUE type(ANYARGS)
ANYARGS-ed function type.
Functions related to nodes in the AST.
uintptr_t ID
Type that represents a Ruby identifier such as a variable name.
uintptr_t VALUE
Type that represents a Ruby object.