Index: test/mjsunit/strong/implicit-conversions.js |
diff --git a/test/mjsunit/strong/implicit-conversions.js b/test/mjsunit/strong/implicit-conversions.js |
index c4a6765f8a1c337b831daf23a0de98a73a0f7072..cd8acf70857bf31050a07ff5d5fd24615c449d57 100644 |
--- a/test/mjsunit/strong/implicit-conversions.js |
+++ b/test/mjsunit/strong/implicit-conversions.js |
@@ -61,23 +61,17 @@ let numberValues = [ |
"0", |
"(-0)", |
"1", |
- "0.79", |
- "(-0.79)", |
- "4294967295", |
- "4294967296", |
"(-4294967295)", |
"(-4294967296)", |
"9999999999999", |
"(-9999999999999)", |
- "1.5e10", |
- "(-1.5e10)", |
- "0xFFF", |
- "(-0xFFF)", |
"NaN", |
"Infinity", |
"(-Infinity)" |
]; |
+//****************************************************************************** |
+// Relational comparison function declarations |
function add_strong(x, y) { |
"use strong"; |
return x + y; |
@@ -253,6 +247,18 @@ function typed_greater_equal_strong(x, y) { |
return (+x) >= (+y); |
} |
+//****************************************************************************** |
+// (in)equality function declarations |
+function str_equal_strong(x, y) { |
+ "use strong"; |
+ return x === y; |
+} |
+ |
+function str_ineq_strong(x, y) { |
+ "use strong"; |
+ return x !== y; |
+} |
+ |
let strongNumberFuncs = [add_num_strong, sub_strong, mul_strong, div_strong, |
mod_strong, or_strong, and_strong, xor_strong, |
shl_strong, shr_strong, sar_strong, less_num_strong, |
@@ -332,44 +338,75 @@ for (let op of strongUnops) { |
for (let func of strongNumberFuncs) { |
// Check IC None*None->None throws |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %OptimizeFunctionOnNextCall(func); |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %DeoptimizeFunction(func); |
+ for (let v of nonNumberValues) { |
+ let value = eval(v); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %OptimizeFunctionOnNextCall(func); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %DeoptimizeFunction(func); |
+ } |
func(4, 5); |
func(4, 5); |
// Check IC Smi*Smi->Smi throws |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %OptimizeFunctionOnNextCall(func); |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %DeoptimizeFunction(func); |
+ for (let v of nonNumberValues) { |
+ let value = eval(v); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %OptimizeFunctionOnNextCall(func); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %DeoptimizeFunction(func); |
+ } |
func(NaN, NaN); |
func(NaN, NaN); |
// Check IC Number*Number->Number throws |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %OptimizeFunctionOnNextCall(func); |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %DeoptimizeFunction(func); |
+ for (let v of nonNumberValues) { |
+ let value = eval(v); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %OptimizeFunctionOnNextCall(func); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %DeoptimizeFunction(func); |
+ } |
} |
for (let func of strongStringOrNumberFuncs) { |
// Check IC None*None->None throws |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %OptimizeFunctionOnNextCall(func); |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %DeoptimizeFunction(func); |
+ for (let v of nonNumberValues) { |
+ let value = eval(v); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %OptimizeFunctionOnNextCall(func); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %DeoptimizeFunction(func); |
+ } |
func("foo", "bar"); |
func("foo", "bar"); |
// Check IC String*String->String throws |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %OptimizeFunctionOnNextCall(func); |
- assertThrows(function(){func(2, "foo");}, TypeError); |
- %DeoptimizeFunction(func); |
+ for (let v of nonNumberValues) { |
+ let value = eval(v); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %OptimizeFunctionOnNextCall(func); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %DeoptimizeFunction(func); |
+ } |
func(NaN, NaN); |
func(NaN, NaN); |
// Check IC Generic*Generic->Generic throws |
- assertThrows(function(){func(2, "foo");}, TypeError); |
+ for (let v of nonNumberValues) { |
+ let value = eval(v); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %OptimizeFunctionOnNextCall(func); |
+ assertThrows(function(){func(2, value);}, TypeError); |
+ %DeoptimizeFunction(func); |
+ } |
+} |
+ |
+for (let func of [str_equal_strong, str_ineq_strong]) { |
+ assertDoesNotThrow(function(){func(2, undefined)}); |
+ assertDoesNotThrow(function(){func(2, undefined)}); |
+ %OptimizeFunctionOnNextCall(func); |
+ assertDoesNotThrow(function(){func(2, undefined)}); |
+ %DeoptimizeFunction(func); |
+ assertDoesNotThrow(function(){func(true, {})}); |
+ assertDoesNotThrow(function(){func(true, {})}); |
%OptimizeFunctionOnNextCall(func); |
- assertThrows(function(){func(2, "foo");}, TypeError); |
+ assertDoesNotThrow(function(){func(true, {})}); |
%DeoptimizeFunction(func); |
} |