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 "throwingProperty" correctly. PASS: Handled "({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "!undefinedProperty" correctly. PASS: local = ~valueOfThrower worked as expected; PASS: local = +valueOfThrower worked as expected; PASS: local = -valueOfThrower worked as expected; PASS: local = ++valueOfThrower worked as expected; PASS: local = --valueOfThrower worked as expected; PASS: local = ~globalValueOfThrower worked as expected; PASS: local = +globalValueOfThrower worked as expected; PASS: local = -globalValueOfThrower worked as expected; PASS: local = ++globalValueOfThrower worked as expected; PASS: local = --globalValueOfThrower worked as expected; PASS: local = ~this.globalValueOfThrower worked as expected; PASS: local = +this.globalValueOfThrower worked as expected; PASS: local = -this.globalValueOfThrower worked as expected; PASS: local = ++this.globalValueOfThrower worked as expected; PASS: local = --this.globalValueOfThrower worked as expected; PASS: local = ~this['globalValueOfThrower'] worked as expected; PASS: local = +this['globalValueOfThrower'] worked as expected; PASS: local = -this['globalValueOfThrower'] worked as expected; PASS: local = ++this['globalValueOfThrower'] worked as expected; PASS: local = --this['globalValueOfThrower'] worked as expected; PASS: local = ~throwingProperty worked as expected; PASS: local = +throwingProperty worked as expected; PASS: local = -throwingProperty worked as expected; PASS: local = ++throwingProperty worked as expected; PASS: local = --throwingProperty worked as expected; PASS: local = ~this.throwingProperty worked as expected; PASS: local = +this.throwingProperty worked as expected; PASS: local = -this.throwingProperty worked as expected; PASS: local = ++this.throwingProperty worked as expected; PASS: local = --this.throwingProperty worked as expected; PASS: local = ~this['throwingProperty'] worked as expected; PASS: local = +this['throwingProperty'] worked as expected; PASS: local = -this['throwingProperty'] worked as expected; PASS: local = ++this['throwingProperty'] worked as expected; PASS: local = --this['throwingProperty'] worked as expected; PASS: Handled "~undefinedProperty" correctly. PASS: Handled "~undefinedProperty.imaginaryProperty" correctly. PASS: Handled "~undefinedProperty['imaginaryProperty']" correctly. PASS: Handled "~valueOfThrower" correctly. PASS: Handled "~toStringThrower" correctly. PASS: Handled "~throwingProperty" correctly. PASS: Handled "~({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "~this.valueOfThrower" correctly. PASS: Handled "~this.toStringThrower" correctly. PASS: Handled "~this.throwingProperty" correctly. PASS: Handled "~this[valueOfThrowerStr]" correctly. PASS: Handled "~this[toStringThrowerStr]" correctly. PASS: Handled "~this[throwingPropStr]" correctly. PASS: Handled "~throwingProperty.imaginaryProperty" correctly. PASS: Handled "~({get throwingProperty(){ throw "throwing property" }}).throwingProperty.imaginaryProperty" correctly. PASS: Handled "~throwingProperty['imaginaryProperty']" correctly. PASS: Handled "~({get throwingProperty(){ throw "throwing property" }}).throwingProperty['imaginaryProperty']" correctly. PASS: Handled "+undefinedProperty" correctly. PASS: Handled "+undefinedProperty.imaginaryProperty" correctly. PASS: Handled "+undefinedProperty['imaginaryProperty']" correctly. PASS: Handled "+valueOfThrower" correctly. PASS: Handled "+toStringThrower" correctly. PASS: Handled "+throwingProperty" correctly. PASS: Handled "+({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "+this.valueOfThrower" correctly. PASS: Handled "+this.toStringThrower" correctly. PASS: Handled "+this.throwingProperty" correctly. PASS: Handled "+this[valueOfThrowerStr]" correctly. PASS: Handled "+this[toStringThrowerStr]" correctly. PASS: Handled "+this[throwingPropStr]" correctly. PASS: Handled "+throwingProperty.imaginaryProperty" correctly. PASS: Handled "+({get throwingProperty(){ throw "throwing property" }}).throwingProperty.imaginaryProperty" correctly. PASS: Handled "+throwingProperty['imaginaryProperty']" correctly. PASS: Handled "+({get throwingProperty(){ throw "throwing property" }}).throwingProperty['imaginaryProperty']" correctly. PASS: Handled "-undefinedProperty" correctly. PASS: Handled "-undefinedProperty.imaginaryProperty" correctly. PASS: Handled "-undefinedProperty['imaginaryProperty']" correctly. PASS: Handled "-valueOfThrower" correctly. PASS: Handled "-toStringThrower" correctly. PASS: Handled "-throwingProperty" correctly. PASS: Handled "-({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "-this.valueOfThrower" correctly. PASS: Handled "-this.toStringThrower" correctly. PASS: Handled "-this.throwingProperty" correctly. PASS: Handled "-this[valueOfThrowerStr]" correctly. PASS: Handled "-this[toStringThrowerStr]" correctly. PASS: Handled "-this[throwingPropStr]" correctly. PASS: Handled "-throwingProperty.imaginaryProperty" correctly. PASS: Handled "-({get throwingProperty(){ throw "throwing property" }}).throwingProperty.imaginaryProperty" correctly. PASS: Handled "-throwingProperty['imaginaryProperty']" correctly. PASS: Handled "-({get throwingProperty(){ throw "throwing property" }}).throwingProperty['imaginaryProperty']" correctly. PASS: Handled "++undefinedProperty" correctly. PASS: Handled "++undefinedProperty.imaginaryProperty" correctly. PASS: Handled "++undefinedProperty['imaginaryProperty']" correctly. PASS: Handled "++valueOfThrower" correctly. PASS: Handled "++toStringThrower" correctly. PASS: Handled "++throwingProperty" correctly. PASS: Handled "++({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "++this.valueOfThrower" correctly. PASS: Handled "++this.toStringThrower" correctly. PASS: Handled "++this.throwingProperty" correctly. PASS: Handled "++this[valueOfThrowerStr]" correctly. PASS: Handled "++this[toStringThrowerStr]" correctly. PASS: Handled "++this[throwingPropStr]" correctly. PASS: Handled "++throwingProperty.imaginaryProperty" correctly. PASS: Handled "++({get throwingProperty(){ throw "throwing property" }}).throwingProperty.imaginaryProperty" correctly. PASS: Handled "++throwingProperty['imaginaryProperty']" correctly. PASS: Handled "++({get throwingProperty(){ throw "throwing property" }}).throwingProperty['imaginaryProperty']" correctly. PASS: Handled "--undefinedProperty" correctly. PASS: Handled "--undefinedProperty.imaginaryProperty" correctly. PASS: Handled "--undefinedProperty['imaginaryProperty']" correctly. PASS: Handled "--valueOfThrower" correctly. PASS: Handled "--toStringThrower" correctly. PASS: Handled "--throwingProperty" correctly. PASS: Handled "--({get throwingProperty(){ throw "throwing property" }}).throwingProperty" correctly. PASS: Handled "--this.valueOfThrower" correctly. PASS: Handled "--this.toStringThrower" correctly. PASS: Handled "--this.throwingProperty" correctly. PASS: Handled "--this[valueOfThrowerStr]" correctly. PASS: Handled "--this[toStringThrowerStr]" correctly. PASS: Handled "--this[throwingPropStr]" correctly. PASS: Handled "--throwingProperty.imaginaryProperty" correctly. PASS: Handled "--({get throwingProperty(){ throw "throwing property" }}).throwingProperty.imaginaryProperty" correctly. PASS: Handled "--throwingProperty['imaginaryProperty']" correctly. PASS: Handled "--({get throwingProperty(){ throw "throwing property" }}).throwingProperty['imaginaryProperty']" correctly. PASS: Handled "undefinedProperty++" correctly. PASS: Handled "undefinedProperty.imaginaryProperty++" correctly. PASS: Handled "valueOfThrower++" correctly. PASS: Handled "toStringThrower++" correctly. PASS: Handled "throwingProperty++" correctly. PASS: Handled "this.valueOfThrower++" correctly. PASS: Handled "this.toStringThrower++" correctly. PASS: Handled "this.throwingProperty++" correctly. PASS: Handled "this[valueOfThrowerStr]++" correctly. PASS: Handled "this[toStringThrowerStr]++" correctly. PASS: Handled "this[throwingPropStr]++" correctly. PASS: Handled "undefinedProperty--" correctly. PASS: Handled "undefinedProperty.imaginaryProperty--" correctly. PASS: Handled "valueOfThrower--" correctly. PASS: Handled "toStringThrower--" correctly. PASS: Handled "throwingProperty--" correctly. PASS: Handled "this.valueOfThrower--" correctly. PASS: Handled "this.toStringThrower--" correctly. PASS: Handled "this.throwingProperty--" correctly. PASS: Handled "this[valueOfThrowerStr]--" correctly. PASS: Handled "this[toStringThrowerStr]--" correctly. PASS: Handled "this[throwingPropStr]--" correctly. PASS: nonThrowingIndexBase[nonThrowingIndexNoThrowProperty] PASS: nonThrowingIndexBase[nonThrowingIndexThrowProperty] PASS: nonThrowingIndexBase[throwingIndex] PASS: throwingIndexBase[nonThrowingIndexNoThrowProperty] PASS: throwingIndexBase[nonThrowingIndexThrowProperty] PASS: throwingIndexBase[throwingIndex] PASS: nonThrowingIndexBase[nonThrowingIndexNoThrowProperty] = valueForAssignment PASS: nonThrowingIndexBase[nonThrowingIndexThrowProperty] = valueForAssignment PASS: nonThrowingIndexBase[throwingIndex] = valueForAssignment PASS: throwingIndexBase[nonThrowingIndexNoThrowProperty] = valueForAssignment PASS: throwingIndexBase[nonThrowingIndexThrowProperty] = valueForAssignment PASS: throwingIndexBase[throwingIndex] = valueForAssignment PASS: Number.prototype.toString.call(false) Passed 158 of 158 tests.