[ruby/yarp] Add class variables to the constant pool

https://github.com/ruby/yarp/commit/be5cb60c83
This commit is contained in:
Kevin Newton 2023-08-30 15:28:10 -04:00 коммит произвёл git
Родитель 151e94fee5
Коммит 00dbee94ac
18 изменённых файлов: 81 добавлений и 41 удалений

Просмотреть файл

@ -8,7 +8,7 @@ module YARP
#
# @@foo && @@foo = bar
def visit_class_variable_and_write_node(node)
desugar_and_write_node(node, ClassVariableReadNode, ClassVariableWriteNode)
desugar_and_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, arguments: [node.name])
end
# @@foo ||= bar
@ -17,7 +17,7 @@ module YARP
#
# defined?(@@foo) ? @@foo : @@foo = bar
def visit_class_variable_or_write_node(node)
desugar_or_write_defined_node(node, ClassVariableReadNode, ClassVariableWriteNode)
desugar_or_write_defined_node(node, ClassVariableReadNode, ClassVariableWriteNode, arguments: [node.name])
end
# @@foo += bar
@ -26,7 +26,7 @@ module YARP
#
# @@foo = @@foo + bar
def visit_class_variable_operator_write_node(node)
desugar_operator_write_node(node, ClassVariableReadNode, ClassVariableWriteNode)
desugar_operator_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, arguments: [node.name])
end
# Foo &&= bar
@ -245,15 +245,15 @@ module YARP
end
# Don't desugar `x ||= y` to `defined?(x) ? x : x = y`
def desugar_or_write_defined_node(node, read_class, write_class)
def desugar_or_write_defined_node(node, read_class, write_class, arguments: [])
IfNode.new(
node.operator_loc,
DefinedNode.new(nil, read_class.new(node.name_loc), nil, node.operator_loc, node.name_loc),
StatementsNode.new([read_class.new(node.name_loc)], node.location),
DefinedNode.new(nil, read_class.new(*arguments, node.name_loc), nil, node.operator_loc, node.name_loc),
StatementsNode.new([read_class.new(*arguments, node.name_loc)], node.location),
ElseNode.new(
node.operator_loc,
StatementsNode.new(
[write_class.new(node.name_loc, node.value, node.operator_loc, node.location)],
[write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location)],
node.location
),
node.operator_loc,

Просмотреть файл

@ -910,7 +910,7 @@ ProgramNode(0...1194)(
),
DefNode(811...826)(
(821...822),
ClassVariableReadNode(815...820)(),
ClassVariableReadNode(815...820)(:@@var),
nil,
nil,
[],

Просмотреть файл

@ -941,7 +941,7 @@ ProgramNode(0...3743)(
"foo"
),
PinnedVariableNode(974...980)(
ClassVariableReadNode(975...980)(),
ClassVariableReadNode(975...980)(:@@bar),
(974...975)
),
(971...973)

Просмотреть файл

@ -502,7 +502,7 @@ ProgramNode(0...747)(
(633...634)
),
PinnedVariableNode(638...642)(
ClassVariableReadNode(639...642)(),
ClassVariableReadNode(639...642)(:@@c),
(638...639)
)],
nil,

Просмотреть файл

@ -20,7 +20,7 @@ ProgramNode(0...498)(
(122...123),
[EmbeddedVariableNode(123...129)(
(123...124),
ClassVariableReadNode(124...129)()
ClassVariableReadNode(124...129)(:@@foo)
)],
(129...130)
),

Просмотреть файл

@ -54,8 +54,8 @@ ProgramNode(0...704)(
(54...55)
),
MultiWriteNode(65...84)(
[ClassVariableTargetNode(66...69)(),
ClassVariableTargetNode(71...74)()],
[ClassVariableTargetNode(66...69)(:@@a),
ClassVariableTargetNode(71...74)(:@@b)],
(76...77),
ArrayNode(78...84)(
[IntegerNode(79...80)(), IntegerNode(82...83)()],
@ -291,6 +291,7 @@ ProgramNode(0...704)(
)
),
ClassVariableWriteNode(302...309)(
:@@a,
(302...305),
IntegerNode(308...309)(),
(306...307)

Просмотреть файл

@ -84,7 +84,7 @@ ProgramNode(0...299)(
[StringNode(167...168)(nil, (167...168), nil, "a"),
EmbeddedVariableNode(168...172)(
(168...169),
ClassVariableReadNode(169...172)()
ClassVariableReadNode(169...172)(:@@a)
)],
(172...173)
),

Просмотреть файл

@ -158,7 +158,7 @@ ProgramNode(0...916)(
StringNode(210...211)(nil, (210...211), nil, " "),
EmbeddedVariableNode(211...215)(
(211...212),
ClassVariableReadNode(212...215)()
ClassVariableReadNode(212...215)(:@@a)
),
StringNode(215...216)(nil, (215...216), nil, " "),
EmbeddedVariableNode(216...219)(

Просмотреть файл

@ -3,7 +3,7 @@ ProgramNode(0...66)(
StatementsNode(0...66)(
[CallNode(0...1)(nil, nil, (0...1), nil, nil, nil, nil, 2, "a"),
InstanceVariableReadNode(2...4)(:@a),
ClassVariableReadNode(5...8)(),
ClassVariableReadNode(5...8)(:@@a),
GlobalVariableReadNode(9...11)(),
NumberedReferenceReadNode(12...14)(),
BackReferenceReadNode(15...17)(),

Просмотреть файл

@ -246,7 +246,7 @@ ProgramNode(0...608)(
[StringNode(598...599)(nil, (598...599), nil, "a"),
EmbeddedVariableNode(599...603)(
(599...600),
ClassVariableReadNode(600...603)()
ClassVariableReadNode(600...603)(:@@a)
)],
(603...604)
),

Просмотреть файл

@ -1,21 +1,23 @@
ProgramNode(0...293)(
[:abc, :foo, :bar, :baz],
StatementsNode(0...293)(
[ClassVariableReadNode(0...5)(),
[ClassVariableReadNode(0...5)(:@@abc),
ClassVariableWriteNode(7...16)(
:@@abc,
(7...12),
IntegerNode(15...16)(),
(13...14)
),
MultiWriteNode(18...34)(
[ClassVariableTargetNode(18...23)(),
ClassVariableTargetNode(25...30)()],
[ClassVariableTargetNode(18...23)(:@@foo),
ClassVariableTargetNode(25...30)(:@@bar)],
(31...32),
IntegerNode(33...34)(),
nil,
nil
),
ClassVariableWriteNode(36...48)(
:@@foo,
(36...41),
ArrayNode(44...48)(
[IntegerNode(44...45)(), IntegerNode(47...48)()],

Просмотреть файл

@ -1 +1,4 @@
ProgramNode(0...5)([], StatementsNode(0...5)([ClassVariableReadNode(0...5)()]))
ProgramNode(0...5)(
[],
StatementsNode(0...5)([ClassVariableReadNode(0...5)(:@@foo)])
)

Просмотреть файл

@ -1,6 +1,11 @@
ProgramNode(0...10)(
[],
StatementsNode(0...10)(
[ClassVariableWriteNode(0...10)((0...5), IntegerNode(8...10)(), (6...7))]
[ClassVariableWriteNode(0...10)(
:@@var,
(0...5),
IntegerNode(8...10)(),
(6...7)
)]
)
)

Просмотреть файл

@ -52,7 +52,7 @@ ProgramNode(0...139)(
),
MultiWriteNode(47...65)(
[InstanceVariableTargetNode(47...51)(:@foo),
ClassVariableTargetNode(53...58)()],
ClassVariableTargetNode(53...58)(:@@bar)],
(59...60),
ArrayNode(61...65)(
[SplatNode(61...65)(

Просмотреть файл

@ -8,7 +8,10 @@ ProgramNode(0...14)(
InstanceVariableReadNode(2...4)(:@a)
),
StringNode(4...5)(nil, (4...5), nil, " "),
EmbeddedVariableNode(5...9)((5...6), ClassVariableReadNode(6...9)()),
EmbeddedVariableNode(5...9)(
(5...6),
ClassVariableReadNode(6...9)(:@@a)
),
StringNode(9...10)(nil, (9...10), nil, " "),
EmbeddedVariableNode(10...13)(
(10...11),

Просмотреть файл

@ -2,6 +2,7 @@ ProgramNode(0...53)(
[:a],
StatementsNode(0...53)(
[ClassVariableOperatorWriteNode(0...11)(
:@@var,
(0...5),
(6...8),
IntegerNode(9...11)(),
@ -28,6 +29,7 @@ ProgramNode(0...53)(
nil,
StatementsNode(37...48)(
[ClassVariableOperatorWriteNode(37...48)(
:@@var,
(37...42),
(43...45),
IntegerNode(46...48)(),

Просмотреть файл

@ -727,6 +727,8 @@ nodes:
^^^^^^^^^^^^^
- name: ClassVariableAndWriteNode
child_nodes:
- name: name
type: constant
- name: name_loc
type: location
- name: operator_loc
@ -740,6 +742,8 @@ nodes:
^^^^^^^^^^^^^^^^
- name: ClassVariableOperatorWriteNode
child_nodes:
- name: name
type: constant
- name: name_loc
type: location
- name: operator_loc
@ -755,6 +759,8 @@ nodes:
^^^^^^^^^^^^^^^^^
- name: ClassVariableOrWriteNode
child_nodes:
- name: name
type: constant
- name: name_loc
type: location
- name: operator_loc
@ -767,12 +773,18 @@ nodes:
@@target ||= value
^^^^^^^^^^^^^^^^^^
- name: ClassVariableReadNode
child_nodes:
- name: name
type: constant
comment: |
Represents referencing a class variable.
@@foo
^^^^^
- name: ClassVariableTargetNode
child_nodes:
- name: name
type: constant
comment: |
Represents writing to a class variable in a context that doesn't have an explicit value.
@ -780,6 +792,8 @@ nodes:
^^^^^ ^^^^^
- name: ClassVariableWriteNode
child_nodes:
- name: name
type: constant
- name: name_loc
type: location
- name: value

Просмотреть файл

@ -1558,8 +1558,7 @@ yp_class_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const y
// Allocate and initialize a new ClassVariableAndWriteNode node.
static yp_class_variable_and_write_node_t *
yp_class_variable_and_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) {
assert(YP_NODE_TYPE_P(target, YP_NODE_CLASS_VARIABLE_READ_NODE));
yp_class_variable_and_write_node_create(yp_parser_t *parser, yp_class_variable_read_node_t *target, const yp_token_t *operator, yp_node_t *value) {
assert(operator->type == YP_TOKEN_AMPERSAND_AMPERSAND_EQUAL);
yp_class_variable_and_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_and_write_node_t);
@ -1567,11 +1566,12 @@ yp_class_variable_and_write_node_create(yp_parser_t *parser, yp_node_t *target,
{
.type = YP_NODE_CLASS_VARIABLE_AND_WRITE_NODE,
.location = {
.start = target->location.start,
.start = target->base.location.start,
.end = value->location.end
}
},
.name_loc = target->location,
.name = target->name,
.name_loc = target->base.location,
.operator_loc = YP_LOCATION_TOKEN_VALUE(operator),
.value = value
};
@ -1581,18 +1581,19 @@ yp_class_variable_and_write_node_create(yp_parser_t *parser, yp_node_t *target,
// Allocate and initialize a new ClassVariableOperatorWriteNode node.
static yp_class_variable_operator_write_node_t *
yp_class_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) {
yp_class_variable_operator_write_node_create(yp_parser_t *parser, yp_class_variable_read_node_t *target, const yp_token_t *operator, yp_node_t *value) {
yp_class_variable_operator_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_operator_write_node_t);
*node = (yp_class_variable_operator_write_node_t) {
{
.type = YP_NODE_CLASS_VARIABLE_OPERATOR_WRITE_NODE,
.location = {
.start = target->location.start,
.start = target->base.location.start,
.end = value->location.end
}
},
.name_loc = target->location,
.name = target->name,
.name_loc = target->base.location,
.operator_loc = YP_LOCATION_TOKEN_VALUE(operator),
.value = value,
.operator = yp_parser_constant_id_location(parser, operator->start, operator->end - 1)
@ -1603,8 +1604,7 @@ yp_class_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *tar
// Allocate and initialize a new ClassVariableOrWriteNode node.
static yp_class_variable_or_write_node_t *
yp_class_variable_or_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) {
assert(YP_NODE_TYPE_P(target, YP_NODE_CLASS_VARIABLE_READ_NODE));
yp_class_variable_or_write_node_create(yp_parser_t *parser, yp_class_variable_read_node_t *target, const yp_token_t *operator, yp_node_t *value) {
assert(operator->type == YP_TOKEN_PIPE_PIPE_EQUAL);
yp_class_variable_or_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_or_write_node_t);
@ -1612,11 +1612,12 @@ yp_class_variable_or_write_node_create(yp_parser_t *parser, yp_node_t *target, c
{
.type = YP_NODE_CLASS_VARIABLE_OR_WRITE_NODE,
.location = {
.start = target->location.start,
.start = target->base.location.start,
.end = value->location.end
}
},
.name_loc = target->location,
.name = target->name,
.name_loc = target->base.location,
.operator_loc = YP_LOCATION_TOKEN_VALUE(operator),
.value = value
};
@ -1629,13 +1630,21 @@ static yp_class_variable_read_node_t *
yp_class_variable_read_node_create(yp_parser_t *parser, const yp_token_t *token) {
assert(token->type == YP_TOKEN_CLASS_VARIABLE);
yp_class_variable_read_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_read_node_t);
*node = (yp_class_variable_read_node_t) {{ .type = YP_NODE_CLASS_VARIABLE_READ_NODE, .location = YP_LOCATION_TOKEN_VALUE(token) }};
*node = (yp_class_variable_read_node_t) {
{
.type = YP_NODE_CLASS_VARIABLE_READ_NODE,
.location = YP_LOCATION_TOKEN_VALUE(token)
},
.name = yp_parser_constant_id_location(parser, token->start, token->end)
};
return node;
}
// Initialize a new ClassVariableWriteNode node from a ClassVariableRead node.
static yp_class_variable_write_node_t *
yp_class_variable_read_node_to_class_variable_write_node(yp_parser_t *parser, yp_class_variable_read_node_t *read_node, yp_token_t *operator, yp_node_t *value) {
yp_class_variable_write_node_create(yp_parser_t *parser, yp_class_variable_read_node_t *read_node, yp_token_t *operator, yp_node_t *value) {
yp_class_variable_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_write_node_t);
*node = (yp_class_variable_write_node_t) {
@ -1646,6 +1655,7 @@ yp_class_variable_read_node_to_class_variable_write_node(yp_parser_t *parser, yp
.end = value->location.end
},
},
.name = read_node->name,
.name_loc = YP_LOCATION_NODE_VALUE((yp_node_t *) read_node),
.operator_loc = YP_OPTIONAL_LOCATION_TOKEN_VALUE(operator),
.value = value
@ -8007,7 +8017,7 @@ parse_write(yp_parser_t *parser, yp_node_t *target, yp_token_t *operator, yp_nod
case YP_NODE_MISSING_NODE:
return target;
case YP_NODE_CLASS_VARIABLE_READ_NODE: {
yp_class_variable_write_node_t *write_node = yp_class_variable_read_node_to_class_variable_write_node(parser, (yp_class_variable_read_node_t *) target, operator, value);
yp_class_variable_write_node_t *write_node = yp_class_variable_write_node_create(parser, (yp_class_variable_read_node_t *) target, operator, value);
yp_node_destroy(parser, target);
return (yp_node_t *) write_node;
}
@ -12837,7 +12847,7 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t
parser_lex(parser);
yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after &&=");
yp_node_t *result = (yp_node_t *) yp_class_variable_and_write_node_create(parser, node, &token, value);
yp_node_t *result = (yp_node_t *) yp_class_variable_and_write_node_create(parser, (yp_class_variable_read_node_t *) node, &token, value);
yp_node_destroy(parser, node);
return result;
@ -12938,7 +12948,7 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t
parser_lex(parser);
yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after ||=");
yp_node_t *result = (yp_node_t *) yp_class_variable_or_write_node_create(parser, node, &token, value);
yp_node_t *result = (yp_node_t *) yp_class_variable_or_write_node_create(parser, (yp_class_variable_read_node_t *) node, &token, value);
yp_node_destroy(parser, node);
return result;
@ -13049,7 +13059,7 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t
parser_lex(parser);
yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after the operator.");
yp_node_t *result = (yp_node_t *) yp_class_variable_operator_write_node_create(parser, node, &token, value);
yp_node_t *result = (yp_node_t *) yp_class_variable_operator_write_node_create(parser, (yp_class_variable_read_node_t *) node, &token, value);
yp_node_destroy(parser, node);
return result;