dart-sdk/tests/web
Stephen Adams 5c582f82f0 [dart2js, js_runtime, js_dev_runtime] NaN-safe range checks.
`int` variables can attain NaN values because web int arithmetic
implemented by JavaScript numbers (doubles) is not closed under many
operations. It is possible get NaN using only addition:

    int a = 1, b = -1;
    while (a + a != a) { a += a; b += b; }
    int nan = a + b;

On the VM, a, b and nan are all zero.
On the web, a, b and nan are Infinity, -Infinity and NaN, respectively.

Since NaN can leak into int arithmetic, is it helpful if bounds checks
catch NaN indexes. NaN compares false in any comparison, so a test
of the form

   if (index < 0 || index >= a.length) throw ioore(a, index);

fails to detect a NaN value of `index`.
This is fixed by negating the comparisons, and applying De Morgan's law:

   if (!(index >= 0 && index < a.length)) throw ioore(a, index);

These changes have been applied to JSArray.[], JSArray.[]= and String.[]

For dart2js the change is a little more involved. Primitive indexing is
lowered to code with a HBoundsCheck check instruction. The code generated
for the instruction now uses, e.g. `!(i>=0)` instead of `i<0`.
This leads to a small code size regression.

There is no regression at -O4 since bounds checks are omitted at -O4.

At -O3 (where the regression is largest) the regression is
   0.01% for cm
   0.06% for flutter gallery -- array-heavy diff and layout
   0.21% for Meteor          -- array-heavy code
   0.30% for Box2DOctane     -- array-heavy code

I believe the regression can be largely alleviated by determining if
NaN is impossible at the index check, and if so, reverting to the smaller
code pattern. The analysis could be global, incorporating NaN into the
global abstract value domain, or a much simpler a local dataflow
analysis. Many indexes are loop driven and cannot reach infinity because
they are incremented by a small bump and eventually (even without a loop
guard) the index would stop growing when the increment falls below the
rounding error in O(2^53) iterations.


