diff --git a/dlls/jscript/compile.c b/dlls/jscript/compile.c index dc6f0994d80..40ad7820415 100644 --- a/dlls/jscript/compile.c +++ b/dlls/jscript/compile.c @@ -40,7 +40,7 @@ typedef struct _statement_ctx_t { struct _statement_ctx_t *next; } statement_ctx_t; -struct _compiler_ctx_t { +typedef struct { parser_ctx_t *parser; bytecode_t *code; @@ -52,7 +52,7 @@ struct _compiler_ctx_t { unsigned labels_cnt; statement_ctx_t *stat_ctx; -}; +} compiler_ctx_t; static const struct { const char *op_str; @@ -1703,44 +1703,22 @@ void release_bytecode(bytecode_t *code) heap_free(code); } -void release_compiler(compiler_ctx_t *ctx) +static HRESULT init_code(compiler_ctx_t *compiler) { - heap_free(ctx); -} - -static HRESULT init_compiler(parser_ctx_t *parser) -{ - compiler_ctx_t *compiler; - - if(parser->compiler) - return S_OK; - - compiler = heap_alloc_zero(sizeof(*compiler)); - if(!compiler) - return E_OUTOFMEMORY; - compiler->code = heap_alloc_zero(sizeof(bytecode_t)); - if(!compiler->code) { - release_compiler(compiler); + if(!compiler->code) return E_OUTOFMEMORY; - } jsheap_init(&compiler->code->heap); compiler->code->instrs = heap_alloc(64 * sizeof(instr_t)); if(!compiler->code->instrs) { release_bytecode(compiler->code); - release_compiler(compiler); return E_OUTOFMEMORY; } compiler->code_size = 64; compiler->code_off = 1; - - compiler->parser = parser; - - parser->code = compiler->code; - parser->compiler = compiler; return S_OK; } @@ -1781,21 +1759,26 @@ static HRESULT compile_function(compiler_ctx_t *ctx, source_elements_t *source, HRESULT compile_script(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimiter, BOOL from_eval, parser_ctx_t **ret) { - parser_ctx_t *parser; + compiler_ctx_t compiler = {0}; HRESULT hres; - hres = script_parse(ctx, code, delimiter, from_eval, &parser); + hres = script_parse(ctx, code, delimiter, from_eval, &compiler.parser); if(FAILED(hres)) return hres; - hres = init_compiler(parser); - if(SUCCEEDED(hres)) - hres = compile_function(parser->compiler, parser->source, from_eval); + hres = init_code(&compiler); + if(SUCCEEDED(hres)) { + hres = compile_function(&compiler, compiler.parser->source, from_eval); + if(FAILED(hres)) + release_bytecode(compiler.code); + } + if(FAILED(hres)) { - parser_release(parser); + parser_release(compiler.parser); return hres; } - *ret = parser; + compiler.parser->code = compiler.code; + *ret = compiler.parser; return S_OK; } diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h index 73553b6bf81..1c4f49a353e 100644 --- a/dlls/jscript/engine.h +++ b/dlls/jscript/engine.h @@ -160,10 +160,6 @@ typedef struct { void release_bytecode(bytecode_t*); -typedef struct _compiler_ctx_t compiler_ctx_t; - -void release_compiler(compiler_ctx_t*); - typedef struct _parser_ctx_t { LONG ref; @@ -183,7 +179,6 @@ typedef struct _parser_ctx_t { func_stack_t *func_stack; bytecode_t *code; - compiler_ctx_t *compiler; struct _parser_ctx_t *next; } parser_ctx_t; diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y index 66b547635e1..41a99c40ced 100644 --- a/dlls/jscript/parser.y +++ b/dlls/jscript/parser.y @@ -1537,8 +1537,6 @@ void parser_release(parser_ctx_t *ctx) if(ctx->code) release_bytecode(ctx->code); - if(ctx->compiler) - release_compiler(ctx->compiler); script_release(ctx->script); heap_free(ctx->begin); jsheap_free(&ctx->heap);