diff --git a/jim.c b/jim.c index cf9b7586..ea70d359 100644 --- a/jim.c +++ b/jim.c @@ -8240,17 +8240,23 @@ static int ExprBool(Jim_Interp *interp, Jim_Obj *obj) long l; double d; int b; + int ret = -1; + + /* In case the object is interp->result with refcount 1*/ + Jim_IncrRefCount(obj); if (Jim_GetLong(interp, obj, &l) == JIM_OK) { - return l != 0; + ret = (l != 0); } - if (Jim_GetDouble(interp, obj, &d) == JIM_OK) { - return d != 0; + else if (Jim_GetDouble(interp, obj, &d) == JIM_OK) { + ret = (d != 0); } - if (Jim_GetBoolean(interp, obj, &b) == JIM_OK) { - return b != 0; + else if (Jim_GetBoolean(interp, obj, &b) == JIM_OK) { + ret = (b != 0); } - return -1; + + Jim_DecrRefCount(interp, obj); + return ret; } static int JimExprOpAnd(Jim_Interp *interp, struct JimExprNode *node) diff --git a/regtest.tcl b/regtest.tcl index 0833b392..a46b849f 100644 --- a/regtest.tcl +++ b/regtest.tcl @@ -345,6 +345,11 @@ puts "TEST 49 PASSED" catch {expr {>>-$x}} puts "TEST 50 PASSED" +# REGTEST 51 +# expr convert invalid value to boolean +catch {expr {2 && "abc$"}} +puts "TEST 51 PASSED" + # TAKE THE FOLLOWING puts AS LAST LINE puts "--- ALL TESTS PASSED ---"