Change-Id: I23ab1eb779f1d0c9c6655e13d69f65d453db9284
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/210321
Commit-Queue: Stephen Adams <sra@google.com>
Reviewed-by: Mayank Patke <fishythefish@google.com>
2021-08-27 00:37:56 +00:00
..
deferred [dart2js] Add test for empty holders in an output unit. 2021-06-04 17:55:17 +00:00
internal Remove obsolete internal dart2js annotations 2021-08-04 23:27:18 +00:00
native Remove obsolete internal dart2js annotations 2021-08-04 23:27:18 +00:00
regress [dart2js] Some DartTypeVisitor cleanup. 2021-07-15 19:04:25 +00:00
supermixin
3_test.dart
7_test.dart
12_test.dart
33_test.dart
43_test.dart
881_test.dart
10216a_test.dart
10216b_test.dart
11673_test.dart
12320_test.dart
16400_test.dart
16407_test.dart
16967_test.dart
17094_test.dart
17645_test.dart
17856_test.dart
18175_test.dart
18383_test.dart
19191_test.dart
21351_test.dart
21579_test.dart
22487_test.dart
22776_test.dart
22868_test.dart
22917_test.dart
23404_test.dart
23432_test.dart
23486_helper.dart
23486_test.dart
23804_test.dart
23828_test.dart
26243_test.dart
27198_test.dart
27199_test.dart
27323_test.dart
27354_test.dart
28749_test.dart
28919_test.dart
29130_test.dart
31803_test.dart
32770a_test.dart
32770b_test.dart
32770c_test.dart
32774_test.dart
32828_test.dart
32853_test.dart
32928_test.dart
32969_test.dart
32997a_lib.dart
32997a_test.dart
32997b_lib.dart
32997b_test.dart
33296_test.dart
33572_test.dart
34156_test.dart
34701_test.dart
35341_test.dart
35356_test.dart
35853_test.dart
35965a_test.dart
37494_test.dart
37576_test.dart
38005_test.dart
38949_test.dart
40152a_test.dart
40902_test.dart
41449a_test.dart
41449b_test.dart
41449c_test.dart
41449d_test.dart [dart2js] Add failing tests for issue #41449. 2021-02-08 23:23:34 +00:00
42088_test.dart
42189_test.dart
42501_test.dart
42531_test.dart
45046_test.dart [dart2js] Add failing tests for issue #45046. 2021-03-12 04:47:59 +00:00
assert_with_message_test.dart
async_helper.dart
async_stacktrace_test.dart
big_allocation_expression_test.dart
block_expression_on_field_test.dart
bound_closure_interceptor_methods_test.dart
bounded_type_literal_test.dart
bounds_check1a_test.dart
bounds_check1b_test.dart
bounds_check2a_test.dart
bounds_check2b_test.dart
bounds_check3a_test.dart
bounds_check3b_test.dart
bounds_check3c_test.dart
bounds_check4a_test.dart
bounds_check4b_test.dart
bounds_check_test.dart
break_test.dart
call_is_function_test.dart
call_signature_test.dart
call_uninlined_test.dart
cfe_instance_constant_test.dart
checked_setter_test.dart
class_hierarchy_extends_clause_test.dart
closure2_test.dart
closure3_test.dart
closure4_test.dart
closure5_test.dart
closure6_test.dart
closure7_test.dart
closure_capture2_test.dart
closure_capture3_test.dart
closure_capture4_test.dart
closure_capture5_test.dart
closure_capture6_test.dart
closure_capture7_test.dart
closure_capture_test.dart
closure_signature_unneeded_test.dart
closure_test.dart
code_motion_exception_test.dart
compile_time_constant4_test.dart
compound_operator_index_test.dart
conditional_rewrite_test.dart
conditional_send_test.dart
conditional_test.dart
conflict_index_test.dart
consistent_add_error_test.dart
consistent_codeUnitAt_error_test.dart
consistent_index_error_array_test.dart
consistent_index_error_string_test.dart
consistent_index_error_typed_list_test.dart
consistent_null_add_error_test.dart
consistent_subtract_error_test.dart
consistent_type_error_test.dart
constant_fold_number_dart2_j_s_test.dart
constant_folding2_test.dart
constant_folding_test.dart
constant_javascript_semantics2_test.dart
constant_javascript_semantics3_test.dart
constant_javascript_semantics_test5.dart
constant_truncate_test.dart
crash_library_metadata.dart
dart2js.status
data_uri_test.dart
deferred_fail_and_retry_lib.dart
deferred_fail_and_retry_test.dart
deferred_function_types1_test.dart
deferred_function_types2_test.dart
deferred_function_types3_test.dart
deferred_function_types4_test.dart
deferred_function_types5_test.dart
deferred_function_types6_test.dart
deferred_function_types7_test.dart
deferred_function_types8_test.dart
deferred_function_types_lib1.dart
deferred_function_types_lib2.dart
deferred_inheritance_lib1.dart
deferred_inheritance_lib2.dart
deferred_inheritance_test.dart Remove obsolete internal dart2js annotations 2021-08-04 23:27:18 +00:00
deferred_split_lib1.dart
deferred_split_lib2.dart
deferred_split_test.dart
deferred_tearoff_load_library_lib.dart
deferred_tearoff_load_library_test.dart
deferred_with_cross_origin_lib.dart
deferred_with_cross_origin_test.dart
deferred_with_csp_nonce2_test.dart
deferred_with_csp_nonce_lib.dart
deferred_with_csp_nonce_test.dart
do_test.dart
dummy_compiler_test.dart
dynamic_bounds_check_test.dart
dynamic_invocation_test.dart
dynamic_type_literal_test.dart
effectively_constant_fields_test.dart
effectively_constant_instance_field_test.dart
empty_method_test.dart
eof_line_ending_test.dart
equals_test.dart
expose_this1_test.dart
expose_this2_test.dart
field_access_test.dart
field_in_constructor_test.dart
field_initializer_test.dart
fields_test.dart
first_class_types_hashcode_test.dart
fixed_type_argument_implements_test.dart
fixed_type_argument_test.dart
foo7_test.dart
for_in_test.dart
for_test.dart
function_parameters_test.dart
function_typed_arguments_test.dart
generator_elided_parameter_test.dart
generic_bounds_test.dart
generic_class_is_test.dart
generic_in_mixin_field_test.dart
generic_in_redirect_test.dart
generic_in_super_test.dart
generic_instantiation1_test.dart
generic_instantiation2_test.dart
generic_instantiation3_test.dart
generic_instantiation4_test.dart
generic_method_dynamic_is_test.dart
generic_method_dynamic_type_test.dart
generic_method_static_is_test.dart
generic_type_error_message_test.dart
generics_factories_test.dart
generics_is_check1_test.dart
getter_element_test.dart
getters_setters_test.dart
hash_code_test.dart
identical_trace_test.dart
if_in_loop_test.dart
if_null2_test.dart
if_null3_test.dart
if_null_test.dart
if_test.dart
index_test.dart
indirect_type_literal_test.dart
inference_super_set_call_test.dart
inferrer_is_int_test.dart [test] Replace non-implemented @DontInline() annotations 2021-07-26 13:22:31 +00:00
injected_cast_test.dart
inline_generic_test.dart
inline_position_crash_source.dart
inline_position_crash_test.dart
instantiation_stub_2_test.dart
instantiation_stub_test.dart
int_index_test.dart
interceptor_named_arguments_test.dart
interface_type_optimization_test.dart
invalid_annotation_test.dart
invoke_dynamic_test.dart
is_check_instanceof_test.dart
is_operator_test.dart
issue36562_test.dart
js_array_index_error_test.dart
js_array_removeLast_error_test.dart
js_array_sort_default_test.dart
js_interop_cast_test.dart
js_interop_implements_test.dart
js_interop_no_elide_optional_arg_test.dart
js_interop_optional_arg_test.dart
js_interop_test.dart
jsinterop_test.dart
label_test.dart
late_initializers_1_test.dart
late_initializers_2_test.dart
lax_runtime_type_closure_equals1_test.dart
lax_runtime_type_closure_equals2_test.dart
lax_runtime_type_closure_equals3_test.dart
lax_runtime_type_closure_equals4_test.dart
lax_runtime_type_closure_equals5_test.dart
lax_runtime_type_closure_equals6_test.dart
lax_runtime_type_closure_equals7_test.dart
lax_runtime_type_closure_equals8_test.dart
lax_runtime_type_closure_to_string3_test.dart
lax_runtime_type_closure_to_string4_test.dart
lax_runtime_type_closure_to_string5_test.dart
lax_runtime_type_closure_to_string6_test.dart
lax_runtime_type_equals1_test.dart
lax_runtime_type_equals2_test.dart
lax_runtime_type_equals3_test.dart
lax_runtime_type_equals4_test.dart
lax_runtime_type_instantiate_to_string_test.dart
LayoutTests_fast_mediastream_getusermedia_t01_test.dart
list_factory_test.dart
list_generate_1_test.dart
list_generate_2_test.dart
literal_string_juxtaposition_test.dart
literals_test.dart
local_function_call2_test.dart
local_function_call_test.dart
local_function_generic_strong_test.dart
local_function_signatures_strong_test.dart
local_function_signatures_test.dart
local_signature_test.dart
locals_test.dart
logical_and_test.dart
logical_or_test.dart
loop_if_phi_test.dart
many_constants_test.dart
many_fields_test.dart
many_instantiations_test.dart
map_to_set_test.dart
math_lib_prefix_test.dart
math_lib_test.dart
member_namespace_test.dart
method_signatures_strong_test.dart
method_signatures_test.dart
minus_zero2_test.dart
minus_zero_test.dart
mixin_subtype_test.dart
mixin_type_variable_test.dart
multi_global_def_single_instantiation_test.dart
named_mixin_runtime_type_test.dart
named_parameter_for_static_test.dart
named_parameter_test.dart
nan_index_test.dart [dart2js, js_runtime, js_dev_runtime] NaN-safe range checks. 2021-08-27 00:37:56 +00:00
nan_negate_test.dart
new_from_env_test.dart
no_such_method_strong1_test.dart
no_such_method_strong2_test.dart
no_such_method_strong3_test.dart
no_such_method_strong4_test.dart
no_such_method_strong5_test.dart
no_such_method_strong6_test.dart
no_such_method_strong7_test.dart
no_such_method_strong8_test.dart
no_such_method_strong9_test.dart
no_such_method_strong10_test.dart
no_such_method_strong11_lib.dart
no_such_method_strong11_test.dart
no_such_method_strong12_test.dart
no_such_method_test.dart
non_jsinterop_test.dart
non_trivial_substitution_test.dart
not_equals_test.dart
not_test.dart
null_stacktrace_test.dart
null_test.dart
operator2_test.dart
operator3_test.dart
operator_equals_test.dart
operator_test.dart
optional_parameter_test.dart
panda_lib.dart
panda_test.dart
phi_elimination_test.dart
phi_gvn_test.dart
phi_test.dart
recursive_metadata_test.dart
regress_32069_test.dart
regress_36222_test.dart
regress_40349_test.dart
regress_42281_test.dart
regress_null_aware_test.dart
regression_2913_test.dart
replaced_type_variable_test.dart
return_setter_test.dart
round_constant_folding_test.dart
rti_need_for_closure_signature_test.dart
rti_need_for_runtime_type_test.dart
runtime_type_closure_equals1_test.dart
runtime_type_closure_equals2_test.dart
runtime_type_closure_equals3_test.dart
runtime_type_closure_equals4_test.dart
runtime_type_closure_equals5_test.dart
runtime_type_closure_equals6_test.dart
runtime_type_closure_equals7_test.dart
runtime_type_closure_equals8_test.dart
runtime_type_equals1_test.dart
runtime_type_equals2_test.dart
runtime_type_equals3_test.dart
runtime_type_equals4_test.dart
runtime_type_equals5_test.dart
runtime_type_equals6_test.dart
runtime_type_equals7_test.dart
runtime_type_equals8_test.dart
runtime_type_int_test.dart
runtime_type_test.dart
runtime_type_to_string1_test.dart
send_test.dart
simple_string_constant_test.dart
source_mapping_crash_source.dart
source_mapping_crash_test.dart
static_field2_test.dart
static_field_test.dart
static_method2_test.dart
static_method_test.dart
static_var_no_initializer_test.dart
static_var_test.dart
string_escape_test.dart
string_interpolation_dynamic_test.dart
string_interpolation_opt1_test.dart
string_interpolation_test.dart
super_call_test.dart
super_constructor1_test.dart
super_constructor2_test.dart
switch_equals_test.dart
switch_test.dart
sync_star_element_rti_need_test.dart
tear_off_types_test.dart
this_phi_elimination_test.dart
this_redirecting_constructor_test.dart
this_test.dart
throw1_test.dart
throw2_test.dart
timer_test.dart
to_string_test.dart
truncation_errors_test.dart
type_argument_factory_crash_test.dart
type_argument_factory_nocrash_test.dart
type_argument_optimization_test.dart
type_error_message_test.dart
type_literal2_test.dart
type_literal_test.dart
typevariable_factory_test.dart
typevariable_substitution_test.dart
typevariable_typedef_test.dart
unconditional_dartio_import_test.dart
unused_local_const_test.dart
useful_error_message_1_test.dart
while_test.dart