mirror of
https://github.com/ruby/ruby.git
synced 2025-08-27 06:56:13 +02:00

This commit completely restructures how we handle parameters. The motivation for this commit was the fix compilation of MultiTargetNodes within parameters, including nested MultiTargetNodes. A subsequent commit will actually do the compilation for the MultiTargetNodes. This commit's main accomplishment is restructuring the locals table and how we account for it on the ScopeNode, specifically with regards to hidden variables. It has multiple steps, all commented within the code, to calculate the locals table correctly and compile the parameters: - Step 1: Caculate the table size for the locals - Step 2: Populate iv index table and local table - Step 3: Fill in parameter names of MultiTargetNodes on local table - Step 4: Fill in method body locals on local table - Step 5: Compile any locals
28 lines
940 B
C
28 lines
940 B
C
#include "prism/prism.h"
|
|
|
|
// ScopeNodes are helper nodes, and will never be part of the AST. We manually
|
|
// declare them here to avoid generating them.
|
|
typedef struct pm_scope_node {
|
|
pm_node_t base;
|
|
struct pm_scope_node *previous;
|
|
pm_node_t *ast_node;
|
|
pm_node_t *parameters;
|
|
pm_node_t *body;
|
|
pm_constant_id_list_t locals;
|
|
pm_parser_t *parser;
|
|
|
|
// The size of the local table
|
|
// on the iseq which includes
|
|
// locals and hidden variables
|
|
int local_table_for_iseq_size;
|
|
|
|
ID *constants;
|
|
st_table *index_lookup_table;
|
|
|
|
// Some locals are defined at higher scopes than they are used. We can use
|
|
// this offset to control which parent scopes local table we should be
|
|
// referencing from the current scope.
|
|
unsigned int local_depth_offset;
|
|
} pm_scope_node_t;
|
|
|
|
void pm_scope_node_init(const pm_node_t *node, pm_scope_node_t *scope, pm_scope_node_t *previous, pm_parser_t *parser);
|