зеркало из https://github.com/github/ruby.git
[ruby/yarp] A couple small stylistic updates for yp_scope_node
* Ensure the node gets initialized in case of failure with no assertions * Include lambda and top-level nodes for scopes * Small indentation fixes https://github.com/ruby/yarp/commit/be29e07391
This commit is contained in:
Родитель
90ff30e51e
Коммит
90048241ca
|
@ -118,7 +118,7 @@ yp_node_memsize_node(yp_node_t *node, yp_memsize_t *memsize) {
|
||||||
// We do not calculate memsize of a ScopeNode
|
// We do not calculate memsize of a ScopeNode
|
||||||
// as it should never be generated
|
// as it should never be generated
|
||||||
case YP_NODE_SCOPE_NODE:
|
case YP_NODE_SCOPE_NODE:
|
||||||
return;
|
return;
|
||||||
<%- nodes.each do |node| -%>
|
<%- nodes.each do |node| -%>
|
||||||
#line <%= __LINE__ + 1 %> "<%= File.basename(__FILE__) %>"
|
#line <%= __LINE__ + 1 %> "<%= File.basename(__FILE__) %>"
|
||||||
case <%= node.type %>: {
|
case <%= node.type %>: {
|
||||||
|
|
|
@ -19,7 +19,7 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
||||||
// We do not need to print a ScopeNode as it's not part
|
// We do not need to print a ScopeNode as it's not part
|
||||||
// of the AST
|
// of the AST
|
||||||
case YP_NODE_SCOPE_NODE:
|
case YP_NODE_SCOPE_NODE:
|
||||||
return;
|
return;
|
||||||
<%- nodes.each do |node| -%>
|
<%- nodes.each do |node| -%>
|
||||||
case <%= node.type %>: {
|
case <%= node.type %>: {
|
||||||
yp_buffer_append_str(buffer, "<%= node.name %>(", <%= node.name.length + 1 %>);
|
yp_buffer_append_str(buffer, "<%= node.name %>(", <%= node.name.length + 1 %>);
|
||||||
|
|
136
yarp/yarp.c
136
yarp/yarp.c
|
@ -536,6 +536,73 @@ yp_arguments_validate(yp_parser_t *parser, yp_arguments_t *arguments) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
/* Scope node functions */
|
||||||
|
/******************************************************************************/
|
||||||
|
|
||||||
|
// Generate a scope node from the given node.
|
||||||
|
void
|
||||||
|
yp_scope_node_init(yp_node_t *node, yp_scope_node_t *scope) {
|
||||||
|
scope->base.type = YP_NODE_SCOPE_NODE;
|
||||||
|
scope->base.location.start = node->location.start;
|
||||||
|
scope->base.location.end = node->location.end;
|
||||||
|
|
||||||
|
scope->parameters = NULL;
|
||||||
|
scope->body = NULL;
|
||||||
|
yp_constant_id_list_init(&scope->locals);
|
||||||
|
|
||||||
|
switch (YP_NODE_TYPE(node)) {
|
||||||
|
case YP_NODE_BLOCK_NODE: {
|
||||||
|
yp_block_node_t *cast = (yp_block_node_t *) node;
|
||||||
|
if (cast->parameters) scope->parameters = cast->parameters->parameters;
|
||||||
|
scope->body = cast->body;
|
||||||
|
scope->locals = cast->locals;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case YP_NODE_CLASS_NODE: {
|
||||||
|
yp_class_node_t *cast = (yp_class_node_t *) node;
|
||||||
|
scope->body = cast->body;
|
||||||
|
scope->locals = cast->locals;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case YP_NODE_DEF_NODE: {
|
||||||
|
yp_def_node_t *cast = (yp_def_node_t *) node;
|
||||||
|
scope->parameters = cast->parameters;
|
||||||
|
scope->body = cast->body;
|
||||||
|
scope->locals = cast->locals;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case YP_NODE_LAMBDA_NODE: {
|
||||||
|
yp_lambda_node_t *cast = (yp_lambda_node_t *) node;
|
||||||
|
if (cast->parameters) scope->parameters = cast->parameters->parameters;
|
||||||
|
scope->body = cast->body;
|
||||||
|
scope->locals = cast->locals;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case YP_NODE_MODULE_NODE: {
|
||||||
|
yp_module_node_t *cast = (yp_module_node_t *) node;
|
||||||
|
scope->body = cast->body;
|
||||||
|
scope->locals = cast->locals;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case YP_NODE_PROGRAM_NODE: {
|
||||||
|
yp_program_node_t *cast = (yp_program_node_t *) node;
|
||||||
|
scope->body = (yp_node_t *) cast->statements;
|
||||||
|
scope->locals = cast->locals;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case YP_NODE_SINGLETON_CLASS_NODE: {
|
||||||
|
yp_singleton_class_node_t *cast = (yp_singleton_class_node_t *) node;
|
||||||
|
scope->body = cast->body;
|
||||||
|
scope->locals = cast->locals;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
assert(false && "unreachable");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* Node creation functions */
|
/* Node creation functions */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
@ -1016,75 +1083,6 @@ yp_block_argument_node_create(yp_parser_t *parser, const yp_token_t *operator, y
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
yp_scope_node_create(yp_parameters_node_t *parameters, yp_node_t *body, yp_constant_id_list_t locals, const char *start, const char *end, yp_scope_node_t *dest)
|
|
||||||
{
|
|
||||||
*dest = (yp_scope_node_t) {
|
|
||||||
{
|
|
||||||
.type = YP_NODE_SCOPE_NODE,
|
|
||||||
.location = { .start = start, .end = end },
|
|
||||||
},
|
|
||||||
.parameters = parameters,
|
|
||||||
.body = body,
|
|
||||||
.locals = locals,
|
|
||||||
};
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Implement this for all other nodes which can have a scope
|
|
||||||
void
|
|
||||||
yp_scope_node_init(yp_node_t *node, yp_scope_node_t *dest) {
|
|
||||||
yp_parameters_node_t *parameters = NULL;
|
|
||||||
yp_node_t *body;
|
|
||||||
yp_constant_id_list_t locals;
|
|
||||||
const char *start = node->location.start;
|
|
||||||
const char *end = node->location.end;
|
|
||||||
|
|
||||||
switch (node->type) {
|
|
||||||
case YP_NODE_BLOCK_NODE: {
|
|
||||||
yp_block_node_t *block_node = (yp_block_node_t *) node;
|
|
||||||
body = block_node->body;
|
|
||||||
locals = block_node->locals;
|
|
||||||
if (block_node->parameters) {
|
|
||||||
parameters = block_node->parameters->parameters;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case YP_NODE_CLASS_NODE: {
|
|
||||||
yp_class_node_t *class_node = (yp_class_node_t *) node;
|
|
||||||
body = class_node->body;
|
|
||||||
locals = class_node->locals;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case YP_NODE_DEF_NODE: {
|
|
||||||
yp_def_node_t *def_node = (yp_def_node_t *) node;
|
|
||||||
parameters = def_node->parameters;
|
|
||||||
body = def_node->body;
|
|
||||||
locals = def_node->locals;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case YP_NODE_MODULE_NODE: {
|
|
||||||
yp_module_node_t *module_node = (yp_module_node_t *) node;
|
|
||||||
body = module_node->body;
|
|
||||||
locals = module_node->locals;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case YP_NODE_SINGLETON_CLASS_NODE: {
|
|
||||||
yp_singleton_class_node_t *singleton_class_node = (yp_singleton_class_node_t *) node;
|
|
||||||
body = singleton_class_node->body;
|
|
||||||
locals = singleton_class_node->locals;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
assert(false && "unreachable");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
yp_scope_node_create(parameters, body, locals, start, end, dest);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allocate and initialize a new BlockNode node.
|
// Allocate and initialize a new BlockNode node.
|
||||||
static yp_block_node_t *
|
static yp_block_node_t *
|
||||||
yp_block_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const yp_token_t *opening, yp_block_parameters_node_t *parameters, yp_node_t *body, const yp_token_t *closing) {
|
yp_block_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const yp_token_t *opening, yp_block_parameters_node_t *parameters, yp_node_t *body, const yp_token_t *closing) {
|
||||||
|
|
|
@ -30,7 +30,7 @@ void yp_serialize_content(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buf
|
||||||
|
|
||||||
void yp_print_node(yp_parser_t *parser, yp_node_t *node);
|
void yp_print_node(yp_parser_t *parser, yp_node_t *node);
|
||||||
|
|
||||||
// Generate a scope node for a DefNode and ClassNode
|
// Generate a scope node from the given node.
|
||||||
void yp_scope_node_init(yp_node_t *node, yp_scope_node_t *dest);
|
void yp_scope_node_init(yp_node_t *node, yp_scope_node_t *dest);
|
||||||
|
|
||||||
// The YARP version and the serialization format.
|
// The YARP version and the serialization format.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче