mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
fix assert
message won't be evaluated on true cond
This commit is contained in:
parent
27e40e61bd
commit
e26f389182
@ -81,6 +81,7 @@ OPCODE(CONTAINS_OP)
|
|||||||
/**************************/
|
/**************************/
|
||||||
OPCODE(JUMP_ABSOLUTE)
|
OPCODE(JUMP_ABSOLUTE)
|
||||||
OPCODE(POP_JUMP_IF_FALSE)
|
OPCODE(POP_JUMP_IF_FALSE)
|
||||||
|
OPCODE(POP_JUMP_IF_TRUE)
|
||||||
OPCODE(JUMP_IF_TRUE_OR_POP)
|
OPCODE(JUMP_IF_TRUE_OR_POP)
|
||||||
OPCODE(JUMP_IF_FALSE_OR_POP)
|
OPCODE(JUMP_IF_FALSE_OR_POP)
|
||||||
OPCODE(SHORTCUT_IF_FALSE_OR_POP)
|
OPCODE(SHORTCUT_IF_FALSE_OR_POP)
|
||||||
@ -120,9 +121,9 @@ OPCODE(STORE_CLASS_ATTR)
|
|||||||
OPCODE(WITH_ENTER)
|
OPCODE(WITH_ENTER)
|
||||||
OPCODE(WITH_EXIT)
|
OPCODE(WITH_EXIT)
|
||||||
/**************************/
|
/**************************/
|
||||||
OPCODE(ASSERT)
|
|
||||||
OPCODE(EXCEPTION_MATCH)
|
OPCODE(EXCEPTION_MATCH)
|
||||||
OPCODE(RAISE)
|
OPCODE(RAISE)
|
||||||
|
OPCODE(RAISE_ASSERT)
|
||||||
OPCODE(RE_RAISE)
|
OPCODE(RE_RAISE)
|
||||||
OPCODE(POP_EXCEPTION)
|
OPCODE(POP_EXCEPTION)
|
||||||
/**************************/
|
/**************************/
|
||||||
|
@ -473,6 +473,9 @@ __NEXT_STEP:;
|
|||||||
TARGET(POP_JUMP_IF_FALSE)
|
TARGET(POP_JUMP_IF_FALSE)
|
||||||
if(!py_bool(POPX())) frame->jump_abs(byte.arg);
|
if(!py_bool(POPX())) frame->jump_abs(byte.arg);
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
|
TARGET(POP_JUMP_IF_TRUE)
|
||||||
|
if(py_bool(POPX())) frame->jump_abs(byte.arg);
|
||||||
|
DISPATCH();
|
||||||
TARGET(JUMP_IF_TRUE_OR_POP)
|
TARGET(JUMP_IF_TRUE_OR_POP)
|
||||||
if(py_bool(TOP()) == true) frame->jump_abs(byte.arg);
|
if(py_bool(TOP()) == true) frame->jump_abs(byte.arg);
|
||||||
else POP();
|
else POP();
|
||||||
@ -682,19 +685,6 @@ __NEXT_STEP:;
|
|||||||
call_method(POPX(), __exit__);
|
call_method(POPX(), __exit__);
|
||||||
DISPATCH();
|
DISPATCH();
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
TARGET(ASSERT) {
|
|
||||||
_0 = TOP();
|
|
||||||
Str msg;
|
|
||||||
if(is_type(_0, tp_tuple)){
|
|
||||||
auto& t = CAST(Tuple&, _0);
|
|
||||||
if(t.size() != 2) ValueError("assert tuple must have 2 elements");
|
|
||||||
_0 = t[0];
|
|
||||||
msg = CAST(Str&, py_str(t[1]));
|
|
||||||
}
|
|
||||||
bool ok = py_bool(_0);
|
|
||||||
POP();
|
|
||||||
if(!ok) _error("AssertionError", msg);
|
|
||||||
} DISPATCH();
|
|
||||||
TARGET(EXCEPTION_MATCH) {
|
TARGET(EXCEPTION_MATCH) {
|
||||||
const auto& e = CAST(Exception&, TOP());
|
const auto& e = CAST(Exception&, TOP());
|
||||||
_name = StrName(byte.arg);
|
_name = StrName(byte.arg);
|
||||||
@ -705,6 +695,14 @@ __NEXT_STEP:;
|
|||||||
Str msg = _0 == None ? "" : CAST(Str, py_str(_0));
|
Str msg = _0 == None ? "" : CAST(Str, py_str(_0));
|
||||||
_error(StrName(byte.arg), msg);
|
_error(StrName(byte.arg), msg);
|
||||||
} DISPATCH();
|
} DISPATCH();
|
||||||
|
TARGET(RAISE_ASSERT)
|
||||||
|
if(byte.arg){
|
||||||
|
_0 = py_str(POPX());
|
||||||
|
_error("AssertionError", CAST(Str, _0));
|
||||||
|
}else{
|
||||||
|
_error("AssertionError", "");
|
||||||
|
}
|
||||||
|
DISPATCH();
|
||||||
TARGET(RE_RAISE) _raise(true); DISPATCH();
|
TARGET(RE_RAISE) _raise(true); DISPATCH();
|
||||||
TARGET(POP_EXCEPTION) _last_exception = POPX(); DISPATCH();
|
TARGET(POP_EXCEPTION) _last_exception = POPX(); DISPATCH();
|
||||||
/*****************************************/
|
/*****************************************/
|
||||||
|
@ -802,11 +802,19 @@ __EAT_DOTS_END:
|
|||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK("assert"):
|
case TK("assert"):{
|
||||||
EXPR_TUPLE(false);
|
EXPR(false); // condition
|
||||||
ctx()->emit(OP_ASSERT, BC_NOARG, kw_line);
|
int index = ctx()->emit(OP_POP_JUMP_IF_TRUE, BC_NOARG, kw_line);
|
||||||
|
int has_msg = 0;
|
||||||
|
if(match(TK(","))){
|
||||||
|
EXPR(false); // message
|
||||||
|
has_msg = 1;
|
||||||
|
}
|
||||||
|
ctx()->emit(OP_RAISE_ASSERT, has_msg, kw_line);
|
||||||
|
ctx()->patch_jump(index);
|
||||||
consume_end_stmt();
|
consume_end_stmt();
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case TK("global"):
|
case TK("global"):
|
||||||
do {
|
do {
|
||||||
consume(TK("@id"));
|
consume(TK("@id"));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user