summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--node.c5
-rw-r--r--node.h17
2 files changed, 13 insertions, 9 deletions
diff --git a/node.c b/node.c
index 48fdf03c0a..885cef6c04 100644
--- a/node.c
+++ b/node.c
@@ -1058,11 +1058,12 @@ void
rb_node_init(NODE *n, enum node_type type, VALUE a0, VALUE a1, VALUE a2)
{
n->flags = T_NODE;
- n->nd_location = 0;
+ nd_set_type(n, type);
n->u1.value = a0;
n->u2.value = a1;
n->u3.value = a2;
- nd_set_type(n, type);
+ n->nd_first_loc.lineno = 0;
+ n->nd_first_loc.column = 0;
}
typedef struct node_buffer_elem_struct {
diff --git a/node.h b/node.h
index d85f86746a..59d6d7f204 100644
--- a/node.h
+++ b/node.h
@@ -222,9 +222,13 @@ enum node_type {
#define NODE_LAST NODE_LAST
};
+typedef struct rb_code_location_struct {
+ int lineno;
+ int column;
+} rb_code_location_t;
+
typedef struct RNode {
VALUE flags;
- VALUE nd_location; /* lineno and column */
union {
struct RNode *node;
ID id;
@@ -247,6 +251,7 @@ typedef struct RNode {
long cnt;
VALUE value;
} u3;
+ rb_code_location_t nd_first_loc;
} NODE;
#define RNODE(obj) (R_CAST(RNode)(obj))
@@ -270,13 +275,11 @@ typedef struct RNode {
#define nd_line(n) (int)(((SIGNED_VALUE)(n)->flags)>>NODE_LSHIFT)
#define nd_set_line(n,l) \
(n)->flags=(((n)->flags&~((VALUE)(-1)<<NODE_LSHIFT))|((VALUE)((l)&NODE_LMASK)<<NODE_LSHIFT))
-#define nd_column(n) (int)((n)->nd_location & 0xffff)
-#define nd_set_column(n, v) \
- (n)->nd_location = ((n)->nd_location & ~0xffff) | ((v) > 0xffff ? 0xffff : ((unsigned int)(v)) & 0xffff)
-#define nd_lineno(n) (int)(((n)->nd_location >> 16) & 0xffff)
-#define nd_set_lineno(n, v) \
- (n)->nd_location = ((n)->nd_location & ~0xffff0000) | (((v) > 0xffff ? 0xffff : ((unsigned int)(v)) & 0xffff) << 16)
+#define nd_column(n) ((int)((n)->nd_first_loc.column))
+#define nd_set_column(n, v) ((n)->nd_first_loc.column = (v))
+#define nd_lineno(n) ((int)((n)->nd_first_loc.lineno))
+#define nd_set_lineno(n, v) ((n)->nd_first_loc.lineno = (v))
#define nd_head u1.node
#define nd_alen u2.argc