static HRESULT compile_statement(compile_ctx_t *ctx, statement_ctx_t *stat_ctx, statement_t *stat) { HRESULT hres; if(stat_ctx) { stat_ctx->next = ctx->stat_ctx; ctx->stat_ctx = stat_ctx; } while(stat) { switch(stat->type) { case STAT_ASSIGN: hres = compile_assign_statement(ctx, (assign_statement_t*)stat, FALSE); break; case STAT_CALL: hres = compile_call_statement(ctx, (call_statement_t*)stat); break; case STAT_CONST: hres = compile_const_statement(ctx, (const_statement_t*)stat); break; case STAT_DIM: hres = compile_dim_statement(ctx, (dim_statement_t*)stat); break; case STAT_DOWHILE: case STAT_DOUNTIL: hres = compile_dowhile_statement(ctx, (while_statement_t*)stat); break; case STAT_EXITDO: hres = compile_exitdo_statement(ctx); break; case STAT_EXITFOR: hres = compile_exitfor_statement(ctx); break; case STAT_EXITFUNC: hres = compile_exitfunc_statement(ctx); break; case STAT_EXITPROP: hres = compile_exitprop_statement(ctx); break; case STAT_EXITSUB: hres = compile_exitsub_statement(ctx); break; case STAT_FOREACH: hres = compile_foreach_statement(ctx, (foreach_statement_t*)stat); break; case STAT_FORTO: hres = compile_forto_statement(ctx, (forto_statement_t*)stat); break; case STAT_FUNC: hres = compile_function_statement(ctx, (function_statement_t*)stat); break; case STAT_IF: hres = compile_if_statement(ctx, (if_statement_t*)stat); break; case STAT_ONERROR: hres = compile_onerror_statement(ctx, (onerror_statement_t*)stat); break; case STAT_SELECT: hres = compile_select_statement(ctx, (select_statement_t*)stat); break; case STAT_SET: hres = compile_assign_statement(ctx, (assign_statement_t*)stat, TRUE); break; case STAT_STOP: hres = push_instr(ctx, OP_stop) ? S_OK : E_OUTOFMEMORY; break; case STAT_UNTIL: case STAT_WHILE: case STAT_WHILELOOP: hres = compile_while_statement(ctx, (while_statement_t*)stat); break; default: FIXME("Unimplemented statement type %d\n", stat->type); hres = E_NOTIMPL; } if(FAILED(hres)) return hres; stat = stat->next; } if(stat_ctx) { assert(ctx->stat_ctx == stat_ctx); ctx->stat_ctx = stat_ctx->next; } return S_OK; }
static HRESULT compile_statement(compile_ctx_t *ctx, statement_t *stat) { HRESULT hres; while(stat) { switch(stat->type) { case STAT_ASSIGN: hres = compile_assign_statement(ctx, (assign_statement_t*)stat, FALSE); break; case STAT_CALL: hres = compile_member_expression(ctx, ((call_statement_t*)stat)->expr, FALSE); break; case STAT_DIM: hres = compile_dim_statement(ctx, (dim_statement_t*)stat); break; case STAT_DOWHILE: case STAT_DOUNTIL: hres = compile_dowhile_statement(ctx, (while_statement_t*)stat); break; case STAT_EXITDO: hres = compile_exitdo_statement(ctx); break; case STAT_EXITFUNC: hres = compile_exitfunc_statement(ctx); break; case STAT_EXITPROP: hres = compile_exitprop_statement(ctx); break; case STAT_EXITSUB: hres = compile_exitsub_statement(ctx); break; case STAT_FUNC: hres = compile_function_statement(ctx, (function_statement_t*)stat); break; case STAT_IF: hres = compile_if_statement(ctx, (if_statement_t*)stat); break; case STAT_ONERROR: hres = compile_onerror_statement(ctx, (onerror_statement_t*)stat); break; case STAT_SET: hres = compile_assign_statement(ctx, (assign_statement_t*)stat, TRUE); break; case STAT_STOP: hres = push_instr(ctx, OP_stop) == -1 ? E_OUTOFMEMORY : S_OK; break; case STAT_UNTIL: case STAT_WHILE: case STAT_WHILELOOP: hres = compile_while_statement(ctx, (while_statement_t*)stat); break; default: FIXME("Unimplemented statement type %d\n", stat->type); hres = E_NOTIMPL; } if(FAILED(hres)) return hres; stat = stat->next; } return S_OK; }
static HRESULT compile_statement(compiler_ctx_t *ctx, statement_ctx_t *stat_ctx, statement_t *stat) { HRESULT hres; if(stat_ctx) { stat_ctx->next = ctx->stat_ctx; ctx->stat_ctx = stat_ctx; } switch(stat->type) { case STAT_BLOCK: hres = compile_block_statement(ctx, ((block_statement_t*)stat)->stat_list); break; case STAT_BREAK: hres = compile_break_statement(ctx, (branch_statement_t*)stat); break; case STAT_CONTINUE: hres = compile_continue_statement(ctx, (branch_statement_t*)stat); break; case STAT_EMPTY: hres = push_instr(ctx, OP_undefined) ? S_OK : E_OUTOFMEMORY; /* FIXME */ break; case STAT_EXPR: hres = compile_expression_statement(ctx, (expression_statement_t*)stat); break; case STAT_FOR: hres = compile_for_statement(ctx, (for_statement_t*)stat); break; case STAT_FORIN: hres = compile_forin_statement(ctx, (forin_statement_t*)stat); break; case STAT_IF: hres = compile_if_statement(ctx, (if_statement_t*)stat); break; case STAT_LABEL: hres = push_instr(ctx, OP_label) ? S_OK : E_OUTOFMEMORY; /* FIXME */ break; case STAT_RETURN: hres = compile_return_statement(ctx, (expression_statement_t*)stat); break; case STAT_SWITCH: hres = compile_switch_statement(ctx, (switch_statement_t*)stat); break; case STAT_THROW: hres = compile_throw_statement(ctx, (expression_statement_t*)stat); break; case STAT_TRY: hres = compile_try_statement(ctx, (try_statement_t*)stat); break; case STAT_VAR: hres = compile_var_statement(ctx, (var_statement_t*)stat); break; case STAT_WHILE: hres = compile_while_statement(ctx, (while_statement_t*)stat); break; case STAT_WITH: hres = compile_with_statement(ctx, (with_statement_t*)stat); break; default: assert(0); } if(stat_ctx) { assert(ctx->stat_ctx == stat_ctx); ctx->stat_ctx = stat_ctx->next; } return hres; }