[Universal Parser] Reduce dependence on RArray in parse.y
[ruby.git] / node.h
blob371b33cff6ac358a100a1885ab6a245bc248a6c5
1 #ifndef RUBY_NODE_H
2 #define RUBY_NODE_H 1
3 /**********************************************************************
5 node.h -
7 $Author$
8 created at: Fri May 28 15:14:02 JST 1993
10 Copyright (C) 1993-2007 Yukihiro Matsumoto
12 **********************************************************************/
14 #include <stdbool.h>
15 #include "rubyparser.h"
16 #include "ruby/backward/2/attributes.h"
18 typedef void (*bug_report_func)(const char *fmt, ...);
20 typedef struct node_buffer_elem_struct {
21 struct node_buffer_elem_struct *next;
22 long len; /* Length of nodes */
23 size_t allocated; /* Total memory size of allocated buf */
24 size_t used; /* Current usage of buf */
25 NODE **nodes; /* Array of node pointers */
26 NODE *buf[FLEX_ARY_LEN];
27 } node_buffer_elem_t;
29 typedef struct {
30 node_buffer_elem_t *head;
31 node_buffer_elem_t *last;
32 } node_buffer_list_t;
34 struct node_buffer_struct {
35 node_buffer_list_t unmarkable;
36 node_buffer_list_t markable;
37 struct rb_ast_local_table_link *local_tables;
38 // - id (sequence number)
39 // - token_type
40 // - text of token
41 // - location info
42 // Array, whose entry is array
43 rb_parser_ary_t *tokens;
44 #ifdef UNIVERSAL_PARSER
45 const rb_parser_config_t *config;
46 #endif
49 RUBY_SYMBOL_EXPORT_BEGIN
51 #ifdef UNIVERSAL_PARSER
52 rb_ast_t *rb_ast_new(const rb_parser_config_t *config);
53 #else
54 rb_ast_t *rb_ast_new(void);
55 #endif
56 size_t rb_ast_memsize(const rb_ast_t*);
57 void rb_ast_dispose(rb_ast_t*);
58 #if RUBY_DEBUG
59 void rb_ast_node_type_change(NODE *n, enum node_type type);
60 #endif
61 const char *ruby_node_name(int node);
62 void rb_node_init(NODE *n, enum node_type type);
64 void rb_ast_mark_and_move(rb_ast_t *ast, bool reference_updating);
65 void rb_ast_update_references(rb_ast_t*);
66 void rb_ast_free(rb_ast_t*);
67 NODE *rb_ast_newnode(rb_ast_t*, enum node_type type, size_t size, size_t alignment);
68 void rb_ast_delete_node(rb_ast_t*, NODE *n);
69 rb_ast_id_table_t *rb_ast_new_local_table(rb_ast_t*, int);
70 rb_ast_id_table_t *rb_ast_resize_latest_local_table(rb_ast_t*, int);
72 VALUE rb_parser_dump_tree(const NODE *node, int comment);
74 const struct kwtable *rb_reserved_word(const char *, unsigned int);
76 struct parser_params;
77 void *rb_parser_malloc(struct parser_params *, size_t);
78 void *rb_parser_realloc(struct parser_params *, void *, size_t);
79 void *rb_parser_calloc(struct parser_params *, size_t, size_t);
80 void rb_parser_free(struct parser_params *, void *);
81 PRINTF_ARGS(void rb_parser_printf(struct parser_params *parser, const char *fmt, ...), 2, 3);
82 VALUE rb_node_set_type(NODE *n, enum node_type t);
84 RUBY_SYMBOL_EXPORT_END
86 #define NODE_LSHIFT (NODE_TYPESHIFT+7)
87 #define NODE_LMASK (((SIGNED_VALUE)1<<(sizeof(VALUE)*CHAR_BIT-NODE_LSHIFT))-1)
89 #define nd_line(n) (int)(((SIGNED_VALUE)(n)->flags)>>NODE_LSHIFT)
90 #define nd_set_line(n,l) \
91 (n)->flags=(((n)->flags&~((VALUE)(-1)<<NODE_LSHIFT))|((VALUE)((l)&NODE_LMASK)<<NODE_LSHIFT))
94 #define NODE_SPECIAL_REQUIRED_KEYWORD ((NODE *)-1)
95 #define NODE_REQUIRED_KEYWORD_P(node) ((node) == NODE_SPECIAL_REQUIRED_KEYWORD)
96 #define NODE_SPECIAL_NO_NAME_REST ((NODE *)-1)
97 #define NODE_NAMED_REST_P(node) ((node) != NODE_SPECIAL_NO_NAME_REST)
98 #define NODE_SPECIAL_EXCESSIVE_COMMA ((ID)1)
99 #define NODE_SPECIAL_NO_REST_KEYWORD ((NODE *)-1)
101 #define nd_first_column(n) ((int)(RNODE(n)->nd_loc.beg_pos.column))
102 #define nd_set_first_column(n, v) (RNODE(n)->nd_loc.beg_pos.column = (v))
103 #define nd_first_lineno(n) ((int)(RNODE(n)->nd_loc.beg_pos.lineno))
104 #define nd_set_first_lineno(n, v) (RNODE(n)->nd_loc.beg_pos.lineno = (v))
105 #define nd_first_loc(n) (RNODE(n)->nd_loc.beg_pos)
106 #define nd_set_first_loc(n, v) (nd_first_loc(n) = (v))
108 #define nd_last_column(n) ((int)(RNODE(n)->nd_loc.end_pos.column))
109 #define nd_set_last_column(n, v) (RNODE(n)->nd_loc.end_pos.column = (v))
110 #define nd_last_lineno(n) ((int)(RNODE(n)->nd_loc.end_pos.lineno))
111 #define nd_set_last_lineno(n, v) (RNODE(n)->nd_loc.end_pos.lineno = (v))
112 #define nd_last_loc(n) (RNODE(n)->nd_loc.end_pos)
113 #define nd_set_last_loc(n, v) (nd_last_loc(n) = (v))
114 #define nd_node_id(n) (RNODE(n)->node_id)
115 #define nd_set_node_id(n,id) (RNODE(n)->node_id = (id))
117 static inline bool
118 nd_type_p(const NODE *n, enum node_type t)
120 return (enum node_type)nd_type(n) == t;
123 #endif /* RUBY_NODE_H */