Test exception handling with various arithmetic and logic operators, it checks the following things: In assignment expressions the lefthand side is not modified if the right hand side throws If the left hand side of a binary operator throws then the right hand should not be executed If valueOf/toString throws in the left hand expression of a binop it does not prevent evaluation of the right hand expression, but does prevent evaluation of toString/valueOf on the rhs. PASS: Handled "1 < valueOfThrower" correctly. PASS: Handled "1 < toStringThrower" correctly. PASS: Handled "1 < throwingProperty" correctly. PASS: Handled "1 < ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "1 < getterThrower.value" correctly. PASS: Handled "'string' < valueOfThrower" correctly. PASS: Handled "'string' < toStringThrower" correctly. PASS: Handled "'string' < throwingProperty" correctly. PASS: Handled "'string' < ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "'string' < getterThrower.value" correctly. PASS: Handled "valueOfThrower < rhsNonZeroNum" correctly. PASS: Handled "toStringThrower < rhsNonZeroNum" correctly. PASS: Handled "throwingProperty < rhsNonZeroNum" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty < rhsNonZeroNum" correctly. PASS: Handled "getterThrower.value < rhsNonZeroNum" correctly. PASS: Handled "valueOfThrower < rhsToStringThrower" correctly. PASS: Handled "toStringThrower < rhsToStringThrower" correctly. PASS: Handled "throwingProperty < rhsToStringThrower" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty < rhsToStringThrower" correctly. PASS: Handled "getterThrower.value < rhsToStringThrower" correctly. PASS: Handled "valueOfThrower < rhsGetterTester.value" correctly. PASS: Handled "toStringThrower < rhsGetterTester.value" correctly. PASS: Handled "1 <= valueOfThrower" correctly. PASS: Handled "1 <= toStringThrower" correctly. PASS: Handled "1 <= throwingProperty" correctly. PASS: Handled "1 <= ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "1 <= getterThrower.value" correctly. PASS: Handled "'string' <= valueOfThrower" correctly. PASS: Handled "'string' <= toStringThrower" correctly. PASS: Handled "'string' <= throwingProperty" correctly. PASS: Handled "'string' <= ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "'string' <= getterThrower.value" correctly. PASS: Handled "valueOfThrower <= rhsNonZeroNum" correctly. PASS: Handled "toStringThrower <= rhsNonZeroNum" correctly. PASS: Handled "throwingProperty <= rhsNonZeroNum" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty <= rhsNonZeroNum" correctly. PASS: Handled "getterThrower.value <= rhsNonZeroNum" correctly. PASS: Handled "valueOfThrower <= rhsToStringThrower" correctly. PASS: Handled "toStringThrower <= rhsToStringThrower" correctly. PASS: Handled "throwingProperty <= rhsToStringThrower" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty <= rhsToStringThrower" correctly. PASS: Handled "getterThrower.value <= rhsToStringThrower" correctly. PASS: Handled "valueOfThrower <= rhsGetterTester.value" correctly. PASS: Handled "toStringThrower <= rhsGetterTester.value" correctly. PASS: Handled "1 >= valueOfThrower" correctly. PASS: Handled "1 >= toStringThrower" correctly. PASS: Handled "1 >= throwingProperty" correctly. PASS: Handled "1 >= ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "1 >= getterThrower.value" correctly. PASS: Handled "'string' >= valueOfThrower" correctly. PASS: Handled "'string' >= toStringThrower" correctly. PASS: Handled "'string' >= throwingProperty" correctly. PASS: Handled "'string' >= ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "'string' >= getterThrower.value" correctly. FAIL: "valueOfThrower >= rhsNonZeroNum" threw exception, but executed right hand half of expression FAIL: "toStringThrower >= rhsNonZeroNum" threw exception, but executed right hand half of expression PASS: Handled "throwingProperty >= rhsNonZeroNum" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty >= rhsNonZeroNum" correctly. PASS: Handled "getterThrower.value >= rhsNonZeroNum" correctly. FAIL: "valueOfThrower >= rhsToStringThrower" threw exception, but executed right hand half of expression FAIL: "toStringThrower >= rhsToStringThrower" threw exception, but executed right hand half of expression PASS: Handled "throwingProperty >= rhsToStringThrower" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty >= rhsToStringThrower" correctly. PASS: Handled "getterThrower.value >= rhsToStringThrower" correctly. PASS: Handled "valueOfThrower >= rhsGetterTester.value" correctly. PASS: Handled "toStringThrower >= rhsGetterTester.value" correctly. PASS: Handled "1 > valueOfThrower" correctly. PASS: Handled "1 > toStringThrower" correctly. PASS: Handled "1 > throwingProperty" correctly. PASS: Handled "1 > ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "1 > getterThrower.value" correctly. PASS: Handled "'string' > valueOfThrower" correctly. PASS: Handled "'string' > toStringThrower" correctly. PASS: Handled "'string' > throwingProperty" correctly. PASS: Handled "'string' > ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "'string' > getterThrower.value" correctly. FAIL: "valueOfThrower > rhsNonZeroNum" threw exception, but executed right hand half of expression FAIL: "toStringThrower > rhsNonZeroNum" threw exception, but executed right hand half of expression PASS: Handled "throwingProperty > rhsNonZeroNum" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty > rhsNonZeroNum" correctly. PASS: Handled "getterThrower.value > rhsNonZeroNum" correctly. FAIL: "valueOfThrower > rhsToStringThrower" threw exception, but executed right hand half of expression FAIL: "toStringThrower > rhsToStringThrower" threw exception, but executed right hand half of expression PASS: Handled "throwingProperty > rhsToStringThrower" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty > rhsToStringThrower" correctly. PASS: Handled "getterThrower.value > rhsToStringThrower" correctly. PASS: Handled "valueOfThrower > rhsGetterTester.value" correctly. PASS: Handled "toStringThrower > rhsGetterTester.value" correctly. PASS: Handled "1 == valueOfThrower" correctly. PASS: Handled "1 == toStringThrower" correctly. PASS: Handled "1 == throwingProperty" correctly. PASS: Handled "1 == ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "1 == getterThrower.value" correctly. PASS: Handled "'string' == valueOfThrower" correctly. PASS: Handled "'string' == toStringThrower" correctly. PASS: Handled "'string' == throwingProperty" correctly. PASS: Handled "'string' == ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "'string' == getterThrower.value" correctly. PASS: Handled "throwingProperty == rhsNonZeroNum" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty == rhsNonZeroNum" correctly. PASS: Handled "getterThrower.value == rhsNonZeroNum" correctly. PASS: Handled "throwingProperty == rhsToStringThrower" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty == rhsToStringThrower" correctly. PASS: Handled "getterThrower.value == rhsToStringThrower" correctly. PASS: Handled "valueOfThrower == rhsGetterTester.value" correctly. PASS: Handled "toStringThrower == rhsGetterTester.value" correctly. PASS: Handled "1 != valueOfThrower" correctly. PASS: Handled "1 != toStringThrower" correctly. PASS: Handled "1 != throwingProperty" correctly. PASS: Handled "1 != ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "1 != getterThrower.value" correctly. PASS: Handled "'string' != valueOfThrower" correctly. PASS: Handled "'string' != toStringThrower" correctly. PASS: Handled "'string' != throwingProperty" correctly. PASS: Handled "'string' != ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "'string' != getterThrower.value" correctly. PASS: Handled "throwingProperty != rhsNonZeroNum" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty != rhsNonZeroNum" correctly. PASS: Handled "getterThrower.value != rhsNonZeroNum" correctly. PASS: Handled "throwingProperty != rhsToStringThrower" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty != rhsToStringThrower" correctly. PASS: Handled "getterThrower.value != rhsToStringThrower" correctly. PASS: Handled "valueOfThrower != rhsGetterTester.value" correctly. PASS: Handled "toStringThrower != rhsGetterTester.value" correctly. PASS: Handled "1 << valueOfThrower" correctly. PASS: Handled "1 << toStringThrower" correctly. PASS: Handled "1 << throwingProperty" correctly. PASS: Handled "1 << ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "1 << getterThrower.value" correctly. PASS: Handled "'string' << valueOfThrower" correctly. PASS: Handled "'string' << toStringThrower" correctly. PASS: Handled "'string' << throwingProperty" correctly. PASS: Handled "'string' << ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "'string' << getterThrower.value" correctly. PASS: Handled "valueOfThrower << rhsNonZeroNum" correctly. PASS: Handled "toStringThrower << rhsNonZeroNum" correctly. PASS: Handled "throwingProperty << rhsNonZeroNum" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty << rhsNonZeroNum" correctly. PASS: Handled "getterThrower.value << rhsNonZeroNum" correctly. PASS: Handled "valueOfThrower << rhsToStringThrower" correctly. PASS: Handled "toStringThrower << rhsToStringThrower" correctly. PASS: Handled "throwingProperty << rhsToStringThrower" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty << rhsToStringThrower" correctly. PASS: Handled "getterThrower.value << rhsToStringThrower" correctly. PASS: Handled "valueOfThrower << rhsGetterTester.value" correctly. PASS: Handled "toStringThrower << rhsGetterTester.value" correctly. PASS: Handled "1 >> valueOfThrower" correctly. PASS: Handled "1 >> toStringThrower" correctly. PASS: Handled "1 >> throwingProperty" correctly. PASS: Handled "1 >> ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "1 >> getterThrower.value" correctly. PASS: Handled "'string' >> valueOfThrower" correctly. PASS: Handled "'string' >> toStringThrower" correctly. PASS: Handled "'string' >> throwingProperty" correctly. PASS: Handled "'string' >> ({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "'string' >> getterThrower.value" correctly. PASS: Handled "valueOfThrower >> rhsNonZeroNum" correctly. PASS: Handled "toStringThrower >> rhsNonZeroNum" correctly. PASS: Handled "throwingProperty >> rhsNonZeroNum" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty >> rhsNonZeroNum" correctly. PASS: Handled "getterThrower.value >> rhsNonZeroNum" correctly. PASS: Handled "valueOfThrower >> rhsToStringThrower" correctly. PASS: Handled "toStringThrower >> rhsToStringThrower" correctly. PASS: Handled "throwingProperty >> rhsToStringThrower" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty >> rhsToStringThrower" correctly. PASS: Handled "getterThrower.value >> rhsToStringThrower" correctly. PASS: Handled "valueOfThrower >> rhsGetterTester.value" correctly. PASS: Handled "toStringThrower >> rhsGetterTester.value" correctly. Passed 160 of 168 tests.