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(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; }