···11911191compat-table/es6/well-known.toStringTag.misc-builtins.js: OK
11921192compat-table/es6/well-known.toStringTag.new-builtins.js: failed
11931193compat-table/es6/well-known.unscopables.js: OK
11941194-compat-table/es2016/Array.prototype.includes.generic.js: failed
11941194+compat-table/es2016/Array.prototype.includes.generic.js: OK
11951195compat-table/es2016/Array.prototype.includes.js: OK
11961196-compat-table/es2016/Array.prototype.includes.sparse.js: failed
11971197-compat-table/es2016/Array.prototype.includes.typed-array.js: TypeError: undefined is not a function
11961196+compat-table/es2016/Array.prototype.includes.sparse.js: OK
11971197+compat-table/es2016/Array.prototype.includes.typed-array.js: OK
11981198compat-table/es2016/exponentiation.assignment.js: OK
11991199compat-table/es2016/exponentiation.basic.js: OK
12001200compat-table/es2016/exponentiation.unary-negation-error.js: OK
12011201-compat-table/es2016/misc.Proxy-Array-includes.js: failed
12011201+compat-table/es2016/misc.Proxy-Array-includes.js: OK
12021202compat-table/es2016/misc.Proxy-enumerate-removed.js: OK
12031203compat-table/es2016/misc.generator-no-new.js: OK
12041204compat-table/es2016/misc.generator-throw-inner.js: OK
12051205compat-table/es2016/misc.nested-rest-destructuring-decl.js: OK
12061206compat-table/es2016/misc.nested-rest-destructuring-params.js: OK
12071207-compat-table/es2016/misc.strict-fn-non-simple-params-error.js: failed
12071207+compat-table/es2016/misc.strict-fn-non-simple-params-error.js: OK
12081208compat-table/es2017/Atomics.add.js: OK
12091209compat-table/es2017/Atomics.and.js: OK
12101210compat-table/es2017/Atomics.compareExchange.js: OK
+84-18
src/ant.c
···83408340 free(result); return ret;
83418341}
8342834283438343-static ant_value_t builtin_array_includes(ant_t *js, ant_value_t *args, int nargs) {
83448344- ant_value_t arr = js->this_val;
83438343+static inline bool array_includes_same_value_zero(ant_t *js, ant_value_t val, ant_value_t search) {
83448344+ return (
83458345+ vtype(val) == T_NUM &&
83468346+ vtype(search) == T_NUM &&
83478347+ isnan(tod(val)) &&
83488348+ isnan(tod(search))
83498349+ ) || strict_eq_values(js, val, search);
83508350+}
83518351+83528352+static inline ant_offset_t array_includes_length_from_number(double len_num) {
83538353+ if (isnan(len_num) || len_num <= 0) return 0;
83548354+ if (len_num >= (double)UINT32_MAX) return UINT32_MAX;
83558355+ return (ant_offset_t)len_num;
83568356+}
83578357+83588358+static inline ant_offset_t array_includes_start_index(ant_t *js, ant_value_t *args, int nargs, ant_offset_t len) {
83598359+ int64_t start = 0;
8345836083468346- if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ)
83478347- return js_mkerr(js, "includes called on non-array");
83488348-83498349- if (nargs == 0) return mkval(T_BOOL, 0);
83508350- ant_value_t search = args[0];
83518351-83618361+ if (nargs >= 2 && vtype(args[1]) != T_UNDEF) {
83628362+ double from_index_num = js_to_number(js, args[1]);
83638363+ if (!isnan(from_index_num)) start = (int64_t)from_index_num;
83648364+ if (start < 0) {
83658365+ start += (int64_t)len;
83668366+ if (start < 0) start = 0;
83678367+ }}
83688368+83698369+ if ((uint64_t)start >= (uint64_t)len) return len;
83708370+ return (ant_offset_t)start;
83718371+}
83728372+83738373+static ant_value_t array_includes_dense_fast(
83748374+ ant_t *js, ant_value_t arr, ant_value_t search, ant_value_t *args, int nargs
83758375+) {
83768376+ if (!array_obj_ptr(arr) || is_proxy(arr)) return js_mkundef();
83778377+83528378 ant_offset_t len = get_array_length(js, arr);
83538379 if (len == 0) return mkval(T_BOOL, 0);
83548354-83558355- ant_offset_t start = 0;
83568356- if (nargs >= 2 && vtype(args[1]) == T_NUM) {
83578357- int s = (int) tod(args[1]);
83588358- if (s < 0) s = (int)len + s;
83598359- if (s < 0) s = 0;
83608360- start = (ant_offset_t) s;
83808380+83818381+ ant_offset_t doff = get_dense_buf(arr);
83828382+ if (!doff) return js_mkundef();
83838383+83848384+ ant_offset_t dense_len = dense_iterable_length(js, arr);
83858385+ if (dense_len != len) return js_mkundef();
83868386+83878387+ ant_offset_t start = array_includes_start_index(js, args, nargs, len);
83888388+ if (start >= len) return mkval(T_BOOL, 0);
83898389+83908390+ for (ant_offset_t i = start; i < len; i++) {
83918391+ ant_value_t val = dense_get(doff, i);
83928392+ if (is_empty_slot(val)) return js_mkundef();
83938393+ if (array_includes_same_value_zero(js, val, search)) return mkval(T_BOOL, 1);
83618394 }
83958395+83968396+ return mkval(T_BOOL, 0);
83978397+}
83988398+83998399+static ant_value_t array_includes_generic(
84008400+ ant_t *js, ant_value_t arr, ant_value_t search, ant_value_t *args, int nargs
84018401+) {
84028402+ ant_value_t len_val = js_getprop_fallback(js, arr, "length");
84038403+ if (is_err(len_val)) return len_val;
84048404+84058405+ ant_offset_t len = array_includes_length_from_number(js_to_number(js, len_val));
84068406+ if (len == 0) return mkval(T_BOOL, 0);
8362840784088408+ ant_offset_t start = array_includes_start_index(js, args, nargs, len);
84098409+ if (start >= len) return mkval(T_BOOL, 0);
84108410+83638411 for (ant_offset_t i = start; i < len; i++) {
83648364- ant_value_t val = arr_get(js, arr, i);
83658365- if (vtype(val) == T_NUM && vtype(search) == T_NUM && isnan(tod(val)) && isnan(tod(search))) return mkval(T_BOOL, 1);
83668366- if (strict_eq_values(js, val, search)) return mkval(T_BOOL, 1);
84128412+ char idxstr[24];
84138413+ size_t idxlen = uint_to_str(idxstr, sizeof(idxstr), (uint64_t)i);
84148414+ idxstr[idxlen] = '\0';
84158415+84168416+ ant_value_t val = js_getprop_fallback(js, arr, idxstr);
84178417+ if (is_err(val)) return val;
84188418+ if (array_includes_same_value_zero(js, val, search)) return mkval(T_BOOL, 1);
83678419 }
8368842083698421 return mkval(T_BOOL, 0);
84228422+}
84238423+84248424+static ant_value_t builtin_array_includes(ant_t *js, ant_value_t *args, int nargs) {
84258425+ ant_value_t arr = js->this_val;
84268426+84278427+ if (vtype(arr) != T_ARR && vtype(arr) != T_OBJ)
84288428+ return js_mkerr(js, "includes called on non-array");
84298429+84308430+ ant_value_t search = (nargs > 0) ? args[0] : js_mkundef();
84318431+84328432+ ant_value_t fast = array_includes_dense_fast(js, arr, search, args, nargs);
84338433+ if (vtype(fast) != T_UNDEF) return fast;
84348434+84358435+ return array_includes_generic(js, arr, search, args, nargs);
83708436}
8371843783728438static ant_value_t builtin_array_every(ant_t *js, ant_value_t *args, int nargs) {