// Return FALSE when compilation has finished bool compiler::compile_token(const std::string& s, parser& p) { if ( s.empty() ) { m.load_halt(); resolve_forwards(); return false; } else if ( ishalt(s) ) m.load_halt(); else if ( iscomment(s) ) p.skip_line(); else if ( isliteral(s) ) compile_literal(s); else if ( islabel(s) ) m.addlabel(s.c_str(), m.pos()); else { Op op = tok2op(s); if ( op == NOP_END ) error("Unknown operation: " + s); m.load(op); } return true; }
static HRESULT compile_expression_noret(compiler_ctx_t *ctx, expression_t *expr, BOOL *no_ret) { switch(expr->type) { case EXPR_ADD: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_add); case EXPR_AND: return compile_logical_expression(ctx, (binary_expression_t*)expr, OP_cnd_z); case EXPR_ARRAY: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_array); case EXPR_ARRAYLIT: return compile_array_literal(ctx, (array_literal_expression_t*)expr); case EXPR_ASSIGN: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_LAST); case EXPR_ASSIGNADD: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_add); case EXPR_ASSIGNAND: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_and); case EXPR_ASSIGNSUB: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_sub); case EXPR_ASSIGNMUL: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_mul); case EXPR_ASSIGNDIV: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_div); case EXPR_ASSIGNMOD: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_mod); case EXPR_ASSIGNOR: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_or); case EXPR_ASSIGNLSHIFT: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_lshift); case EXPR_ASSIGNRSHIFT: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_rshift); case EXPR_ASSIGNRRSHIFT: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_rshift2); case EXPR_ASSIGNXOR: return compile_assign_expression(ctx, (binary_expression_t*)expr, OP_xor); case EXPR_BAND: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_and); case EXPR_BITNEG: return compile_unary_expression(ctx, (unary_expression_t*)expr, OP_bneg); case EXPR_BOR: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_or); case EXPR_CALL: return compile_call_expression(ctx, (call_expression_t*)expr, no_ret); case EXPR_COMMA: return compile_comma_expression(ctx, (binary_expression_t*)expr); case EXPR_COND: return compile_conditional_expression(ctx, (conditional_expression_t*)expr); case EXPR_DELETE: return compile_delete_expression(ctx, (unary_expression_t*)expr); case EXPR_DIV: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_div); case EXPR_EQ: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_eq); case EXPR_EQEQ: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_eq2); case EXPR_FUNC: return compile_function_expression(ctx, (function_expression_t*)expr); case EXPR_GREATER: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_gt); case EXPR_GREATEREQ: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_gteq); case EXPR_IDENT: return push_instr_bstr(ctx, OP_ident, ((identifier_expression_t*)expr)->identifier); case EXPR_IN: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_in); case EXPR_INSTANCEOF: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_instanceof); case EXPR_LESS: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_lt); case EXPR_LESSEQ: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_lteq); case EXPR_LITERAL: return compile_literal(ctx, ((literal_expression_t*)expr)->literal); case EXPR_LOGNEG: return compile_unary_expression(ctx, (unary_expression_t*)expr, OP_neg); case EXPR_LSHIFT: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_lshift); case EXPR_MEMBER: return compile_member_expression(ctx, (member_expression_t*)expr); case EXPR_MINUS: return compile_unary_expression(ctx, (unary_expression_t*)expr, OP_minus); case EXPR_MOD: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_mod); case EXPR_MUL: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_mul); case EXPR_NEW: return compile_new_expression(ctx, (call_expression_t*)expr); case EXPR_NOTEQ: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_neq); case EXPR_NOTEQEQ: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_neq2); case EXPR_OR: return compile_logical_expression(ctx, (binary_expression_t*)expr, OP_cnd_nz); case EXPR_PLUS: return compile_unary_expression(ctx, (unary_expression_t*)expr, OP_tonum); case EXPR_POSTDEC: return compile_increment_expression(ctx, (unary_expression_t*)expr, OP_postinc, -1); case EXPR_POSTINC: return compile_increment_expression(ctx, (unary_expression_t*)expr, OP_postinc, 1); case EXPR_PREDEC: return compile_increment_expression(ctx, (unary_expression_t*)expr, OP_preinc, -1); case EXPR_PREINC: return compile_increment_expression(ctx, (unary_expression_t*)expr, OP_preinc, 1); case EXPR_PROPVAL: return compile_object_literal(ctx, (property_value_expression_t*)expr); case EXPR_RSHIFT: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_rshift); case EXPR_RRSHIFT: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_rshift2); case EXPR_SUB: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_sub); case EXPR_THIS: return push_instr(ctx, OP_this) ? S_OK : E_OUTOFMEMORY; case EXPR_TYPEOF: return compile_typeof_expression(ctx, (unary_expression_t*)expr); case EXPR_VOID: return compile_unary_expression(ctx, (unary_expression_t*)expr, OP_void); case EXPR_BXOR: return compile_binary_expression(ctx, (binary_expression_t*)expr, OP_xor); default: assert(0); } return S_OK; }