/* * expression code generate method */ static void generate_expression_code(CodeAttribute *ca, Expression *ex){ switch(ex->kind){ case INT_EXPRESSION: generate_int_expression(ca, ex->u.int_value); break; case IDENTIFIER_EXPRESSION: generate_identifier_expression(ca, ex); break; case BINARY_EXPRESSION: generate_binary_expression(ca, ex->u.binary_expression); break; case MINUS_EXPRESSION: generate_minus_expression(ca, ex->u.minus_expression); break; case CALL_EXPRESSION: generate_call_expression(ca, &(ex->u.call_expression)); } }
static void generate_function_pattern_code(CodeAttribute *ca, FunctionPattern *fp){ Code *jump_operator; u2 start_pc; add_code(ca, ILOAD_0); if(fp->pattern){ generate_int_expression(ca, fp->pattern); start_pc = ca->code_length; jump_operator = add_code(ca, IF_ICOMPNE, 0); } else{ start_pc = ca->code_length; jump_operator = add_code(ca, IFNE, 0); } generate_expression_code(ca, fp->statement->expression); add_code(ca, IRETURN); jump_operator->next->u.operand_short = ca->code_length - start_pc; }
static void generate_expression(DVM_Executable *exe, Block *current_block, Expression *expr, OpcodeBuf *ob) { switch (expr->kind) { case BOOLEAN_EXPRESSION: generate_boolean_expression(exe, expr, ob); break; case INT_EXPRESSION: generate_int_expression(exe, expr, ob); break; case DOUBLE_EXPRESSION: generate_double_expression(exe, expr, ob); break; case STRING_EXPRESSION: generate_string_expression(exe, expr, ob); break; case IDENTIFIER_EXPRESSION: generate_identifier_expression(exe, current_block, expr, ob); break; case COMMA_EXPRESSION: generate_expression(exe, current_block, expr->u.comma.left, ob); generate_expression(exe, current_block, expr->u.comma.right, ob); break; case ASSIGN_EXPRESSION: generate_assign_expression(exe, current_block, expr, ob, DVM_FALSE); break; case ADD_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_ADD_INT, ob); break; case SUB_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_SUB_INT, ob); break; case MUL_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_MUL_INT, ob); break; case DIV_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_DIV_INT, ob); break; case MOD_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_MOD_INT, ob); break; case EQ_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_EQ_INT, ob); break; case NE_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_NE_INT, ob); break; case GT_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_GT_INT, ob); break; case GE_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_GE_INT, ob); break; case LT_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_LT_INT, ob); break; case LE_EXPRESSION: generate_binary_expression(exe, current_block, expr, DVM_LE_INT, ob); break; case LOGICAL_AND_EXPRESSION: generate_logical_and_expression(exe, current_block, expr, ob); break; case LOGICAL_OR_EXPRESSION: generate_logical_or_expression(exe, current_block, expr, ob); break; case MINUS_EXPRESSION: generate_expression(exe, current_block, expr->u.minus_expression, ob); generate_code(ob, expr->line_number, DVM_MINUS_INT + get_opcode_type_offset(expr->type->basic_type)); break; case LOGICAL_NOT_EXPRESSION: generate_expression(exe, current_block, expr->u.logical_not, ob); generate_code(ob, expr->line_number, DVM_LOGICAL_NOT); break; case FUNCTION_CALL_EXPRESSION: generate_function_call_expression(exe, current_block, expr, ob); break; case INCREMENT_EXPRESSION: /* FALLTHRU */ case DECREMENT_EXPRESSION: generate_inc_dec_expression(exe, current_block, expr, expr->kind, ob, DVM_FALSE); break; case CAST_EXPRESSION: generate_cast_expression(exe, current_block, expr, ob); break; case EXPRESSION_KIND_COUNT_PLUS_1: /* FALLTHRU */ default: DBG_assert(0, ("expr->kind..%d", expr->kind)); } }