Commit 474f1152 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

jscript: Moved collecting variable declarations from parser to compiler.

parent b866c7f5
...@@ -53,6 +53,9 @@ typedef struct { ...@@ -53,6 +53,9 @@ typedef struct {
statement_ctx_t *stat_ctx; statement_ctx_t *stat_ctx;
function_code_t *func; function_code_t *func;
variable_declaration_t *var_head;
variable_declaration_t *var_tail;
} compiler_ctx_t; } compiler_ctx_t;
static const struct { static const struct {
...@@ -988,7 +991,19 @@ static HRESULT compile_variable_list(compiler_ctx_t *ctx, variable_declaration_t ...@@ -988,7 +991,19 @@ static HRESULT compile_variable_list(compiler_ctx_t *ctx, variable_declaration_t
variable_declaration_t *iter; variable_declaration_t *iter;
HRESULT hres; HRESULT hres;
assert(list != NULL);
if(ctx->var_tail)
ctx->var_tail->global_next = list;
else
ctx->var_head = list;
for(iter = list; iter; iter = iter->next) { for(iter = list; iter; iter = iter->next) {
ctx->func->var_cnt++;
iter->global_next = iter->next;
if(!iter->next)
ctx->var_tail = iter;
if(!iter->expr) if(!iter->expr)
continue; continue;
...@@ -1771,13 +1786,15 @@ static HRESULT init_code(compiler_ctx_t *compiler, const WCHAR *source) ...@@ -1771,13 +1786,15 @@ static HRESULT init_code(compiler_ctx_t *compiler, const WCHAR *source)
static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source, function_expression_t *func_expr, static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source, function_expression_t *func_expr,
BOOL from_eval, function_code_t *func) BOOL from_eval, function_code_t *func)
{ {
variable_declaration_t *var_iter;
function_declaration_t *iter; function_declaration_t *iter;
var_list_t *var_iter;
unsigned off, i; unsigned off, i;
HRESULT hres; HRESULT hres;
TRACE("\n"); TRACE("\n");
ctx->var_head = ctx->var_tail = NULL;
off = ctx->code_off; off = ctx->code_off;
ctx->func = func; ctx->func = func;
hres = compile_block_statement(ctx, source->statement); hres = compile_block_statement(ctx, source->statement);
...@@ -1822,6 +1839,18 @@ static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source, ...@@ -1822,6 +1839,18 @@ static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source,
} }
} }
func->variables = compiler_alloc(ctx->code, func->var_cnt * sizeof(*func->variables));
if(!func->variables)
return E_OUTOFMEMORY;
for(var_iter = ctx->var_head, i=0; var_iter; var_iter = var_iter->global_next, i++) {
func->variables[i] = compiler_alloc_bstr(ctx, var_iter->identifier);
if(!func->variables[i])
return E_OUTOFMEMORY;
}
assert(i == func->var_cnt);
func->funcs = compiler_alloc(ctx->code, func->func_cnt * sizeof(*func->funcs)); func->funcs = compiler_alloc(ctx->code, func->func_cnt * sizeof(*func->funcs));
if(!func->funcs) if(!func->funcs)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
...@@ -1835,19 +1864,6 @@ static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source, ...@@ -1835,19 +1864,6 @@ static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source,
assert(i == func->func_cnt); assert(i == func->func_cnt);
for(var_iter = source->variables; var_iter; var_iter = var_iter->next)
func->var_cnt++;
func->variables = compiler_alloc(ctx->code, func->var_cnt * sizeof(*func->variables));
if(!func->variables)
return E_OUTOFMEMORY;
for(var_iter = source->variables, i=0; var_iter; var_iter = var_iter->next, i++) {
func->variables[i] = compiler_alloc_bstr(ctx, var_iter->identifier);
if(!func->variables[i])
return E_OUTOFMEMORY;
}
return S_OK; return S_OK;
} }
......
...@@ -27,17 +27,9 @@ typedef struct _function_declaration_t { ...@@ -27,17 +27,9 @@ typedef struct _function_declaration_t {
struct _function_declaration_t *next; struct _function_declaration_t *next;
} function_declaration_t; } function_declaration_t;
typedef struct _var_list_t {
const WCHAR *identifier;
struct _var_list_t *next;
} var_list_t;
typedef struct _func_stack { typedef struct _func_stack {
function_declaration_t *func_head; function_declaration_t *func_head;
function_declaration_t *func_tail; function_declaration_t *func_tail;
var_list_t *var_head;
var_list_t *var_tail;
struct _func_stack *next; struct _func_stack *next;
} func_stack_t; } func_stack_t;
...@@ -302,6 +294,7 @@ typedef struct _variable_declaration_t { ...@@ -302,6 +294,7 @@ typedef struct _variable_declaration_t {
expression_t *expr; expression_t *expr;
struct _variable_declaration_t *next; struct _variable_declaration_t *next;
struct _variable_declaration_t *global_next; /* for compiler */
} variable_declaration_t; } variable_declaration_t;
typedef enum { typedef enum {
...@@ -505,7 +498,6 @@ struct _source_elements_t { ...@@ -505,7 +498,6 @@ struct _source_elements_t {
statement_t *statement; statement_t *statement;
statement_t *statement_tail; statement_t *statement_tail;
function_declaration_t *functions; function_declaration_t *functions;
var_list_t *variables;
}; };
struct _function_expression_t { struct _function_expression_t {
......
...@@ -1051,19 +1051,11 @@ static statement_t *new_block_statement(parser_ctx_t *ctx, statement_list_t *lis ...@@ -1051,19 +1051,11 @@ static statement_t *new_block_statement(parser_ctx_t *ctx, statement_list_t *lis
static variable_declaration_t *new_variable_declaration(parser_ctx_t *ctx, const WCHAR *identifier, expression_t *expr) static variable_declaration_t *new_variable_declaration(parser_ctx_t *ctx, const WCHAR *identifier, expression_t *expr)
{ {
variable_declaration_t *ret = parser_alloc(ctx, sizeof(variable_declaration_t)); variable_declaration_t *ret = parser_alloc(ctx, sizeof(variable_declaration_t));
var_list_t *var_list = parser_alloc(ctx, sizeof(var_list_t));
ret->identifier = identifier; ret->identifier = identifier;
ret->expr = expr; ret->expr = expr;
ret->next = NULL; ret->next = NULL;
ret->global_next = NULL;
var_list->identifier = identifier;
var_list->next = NULL;
if(ctx->func_stack->var_tail)
ctx->func_stack->var_tail = ctx->func_stack->var_tail->next = var_list;
else
ctx->func_stack->var_head = ctx->func_stack->var_tail = var_list;
return ret; return ret;
} }
...@@ -1503,7 +1495,6 @@ static void push_func(parser_ctx_t *ctx) ...@@ -1503,7 +1495,6 @@ static void push_func(parser_ctx_t *ctx)
func_stack_t *new_func = parser_alloc_tmp(ctx, sizeof(func_stack_t)); func_stack_t *new_func = parser_alloc_tmp(ctx, sizeof(func_stack_t));
new_func->func_head = new_func->func_tail = NULL; new_func->func_head = new_func->func_tail = NULL;
new_func->var_head = new_func->var_tail = NULL;
new_func->next = ctx->func_stack; new_func->next = ctx->func_stack;
ctx->func_stack = new_func; ctx->func_stack = new_func;
...@@ -1512,7 +1503,6 @@ static void push_func(parser_ctx_t *ctx) ...@@ -1512,7 +1503,6 @@ static void push_func(parser_ctx_t *ctx)
static source_elements_t *function_body_parsed(parser_ctx_t *ctx, source_elements_t *source) static source_elements_t *function_body_parsed(parser_ctx_t *ctx, source_elements_t *source)
{ {
source->functions = ctx->func_stack->func_head; source->functions = ctx->func_stack->func_head;
source->variables = ctx->func_stack->var_head;
pop_func(ctx); pop_func(ctx);
return source; return source;
...@@ -1521,7 +1511,6 @@ static source_elements_t *function_body_parsed(parser_ctx_t *ctx, source_element ...@@ -1521,7 +1511,6 @@ static source_elements_t *function_body_parsed(parser_ctx_t *ctx, source_element
static void program_parsed(parser_ctx_t *ctx, source_elements_t *source) static void program_parsed(parser_ctx_t *ctx, source_elements_t *source)
{ {
source->functions = ctx->func_stack->func_head; source->functions = ctx->func_stack->func_head;
source->variables = ctx->func_stack->var_head;
pop_func(ctx); pop_func(ctx);
ctx->source = source; ctx->source = source;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment