diff --git a/src/interpreter.h b/src/interpreter.h index 95dd2a2ae76a26d793beb3d30eb00d6e5d7746e5..0019311296fab656f688f282a9a93ecb613b28b8 100644 --- a/src/interpreter.h +++ b/src/interpreter.h @@ -1293,17 +1293,39 @@ static int eval_instruction(unsigned char *pc) CASE(F_CAST); f_cast(); break; CASE(F_SOFT_CAST); + /* Stack: type_string, value */ #ifdef PIKE_DEBUG + if (sp[-2].type != T_STRING) { + fatal("Argument 1 to soft_cast isn't a string!\n"); + } +#endif /* PIKE_DEBUG */ + /* FIXME: Should probably be some other flag */ if (d_flag) { - /* FIXME: Perform a type-check here */ - /* Stack: type_string, value */ - if (d_flag > 1) { + struct pike_string *sval_type = get_type_of_svalue(sp-1); + if (!pike_types_le(sval_type, sp[-2].u.string)) { + struct pike_string *t; + ONERROR tmp; + + free_string(sval_type); + + t = describe_type(sp[-2].u.string); + SET_ONERRROR(tmp, free_string, t); + bad_arg_error("soft_cast", sp-1, 1, 1, t->str, sp-1, + "Assertion failed in soft_cast(). Expected %s\n", + t->str); + /* NOT_REACHED */ + UNSET_ONERROR(tmp); + free_string(t); + } + free_string(sval_type); +#ifdef PIKE_DEBUG + if (d_flag > 2) { struct pike_string *t = describe_type(sp[-2].u.string); fprintf(stderr, "Soft cast to %s\n", t->str); free_string(t); } - } #endif /* PIKE_DEBUG */ + } stack_swap(); pop_stack(); break;