about summary refs log tree commit diff stats
path: root/lib/monoucha0
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-03-11 23:06:42 +0100
committerbptato <nincsnevem662@gmail.com>2025-03-11 23:10:01 +0100
commit9424b6910b3944731857d9b014ac37aec392b9d5 (patch)
tree4ffa88524ee14b996ed2a8ae8ddf534d2f01de45 /lib/monoucha0
parentbd0a5eed0d0c67d5f9e6b0cda4985f8a09b1cc73 (diff)
downloadchawan-9424b6910b3944731857d9b014ac37aec392b9d5.tar.gz
Update QuickJS-NG to 0.9.0
Diffstat (limited to 'lib/monoucha0')
-rw-r--r--lib/monoucha0/monoucha/qjs/LICENSE8
-rw-r--r--lib/monoucha0/monoucha/qjs/cutils.c17
-rw-r--r--lib/monoucha0/monoucha/qjs/cutils.h64
-rw-r--r--lib/monoucha0/monoucha/qjs/libbf.c124
-rw-r--r--lib/monoucha0/monoucha/qjs/libregexp.c122
-rw-r--r--lib/monoucha0/monoucha/qjs/libregexp.h11
-rw-r--r--lib/monoucha0/monoucha/qjs/libunicode.c36
-rw-r--r--lib/monoucha0/monoucha/qjs/libunicode.h21
-rw-r--r--lib/monoucha0/monoucha/qjs/quickjs-opcode.h6
-rw-r--r--lib/monoucha0/monoucha/qjs/quickjs.c6858
-rw-r--r--lib/monoucha0/monoucha/qjs/quickjs.h524
-rw-r--r--lib/monoucha0/monoucha/quickjs.nim10
12 files changed, 3906 insertions, 3895 deletions
diff --git a/lib/monoucha0/monoucha/qjs/LICENSE b/lib/monoucha0/monoucha/qjs/LICENSE
index 7d87e3ca..3c78b692 100644
--- a/lib/monoucha0/monoucha/qjs/LICENSE
+++ b/lib/monoucha0/monoucha/qjs/LICENSE
@@ -1,9 +1,9 @@
 The MIT License (MIT)
  
-Copyright (c) 2017-2021 Fabrice Bellard
-Copyright (c) 2017-2021 Charlie Gordon
-Copyright (c) 2023 Ben Noordhuis
-Copyright (c) 2023 Saúl Ibarra Corretgé
+Copyright (c) 2017-2024 Fabrice Bellard
+Copyright (c) 2017-2024 Charlie Gordon
+Copyright (c) 2023-2025 Ben Noordhuis
+Copyright (c) 2023-2025 Saúl Ibarra Corretgé
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/lib/monoucha0/monoucha/qjs/cutils.c b/lib/monoucha0/monoucha/qjs/cutils.c
index 0a8ff459..a7b80502 100644
--- a/lib/monoucha0/monoucha/qjs/cutils.c
+++ b/lib/monoucha0/monoucha/qjs/cutils.c
@@ -125,7 +125,7 @@ int dbuf_realloc(DynBuf *s, size_t new_size)
             new_size = size;
         new_buf = s->realloc_func(s->opaque, s->buf, new_size);
         if (!new_buf) {
-            s->error = TRUE;
+            s->error = true;
             return -1;
         }
         s->buf = new_buf;
@@ -180,8 +180,7 @@ int dbuf_putstr(DynBuf *s, const char *str)
     return dbuf_put(s, (const uint8_t *)str, strlen(str));
 }
 
-int __attribute__((format(printf, 2, 3))) dbuf_printf(DynBuf *s,
-                                                      const char *fmt, ...)
+int JS_PRINTF_FORMAT_ATTR(2, 3) dbuf_printf(DynBuf *s, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     va_list ap;
     char buf[128];
@@ -590,7 +589,13 @@ overflow:
  */
 
 /* 2 <= base <= 36 */
-char const digits36[36] = "0123456789abcdefghijklmnopqrstuvwxyz";
+char const digits36[36] = {
+    '0','1','2','3','4','5','6','7','8','9',
+    'a','b','c','d','e','f','g','h','i','j',
+    'k','l','m','n','o','p','q','r','s','t',
+    'u','v','w','x','y','z'
+};
+
 
 #define USE_SPECIAL_RADIX_10  1  // special case base 10 radix conversions
 #define USE_SINGLE_CASE_FAST  1  // special case single digit numbers
@@ -1203,12 +1208,12 @@ typedef struct {
     js__once_cb callback;
 } js__once_data_t;
 
-static BOOL WINAPI js__once_inner(INIT_ONCE *once, void *param, void **context) {
+static int WINAPI js__once_inner(INIT_ONCE *once, void *param, void **context) {
     js__once_data_t *data = param;
 
     data->callback();
 
-    return TRUE;
+    return 1;
 }
 
 void js_once(js_once_t *guard, js__once_cb callback) {
diff --git a/lib/monoucha0/monoucha/qjs/cutils.h b/lib/monoucha0/monoucha/qjs/cutils.h
index 907bd559..c0537e68 100644
--- a/lib/monoucha0/monoucha/qjs/cutils.h
+++ b/lib/monoucha0/monoucha/qjs/cutils.h
@@ -25,6 +25,7 @@
 #ifndef CUTILS_H
 #define CUTILS_H
 
+#include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 #include <inttypes.h>
@@ -54,14 +55,6 @@ extern "C" {
 #include <pthread.h>
 #endif
 
-#if defined(__SANITIZE_ADDRESS__)
-# define __ASAN__ 1
-#elif defined(__has_feature)
-# if __has_feature(address_sanitizer)
-#  define __ASAN__ 1
-# endif
-#endif
-
 #if defined(_MSC_VER) && !defined(__clang__)
 #  define likely(x)       (x)
 #  define unlikely(x)     (x)
@@ -70,10 +63,6 @@ extern "C" {
 #  define __maybe_unused
 #  define __attribute__(x)
 #  define __attribute(x)
-#  include <intrin.h>
-static void *__builtin_frame_address(unsigned int level) {
-    return (void *)((char*)_AddressOfReturnAddress() - sizeof(int *) - level * sizeof(int *));
-}
 #else
 #  define likely(x)       __builtin_expect(!!(x), 1)
 #  define unlikely(x)     __builtin_expect(!!(x), 0)
@@ -82,19 +71,6 @@ static void *__builtin_frame_address(unsigned int level) {
 #  define __maybe_unused __attribute__((unused))
 #endif
 
-// https://stackoverflow.com/a/6849629
-#undef FORMAT_STRING
-#if _MSC_VER >= 1400
-# include <sal.h>
-# if _MSC_VER > 1400
-#  define FORMAT_STRING(p) _Printf_format_string_ p
-# else
-#  define FORMAT_STRING(p) __format_string p
-# endif /* FORMAT_STRING */
-#else
-# define FORMAT_STRING(p) p
-#endif /* _MSC_VER */
-
 #if defined(_MSC_VER) && !defined(__clang__)
 #include <math.h>
 #define INF INFINITY
@@ -124,13 +100,22 @@ static void *__builtin_frame_address(unsigned int level) {
 #define minimum_length(n) static n
 #endif
 
-typedef int BOOL;
-
-#ifndef FALSE
-enum {
-    FALSE = 0,
-    TRUE = 1,
-};
+/* Borrowed from Folly */
+#ifndef JS_PRINTF_FORMAT
+#ifdef _MSC_VER
+#include <sal.h>
+#define JS_PRINTF_FORMAT _Printf_format_string_
+#define JS_PRINTF_FORMAT_ATTR(format_param, dots_param)
+#else
+#define JS_PRINTF_FORMAT
+#if !defined(__clang__) && defined(__GNUC__)
+#define JS_PRINTF_FORMAT_ATTR(format_param, dots_param) \
+  __attribute__((format(gnu_printf, format_param, dots_param)))
+#else
+#define JS_PRINTF_FORMAT_ATTR(format_param, dots_param) \
+  __attribute__((format(printf, format_param, dots_param)))
+#endif
+#endif
 #endif
 
 void js__pstrcpy(char *buf, int buf_size, const char *str);
@@ -440,7 +425,7 @@ typedef struct DynBuf {
     uint8_t *buf;
     size_t size;
     size_t allocated_size;
-    BOOL error; /* true if a memory allocation error occurred */
+    bool error; /* true if a memory allocation error occurred */
     DynBufReallocFunc *realloc_func;
     void *opaque; /* for realloc_func */
 } DynBuf;
@@ -465,15 +450,14 @@ static inline int dbuf_put_u64(DynBuf *s, uint64_t val)
 {
     return dbuf_put(s, (uint8_t *)&val, 8);
 }
-int __attribute__((format(printf, 2, 3))) dbuf_printf(DynBuf *s,
-                                                      FORMAT_STRING(const char *fmt), ...);
+int JS_PRINTF_FORMAT_ATTR(2, 3) dbuf_printf(DynBuf *s, JS_PRINTF_FORMAT const char *fmt, ...);
 void dbuf_free(DynBuf *s);
-static inline BOOL dbuf_error(DynBuf *s) {
+static inline bool dbuf_error(DynBuf *s) {
     return s->error;
 }
 static inline void dbuf_set_error(DynBuf *s)
 {
-    s->error = TRUE;
+    s->error = true;
 }
 
 /*---- UTF-8 and UTF-16 handling ----*/
@@ -497,17 +481,17 @@ size_t utf8_decode_buf16(uint16_t *dest, size_t dest_len, const char *src, size_
 size_t utf8_encode_buf8(char *dest, size_t dest_len, const uint8_t *src, size_t src_len);
 size_t utf8_encode_buf16(char *dest, size_t dest_len, const uint16_t *src, size_t src_len);
 
-static inline BOOL is_surrogate(uint32_t c)
+static inline bool is_surrogate(uint32_t c)
 {
     return (c >> 11) == (0xD800 >> 11); // 0xD800-0xDFFF
 }
 
-static inline BOOL is_hi_surrogate(uint32_t c)
+static inline bool is_hi_surrogate(uint32_t c)
 {
     return (c >> 10) == (0xD800 >> 10); // 0xD800-0xDBFF
 }
 
-static inline BOOL is_lo_surrogate(uint32_t c)
+static inline bool is_lo_surrogate(uint32_t c)
 {
     return (c >> 10) == (0xDC00 >> 10); // 0xDC00-0xDFFF
 }
diff --git a/lib/monoucha0/monoucha/qjs/libbf.c b/lib/monoucha0/monoucha/qjs/libbf.c
index 6293f4ea..26872c6d 100644
--- a/lib/monoucha0/monoucha/qjs/libbf.c
+++ b/lib/monoucha0/monoucha/qjs/libbf.c
@@ -646,20 +646,20 @@ int bf_normalize_and_round(bf_t *r, limb_t prec1, bf_flags_t flags)
    rounding */
 int bf_can_round(const bf_t *a, slimb_t prec, bf_rnd_t rnd_mode, slimb_t k)
 {
-    BOOL is_rndn;
+    bool is_rndn;
     slimb_t bit_pos, n;
     limb_t bit;
 
     if (a->expn == BF_EXP_INF || a->expn == BF_EXP_NAN)
-        return FALSE;
+        return false;
     if (rnd_mode == BF_RNDF) {
         return (k >= (prec + 1));
     }
     if (a->expn == BF_EXP_ZERO)
-        return FALSE;
+        return false;
     is_rndn = (rnd_mode == BF_RNDN || rnd_mode == BF_RNDNA);
     if (k < (prec + 2))
-        return FALSE;
+        return false;
     bit_pos = a->len * LIMB_BITS - 1 - prec;
     n = k - prec;
     /* bit pattern for RNDN or RNDNA: 0111.. or 1000...
@@ -672,11 +672,11 @@ int bf_can_round(const bf_t *a, slimb_t prec, bf_rnd_t rnd_mode, slimb_t k)
     /* XXX: slow, but a few iterations on average */
     while (n != 0) {
         if (get_bit(a->tab, a->len, bit_pos) != bit)
-            return TRUE;
+            return true;
         bit_pos--;
         n--;
     }
-    return FALSE;
+    return false;
 }
 
 /* Cannot fail with BF_ST_MEM_ERROR. */
@@ -955,20 +955,20 @@ static int bf_add_internal(bf_t *r, const bf_t *a, const bf_t *b, limb_t prec,
         i = r_len - tot_len;
         while (i < 0) {
             slimb_t ap, bp;
-            BOOL inflag;
+            bool inflag;
 
             ap = a_offset + i;
             bp = b_bit_offset + i * LIMB_BITS;
-            inflag = FALSE;
+            inflag = false;
             if (ap >= 0 && ap < a->len) {
                 v1 = a->tab[ap];
-                inflag = TRUE;
+                inflag = true;
             } else {
                 v1 = 0;
             }
             if (bp + LIMB_BITS > 0 && bp < (slimb_t)(b->len * LIMB_BITS)) {
                 v2 = get_bits(b->tab, b->len, bp);
-                inflag = TRUE;
+                inflag = true;
             } else {
                 v2 = 0;
             }
@@ -1758,7 +1758,7 @@ int bf_divrem(bf_t *q, bf_t *r, const bf_t *a, const bf_t *b,
     bf_t a1_s, *a1 = &a1_s;
     bf_t b1_s, *b1 = &b1_s;
     int q_sign, ret;
-    BOOL is_ceil, is_rndn;
+    bool is_ceil, is_rndn;
 
     assert(q != a && q != b);
     assert(r != a && r != b);
@@ -1785,7 +1785,7 @@ int bf_divrem(bf_t *q, bf_t *r, const bf_t *a, const bf_t *b,
     case BF_RNDZ:
     case BF_RNDN:
     case BF_RNDNA:
-        is_ceil = FALSE;
+        is_ceil = false;
         break;
     case BF_RNDD:
         is_ceil = q_sign;
@@ -1794,7 +1794,7 @@ int bf_divrem(bf_t *q, bf_t *r, const bf_t *a, const bf_t *b,
         is_ceil = q_sign ^ 1;
         break;
     case BF_RNDA:
-        is_ceil = TRUE;
+        is_ceil = true;
         break;
     case BF_DIVREM_EUCLIDIAN:
         is_ceil = a->sign;
@@ -2900,13 +2900,13 @@ static int strcasestart(const char *str, const char *val, const char **ptr)
 
 static int bf_atof_internal(bf_t *r, slimb_t *pexponent,
                             const char *str, const char **pnext, int radix,
-                            limb_t prec, bf_flags_t flags, BOOL is_dec)
+                            limb_t prec, bf_flags_t flags, bool is_dec)
 {
     const char *p, *p_start;
     int is_neg, radix_bits, exp_is_neg, ret, digits_per_limb, shift;
     limb_t cur_limb;
     slimb_t pos, expn, int_len, digit_count;
-    BOOL has_decpt, is_bin_exp;
+    bool has_decpt, is_bin_exp;
     bf_t a_s, *a;
 
     *pexponent = 0;
@@ -2991,14 +2991,14 @@ static int bf_atof_internal(bf_t *r, slimb_t *pexponent,
     cur_limb = 0;
     bf_resize(a, 1);
     pos = 0;
-    has_decpt = FALSE;
+    has_decpt = false;
     int_len = digit_count = 0;
     for(;;) {
         limb_t c;
         if (*p == '.' && (p > p_start || bf_to_digit(p[1]) < radix)) {
             if (has_decpt)
                 break;
-            has_decpt = TRUE;
+            has_decpt = true;
             int_len = digit_count;
             p++;
         }
@@ -3067,7 +3067,7 @@ static int bf_atof_internal(bf_t *r, slimb_t *pexponent,
 
     /* parse the exponent, if any */
     expn = 0;
-    is_bin_exp = FALSE;
+    is_bin_exp = false;
     if (((radix == 10 && (*p == 'e' || *p == 'E')) ||
          (radix != 10 && (*p == '@' ||
                           (radix_bits && (*p == 'p' || *p == 'P'))))) &&
@@ -3162,14 +3162,14 @@ int bf_atof2(bf_t *r, slimb_t *pexponent,
              limb_t prec, bf_flags_t flags)
 {
     return bf_atof_internal(r, pexponent, str, pnext, radix, prec, flags,
-                            FALSE);
+                            false);
 }
 
 int bf_atof(bf_t *r, const char *str, const char **pnext, int radix,
             limb_t prec, bf_flags_t flags)
 {
     slimb_t dummy_exp;
-    return bf_atof_internal(r, &dummy_exp, str, pnext, radix, prec, flags, FALSE);
+    return bf_atof_internal(r, &dummy_exp, str, pnext, radix, prec, flags, false);
 }
 
 /* base conversion to radix */
@@ -3340,7 +3340,7 @@ slimb_t bf_mul_log2_radix(slimb_t a1, unsigned int radix, int is_inv,
 {
     int is_neg;
     limb_t a;
-    BOOL is_ceil;
+    bool is_ceil;
 
     is_ceil = is_ceil1;
     a = a1;
@@ -3510,7 +3510,7 @@ static int bf_integer_to_radix(bf_t *r, const bf_t *a, limb_t radixl)
 static int bf_convert_to_radix(bf_t *r, slimb_t *pE,
                                const bf_t *a, int radix,
                                limb_t P, bf_rnd_t rnd_mode,
-                               BOOL is_fixed_exponent)
+                               bool is_fixed_exponent)
 {
     slimb_t E, e, prec, extra_bits, ziv_extra_bits, prec0;
     bf_t B_s, *B = &B_s;
@@ -3526,7 +3526,7 @@ static int bf_convert_to_radix(bf_t *r, slimb_t *pE,
         E = *pE;
     } else {
         /* compute the new exponent */
-        E = 1 + bf_mul_log2_radix(a->expn - 1, radix, TRUE, FALSE);
+        E = 1 + bf_mul_log2_radix(a->expn - 1, radix, true, false);
     }
     //    bf_print_str("a", a);
     //    printf("E=%ld P=%ld radix=%d\n", E, P, radix);
@@ -3539,7 +3539,7 @@ static int bf_convert_to_radix(bf_t *r, slimb_t *pE,
             e_sign = 1;
         }
         /* Note: precision for log2(radix) is not critical here */
-        prec0 = bf_mul_log2_radix(P, radix, FALSE, TRUE);
+        prec0 = bf_mul_log2_radix(P, radix, false, true);
         ziv_extra_bits = 16;
         for(;;) {
             prec = prec0 + ziv_extra_bits;
@@ -3632,12 +3632,12 @@ static void limb_to_a2(char *buf, limb_t n, unsigned int radix_bits, int len)
     }
 }
 
-/* 'a' must be an integer if the is_dec = FALSE or if the radix is not
+/* 'a' must be an integer if the is_dec = false or if the radix is not
    a power of two. A dot is added before the 'dot_pos' digit. dot_pos
    = n_digits does not display the dot. 0 <= dot_pos <=
    n_digits. n_digits >= 1. */
 static void output_digits(DynBuf *s, const bf_t *a1, int radix, limb_t n_digits,
-                          limb_t dot_pos, BOOL is_dec)
+                          limb_t dot_pos, bool is_dec)
 {
     limb_t i, v, l;
     slimb_t pos, pos_incr;
@@ -3721,7 +3721,7 @@ static void *bf_dbuf_realloc(void *opaque, void *ptr, size_t size)
 
 /* return the length in bytes. A trailing '\0' is added */
 static char *bf_ftoa_internal(size_t *plen, const bf_t *a2, int radix,
-                              limb_t prec, bf_flags_t flags, BOOL is_dec)
+                              limb_t prec, bf_flags_t flags, bool is_dec)
 {
     bf_context_t *ctx = a2->ctx;
     DynBuf s_s, *s = &s_s;
@@ -3810,11 +3810,11 @@ static char *bf_ftoa_internal(size_t *plen, const bf_t *a2, int radix,
                     a->sign = 0;
 
                     /* one more digit for the rounding */
-                    n = 1 + bf_mul_log2_radix(bf_max(a->expn, 0), radix, TRUE, TRUE);
+                    n = 1 + bf_mul_log2_radix(bf_max(a->expn, 0), radix, true, true);
                     n_digits = n + prec;
                     n1 = n;
                     if (bf_convert_to_radix(a1, &n1, a, radix, n_digits,
-                                            flags & BF_RND_MASK, TRUE))
+                                            flags & BF_RND_MASK, true))
                         goto fail1;
                     start = s->size;
                     output_digits(s, a1, radix, n_digits, n, is_dec);
@@ -3897,7 +3897,7 @@ static char *bf_ftoa_internal(size_t *plen, const bf_t *a2, int radix,
                         slimb_t n_digits_max, n_digits_min;
 
                         assert(prec != BF_PREC_INF);
-                        n_digits = 1 + bf_mul_log2_radix(prec, radix, TRUE, TRUE);
+                        n_digits = 1 + bf_mul_log2_radix(prec, radix, true, true);
                         /* max number of digits for non exponential
                            notation. The rational is to have the same rule
                            as JS i.e. n_max = 21 for 64 bit float in base 10. */
@@ -3914,7 +3914,7 @@ static char *bf_ftoa_internal(size_t *plen, const bf_t *a2, int radix,
                             while (n_digits_min < n_digits_max) {
                                 n_digits = (n_digits_min + n_digits_max) / 2;
                                 if (bf_convert_to_radix(a1, &n, a, radix, n_digits,
-                                                        flags & BF_RND_MASK, FALSE)) {
+                                                        flags & BF_RND_MASK, false)) {
                                     bf_delete(b);
                                     goto fail1;
                                 }
@@ -3938,7 +3938,7 @@ static char *bf_ftoa_internal(size_t *plen, const bf_t *a2, int radix,
                         }
                     }
                     if (bf_convert_to_radix(a1, &n, a, radix, n_digits,
-                                            flags & BF_RND_MASK, FALSE)) {
+                                            flags & BF_RND_MASK, false)) {
                     fail1:
                         bf_delete(a1);
                         goto fail;
@@ -3962,22 +3962,20 @@ static char *bf_ftoa_internal(size_t *plen, const bf_t *a2, int radix,
                         n = 1;
                     if ((flags & BF_FTOA_FORCE_EXP) ||
                         n <= -6 || n > n_max) {
-                        const char *fmt;
                         /* exponential notation */
                         output_digits(s, a1, radix, n_digits, 1, is_dec);
                         if (radix_bits != 0 && radix <= 16) {
+                            slimb_t exp_n = (n - 1) * radix_bits;
                             if (flags & BF_FTOA_JS_QUIRKS)
-                                fmt = "p%+" PRId_LIMB;
+                                dbuf_printf(s, "p%+" PRId_LIMB, exp_n);
                             else
-                                fmt = "p%" PRId_LIMB;
-                            dbuf_printf(s, fmt, (n - 1) * radix_bits);
+                                dbuf_printf(s, "p%" PRId_LIMB, exp_n);
                         } else {
+                            const char c = radix <= 10 ? 'e' : '@';
                             if (flags & BF_FTOA_JS_QUIRKS)
-                                fmt = "%c%+" PRId_LIMB;
+                                dbuf_printf(s, "%c%+" PRId_LIMB, c, n - 1);
                             else
-                                fmt = "%c%" PRId_LIMB;
-                            dbuf_printf(s, fmt,
-                                        radix <= 10 ? 'e' : '@', n - 1);
+                                dbuf_printf(s, "%c%" PRId_LIMB, c, n - 1);
                         }
                     } else if (n <= 0) {
                         /* 0.x */
@@ -4017,7 +4015,7 @@ static char *bf_ftoa_internal(size_t *plen, const bf_t *a2, int radix,
 char *bf_ftoa(size_t *plen, const bf_t *a, int radix, limb_t prec,
               bf_flags_t flags)
 {
-    return bf_ftoa_internal(plen, a, radix, prec, flags, FALSE);
+    return bf_ftoa_internal(plen, a, radix, prec, flags, false);
 }
 
 /***************************************************************/
@@ -4025,7 +4023,7 @@ char *bf_ftoa(size_t *plen, const bf_t *a, int radix, limb_t prec,
 
 /* Note: the algorithm is from MPFR */
 static void bf_const_log2_rec(bf_t *T, bf_t *P, bf_t *Q, limb_t n1,
-                              limb_t n2, BOOL need_P)
+                              limb_t n2, bool need_P)
 {
     bf_context_t *s = T->ctx;
     if ((n2 - n1) == 1) {
@@ -4045,7 +4043,7 @@ static void bf_const_log2_rec(bf_t *T, bf_t *P, bf_t *Q, limb_t n1,
         bf_t Q1_s, *Q1 = &Q1_s;
 
         m = n1 + ((n2 - n1) >> 1);
-        bf_const_log2_rec(T, P, Q, n1, m, TRUE);
+        bf_const_log2_rec(T, P, Q, n1, m, true);
         bf_init(s, T1);
         bf_init(s, P1);
         bf_init(s, Q1);
@@ -4073,7 +4071,7 @@ static void bf_const_log2_internal(bf_t *T, limb_t prec)
     N = w / 3 + 1;
     bf_init(T->ctx, P);
     bf_init(T->ctx, Q);
-    bf_const_log2_rec(T, P, Q, 0, N, FALSE);
+    bf_const_log2_rec(T, P, Q, 0, N, false);
     bf_div(T, T, Q, prec, BF_RNDN);
     bf_delete(P);
     bf_delete(Q);
@@ -4635,10 +4633,10 @@ static int bf_pow_int(bf_t *r, const bf_t *x, limb_t prec, void *opaque)
     return ret;
 }
 
-/* x must be a finite non zero float. Return TRUE if there is a
+/* x must be a finite non zero float. Return true if there is a
    floating point number r such as x=r^(2^n) and return this floating
-   point number 'r'. Otherwise return FALSE and r is undefined. */
-static BOOL check_exact_power2n(bf_t *r, const bf_t *x, slimb_t n)
+   point number 'r'. Otherwise return false and r is undefined. */
+static bool check_exact_power2n(bf_t *r, const bf_t *x, slimb_t n)
 {
     bf_context_t *s = r->ctx;
     bf_t T_s, *T = &T_s;
@@ -4650,17 +4648,17 @@ static BOOL check_exact_power2n(bf_t *r, const bf_t *x, slimb_t n)
     /* fast check on the exponent */
     if (n > (LIMB_BITS - 1)) {
         if (e != 0)
-            return FALSE;
+            return false;
         er = 0;
     } else {
         if ((e & (((limb_t)1 << n) - 1)) != 0)
-            return FALSE;
+            return false;
         er = e >> n;
     }
     /* every perfect odd square = 1 modulo 8 */
     v = get_bits(x->tab, x->len, x->len * LIMB_BITS - x->expn + e);
     if ((v & 7) != 1)
-        return FALSE;
+        return false;
 
     bf_init(s, T);
     bf_set(T, x);
@@ -4669,10 +4667,10 @@ static BOOL check_exact_power2n(bf_t *r, const bf_t *x, slimb_t n)
         if (i != 0)
             bf_set(T, r);
         if (bf_sqrtrem(r, NULL, T) != 0)
-            return FALSE;
+            return false;
     }
     r->expn += er;
-    return TRUE;
+    return true;
 }
 
 /* prec = BF_PREC_INF is accepted for x and y integers and y >= 0 */
@@ -4681,7 +4679,7 @@ int bf_pow(bf_t *r, const bf_t *x, const bf_t *y, limb_t prec, bf_flags_t flags)
     bf_context_t *s = r->ctx;
     bf_t T_s, *T = &T_s;
     bf_t ytmp_s;
-    BOOL y_is_int, y_is_odd;
+    bool y_is_int, y_is_odd;
     int r_sign, ret, rnd_mode;
     slimb_t y_emin;
 
@@ -5072,7 +5070,7 @@ static int bf_atan_internal(bf_t *r, const bf_t *a, limb_t prec,
                             void *opaque)
 {
     bf_context_t *s = r->ctx;
-    BOOL add_pi2 = (BOOL)(intptr_t)opaque;
+    bool add_pi2 = (bool)(intptr_t)opaque;
     bf_t T_s, *T = &T_s;
     bf_t U_s, *U = &U_s;
     bf_t V_s, *V = &V_s;
@@ -5197,7 +5195,7 @@ int bf_atan(bf_t *r, const bf_t *a, limb_t prec, bf_flags_t flags)
         }
     }
 
-    return bf_ziv_rounding(r, a, prec, flags, bf_atan_internal, (void *)FALSE);
+    return bf_ziv_rounding(r, a, prec, flags, bf_atan_internal, (void *)false);
 }
 
 static int bf_atan2_internal(bf_t *r, const bf_t *y, limb_t prec, void *opaque)
@@ -5247,7 +5245,7 @@ int bf_atan2(bf_t *r, const bf_t *y, const bf_t *x,
 static int bf_asin_internal(bf_t *r, const bf_t *a, limb_t prec, void *opaque)
 {
     bf_context_t *s = r->ctx;
-    BOOL is_acos = (BOOL)(intptr_t)opaque;
+    bool is_acos = (bool)(intptr_t)opaque;
     bf_t T_s, *T = &T_s;
     limb_t prec1, prec2;
 
@@ -5313,7 +5311,7 @@ int bf_asin(bf_t *r, const bf_t *a, limb_t prec, bf_flags_t flags)
         }
     }
 
-    return bf_ziv_rounding(r, a, prec, flags, bf_asin_internal, (void *)FALSE);
+    return bf_ziv_rounding(r, a, prec, flags, bf_asin_internal, (void *)false);
 }
 
 int bf_acos(bf_t *r, const bf_t *a, limb_t prec, bf_flags_t flags)
@@ -5347,7 +5345,7 @@ int bf_acos(bf_t *r, const bf_t *a, limb_t prec, bf_flags_t flags)
         return 0;
     }
 
-    return bf_ziv_rounding(r, a, prec, flags, bf_asin_internal, (void *)TRUE);
+    return bf_ziv_rounding(r, a, prec, flags, bf_asin_internal, (void *)true);
 }
 
 /***************************************************************/
@@ -6930,7 +6928,7 @@ int bfdec_divrem(bfdec_t *q, bfdec_t *r, const bfdec_t *a, const bfdec_t *b,
     bfdec_t b1_s, *b1 = &b1_s;
     bfdec_t r1_s, *r1 = &r1_s;
     int q_sign, res;
-    BOOL is_ceil, is_rndn;
+    bool is_ceil, is_rndn;
 
     assert(q != a && q != b);
     assert(r != a && r != b);
@@ -6957,7 +6955,7 @@ int bfdec_divrem(bfdec_t *q, bfdec_t *r, const bfdec_t *a, const bfdec_t *b,
     case BF_RNDZ:
     case BF_RNDN:
     case BF_RNDNA:
-        is_ceil = FALSE;
+        is_ceil = false;
         break;
     case BF_RNDD:
         is_ceil = q_sign;
@@ -6966,7 +6964,7 @@ int bfdec_divrem(bfdec_t *q, bfdec_t *r, const bfdec_t *a, const bfdec_t *b,
         is_ceil = q_sign ^ 1;
         break;
     case BF_RNDA:
-        is_ceil = TRUE;
+        is_ceil = true;
         break;
     case BF_DIVREM_EUCLIDIAN:
         is_ceil = a->sign;
@@ -7196,7 +7194,7 @@ int bfdec_pow_ui(bfdec_t *r, const bfdec_t *a, limb_t b)
 
 char *bfdec_ftoa(size_t *plen, const bfdec_t *a, limb_t prec, bf_flags_t flags)
 {
-    return bf_ftoa_internal(plen, (const bf_t *)a, 10, prec, flags, TRUE);
+    return bf_ftoa_internal(plen, (const bf_t *)a, 10, prec, flags, true);
 }
 
 int bfdec_atof(bfdec_t *r, const char *str, const char **pnext,
@@ -7204,7 +7202,7 @@ int bfdec_atof(bfdec_t *r, const char *str, const char **pnext,
 {
     slimb_t dummy_exp;
     return bf_atof_internal((bf_t *)r, &dummy_exp, str, pnext, 10, prec,
-                            flags, TRUE);
+                            flags, true);
 }
 
 #endif /* USE_BF_DEC */
diff --git a/lib/monoucha0/monoucha/qjs/libregexp.c b/lib/monoucha0/monoucha/qjs/libregexp.c
index 603c2795..693acbbf 100644
--- a/lib/monoucha0/monoucha/qjs/libregexp.c
+++ b/lib/monoucha0/monoucha/qjs/libregexp.c
@@ -67,10 +67,10 @@ typedef struct {
     const uint8_t *buf_end;
     const uint8_t *buf_start;
     int re_flags;
-    BOOL is_unicode;
-    BOOL unicode_sets;
-    BOOL ignore_case;
-    BOOL dotall;
+    bool is_unicode;
+    bool unicode_sets;
+    bool ignore_case;
+    bool dotall;
     int capture_count;
     int total_capture_count; /* -1 = not computed yet */
     int has_named_captures; /* -1 = don't know, 0 = no, 1 = yes */
@@ -143,19 +143,19 @@ static const uint16_t char_range_s[] = {
     0xFEFF, 0xFEFF + 1,
 };
 
-BOOL lre_is_space(int c)
+bool lre_is_space(int c)
 {
     int i, n, low, high;
     n = (countof(char_range_s) - 1) / 2;
     for(i = 0; i < n; i++) {
         low = char_range_s[2 * i + 1];
         if (c < low)
-            return FALSE;
+            return false;
         high = char_range_s[2 * i + 2];
         if (c < high)
-            return TRUE;
+            return true;
     }
-    return FALSE;
+    return false;
 }
 
 uint32_t const lre_id_start_table_ascii[4] = {
@@ -196,7 +196,7 @@ static const uint16_t *char_range_table[] = {
 
 static int cr_init_char_range(REParseState *s, CharRange *cr, uint32_t c)
 {
-    BOOL invert;
+    bool invert;
     const uint16_t *c_pt;
     int len, i;
 
@@ -374,7 +374,7 @@ static void re_emit_op_u16(REParseState *s, int op, uint32_t val)
     dbuf_put_u16(&s->byte_code, val);
 }
 
-static int __attribute__((format(printf, 2, 3))) re_parse_error(REParseState *s, const char *fmt, ...)
+static int JS_PRINTF_FORMAT_ATTR(2, 3) re_parse_error(REParseState *s, const char *fmt, ...)
 {
     va_list ap;
     va_start(ap, fmt);
@@ -390,7 +390,7 @@ static int re_parse_out_of_memory(REParseState *s)
 
 /* If allow_overflow is false, return -1 in case of
    overflow. Otherwise return INT32_MAX. */
-static int parse_digits(const uint8_t **pp, BOOL allow_overflow)
+static int parse_digits(const uint8_t **pp, bool allow_overflow)
 {
     const uint8_t *p;
     uint64_t v;
@@ -548,7 +548,7 @@ int lre_parse_escape(const uint8_t **pp, int allow_utf16)
 }
 
 /* XXX: we use the same chars for name and value */
-static BOOL is_unicode_char(int c)
+static bool is_unicode_char(int c)
 {
     return ((c >= '0' && c <= '9') ||
             (c >= 'A' && c <= 'Z') ||
@@ -557,12 +557,12 @@ static BOOL is_unicode_char(int c)
 }
 
 static int parse_unicode_property(REParseState *s, CharRange *cr,
-                                  const uint8_t **pp, BOOL is_inv)
+                                  const uint8_t **pp, bool is_inv)
 {
     const uint8_t *p;
     char name[64], value[64];
     char *q;
-    BOOL script_ext;
+    bool script_ext;
     int ret;
 
     p = *pp;
@@ -592,10 +592,10 @@ static int parse_unicode_property(REParseState *s, CharRange *cr,
     //    printf("name=%s value=%s\n", name, value);
 
     if (!strcmp(name, "Script") || !strcmp(name, "sc")) {
-        script_ext = FALSE;
+        script_ext = false;
         goto do_script;
     } else if (!strcmp(name, "Script_Extensions") || !strcmp(name, "scx")) {
-        script_ext = TRUE;
+        script_ext = true;
     do_script:
         cr_init(cr, s->opaque, lre_realloc);
         ret = unicode_script(cr, value, script_ext);
@@ -654,7 +654,7 @@ static int parse_unicode_property(REParseState *s, CharRange *cr,
    (CLASS_RANGE_BASE). In case of class range, 'cr' is
    initialized. Otherwise, it is ignored. */
 static int get_class_atom(REParseState *s, CharRange *cr,
-                          const uint8_t **pp, BOOL inclass)
+                          const uint8_t **pp, bool inclass)
 {
     const uint8_t *p, *p_next;
     uint32_t c;
@@ -813,7 +813,7 @@ static int re_parse_char_class(REParseState *s, const uint8_t **pp)
     uint32_t c1, c2;
     CharRange cr_s, *cr = &cr_s;
     CharRange cr1_s, *cr1 = &cr1_s;
-    BOOL invert;
+    bool invert;
 
     cr_init(cr, s->opaque, lre_realloc);
     p = *pp;
@@ -838,16 +838,16 @@ static int re_parse_char_class(REParseState *s, const uint8_t **pp)
         } while (n < 4);
     }
 
-    invert = FALSE;
+    invert = false;
     if (*p == '^') {
         p++;
-        invert = TRUE;
+        invert = true;
     }
 
     for(;;) {
         if (*p == ']')
             break;
-        c1 = get_class_atom(s, cr1, &p, TRUE);
+        c1 = get_class_atom(s, cr1, &p, true);
         if ((int)c1 < 0)
             goto fail;
         if (*p == '-' && p[1] == ']' && s->unicode_sets) {
@@ -865,7 +865,7 @@ static int re_parse_char_class(REParseState *s, const uint8_t **pp)
                 /* Annex B: match '-' character */
                 goto class_atom;
             }
-            c2 = get_class_atom(s, cr1, &p0, TRUE);
+            c2 = get_class_atom(s, cr1, &p0, true);
             if ((int)c2 < 0)
                 goto fail;
             if (c2 >= CLASS_RANGE_BASE) {
@@ -923,13 +923,13 @@ static int re_parse_char_class(REParseState *s, const uint8_t **pp)
    - true if the opcodes may not advance the char pointer
    - false if the opcodes always advance the char pointer
 */
-static BOOL re_need_check_advance(const uint8_t *bc_buf, int bc_buf_len)
+static bool re_need_check_advance(const uint8_t *bc_buf, int bc_buf_len)
 {
     int pos, opcode, len;
     uint32_t val;
-    BOOL ret;
+    bool ret;
 
-    ret = TRUE;
+    ret = true;
     pos = 0;
 
     while (pos < bc_buf_len) {
@@ -950,7 +950,7 @@ static BOOL re_need_check_advance(const uint8_t *bc_buf, int bc_buf_len)
         case REOP_dot:
         case REOP_any:
         simple_char:
-            ret = FALSE;
+            ret = false;
             break;
         case REOP_line_start:
         case REOP_line_end:
@@ -970,7 +970,7 @@ static BOOL re_need_check_advance(const uint8_t *bc_buf, int bc_buf_len)
             break;
         default:
             /* safe behvior: we cannot predict the outcome */
-            return TRUE;
+            return true;
         }
         pos += len;
     }
@@ -1136,7 +1136,7 @@ static int re_count_captures(REParseState *s)
     return s->total_capture_count;
 }
 
-static BOOL re_has_named_captures(REParseState *s)
+static bool re_has_named_captures(REParseState *s)
 {
     if (s->has_named_captures < 0)
         re_count_captures(s);
@@ -1164,13 +1164,13 @@ static int find_group_name(REParseState *s, const char *name)
     return -1;
 }
 
-static int re_parse_disjunction(REParseState *s, BOOL is_backward_dir);
+static int re_parse_disjunction(REParseState *s, bool is_backward_dir);
 
-static int re_parse_term(REParseState *s, BOOL is_backward_dir)
+static int re_parse_term(REParseState *s, bool is_backward_dir)
 {
     const uint8_t *p;
     int c, last_atom_start, quant_min, quant_max, last_capture_count;
-    BOOL greedy, add_zero_advance_check, is_neg, is_backward_lookahead;
+    bool greedy, add_zero_advance_check, is_neg, is_backward_lookahead;
     CharRange cr_s, *cr = &cr_s;
 
     last_atom_start = -1;
@@ -1206,11 +1206,11 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir)
         } else {
             const uint8_t *p1 = p + 1;
             /* Annex B: error if it is like a repetition count */
-            parse_digits(&p1, TRUE);
+            parse_digits(&p1, true);
             if (*p1 == ',') {
                 p1++;
                 if (lre_is_digit(*p1)) {
-                    parse_digits(&p1, TRUE);
+                    parse_digits(&p1, true);
                 }
             }
             if (*p1 != '}') {
@@ -1236,14 +1236,14 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir)
                     return -1;
             } else if ((p[2] == '=' || p[2] == '!')) {
                 is_neg = (p[2] == '!');
-                is_backward_lookahead = FALSE;
+                is_backward_lookahead = false;
                 p += 3;
                 goto lookahead;
             } else if (p[2] == '<' &&
                        (p[3] == '=' || p[3] == '!')) {
                 int pos;
                 is_neg = (p[3] == '!');
-                is_backward_lookahead = TRUE;
+                is_backward_lookahead = true;
                 p += 4;
                 /* lookahead */
             lookahead:
@@ -1376,7 +1376,7 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir)
             {
                 const uint8_t *q = ++p;
 
-                c = parse_digits(&p, FALSE);
+                c = parse_digits(&p, false);
                 if (c < 0 || (c >= s->capture_count && c >= re_count_captures(s))) {
                     if (!s->is_unicode) {
                         /* Annex B.1.4: accept legacy octal */
@@ -1425,7 +1425,7 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir)
         goto parse_class_atom;
     default:
     parse_class_atom:
-        c = get_class_atom(s, cr, &p, FALSE);
+        c = get_class_atom(s, cr, &p, false);
         if ((int)c < 0)
             return -1;
     normal_char:
@@ -1485,12 +1485,12 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir)
                     break;
                 }
                 p++;
-                quant_min = parse_digits(&p, TRUE);
+                quant_min = parse_digits(&p, true);
                 quant_max = quant_min;
                 if (*p == ',') {
                     p++;
                     if (lre_is_digit(*p)) {
-                        quant_max = parse_digits(&p, TRUE);
+                        quant_max = parse_digits(&p, true);
                         if (quant_max < quant_min) {
                         invalid_quant_count:
                             return re_parse_error(s, "invalid repetition count");
@@ -1508,10 +1508,10 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir)
                     return -1;
             }
         quantifier:
-            greedy = TRUE;
+            greedy = true;
             if (*p == '?') {
                 p++;
-                greedy = FALSE;
+                greedy = false;
             }
             if (last_atom_start < 0) {
                 return re_parse_error(s, "nothing to repeat");
@@ -1571,7 +1571,7 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir)
                     if (quant_max == 0) {
                         s->byte_code.size = last_atom_start;
                     } else if (quant_max == 1 || quant_max == INT32_MAX) {
-                        BOOL has_goto = (quant_max == INT32_MAX);
+                        bool has_goto = (quant_max == INT32_MAX);
                         if (dbuf_insert(&s->byte_code, last_atom_start, 5 + add_zero_advance_check))
                             goto out_of_memory;
                         s->byte_code.buf[last_atom_start] = REOP_split_goto_first +
@@ -1596,7 +1596,7 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir)
                         pos += 4;
                         if (add_zero_advance_check) {
                             s->byte_code.buf[pos++] = REOP_push_char_pos;
-                            re_emit_op(s, REOP_check_advance); 
+                            re_emit_op(s, REOP_check_advance);
                         }
                         re_emit_goto(s, REOP_loop, last_atom_start + 5);
                         re_emit_op(s, REOP_drop);
@@ -1658,7 +1658,7 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir)
     return re_parse_out_of_memory(s);
 }
 
-static int re_parse_alternative(REParseState *s, BOOL is_backward_dir)
+static int re_parse_alternative(REParseState *s, bool is_backward_dir)
 {
     const uint8_t *p;
     int ret;
@@ -1692,7 +1692,7 @@ static int re_parse_alternative(REParseState *s, BOOL is_backward_dir)
     return 0;
 }
 
-static int re_parse_disjunction(REParseState *s, BOOL is_backward_dir)
+static int re_parse_disjunction(REParseState *s, bool is_backward_dir)
 {
     int start, len, pos;
 
@@ -1781,7 +1781,7 @@ uint8_t *lre_compile(int *plen, char *error_msg, int error_msg_size,
 {
     REParseState s_s, *s = &s_s;
     int stack_size;
-    BOOL is_sticky;
+    bool is_sticky;
 
     memset(s, 0, sizeof(*s));
     s->opaque = opaque;
@@ -1817,7 +1817,7 @@ uint8_t *lre_compile(int *plen, char *error_msg, int error_msg_size,
     }
     re_emit_op_u8(s, REOP_save_start, 0);
 
-    if (re_parse_disjunction(s, FALSE)) {
+    if (re_parse_disjunction(s, false)) {
     error:
         dbuf_free(&s->byte_code);
         dbuf_free(&s->group_names);
@@ -1868,12 +1868,12 @@ uint8_t *lre_compile(int *plen, char *error_msg, int error_msg_size,
     return s->byte_code.buf;
 }
 
-static BOOL is_line_terminator(uint32_t c)
+static bool is_line_terminator(uint32_t c)
 {
     return (c == '\n' || c == '\r' || c == CP_LS || c == CP_PS);
 }
 
-static BOOL is_word_char(uint32_t c)
+static bool is_word_char(uint32_t c)
 {
     return ((c >= '0' && c <= '9') ||
             (c >= 'a' && c <= 'z') ||
@@ -2009,9 +2009,9 @@ typedef struct {
     int cbuf_type;
     int capture_count;
     int stack_size_max;
-    BOOL multi_line;
-    BOOL ignore_case;
-    BOOL is_unicode;
+    bool multi_line;
+    bool ignore_case;
+    bool is_unicode;
     void *opaque; /* used for stack overflow check */
 
     size_t state_size;
@@ -2062,7 +2062,7 @@ static int push_state(REExecContext *s,
 static intptr_t lre_exec_backtrack(REExecContext *s, uint8_t **capture,
                                    StackInt *stack, int stack_len,
                                    const uint8_t *pc, const uint8_t *cptr,
-                                   BOOL no_recurse)
+                                   bool no_recurse)
 {
     int opcode, ret;
     int cbuf_type;
@@ -2276,17 +2276,17 @@ static intptr_t lre_exec_backtrack(REExecContext *s, uint8_t **capture,
         case REOP_word_boundary:
         case REOP_not_word_boundary:
             {
-                BOOL v1, v2;
+                bool v1, v2;
                 /* char before */
                 if (cptr == s->cbuf) {
-                    v1 = FALSE;
+                    v1 = false;
                 } else {
                     PEEK_PREV_CHAR(c, cptr, s->cbuf, cbuf_type);
                     v1 = is_word_char(c);
                 }
                 /* current char */
                 if (cptr >= cbuf_end) {
-                    v2 = FALSE;
+                    v2 = false;
                 } else {
                     PEEK_CHAR(c, cptr, cbuf_end, cbuf_type);
                     v2 = is_word_char(c);
@@ -2439,7 +2439,7 @@ static intptr_t lre_exec_backtrack(REExecContext *s, uint8_t **capture,
                 q = 0;
                 for(;;) {
                     res = lre_exec_backtrack(s, capture, stack, stack_len,
-                                             pc1, cptr, TRUE);
+                                             pc1, cptr, true);
                     if (res == -1)
                         return res;
                     if (!res)
@@ -2506,7 +2506,7 @@ int lre_exec(uint8_t **capture,
     alloca_size = s->stack_size_max * sizeof(stack_buf[0]);
     stack_buf = alloca(alloca_size);
     ret = lre_exec_backtrack(s, capture, stack_buf, 0, bc_buf + RE_HEADER_LEN,
-                             cbuf + (cindex << cbuf_width), FALSE);
+                             cbuf + (cindex << cbuf_width), false);
     lre_realloc(s->opaque, s->state_stack, 0);
     return ret;
 }
@@ -2532,7 +2532,7 @@ const char *lre_get_groupnames(const uint8_t *bc_buf)
     return (const char *)(bc_buf + RE_HEADER_LEN + re_bytecode_len);
 }
 
-void lre_byte_swap(uint8_t *buf, size_t len, BOOL is_byte_swapped)
+void lre_byte_swap(uint8_t *buf, size_t len, bool is_byte_swapped)
 {
     uint8_t *p, *pe;
     uint32_t n, r, nw;
@@ -2608,9 +2608,9 @@ void lre_byte_swap(uint8_t *buf, size_t len, BOOL is_byte_swapped)
 
 #ifdef TEST
 
-BOOL lre_check_stack_overflow(void *opaque, size_t alloca_size)
+bool lre_check_stack_overflow(void *opaque, size_t alloca_size)
 {
-    return FALSE;
+    return false;
 }
 
 void *lre_realloc(void *opaque, void *ptr, size_t size)
diff --git a/lib/monoucha0/monoucha/qjs/libregexp.h b/lib/monoucha0/monoucha/qjs/libregexp.h
index c2e664a2..0b8fec52 100644
--- a/lib/monoucha0/monoucha/qjs/libregexp.h
+++ b/lib/monoucha0/monoucha/qjs/libregexp.h
@@ -24,6 +24,7 @@
 #ifndef LIBREGEXP_H
 #define LIBREGEXP_H
 
+#include <stdbool.h>
 #include <stddef.h>
 
 #include "libunicode.h"
@@ -32,8 +33,6 @@
 extern "C" {
 #endif
 
-#define LRE_BOOL  int       /* for documentation purposes */
-
 #define LRE_FLAG_GLOBAL     (1 << 0)
 #define LRE_FLAG_IGNORECASE (1 << 1)
 #define LRE_FLAG_MULTILINE  (1 << 2)
@@ -55,12 +54,12 @@ int lre_exec(uint8_t **capture,
              int cbuf_type, void *opaque);
 
 int lre_parse_escape(const uint8_t **pp, int allow_utf16);
-LRE_BOOL lre_is_space(int c);
+bool lre_is_space(int c);
 
-void lre_byte_swap(uint8_t *buf, size_t len, LRE_BOOL is_byte_swapped);
+void lre_byte_swap(uint8_t *buf, size_t len, bool is_byte_swapped);
 
 /* must be provided by the user */
-LRE_BOOL lre_check_stack_overflow(void *opaque, size_t alloca_size);
+bool lre_check_stack_overflow(void *opaque, size_t alloca_size);
 void *lre_realloc(void *opaque, void *ptr, size_t size);
 
 /* JS identifier test */
@@ -86,8 +85,6 @@ static inline int lre_js_is_ident_next(int c)
     }
 }
 
-#undef LRE_BOOL
-
 #ifdef __cplusplus
 } /* extern "C" { */
 #endif
diff --git a/lib/monoucha0/monoucha/qjs/libunicode.c b/lib/monoucha0/monoucha/qjs/libunicode.c
index e68b0cad..a621c523 100644
--- a/lib/monoucha0/monoucha/qjs/libunicode.c
+++ b/lib/monoucha0/monoucha/qjs/libunicode.c
@@ -190,7 +190,7 @@ int lre_case_conv(uint32_t *res, uint32_t c, int conv_type)
     return 1;
 }
 
-static int lre_case_folding_entry(uint32_t c, uint32_t idx, uint32_t v, BOOL is_unicode)
+static int lre_case_folding_entry(uint32_t c, uint32_t idx, uint32_t v, bool is_unicode)
 {
     uint32_t res[LRE_CC_RES_LEN_MAX];
     int len;
@@ -216,7 +216,7 @@ static int lre_case_folding_entry(uint32_t c, uint32_t idx, uint32_t v, BOOL is_
                 c = c - 'a' + 'A';
         } else {
             /* legacy regexp: to upper case if single char >= 128 */
-            len = lre_case_conv_entry(res, c, FALSE, idx, v);
+            len = lre_case_conv_entry(res, c, false, idx, v);
             if (len == 1 && res[0] >= 128)
                 c = res[0];
         }
@@ -225,7 +225,7 @@ static int lre_case_folding_entry(uint32_t c, uint32_t idx, uint32_t v, BOOL is_
 }
 
 /* JS regexp specific rules for case folding */
-int lre_canonicalize(uint32_t c, BOOL is_unicode)
+int lre_canonicalize(uint32_t c, bool is_unicode)
 {
     if (c < 128) {
         /* fast case */
@@ -241,7 +241,7 @@ int lre_canonicalize(uint32_t c, BOOL is_unicode)
     } else {
         uint32_t v, code, len;
         int idx, idx_min, idx_max;
-        
+
         idx_min = 0;
         idx_max = countof(case_conv_table1) - 1;
         while (idx_min <= idx_max) {
@@ -302,7 +302,7 @@ static int get_index_pos(uint32_t *pcode, uint32_t c,
     return (idx_min + 1) * UNICODE_INDEX_BLOCK_LEN + (v >> 21);
 }
 
-static BOOL lre_is_in_table(uint32_t c, const uint8_t *table,
+static bool lre_is_in_table(uint32_t c, const uint8_t *table,
                             const uint8_t *index_table, int index_table_len)
 {
     uint32_t code, b, bit;
@@ -311,7 +311,7 @@ static BOOL lre_is_in_table(uint32_t c, const uint8_t *table,
 
     pos = get_index_pos(&code, c, index_table, index_table_len);
     if (pos < 0)
-        return FALSE; /* outside the table */
+        return false; /* outside the table */
     p = table + pos;
     bit = 0;
     for(;;) {
@@ -337,7 +337,7 @@ static BOOL lre_is_in_table(uint32_t c, const uint8_t *table,
     }
 }
 
-BOOL lre_is_cased(uint32_t c)
+bool lre_is_cased(uint32_t c)
 {
     uint32_t v, code, len;
     int idx, idx_min, idx_max;
@@ -354,7 +354,7 @@ BOOL lre_is_cased(uint32_t c)
         } else if (c >= code + len) {
             idx_min = idx + 1;
         } else {
-            return TRUE;
+            return true;
         }
     }
     return lre_is_in_table(c, unicode_prop_Cased1_table,
@@ -362,7 +362,7 @@ BOOL lre_is_cased(uint32_t c)
                            sizeof(unicode_prop_Cased1_index) / 3);
 }
 
-BOOL lre_is_case_ignorable(uint32_t c)
+bool lre_is_case_ignorable(uint32_t c)
 {
     return lre_is_in_table(c, unicode_prop_Case_Ignorable_table,
                            unicode_prop_Case_Ignorable_index,
@@ -530,14 +530,14 @@ int cr_invert(CharRange *cr)
     return 0;
 }
 
-BOOL lre_is_id_start(uint32_t c)
+bool lre_is_id_start(uint32_t c)
 {
     return lre_is_in_table(c, unicode_prop_ID_Start_table,
                            unicode_prop_ID_Start_index,
                            sizeof(unicode_prop_ID_Start_index) / 3);
 }
 
-BOOL lre_is_id_continue(uint32_t c)
+bool lre_is_id_continue(uint32_t c)
 {
     return lre_is_id_start(c) ||
         lre_is_in_table(c, unicode_prop_ID_Continue1_table,
@@ -545,7 +545,7 @@ BOOL lre_is_id_continue(uint32_t c)
                         sizeof(unicode_prop_ID_Continue1_index) / 3);
 }
 
-BOOL lre_is_white_space(uint32_t c)
+bool lre_is_white_space(uint32_t c)
 {
     return lre_is_in_table(c, unicode_prop_White_Space_table,
                            unicode_prop_White_Space_index,
@@ -759,7 +759,7 @@ static int unicode_decomp_entry(uint32_t *res, uint32_t c,
 
 /* return the length of the decomposition (length <=
    UNICODE_DECOMP_LEN_MAX) or 0 if no decomposition */
-static int unicode_decomp_char(uint32_t *res, uint32_t c, BOOL is_compat1)
+static int unicode_decomp_char(uint32_t *res, uint32_t c, bool is_compat1)
 {
     uint32_t v, type, is_compat, code, len;
     int idx_min, idx_max, idx;
@@ -953,7 +953,7 @@ int unicode_normalize(uint32_t **pdst, const uint32_t *src, int src_len,
                       void *opaque, DynBufReallocFunc *realloc_func)
 {
     int *buf, buf_len, i, p, starter_pos, cc, last_cc, out_len;
-    BOOL is_compat;
+    bool is_compat;
     DynBuf dbuf_s, *dbuf = &dbuf_s;
 
     is_compat = n_type >> 1;
@@ -1053,14 +1053,14 @@ static int unicode_find_name(const char *name_table, const char *name)
 /* 'cr' must be initialized and empty. Return 0 if OK, -1 if error, -2
    if not found */
 int unicode_script(CharRange *cr,
-                   const char *script_name, BOOL is_ext)
+                   const char *script_name, bool is_ext)
 {
     int script_idx;
     const uint8_t *p, *p_end;
     uint32_t c, c1, b, n, v, v_len, i, type;
     CharRange cr1_s = { 0 }, *cr1 = NULL;
     CharRange cr2_s = { 0 }, *cr2 = &cr2_s;
-    BOOL is_common;
+    bool is_common;
 
     script_idx = unicode_find_name(unicode_script_name_table, script_name);
     if (script_idx < 0)
@@ -1380,7 +1380,7 @@ static void cr_sort_and_remove_overlap(CharRange *cr)
 
 /* canonicalize a character set using the JS regex case folding rules
    (see lre_canonicalize()) */
-int cr_regexp_canonicalize(CharRange *cr, BOOL is_unicode)
+int cr_regexp_canonicalize(CharRange *cr, bool is_unicode)
 {
     CharRange cr_inter, cr_mask, cr_result, cr_sub;
     uint32_t v, code, len, i, idx, start, end, c, d_start, d_end, d;
@@ -1542,11 +1542,13 @@ static int unicode_prop_ops(CharRange *cr, ...)
         }
     }
  done:
+    va_end(ap);
     assert(stack_len == 1);
     ret = cr_copy(cr, &stack[0]);
     cr_free(&stack[0]);
     return ret;
  fail:
+    va_end(ap);
     for(i = 0; i < stack_len; i++)
         cr_free(&stack[i]);
     return -1;
diff --git a/lib/monoucha0/monoucha/qjs/libunicode.h b/lib/monoucha0/monoucha/qjs/libunicode.h
index 00400ffa..8e6f2a01 100644
--- a/lib/monoucha0/monoucha/qjs/libunicode.h
+++ b/lib/monoucha0/monoucha/qjs/libunicode.h
@@ -24,6 +24,7 @@
 #ifndef LIBUNICODE_H
 #define LIBUNICODE_H
 
+#include <stdbool.h>
 #include <stddef.h>
 #include <inttypes.h>
 
@@ -31,8 +32,6 @@
 extern "C" {
 #endif
 
-#define LRE_BOOL  int       /* for documentation purposes */
-
 #define LRE_CC_RES_LEN_MAX 3
 
 typedef enum {
@@ -43,9 +42,9 @@ typedef enum {
 } UnicodeNormalizationEnum;
 
 int lre_case_conv(uint32_t *res, uint32_t c, int conv_type);
-int lre_canonicalize(uint32_t c, LRE_BOOL is_unicode);
-LRE_BOOL lre_is_cased(uint32_t c);
-LRE_BOOL lre_is_case_ignorable(uint32_t c);
+int lre_canonicalize(uint32_t c, bool is_unicode);
+bool lre_is_cased(uint32_t c);
+bool lre_is_case_ignorable(uint32_t c);
 
 /* char ranges */
 
@@ -103,11 +102,11 @@ int cr_op(CharRange *cr, const uint32_t *a_pt, int a_len,
           const uint32_t *b_pt, int b_len, int op);
 
 int cr_invert(CharRange *cr);
-int cr_regexp_canonicalize(CharRange *cr, LRE_BOOL is_unicode);
+int cr_regexp_canonicalize(CharRange *cr, bool is_unicode);
 
-LRE_BOOL lre_is_id_start(uint32_t c);
-LRE_BOOL lre_is_id_continue(uint32_t c);
-LRE_BOOL lre_is_white_space(uint32_t c);
+bool lre_is_id_start(uint32_t c);
+bool lre_is_id_continue(uint32_t c);
+bool lre_is_white_space(uint32_t c);
 
 int unicode_normalize(uint32_t **pdst, const uint32_t *src, int src_len,
                       UnicodeNormalizationEnum n_type,
@@ -116,12 +115,10 @@ int unicode_normalize(uint32_t **pdst, const uint32_t *src, int src_len,
 /* Unicode character range functions */
 
 int unicode_script(CharRange *cr,
-                   const char *script_name, LRE_BOOL is_ext);
+                   const char *script_name, bool is_ext);
 int unicode_general_category(CharRange *cr, const char *gc_name);
 int unicode_prop(CharRange *cr, const char *prop_name);
 
-#undef LRE_BOOL
-
 #ifdef __cplusplus
 } /* extern "C" { */
 #endif
diff --git a/lib/monoucha0/monoucha/qjs/quickjs-opcode.h b/lib/monoucha0/monoucha/qjs/quickjs-opcode.h
index 09dacb3e..42c3faee 100644
--- a/lib/monoucha0/monoucha/qjs/quickjs-opcode.h
+++ b/lib/monoucha0/monoucha/qjs/quickjs-opcode.h
@@ -111,6 +111,7 @@ DEF(         return, 1, 1, 0, none)
 DEF(   return_undef, 1, 0, 0, none)
 DEF(check_ctor_return, 1, 1, 2, none)
 DEF(     check_ctor, 1, 0, 0, none)
+DEF(      init_ctor, 1, 0, 1, none)
 DEF(    check_brand, 1, 2, 2, none) /* this_obj func -> this_obj func */
 DEF(      add_brand, 1, 2, 0, none) /* this_obj home_obj -> */
 DEF(   return_async, 1, 1, 0, none)
@@ -364,11 +365,6 @@ DEF(        is_null, 1, 1, 1, none)
 DEF(typeof_is_undefined, 1, 1, 1, none)
 DEF( typeof_is_function, 1, 1, 1, none)
 
-// order matters, see non-IC counterparts
-DEF(      get_field_ic, 5, 1, 1, none)
-DEF(     get_field2_ic, 5, 1, 2, none)
-DEF(      put_field_ic, 5, 2, 0, none)
-
 #undef DEF
 #undef def
 #endif  /* DEF */
diff --git a/lib/monoucha0/monoucha/qjs/quickjs.c b/lib/monoucha0/monoucha/qjs/quickjs.c
index e8a5f6fc..a7dcb2c2 100644
--- a/lib/monoucha0/monoucha/qjs/quickjs.c
+++ b/lib/monoucha0/monoucha/qjs/quickjs.c
@@ -1,10 +1,10 @@
 /*
  * QuickJS Javascript Engine
  *
- * Copyright (c) 2017-2021 Fabrice Bellard
- * Copyright (c) 2017-2021 Charlie Gordon
- * Copyright (c) 2023 Ben Noordhuis
- * Copyright (c) 2023 Saúl Ibarra Corretgé
+ * Copyright (c) 2017-2024 Fabrice Bellard
+ * Copyright (c) 2017-2024 Charlie Gordon
+ * Copyright (c) 2023-2025 Ben Noordhuis
+ * Copyright (c) 2023-2025 Saúl Ibarra Corretgé
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -36,6 +36,9 @@
 #include <timezoneapi.h>
 #endif
 #endif
+#if defined(_WIN32)
+#include <intrin.h>
+#endif
 #include <time.h>
 #include <fenv.h>
 #include <math.h>
@@ -74,29 +77,8 @@
 #define __extension__
 #endif
 
-// Debug trace system: the debug output will be produced to the dump stream (currently
-// stdout) if qjs is invoked with -D<bitmask> with the corresponding bit set.
-
 #ifndef NDEBUG
-#define DUMP_BYTECODE_FINAL   0x01  /* dump pass 3 final byte code */
-#define DUMP_BYTECODE_PASS2   0x02  /* dump pass 2 code */
-#define DUMP_BYTECODE_PASS1   0x04  /* dump pass 1 code */
-#define DUMP_BYTECODE_HEX     0x10  /* dump bytecode in hex */
-#define DUMP_BYTECODE_PC2LINE 0x20  /* dump line number table */
-#define DUMP_BYTECODE_STACK   0x40  /* dump compute_stack_size */
-#define DUMP_BYTECODE_STEP    0x80  /* dump executed bytecode */
-#define DUMP_READ_OBJECT     0x100  /* dump the marshalled objects at load time */
-#define DUMP_FREE            0x200  /* dump every object free */
-#define DUMP_GC              0x400  /* dump the occurrence of the automatic GC */
-#define DUMP_GC_FREE         0x800  /* dump objects freed by the GC */
-#define DUMP_MODULE_RESOLVE 0x1000  /* dump module resolution steps */
-#define DUMP_PROMISE        0x2000  /* dump promise steps */
-#define DUMP_LEAKS          0x4000  /* dump leaked objects and strings in JS_FreeRuntime */
-#define DUMP_ATOM_LEAKS     0x8000  /* dump leaked atoms in JS_FreeRuntime */
-#define DUMP_MEM           0x10000  /* dump memory usage in JS_FreeRuntime */
-#define DUMP_OBJECTS       0x20000  /* dump objects in JS_FreeRuntime */
-#define DUMP_ATOMS         0x40000  /* dump atoms in JS_FreeRuntime */
-#define DUMP_SHAPES        0x80000  /* dump shapes in JS_FreeRuntime */
+#define ENABLE_DUMPS
 #endif
 
 //#define FORCE_GC_AT_MALLOC  /* test the GC by forcing it before each object allocation */
@@ -116,6 +98,29 @@ const char* JS_GetVersion(void) {
 #undef STRINFIGY_
 #undef STRINGIFY
 
+static inline JSValueConst *vc(JSValue *vals)
+{
+    return (JSValueConst *)vals;
+}
+
+static inline JSValue unsafe_unconst(JSValueConst v)
+{
+#ifdef JS_CHECK_JSVALUE
+    return (JSValue)v;
+#else
+    return v;
+#endif
+}
+
+static inline JSValueConst safe_const(JSValue v)
+{
+#ifdef JS_CHECK_JSVALUE
+    return (JSValueConst)v;
+#else
+    return v;
+#endif
+}
+
 enum {
     /* classid tag        */    /* union usage   | properties */
     JS_CLASS_OBJECT = 1,        /* must be first */
@@ -260,7 +265,7 @@ struct JSRuntime {
     struct list_head tmp_hook_obj_list;
     JSGCPhaseEnum gc_phase : 8;
     size_t malloc_gc_threshold;
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
     struct list_head string_list; /* list of JSString.link */
 #endif
     /* stack limitation */
@@ -270,11 +275,11 @@ struct JSRuntime {
 
     JSValue current_exception;
     /* true if inside an out of memory error, to avoid recursing */
-    BOOL in_out_of_memory : 8;
-    /* and likewise if inside Error.prepareStackTrace() */
-    BOOL in_prepare_stack_trace : 8;
+    bool in_out_of_memory;
+    /* true if inside build_backtrace, to avoid recursing */
+    bool in_build_stack_trace;
     /* true if inside JS_FreeRuntime */
-    BOOL in_free : 8;
+    bool in_free;
 
     struct JSStackFrame *current_stack_frame;
 
@@ -295,7 +300,7 @@ struct JSRuntime {
     /* used to allocate, free and clone SharedArrayBuffers */
     JSSharedArrayBufferFunctions sab_funcs;
 
-    BOOL can_block : 8; /* TRUE if Atomics.wait can block */
+    bool can_block; /* true if Atomics.wait can block */
     uint32_t dump_flags : 24;
 
     /* Shape hash table */
@@ -419,8 +424,9 @@ struct JSContext {
     JSValue promise_ctor;
     JSValue native_error_proto[JS_NATIVE_ERROR_COUNT];
     JSValue error_ctor;
+    JSValue error_back_trace;
     JSValue error_prepare_stack;
-    int error_stack_trace_limit;
+    JSValue error_stack_trace_limit;
     JSValue iterator_ctor;
     JSValue iterator_proto;
     JSValue async_iterator_proto;
@@ -441,12 +447,12 @@ struct JSContext {
     struct list_head loaded_modules; /* list of JSModuleDef.link */
 
     /* if NULL, RegExp compilation is not supported */
-    JSValue (*compile_regexp)(JSContext *ctx, JSValue pattern,
-                              JSValue flags);
+    JSValue (*compile_regexp)(JSContext *ctx, JSValueConst pattern,
+                              JSValueConst flags);
     /* if NULL, eval is not supported */
-    JSValue (*eval_internal)(JSContext *ctx, JSValue this_obj,
+    JSValue (*eval_internal)(JSContext *ctx, JSValueConst this_obj,
                              const char *input, size_t input_len,
-                             const char *filename, int flags, int scope_idx);
+                             const char *filename, int line, int flags, int scope_idx);
     void *user_opaque;
 };
 
@@ -503,15 +509,21 @@ struct JSString {
     uint8_t atom_type : 2; /* != 0 if atom, JS_ATOM_TYPE_x */
     uint32_t hash_next; /* atom_index for JS_ATOM_TYPE_SYMBOL */
     JSWeakRefRecord *first_weak_ref;
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
     struct list_head link; /* string list */
 #endif
-    union {
-        __extension__ uint8_t str8[0]; /* 8 bit strings will get an extra null terminator */
-        __extension__ uint16_t str16[0];
-    } u;
 };
 
+static inline uint8_t *str8(JSString *p)
+{
+    return (void *)(p + 1);
+}
+
+static inline uint16_t *str16(JSString *p)
+{
+    return (void *)(p + 1);
+}
+
 typedef struct JSClosureVar {
     uint8_t is_local : 1;
     uint8_t is_arg : 1;
@@ -519,7 +531,7 @@ typedef struct JSClosureVar {
     uint8_t is_lexical : 1;
     uint8_t var_kind : 4; /* see JSVarKindEnum */
     /* 8 bits available */
-    uint16_t var_idx; /* is_local = TRUE: index to a normal variable of the
+    uint16_t var_idx; /* is_local = true: index to a normal variable of the
                     parent function. otherwise: index to a closure
                     variable of the parent function */
     JSAtom var_name;
@@ -591,79 +603,6 @@ typedef enum JSFunctionKindEnum {
     JS_FUNC_ASYNC_GENERATOR = (JS_FUNC_GENERATOR | JS_FUNC_ASYNC),
 } JSFunctionKindEnum;
 
-#define IC_CACHE_ITEM_CAPACITY 4
-
-typedef struct JSInlineCacheRingSlot {
-    /* SoA for space optimization: 56 bytes */
-    JSShape* shape[IC_CACHE_ITEM_CAPACITY];
-    uint32_t prop_offset[IC_CACHE_ITEM_CAPACITY];
-    JSAtom atom;
-    uint8_t index;
-} JSInlineCacheRingSlot;
-
-typedef struct JSInlineCacheHashSlot {
-    JSAtom atom;
-    uint32_t index;
-    struct JSInlineCacheHashSlot *next;
-} JSInlineCacheHashSlot;
-
-typedef struct JSInlineCache {
-    uint32_t count;
-    uint32_t capacity;
-    uint32_t hash_bits;
-    JSInlineCacheHashSlot **hash;
-    JSInlineCacheRingSlot *cache;
-} JSInlineCache;
-
-#define INLINE_CACHE_MISS ((uint32_t)-1) // sentinel
-
-// This is a struct so we don't tie up two argument registers in calls to
-// JS_GetPropertyInternal2 and JS_SetPropertyInternal2 in the common case
-// where there is no IC and therefore no offset to update.
-typedef struct JSInlineCacheUpdate {
-    JSInlineCache *ic;
-    uint32_t offset;
-} JSInlineCacheUpdate;
-
-static JSInlineCache *init_ic(JSContext *ctx);
-static int rebuild_ic(JSContext *ctx, JSInlineCache *ic);
-static int resize_ic_hash(JSContext *ctx, JSInlineCache *ic);
-static int free_ic(JSRuntime *rt, JSInlineCache *ic);
-static void add_ic_slot(JSContext *ctx, JSInlineCacheUpdate *icu,
-                        JSAtom atom, JSObject *object, uint32_t prop_offset);
-
-static uint32_t get_ic_prop_offset(const JSInlineCacheUpdate *icu,
-                                   JSShape *shape)
-{
-    uint32_t i, cache_offset = icu->offset;
-    JSInlineCache *ic = icu->ic;
-    JSInlineCacheRingSlot *cr;
-    JSShape *shape_slot;
-    assert(cache_offset < ic->capacity);
-    cr = ic->cache + cache_offset;
-    i = cr->index;
-    for (;;) {
-        shape_slot = *(cr->shape + i);
-        if (likely(shape_slot == shape)) {
-            cr->index = i;
-            return cr->prop_offset[i];
-        }
-
-        i = (i + 1) % countof(cr->shape);
-        if (unlikely(i == cr->index)) {
-            break;
-        }
-  }
-
-  return INLINE_CACHE_MISS;
-}
-
-static force_inline JSAtom get_ic_atom(JSInlineCache *ic, uint32_t cache_offset)
-{
-    assert(cache_offset < ic->capacity);
-    return ic->cache[cache_offset].atom;
-}
-
 typedef struct JSFunctionBytecode {
     JSGCObjectHeader header; /* must come first */
     uint8_t is_strict_mode : 1;
@@ -692,7 +631,6 @@ typedef struct JSFunctionBytecode {
     JSValue *cpool; /* constant pool (self pointer) */
     int cpool_count;
     int closure_var_count;
-    JSInlineCache *ic;
     JSAtom filename;
     int line_num;
     int col_num;
@@ -729,7 +667,7 @@ typedef enum JSIteratorHelperKindEnum {
 
 typedef struct JSForInIterator {
     JSValue obj;
-    BOOL is_array;
+    bool is_array;
     uint32_t array_length;
     uint32_t idx;
 } JSForInIterator;
@@ -763,13 +701,13 @@ typedef struct JSTypedArray {
     JSObject *buffer; /* based array buffer */
     uint32_t offset; /* byte offset in the array buffer */
     uint32_t length; /* byte length in the array buffer */
-    BOOL track_rab; /* auto-track length of backing array buffer */
+    bool track_rab; /* auto-track length of backing array buffer */
 } JSTypedArray;
 
 typedef struct JSAsyncFunctionState {
     JSValue this_val; /* 'this' generator argument */
     int argc; /* number of function arguments */
-    BOOL throw_flag; /* used to throw an exception in JS_CallInternal() */
+    bool throw_flag; /* used to throw an exception in JS_CallInternal() */
     JSStackFrame frame;
 } JSAsyncFunctionState;
 
@@ -778,7 +716,7 @@ typedef struct JSAsyncFunctionState {
 typedef struct JSAsyncFunctionData {
     JSGCObjectHeader header; /* must come first */
     JSValue resolving_funcs[2];
-    BOOL is_active; /* true if the async function state is valid */
+    bool is_active; /* true if the async function state is valid */
     JSAsyncFunctionState func_state;
 } JSAsyncFunctionData;
 
@@ -849,9 +787,9 @@ struct JSModuleDef {
     JSValue module_ns;
     JSValue func_obj; /* only used for JS modules */
     JSModuleInitFunc *init_func; /* only used for C modules */
-    BOOL has_tla : 8; /* true if func_obj contains await */
-    BOOL resolved : 8;
-    BOOL func_created : 8;
+    bool has_tla; /* true if func_obj contains await */
+    bool resolved;
+    bool func_created;
     JSModuleStatus status : 8;
     /* temp use during js_module_link() & js_module_evaluate() */
     int dfs_index, dfs_ancestor_index;
@@ -861,14 +799,14 @@ struct JSModuleDef {
     int async_parent_modules_count;
     int async_parent_modules_size;
     int pending_async_dependencies;
-    BOOL async_evaluation;
+    bool async_evaluation;
     int64_t async_evaluation_timestamp;
     JSModuleDef *cycle_root;
     JSValue promise; /* corresponds to spec field: capability */
     JSValue resolving_funcs[2]; /* corresponds to spec field: capability */
     /* true if evaluation yielded an exception. It is saved in
        eval_exception */
-    BOOL eval_has_exception : 8;
+    bool eval_has_exception;
     JSValue eval_exception;
     JSValue meta_obj; /* for import.meta */
 };
@@ -939,10 +877,10 @@ struct JSObject {
 
             uint8_t extensible : 1;
             uint8_t free_mark : 1; /* only used when freeing objects with cycles */
-            uint8_t is_exotic : 1; /* TRUE if object has exotic property handlers */
-            uint8_t fast_array : 1; /* TRUE if u.array is used for get/put (for JS_CLASS_ARRAY, JS_CLASS_ARGUMENTS and typed arrays) */
-            uint8_t is_constructor : 1; /* TRUE if object is a constructor function */
-            uint8_t is_uncatchable_error : 1; /* if TRUE, error is not catchable */
+            uint8_t is_exotic : 1; /* true if object has exotic property handlers */
+            uint8_t fast_array : 1; /* true if u.array is used for get/put (for JS_CLASS_ARRAY, JS_CLASS_ARGUMENTS and typed arrays) */
+            uint8_t is_constructor : 1; /* true if object is a constructor function */
+            uint8_t is_uncatchable_error : 1; /* if true, error is not catchable */
             uint8_t tmp_mark : 1; /* used in JS_WriteObjectRec() */
             uint8_t is_HTMLDDA : 1; /* specific annex B IsHtmlDDA behavior */
             uint16_t class_id; /* see JS_CLASS_x */
@@ -1020,7 +958,7 @@ typedef struct JSCallSiteData {
     JSValue filename;
     JSValue func;
     JSValue func_name;
-    BOOL native;
+    bool native;
     int line_num;
     int col_num;
 } JSCallSiteData;
@@ -1076,91 +1014,92 @@ static JSAtom __JS_NewAtomInit(JSRuntime *rt, const char *str, int len,
                                int atom_type);
 static void JS_FreeAtomStruct(JSRuntime *rt, JSAtomStruct *p);
 static void free_function_bytecode(JSRuntime *rt, JSFunctionBytecode *b);
-static JSValue js_call_c_function(JSContext *ctx, JSValue func_obj,
-                                  JSValue this_obj,
-                                  int argc, JSValue *argv, int flags);
-static JSValue js_call_bound_function(JSContext *ctx, JSValue func_obj,
-                                      JSValue this_obj,
-                                      int argc, JSValue *argv, int flags);
-static JSValue JS_CallInternal(JSContext *ctx, JSValue func_obj,
-                               JSValue this_obj, JSValue new_target,
-                               int argc, JSValue *argv, int flags);
+static JSValue js_call_c_function(JSContext *ctx, JSValueConst func_obj,
+                                  JSValueConst this_obj,
+                                  int argc, JSValueConst *argv, int flags);
+static JSValue js_call_bound_function(JSContext *ctx, JSValueConst func_obj,
+                                      JSValueConst this_obj,
+                                      int argc, JSValueConst *argv, int flags);
+static JSValue JS_CallInternal(JSContext *ctx, JSValueConst func_obj,
+                               JSValueConst this_obj, JSValueConst new_target,
+                               int argc, JSValueConst *argv, int flags);
 static JSValue JS_CallConstructorInternal(JSContext *ctx,
-                                          JSValue func_obj,
-                                          JSValue new_target,
-                                          int argc, JSValue *argv, int flags);
-static JSValue JS_CallFree(JSContext *ctx, JSValue func_obj, JSValue this_obj,
-                           int argc, JSValue *argv);
+                                          JSValueConst func_obj,
+                                          JSValueConst new_target,
+                                          int argc, JSValueConst *argv, int flags);
+static JSValue JS_CallFree(JSContext *ctx, JSValue func_obj, JSValueConst this_obj,
+                           int argc, JSValueConst *argv);
 static JSValue JS_InvokeFree(JSContext *ctx, JSValue this_val, JSAtom atom,
-                             int argc, JSValue *argv);
+                             int argc, JSValueConst *argv);
 static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen,
-                                            JSValue val, BOOL is_array_ctor);
-static JSValue JS_EvalObject(JSContext *ctx, JSValue this_obj,
-                             JSValue val, int flags, int scope_idx);
-JSValue __attribute__((format(printf, 2, 3))) JS_ThrowInternalError(JSContext *ctx, const char *fmt, ...);
+                                            JSValue val, bool is_array_ctor);
+static JSValue JS_EvalObject(JSContext *ctx, JSValueConst this_obj,
+                             JSValueConst val, int flags, int scope_idx);
+JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowInternalError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...);
 
-static __maybe_unused void JS_DumpString(JSRuntime *rt, const JSString *p);
+static __maybe_unused void JS_DumpString(JSRuntime *rt, JSString *p);
 static __maybe_unused void JS_DumpObjectHeader(JSRuntime *rt);
 static __maybe_unused void JS_DumpObject(JSRuntime *rt, JSObject *p);
 static __maybe_unused void JS_DumpGCObject(JSRuntime *rt, JSGCObjectHeader *p);
-static __maybe_unused void JS_DumpValue(JSRuntime *rt, JSValue val);
+static __maybe_unused void JS_DumpValue(JSRuntime *rt, JSValueConst val);
 static __maybe_unused void JS_DumpAtoms(JSRuntime *rt);
 static __maybe_unused void JS_DumpShapes(JSRuntime *rt);
 
-static JSValue js_function_apply(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv, int magic);
-static void js_array_finalizer(JSRuntime *rt, JSValue val);
-static void js_array_mark(JSRuntime *rt, JSValue val,
+static JSValue js_function_apply(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv, int magic);
+static void js_array_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_array_mark(JSRuntime *rt, JSValueConst val,
                           JS_MarkFunc *mark_func);
-static void js_object_data_finalizer(JSRuntime *rt, JSValue val);
-static void js_object_data_mark(JSRuntime *rt, JSValue val,
+static void js_object_data_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_object_data_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_c_function_finalizer(JSRuntime *rt, JSValue val);
-static void js_c_function_mark(JSRuntime *rt, JSValue val,
+static void js_c_function_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_c_function_mark(JSRuntime *rt, JSValueConst val,
                                JS_MarkFunc *mark_func);
-static void js_bytecode_function_finalizer(JSRuntime *rt, JSValue val);
-static void js_bytecode_function_mark(JSRuntime *rt, JSValue val,
+static void js_bytecode_function_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_bytecode_function_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_bound_function_finalizer(JSRuntime *rt, JSValue val);
-static void js_bound_function_mark(JSRuntime *rt, JSValue val,
+static void js_bound_function_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_bound_function_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_for_in_iterator_finalizer(JSRuntime *rt, JSValue val);
-static void js_for_in_iterator_mark(JSRuntime *rt, JSValue val,
+static void js_for_in_iterator_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_for_in_iterator_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_regexp_finalizer(JSRuntime *rt, JSValue val);
-static void js_array_buffer_finalizer(JSRuntime *rt, JSValue val);
-static void js_typed_array_finalizer(JSRuntime *rt, JSValue val);
-static void js_typed_array_mark(JSRuntime *rt, JSValue val,
+static void js_regexp_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_array_buffer_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_typed_array_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_typed_array_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_proxy_finalizer(JSRuntime *rt, JSValue val);
-static void js_proxy_mark(JSRuntime *rt, JSValue val,
+static void js_proxy_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_proxy_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_map_finalizer(JSRuntime *rt, JSValue val);
-static void js_map_mark(JSRuntime *rt, JSValue val,
+static void js_map_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_map_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_map_iterator_finalizer(JSRuntime *rt, JSValue val);
-static void js_map_iterator_mark(JSRuntime *rt, JSValue val,
+static void js_map_iterator_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_map_iterator_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_array_iterator_finalizer(JSRuntime *rt, JSValue val);
-static void js_array_iterator_mark(JSRuntime *rt, JSValue val,
+static void js_array_iterator_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_array_iterator_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_iterator_helper_finalizer(JSRuntime *rt, JSValue val);
-static void js_iterator_helper_mark(JSRuntime *rt, JSValue val,
+static void js_iterator_helper_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_iterator_helper_mark(JSRuntime *rt, JSValueConst val,
                                     JS_MarkFunc *mark_func);
-static void js_iterator_wrap_finalizer(JSRuntime *rt, JSValue val);
-static void js_iterator_wrap_mark(JSRuntime *rt, JSValue val,
+static void js_iterator_wrap_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_iterator_wrap_mark(JSRuntime *rt, JSValueConst val,
                                   JS_MarkFunc *mark_func);
-static void js_regexp_string_iterator_finalizer(JSRuntime *rt, JSValue val);
-static void js_regexp_string_iterator_mark(JSRuntime *rt, JSValue val,
+static void js_regexp_string_iterator_finalizer(JSRuntime *rt,
+                                                JSValueConst val);
+static void js_regexp_string_iterator_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_generator_finalizer(JSRuntime *rt, JSValue obj);
-static void js_generator_mark(JSRuntime *rt, JSValue val,
+static void js_generator_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_generator_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_promise_finalizer(JSRuntime *rt, JSValue val);
-static void js_promise_mark(JSRuntime *rt, JSValue val,
+static void js_promise_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_promise_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
-static void js_promise_resolve_function_finalizer(JSRuntime *rt, JSValue val);
-static void js_promise_resolve_function_mark(JSRuntime *rt, JSValue val,
+static void js_promise_resolve_function_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_promise_resolve_function_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func);
 
 #define HINT_STRING  0
@@ -1174,9 +1113,9 @@ static int JS_ToInt32Free(JSContext *ctx, int32_t *pres, JSValue val);
 static int JS_ToFloat64Free(JSContext *ctx, double *pres, JSValue val);
 static int JS_ToUint8ClampFree(JSContext *ctx, int32_t *pres, JSValue val);
 static JSValue js_new_string8_len(JSContext *ctx, const char *buf, int len);
-static JSValue js_compile_regexp(JSContext *ctx, JSValue pattern,
-                                 JSValue flags);
-static JSValue js_regexp_constructor_internal(JSContext *ctx, JSValue ctor,
+static JSValue js_compile_regexp(JSContext *ctx, JSValueConst pattern,
+                                 JSValueConst flags);
+static JSValue js_regexp_constructor_internal(JSContext *ctx, JSValueConst ctor,
                                               JSValue pattern, JSValue bc);
 static void gc_decref(JSRuntime *rt);
 static int JS_NewClass1(JSRuntime *rt, JSClassID class_id,
@@ -1190,17 +1129,16 @@ typedef enum JSStrictEqModeEnum {
     JS_EQ_SAME_VALUE_ZERO,
 } JSStrictEqModeEnum;
 
-static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
+static bool js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
                           JSStrictEqModeEnum eq_mode);
-static BOOL js_strict_eq(JSContext *ctx, JSValue op1, JSValue op2);
-static BOOL js_same_value(JSContext *ctx, JSValue op1, JSValue op2);
-static BOOL js_same_value_zero(JSContext *ctx, JSValue op1, JSValue op2);
-static JSValue JS_ToObject(JSContext *ctx, JSValue val);
+static bool js_strict_eq(JSContext *ctx, JSValue op1, JSValue op2);
+static bool js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2);
+static bool js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op2);
 static JSValue JS_ToObjectFree(JSContext *ctx, JSValue val);
 static JSProperty *add_property(JSContext *ctx,
                                 JSObject *p, JSAtom prop, int prop_flags);
 static JSValue JS_NewBigInt(JSContext *ctx);
-static inline bf_t *JS_GetBigInt(JSValue val)
+static inline bf_t *JS_GetBigInt(JSValueConst val)
 {
     JSBigInt *p = JS_VALUE_GET_PTR(val);
     return &p->num;
@@ -1208,83 +1146,85 @@ static inline bf_t *JS_GetBigInt(JSValue val)
 static JSValue JS_CompactBigInt1(JSContext *ctx, JSValue val);
 static JSValue JS_CompactBigInt(JSContext *ctx, JSValue val);
 static int JS_ToBigInt64Free(JSContext *ctx, int64_t *pres, JSValue val);
-static bf_t *JS_ToBigInt(JSContext *ctx, bf_t *buf, JSValue val);
-static bf_t *JS_ToBigInt1(JSContext *ctx, bf_t *buf, JSValue val);
+static bf_t *JS_ToBigInt(JSContext *ctx, bf_t *buf, JSValueConst val);
+static bf_t *JS_ToBigInt1(JSContext *ctx, bf_t *buf, JSValueConst val);
 static void JS_FreeBigInt(JSContext *ctx, bf_t *a, bf_t *buf);
 JSValue JS_ThrowOutOfMemory(JSContext *ctx);
 static JSValue JS_ThrowTypeErrorRevokedProxy(JSContext *ctx);
-static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValue obj);
-static int js_proxy_setPrototypeOf(JSContext *ctx, JSValue obj,
-                                   JSValue proto_val, BOOL throw_flag);
-static int js_proxy_isExtensible(JSContext *ctx, JSValue obj);
-static int js_proxy_preventExtensions(JSContext *ctx, JSValue obj);
-static int js_proxy_isArray(JSContext *ctx, JSValue obj);
+static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValueConst obj);
+static int js_proxy_setPrototypeOf(JSContext *ctx, JSValueConst obj,
+                                   JSValueConst proto_val, bool throw_flag);
+static int js_proxy_isExtensible(JSContext *ctx, JSValueConst obj);
+static int js_proxy_preventExtensions(JSContext *ctx, JSValueConst obj);
+static int js_proxy_isArray(JSContext *ctx, JSValueConst obj);
 static int JS_CreateProperty(JSContext *ctx, JSObject *p,
-                             JSAtom prop, JSValue val,
-                             JSValue getter, JSValue setter,
+                             JSAtom prop, JSValueConst val,
+                             JSValueConst getter, JSValueConst setter,
                              int flags);
-static int js_string_memcmp(const JSString *p1, const JSString *p2, int len);
+static int js_string_memcmp(JSString *p1, JSString *p2, int len);
 static void reset_weak_ref(JSRuntime *rt, JSWeakRefRecord **first_weak_ref);
-static BOOL is_valid_weakref_target(JSValue val);
-static void insert_weakref_record(JSValue target, struct JSWeakRefRecord *wr);
+static bool is_valid_weakref_target(JSValueConst val);
+static void insert_weakref_record(JSValueConst target,
+                                  struct JSWeakRefRecord *wr);
 static JSValue js_array_buffer_constructor3(JSContext *ctx,
-                                            JSValue new_target,
+                                            JSValueConst new_target,
                                             uint64_t len, uint64_t *max_len,
                                             JSClassID class_id,
                                             uint8_t *buf,
                                             JSFreeArrayBufferDataFunc *free_func,
-                                            void *opaque, BOOL alloc_flag);
+                                            void *opaque, bool alloc_flag);
 static void js_array_buffer_free(JSRuntime *rt, void *opaque, void *ptr);
-static JSArrayBuffer *js_get_array_buffer(JSContext *ctx, JSValue obj);
-static BOOL array_buffer_is_resizable(const JSArrayBuffer *abuf);
+static JSArrayBuffer *js_get_array_buffer(JSContext *ctx, JSValueConst obj);
+static bool array_buffer_is_resizable(const JSArrayBuffer *abuf);
 static JSValue js_typed_array_constructor(JSContext *ctx,
-                                          JSValue this_val,
-                                          int argc, JSValue *argv,
+                                          JSValueConst this_val,
+                                          int argc, JSValueConst *argv,
                                           int classid);
 static JSValue js_typed_array_constructor_ta(JSContext *ctx,
-                                             JSValue new_target,
-                                             JSValue src_obj,
+                                             JSValueConst new_target,
+                                             JSValueConst src_obj,
                                              int classid, uint32_t len);
-static BOOL typed_array_is_oob(JSObject *p);
+static bool is_typed_array(JSClassID class_id);
+static bool typed_array_is_oob(JSObject *p);
 static uint32_t typed_array_get_length(JSContext *ctx, JSObject *p);
 static JSValue JS_ThrowTypeErrorDetachedArrayBuffer(JSContext *ctx);
 static JSValue JS_ThrowTypeErrorArrayBufferOOB(JSContext *ctx);
 static JSVarRef *get_var_ref(JSContext *ctx, JSStackFrame *sf, int var_idx,
-                             BOOL is_arg);
-static JSValue js_generator_function_call(JSContext *ctx, JSValue func_obj,
-                                          JSValue this_obj,
-                                          int argc, JSValue *argv,
+                             bool is_arg);
+static JSValue js_generator_function_call(JSContext *ctx, JSValueConst func_obj,
+                                          JSValueConst this_obj,
+                                          int argc, JSValueConst *argv,
                                           int flags);
-static void js_async_function_resolve_finalizer(JSRuntime *rt, JSValue val);
-static void js_async_function_resolve_mark(JSRuntime *rt, JSValue val,
+static void js_async_function_resolve_finalizer(JSRuntime *rt,
+                                                JSValueConst val);
+static void js_async_function_resolve_mark(JSRuntime *rt, JSValueConst val,
                                            JS_MarkFunc *mark_func);
-static JSValue JS_EvalInternal(JSContext *ctx, JSValue this_obj,
+static JSValue JS_EvalInternal(JSContext *ctx, JSValueConst this_obj,
                                const char *input, size_t input_len,
-                               const char *filename, int flags, int scope_idx);
+                               const char *filename, int line, int flags, int scope_idx);
 static void js_free_module_def(JSContext *ctx, JSModuleDef *m);
 static void js_mark_module_def(JSRuntime *rt, JSModuleDef *m,
                                JS_MarkFunc *mark_func);
 static JSValue js_import_meta(JSContext *ctx);
-static JSValue js_dynamic_import(JSContext *ctx, JSValue specifier);
+static JSValue js_dynamic_import(JSContext *ctx, JSValueConst specifier);
 static void free_var_ref(JSRuntime *rt, JSVarRef *var_ref);
 static JSValue js_new_promise_capability(JSContext *ctx,
                                          JSValue *resolving_funcs,
-                                         JSValue ctor);
+                                         JSValueConst ctor);
 static __exception int perform_promise_then(JSContext *ctx,
-                                            JSValue promise,
-                                            JSValue *resolve_reject,
-                                            JSValue *cap_resolving_funcs);
-static JSValue js_promise_resolve(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv, int magic);
+                                            JSValueConst promise,
+                                            JSValueConst *resolve_reject,
+                                            JSValueConst *cap_resolving_funcs);
+static JSValue js_promise_resolve(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv, int magic);
 static JSValue js_promise_then(JSContext *ctx, JSValueConst this_val,
                                int argc, JSValueConst *argv);
-static int js_string_compare(JSContext *ctx,
-                             const JSString *p1, const JSString *p2);
-static JSValue JS_ToNumber(JSContext *ctx, JSValue val);
-static int JS_SetPropertyValue(JSContext *ctx, JSValue this_obj,
+static bool js_string_eq(JSString *p1, JSString *p2);
+static int js_string_compare(JSString *p1, JSString *p2);
+static int JS_SetPropertyValue(JSContext *ctx, JSValueConst this_obj,
                                JSValue prop, JSValue val, int flags);
-static int JS_NumberIsInteger(JSContext *ctx, JSValue val);
-static BOOL JS_NumberIsNegativeOrMinusZero(JSContext *ctx, JSValue val);
+static int JS_NumberIsInteger(JSContext *ctx, JSValueConst val);
+static bool JS_NumberIsNegativeOrMinusZero(JSContext *ctx, JSValueConst val);
 static JSValue JS_ToNumberFree(JSContext *ctx, JSValue val);
 static int JS_GetOwnPropertyInternal(JSContext *ctx, JSPropertyDescriptor *desc,
                                      JSObject *p, JSAtom prop);
@@ -1298,25 +1238,27 @@ static int js_shape_prepare_update(JSContext *ctx, JSObject *p,
                                    JSShapeProperty **pprs);
 static int init_shape_hash(JSRuntime *rt);
 static __exception int js_get_length32(JSContext *ctx, uint32_t *pres,
-                                       JSValue obj);
+                                       JSValueConst obj);
 static __exception int js_get_length64(JSContext *ctx, int64_t *pres,
-                                       JSValue obj);
-static __exception int js_set_length64(JSContext *ctx, JSValue obj,
+                                       JSValueConst obj);
+static __exception int js_set_length64(JSContext *ctx, JSValueConst obj,
                                        int64_t len);
 static void free_arg_list(JSContext *ctx, JSValue *tab, uint32_t len);
 static JSValue *build_arg_list(JSContext *ctx, uint32_t *plen,
-                               JSValue array_arg);
-static BOOL js_get_fast_array(JSContext *ctx, JSValue obj,
+                               JSValueConst array_arg);
+static JSValue js_create_array(JSContext *ctx, int len, JSValueConst *tab);
+static bool js_get_fast_array(JSContext *ctx, JSValue obj,
                               JSValue **arrpp, uint32_t *countp);
+static int expand_fast_array(JSContext *ctx, JSObject *p, uint32_t new_len);
 static JSValue JS_CreateAsyncFromSyncIterator(JSContext *ctx,
                                               JSValue sync_iter);
-static void js_c_function_data_finalizer(JSRuntime *rt, JSValue val);
-static void js_c_function_data_mark(JSRuntime *rt, JSValue val,
+static void js_c_function_data_finalizer(JSRuntime *rt, JSValueConst val);
+static void js_c_function_data_mark(JSRuntime *rt, JSValueConst val,
                                     JS_MarkFunc *mark_func);
-static JSValue js_c_function_data_call(JSContext *ctx, JSValue func_obj,
-                                       JSValue this_val,
-                                       int argc, JSValue *argv, int flags);
-static JSAtom js_symbol_to_atom(JSContext *ctx, JSValue val);
+static JSValue js_c_function_data_call(JSContext *ctx, JSValueConst func_obj,
+                                       JSValueConst this_val,
+                                       int argc, JSValueConst *argv, int flags);
+static JSAtom js_symbol_to_atom(JSContext *ctx, JSValueConst val);
 static void add_gc_object(JSRuntime *rt, JSGCObjectHeader *h,
                           JSGCObjectTypeEnum type);
 static void remove_gc_object(JSGCObjectHeader *h);
@@ -1326,21 +1268,23 @@ static JSValue js_module_ns_autoinit(JSContext *ctx, JSObject *p, JSAtom atom,
                                  void *opaque);
 static JSValue JS_InstantiateFunctionListItem2(JSContext *ctx, JSObject *p,
                                                JSAtom atom, void *opaque);
-void JS_SetUncatchableError(JSContext *ctx, JSValue val, BOOL flag);
+
+static void js_set_uncatchable_error(JSContext *ctx, JSValueConst val,
+                                     bool flag);
 
 static JSValue js_new_callsite(JSContext *ctx, JSCallSiteData *csd);
 static void js_new_callsite_data(JSContext *ctx, JSCallSiteData *csd, JSStackFrame *sf);
 static void js_new_callsite_data2(JSContext *ctx, JSCallSiteData *csd, const char *filename, int line_num, int col_num);
 static void _JS_AddIntrinsicCallSite(JSContext *ctx);
 
-static void JS_SetOpaqueInternal(JSValue obj, void *opaque);
+static void JS_SetOpaqueInternal(JSValueConst obj, void *opaque);
 
 static const JSClassExoticMethods js_arguments_exotic_methods;
 static const JSClassExoticMethods js_string_exotic_methods;
 static const JSClassExoticMethods js_proxy_exotic_methods;
 static const JSClassExoticMethods js_module_ns_exotic_methods;
 
-static inline BOOL double_is_int32(double d)
+static inline bool double_is_int32(double d)
 {
     uint64_t u, e;
     JSFloat64Union t;
@@ -1405,44 +1349,43 @@ JSValue JS_NewNumber(JSContext *ctx, double d)
     return js_number(d);
 }
 
-static JSValue js_bool(JS_BOOL v)
+static JSValue js_bool(bool v)
 {
     return JS_MKVAL(JS_TAG_BOOL, (v != 0));
 }
 
-static JSValue js_dup(JSValue v)
+static JSValue js_dup(JSValueConst v)
 {
     if (JS_VALUE_HAS_REF_COUNT(v)) {
         JSRefCountHeader *p = (JSRefCountHeader *)JS_VALUE_GET_PTR(v);
         p->ref_count++;
     }
-    return v;
+    return unsafe_unconst(v);
 }
 
-JSValue JS_DupValue(JSContext *ctx, JSValue v)
+JSValue JS_DupValue(JSContext *ctx, JSValueConst v)
 {
     return js_dup(v);
 }
 
-JSValue JS_DupValueRT(JSRuntime *rt, JSValue v)
+JSValue JS_DupValueRT(JSRuntime *rt, JSValueConst v)
 {
     return js_dup(v);
 }
 
 static void js_trigger_gc(JSRuntime *rt, size_t size)
 {
-    BOOL force_gc;
+    bool force_gc;
 #ifdef FORCE_GC_AT_MALLOC
-    force_gc = TRUE;
+    force_gc = true;
 #else
     force_gc = ((rt->malloc_state.malloc_size + size) >
                 rt->malloc_gc_threshold);
 #endif
     if (force_gc) {
-#ifdef DUMP_GC
-        if (check_dump_flag(rt, DUMP_GC)) {
-            printf("GC: size=%" PRIu64 "\n",
-                   (uint64_t)rt->malloc_state.malloc_size);
+#ifdef ENABLE_DUMPS // JS_DUMP_GC
+        if (check_dump_flag(rt, JS_DUMP_GC)) {
+            printf("GC: size=%zd\n", rt->malloc_state.malloc_size);
         }
 #endif
         JS_RunGC(rt);
@@ -1545,12 +1488,6 @@ void *js_realloc_rt(JSRuntime *rt, void *ptr, size_t size)
     return ptr;
 }
 
-static void *js_dbuf_realloc(void *opaque, void *ptr, size_t size)
-{
-    JSRuntime *rt = opaque;
-    return js_realloc_rt(rt, ptr, size);
-}
-
 size_t js_malloc_usable_size_rt(JSRuntime *rt, const void *ptr)
 {
     return rt->mf.js_malloc_usable_size(ptr);
@@ -1693,17 +1630,22 @@ static inline int js_resize_array(JSContext *ctx, void **parray, int elem_size,
         return 0;
 }
 
+static void *js_dbuf_realloc(void *ctx, void *ptr, size_t size)
+{
+    return js_realloc(ctx, ptr, size);
+}
+
 static inline void js_dbuf_init(JSContext *ctx, DynBuf *s)
 {
-    dbuf_init2(s, ctx->rt, js_dbuf_realloc);
+    dbuf_init2(s, ctx, js_dbuf_realloc);
 }
 
 static inline int is_digit(int c) {
     return c >= '0' && c <= '9';
 }
 
-static inline int string_get(const JSString *p, int idx) {
-    return p->is_wide_char ? p->u.str16[idx] : p->u.str8[idx];
+static inline int string_get(JSString *p, int idx) {
+    return p->is_wide_char ? str16(p)[idx] : str8(p)[idx];
 }
 
 typedef struct JSClassShortDef {
@@ -1779,13 +1721,26 @@ static int init_class_range(JSRuntime *rt, JSClassShortDef const *tab,
     return 0;
 }
 
-/* Note: OS and CPU dependent */
+/* Uses code from LLVM project. */
 static inline uintptr_t js_get_stack_pointer(void)
 {
+#if defined(__clang__) || defined(__GNUC__)
     return (uintptr_t)__builtin_frame_address(0);
+#elif defined(_MSC_VER)
+    return (uintptr_t)_AddressOfReturnAddress();
+#else
+    char CharOnStack = 0;
+    // The volatile store here is intended to escape the local variable, to
+    // prevent the compiler from optimizing CharOnStack into anything other
+    // than a char on the stack.
+    //
+    // Tested on: MSVC 2015 - 2019, GCC 4.9 - 9, Clang 3.2 - 9, ICC 13 - 19.
+    char *volatile Ptr = &CharOnStack;
+    return (uintptr_t) Ptr;
+#endif
 }
 
-static inline BOOL js_check_stack_overflow(JSRuntime *rt, size_t alloca_size)
+static inline bool js_check_stack_overflow(JSRuntime *rt, size_t alloca_size)
 {
     uintptr_t sp;
     sp = js_get_stack_pointer() - alloca_size;
@@ -1822,7 +1777,7 @@ JSRuntime *JS_NewRuntime2(const JSMallocFunctions *mf, void *opaque)
     init_list_head(&rt->gc_zero_ref_count_list);
     rt->gc_phase = JS_GC_PHASE_NONE;
 
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
     init_list_head(&rt->string_list);
 #endif
     init_list_head(&rt->job_list);
@@ -1930,7 +1885,18 @@ void JS_SetMemoryLimit(JSRuntime *rt, size_t limit)
 
 void JS_SetDumpFlags(JSRuntime *rt, uint64_t flags)
 {
+#ifdef ENABLE_DUMPS
     rt->dump_flags = flags;
+#endif
+}
+
+uint64_t JS_GetDumpFlags(JSRuntime *rt)
+{
+#ifdef ENABLE_DUMPS
+    return rt->dump_flags;
+#else
+    return 0;
+#endif
 }
 
 size_t JS_GetGCThreshold(JSRuntime *rt) {
@@ -1953,7 +1919,7 @@ void JS_SetInterruptHandler(JSRuntime *rt, JSInterruptHandler *cb, void *opaque)
     rt->interrupt_opaque = opaque;
 }
 
-void JS_SetCanBlock(JSRuntime *rt, BOOL can_block)
+void JS_SetCanBlock(JSRuntime *rt, bool can_block)
 {
     rt->can_block = can_block;
 }
@@ -1966,7 +1932,7 @@ void JS_SetSharedArrayBufferFunctions(JSRuntime *rt,
 
 /* return 0 if OK, < 0 if exception */
 int JS_EnqueueJob(JSContext *ctx, JSJobFunc *job_func,
-                  int argc, JSValue *argv)
+                  int argc, JSValueConst *argv)
 {
     JSRuntime *rt = ctx->rt;
     JSJobEntry *e;
@@ -1987,7 +1953,7 @@ int JS_EnqueueJob(JSContext *ctx, JSJobFunc *job_func,
     return 0;
 }
 
-BOOL JS_IsJobPending(JSRuntime *rt)
+bool JS_IsJobPending(JSRuntime *rt)
 {
     return !list_empty(&rt->job_list);
 }
@@ -2010,7 +1976,7 @@ int JS_ExecutePendingJob(JSRuntime *rt, JSContext **pctx)
     e = list_entry(rt->job_list.next, JSJobEntry, link);
     list_del(&e->link);
     ctx = e->ctx;
-    res = e->job_func(e->ctx, e->argc, e->argv);
+    res = e->job_func(e->ctx, e->argc, vc(e->argv));
     for(i = 0; i < e->argc; i++)
         JS_FreeValue(ctx, e->argv[i]);
     if (JS_IsException(res))
@@ -2028,7 +1994,7 @@ static inline uint32_t atom_get_free(const JSAtomStruct *p)
     return (uintptr_t)p >> 1;
 }
 
-static inline BOOL atom_is_free(const JSAtomStruct *p)
+static inline bool atom_is_free(const JSAtomStruct *p)
 {
     return (uintptr_t)p & 1;
 }
@@ -2051,7 +2017,7 @@ static JSString *js_alloc_string_rt(JSRuntime *rt, int max_len, int is_wide_char
     str->atom_type = 0;
     str->hash = 0;          /* optional but costless */
     str->hash_next = 0;     /* optional */
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
     list_add_tail(&str->link, &rt->string_list);
 #endif
     return str;
@@ -2075,7 +2041,7 @@ static inline void js_free_string(JSRuntime *rt, JSString *str)
         if (str->atom_type) {
             JS_FreeAtomStruct(rt, str);
         } else {
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
             list_del(&str->link);
 #endif
             js_free_rt(rt, str);
@@ -2094,7 +2060,7 @@ void JS_FreeRuntime(JSRuntime *rt)
     struct list_head *el, *el1;
     int i;
 
-    rt->in_free = TRUE;
+    rt->in_free = true;
     JS_FreeValueRT(rt, rt->current_exception);
 
     list_for_each_safe(el, el1, &rt->job_list) {
@@ -2110,10 +2076,10 @@ void JS_FreeRuntime(JSRuntime *rt)
 
     JS_RunGC(rt);
 
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
     /* leaking objects */
-    if (check_dump_flag(rt, DUMP_LEAKS)) {
-        BOOL header_done;
+    if (check_dump_flag(rt, JS_DUMP_LEAKS)) {
+        bool header_done;
         JSGCObjectHeader *p;
         int count;
 
@@ -2125,14 +2091,14 @@ void JS_FreeRuntime(JSRuntime *rt)
         }
         gc_decref(rt);
 
-        header_done = FALSE;
+        header_done = false;
         list_for_each(el, &rt->gc_obj_list) {
             p = list_entry(el, JSGCObjectHeader, link);
             if (p->ref_count != 0) {
                 if (!header_done) {
                     printf("Object leaks:\n");
                     JS_DumpObjectHeader(rt);
-                    header_done = TRUE;
+                    header_done = true;
                 }
                 JS_DumpGCObject(rt, p);
             }
@@ -2163,17 +2129,17 @@ void JS_FreeRuntime(JSRuntime *rt)
 
     bf_context_end(&rt->bf_ctx);
 
-#ifdef DUMP_ATOM_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_ATOM_LEAKS
     /* only the atoms defined in JS_InitAtoms() should be left */
-    if (check_dump_flag(rt, DUMP_ATOM_LEAKS)) {
-        BOOL header_done = FALSE;
+    if (check_dump_flag(rt, JS_DUMP_ATOM_LEAKS)) {
+        bool header_done = false;
 
         for(i = 0; i < rt->atom_size; i++) {
             JSAtomStruct *p = rt->atom_array[i];
             if (!atom_is_free(p) /* && p->str*/) {
                 if (i >= JS_ATOM_END || p->header.ref_count != 1) {
                     if (!header_done) {
-                        header_done = TRUE;
+                        header_done = true;
                         if (rt->rt_info) {
                             printf("%s:1: atom leakage:", rt->rt_info);
                         } else {
@@ -2225,7 +2191,7 @@ void JS_FreeRuntime(JSRuntime *rt)
     for(i = 0; i < rt->atom_size; i++) {
         JSAtomStruct *p = rt->atom_array[i];
         if (!atom_is_free(p)) {
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
             list_del(&p->link);
 #endif
             js_free_rt(rt, p);
@@ -2234,8 +2200,8 @@ void JS_FreeRuntime(JSRuntime *rt)
     js_free_rt(rt, rt->atom_array);
     js_free_rt(rt, rt->atom_hash);
     js_free_rt(rt, rt->shape_hash);
-#ifdef DUMP_LEAKS
-    if (check_dump_flag(rt, DUMP_LEAKS) && !list_empty(&rt->string_list)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
+    if (check_dump_flag(rt, JS_DUMP_LEAKS) && !list_empty(&rt->string_list)) {
         if (rt->rt_info) {
             printf("%s:1: string leakage:", rt->rt_info);
         } else {
@@ -2271,15 +2237,15 @@ void JS_FreeRuntime(JSRuntime *rt)
         js_free_rt(rt, fs);
     }
 
-#ifdef DUMP_LEAKS
-    if (check_dump_flag(rt, DUMP_LEAKS)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
+    if (check_dump_flag(rt, JS_DUMP_LEAKS)) {
         JSMallocState *s = &rt->malloc_state;
         if (s->malloc_count > 1) {
             if (rt->rt_info)
                 printf("%s:1: ", rt->rt_info);
-            printf("Memory leak: %"PRIu64" bytes lost in %"PRIu64" block%s\n",
-                   (uint64_t)(s->malloc_size - sizeof(JSRuntime)),
-                   (uint64_t)(s->malloc_count - 1), &"s"[s->malloc_count == 2]);
+            printf("Memory leak: %zd bytes lost in %zd block%s\n",
+                   s->malloc_size - sizeof(JSRuntime),
+                   s->malloc_count - 1, &"s"[s->malloc_count == 2]);
         }
     }
 #endif
@@ -2317,8 +2283,9 @@ JSContext *JS_NewContextRaw(JSRuntime *rt)
     ctx->regexp_ctor = JS_NULL;
     ctx->promise_ctor = JS_NULL;
     ctx->error_ctor = JS_NULL;
+    ctx->error_back_trace = JS_UNDEFINED;
     ctx->error_prepare_stack = JS_UNDEFINED;
-    ctx->error_stack_trace_limit = 10;
+    ctx->error_stack_trace_limit = js_int32(10);
     init_list_head(&ctx->loaded_modules);
 
     JS_AddIntrinsicBasicObjects(ctx);
@@ -2436,7 +2403,9 @@ static void JS_MarkContext(JSRuntime *rt, JSContext *ctx,
         JS_MarkValue(rt, ctx->native_error_proto[i], mark_func);
     }
     JS_MarkValue(rt, ctx->error_ctor, mark_func);
+    JS_MarkValue(rt, ctx->error_back_trace, mark_func);
     JS_MarkValue(rt, ctx->error_prepare_stack, mark_func);
+    JS_MarkValue(rt, ctx->error_stack_trace_limit, mark_func);
     for(i = 0; i < rt->class_count; i++) {
         JS_MarkValue(rt, ctx->class_proto[i], mark_func);
     }
@@ -2461,16 +2430,16 @@ void JS_FreeContext(JSContext *ctx)
         return;
     assert(ctx->header.ref_count == 0);
 
-#ifdef DUMP_ATOMS
-    if (check_dump_flag(rt, DUMP_ATOMS))
+#ifdef ENABLE_DUMPS // JS_DUMP_ATOMS
+    if (check_dump_flag(rt, JS_DUMP_ATOMS))
         JS_DumpAtoms(ctx->rt);
 #endif
-#ifdef DUMP_SHAPES
-    if (check_dump_flag(rt, DUMP_SHAPES))
+#ifdef ENABLE_DUMPS // JS_DUMP_SHAPES
+    if (check_dump_flag(rt, JS_DUMP_SHAPES))
         JS_DumpShapes(ctx->rt);
 #endif
-#ifdef DUMP_OBJECTS
-    if (check_dump_flag(rt, DUMP_OBJECTS)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_OBJECTS
+    if (check_dump_flag(rt, JS_DUMP_OBJECTS)) {
         struct list_head *el;
         JSGCObjectHeader *p;
         printf("JSObjects: {\n");
@@ -2482,8 +2451,8 @@ void JS_FreeContext(JSContext *ctx)
         printf("}\n");
     }
 #endif
-#ifdef DUMP_MEM
-    if (check_dump_flag(rt, DUMP_MEM)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_MEM
+    if (check_dump_flag(rt, JS_DUMP_MEM)) {
         JSMemoryUsage stats;
         JS_ComputeMemoryUsage(rt, &stats);
         JS_DumpMemoryUsage(stdout, &stats, rt);
@@ -2503,7 +2472,9 @@ void JS_FreeContext(JSContext *ctx)
         JS_FreeValue(ctx, ctx->native_error_proto[i]);
     }
     JS_FreeValue(ctx, ctx->error_ctor);
+    JS_FreeValue(ctx, ctx->error_back_trace);
     JS_FreeValue(ctx, ctx->error_prepare_stack);
+    JS_FreeValue(ctx, ctx->error_stack_trace_limit);
     for(i = 0; i < rt->class_count; i++) {
         JS_FreeValue(ctx, ctx->class_proto[i]);
     }
@@ -2530,7 +2501,7 @@ JSRuntime *JS_GetRuntime(JSContext *ctx)
 
 static void update_stack_limit(JSRuntime *rt)
 {
-#if defined(__wasi__) || (defined(__ASAN__) && !defined(NDEBUG))
+#if defined(__wasi__)
     rt->stack_limit = 0; /* no limit */
 #else
     if (rt->stack_size == 0) {
@@ -2553,7 +2524,7 @@ void JS_UpdateStackTop(JSRuntime *rt)
     update_stack_limit(rt);
 }
 
-static inline BOOL is_strict_mode(JSContext *ctx)
+static inline bool is_strict_mode(JSContext *ctx)
 {
     JSStackFrame *sf = ctx->rt->current_stack_frame;
     return sf && sf->is_strict_mode;
@@ -2568,12 +2539,12 @@ static inline BOOL is_strict_mode(JSContext *ctx)
 /* return the max count from the hash size */
 #define JS_ATOM_COUNT_RESIZE(n) ((n) * 2)
 
-static inline BOOL __JS_AtomIsConst(JSAtom v)
+static inline bool __JS_AtomIsConst(JSAtom v)
 {
     return (int32_t)v < JS_ATOM_END;
 }
 
-static inline BOOL __JS_AtomIsTaggedInt(JSAtom v)
+static inline bool __JS_AtomIsTaggedInt(JSAtom v)
 {
     return (v & JS_ATOM_TAG_INT) != 0;
 }
@@ -2593,8 +2564,8 @@ static inline int is_num(int c)
     return c >= '0' && c <= '9';
 }
 
-/* return TRUE if the string is a number n with 0 <= n <= 2^32-1 */
-static inline BOOL is_num_string(uint32_t *pval, const JSString *p)
+/* return true if the string is a number n with 0 <= n <= 2^32-1 */
+static inline bool is_num_string(uint32_t *pval, JSString *p)
 {
     uint32_t n;
     uint64_t n64;
@@ -2602,29 +2573,29 @@ static inline BOOL is_num_string(uint32_t *pval, const JSString *p)
 
     len = p->len;
     if (len == 0 || len > 10)
-        return FALSE;
+        return false;
     c = string_get(p, 0);
     if (is_num(c)) {
         if (c == '0') {
             if (len != 1)
-                return FALSE;
+                return false;
             n = 0;
         } else {
             n = c - '0';
             for(i = 1; i < len; i++) {
                 c = string_get(p, i);
                 if (!is_num(c))
-                    return FALSE;
+                    return false;
                 n64 = (uint64_t)n * 10 + (c - '0');
                 if ((n64 >> 32) != 0)
-                    return FALSE;
+                    return false;
                 n = n64;
             }
         }
         *pval = n;
-        return TRUE;
+        return true;
     } else {
-        return FALSE;
+        return false;
     }
 }
 
@@ -2648,17 +2619,16 @@ static inline uint32_t hash_string16(const uint16_t *str,
     return h;
 }
 
-static uint32_t hash_string(const JSString *str, uint32_t h)
+static uint32_t hash_string(JSString *str, uint32_t h)
 {
     if (str->is_wide_char)
-        h = hash_string16(str->u.str16, str->len, h);
+        h = hash_string16(str16(str), str->len, h);
     else
-        h = hash_string8(str->u.str8, str->len, h);
+        h = hash_string8(str8(str), str->len, h);
     return h;
 }
 
-static __maybe_unused void JS_DumpString(JSRuntime *rt,
-                                                  const JSString *p)
+static __maybe_unused void JS_DumpString(JSRuntime *rt, JSString *p)
 {
     int i, c, sep;
 
@@ -2926,7 +2896,7 @@ static JSAtom __JS_NewAtom(JSRuntime *rt, JSString *str, int atom_type)
             }
             p->header.ref_count = 1;  /* not refcounted */
             p->atom_type = JS_ATOM_TYPE_SYMBOL;
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
             list_add_tail(&p->link, &rt->string_list);
 #endif
             new_array[0] = p;
@@ -2959,10 +2929,10 @@ static JSAtom __JS_NewAtom(JSRuntime *rt, JSString *str, int atom_type)
             p->header.ref_count = 1;
             p->is_wide_char = str->is_wide_char;
             p->len = str->len;
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
             list_add_tail(&p->link, &rt->string_list);
 #endif
-            memcpy(p->u.str8, str->u.str8, (str->len << str->is_wide_char) +
+            memcpy(str8(p), str8(str), (str->len << str->is_wide_char) +
                    1 - str->is_wide_char);
             js_free_string(rt, str);
         }
@@ -2973,7 +2943,7 @@ static JSAtom __JS_NewAtom(JSRuntime *rt, JSString *str, int atom_type)
         p->header.ref_count = 1;
         p->is_wide_char = 1;    /* Hack to represent NULL as a JSString */
         p->len = 0;
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
         list_add_tail(&p->link, &rt->string_list);
 #endif
     }
@@ -3017,8 +2987,8 @@ static JSAtom __JS_NewAtomInit(JSRuntime *rt, const char *str, int len,
     p = js_alloc_string_rt(rt, len, 0);
     if (!p)
         return JS_ATOM_NULL;
-    memcpy(p->u.str8, str, len);
-    p->u.str8[len] = '\0';
+    memcpy(str8(p), str, len);
+    str8(p)[len] = '\0';
     return __JS_NewAtom(rt, p, atom_type);
 }
 
@@ -3039,7 +3009,7 @@ static JSAtom __JS_FindAtom(JSRuntime *rt, const char *str, size_t len,
             p->atom_type == JS_ATOM_TYPE_STRING &&
             p->len == len &&
             p->is_wide_char == 0 &&
-            memcmp(p->u.str8, str, len) == 0) {
+            memcmp(str8(p), str, len) == 0) {
             if (!__JS_AtomIsConst(i))
                 p->header.ref_count++;
             return i;
@@ -3081,7 +3051,7 @@ static void JS_FreeAtomStruct(JSRuntime *rt, JSAtomStruct *p)
         reset_weak_ref(rt, &p->first_weak_ref);
     }
     /* free the string structure */
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
     list_del(&p->link);
 #endif
     js_free_rt(rt, p);
@@ -3194,7 +3164,7 @@ static JSValue JS_NewSymbolFromAtom(JSContext *ctx, JSAtom descr,
 }
 
 /* `description` may be pure ASCII or UTF-8 encoded */
-JSValue JS_NewSymbol(JSContext *ctx, const char *description, JS_BOOL is_global)
+JSValue JS_NewSymbol(JSContext *ctx, const char *description, bool is_global)
 {
     JSAtom atom = JS_NewAtom(ctx, description);
     if (atom == JS_ATOM_NULL)
@@ -3204,7 +3174,6 @@ JSValue JS_NewSymbol(JSContext *ctx, const char *description, JS_BOOL is_global)
 
 #define ATOM_GET_STR_BUF_SIZE 64
 
-/* Should only be used for debug. */
 static const char *JS_AtomGetStrRT(JSRuntime *rt, char *buf, int buf_size,
                                    JSAtom atom)
 {
@@ -3225,16 +3194,9 @@ static const char *JS_AtomGetStrRT(JSRuntime *rt, char *buf, int buf_size,
             JSString *str = p;
             if (str->is_wide_char) {
                 /* encode surrogates correctly */
-                utf8_encode_buf16(buf, buf_size, str->u.str16, str->len);
+                utf8_encode_buf16(buf, buf_size, str16(str), str->len);
             } else {
-                /* special case ASCII strings */
-                int i, c = 0;
-                for(i = 0; i < str->len; i++) {
-                    c |= str->u.str8[i];
-                }
-                if (c < 0x80)
-                    return (const char *)str->u.str8;
-                utf8_encode_buf8(buf, buf_size, str->u.str8, str->len);
+                utf8_encode_buf8(buf, buf_size, str8(str), str->len);
             }
         }
     }
@@ -3246,7 +3208,7 @@ static const char *JS_AtomGetStr(JSContext *ctx, char *buf, int buf_size, JSAtom
     return JS_AtomGetStrRT(ctx->rt, buf, buf_size, atom);
 }
 
-static JSValue __JS_AtomToValue(JSContext *ctx, JSAtom atom, BOOL force_string)
+static JSValue __JS_AtomToValue(JSContext *ctx, JSAtom atom, bool force_string)
 {
     char buf[ATOM_GET_STR_BUF_SIZE];
 
@@ -3275,21 +3237,21 @@ static JSValue __JS_AtomToValue(JSContext *ctx, JSAtom atom, BOOL force_string)
 
 JSValue JS_AtomToValue(JSContext *ctx, JSAtom atom)
 {
-    return __JS_AtomToValue(ctx, atom, FALSE);
+    return __JS_AtomToValue(ctx, atom, false);
 }
 
 JSValue JS_AtomToString(JSContext *ctx, JSAtom atom)
 {
-    return __JS_AtomToValue(ctx, atom, TRUE);
+    return __JS_AtomToValue(ctx, atom, true);
 }
 
-/* return TRUE if the atom is an array index (i.e. 0 <= index <=
+/* return true if the atom is an array index (i.e. 0 <= index <=
    2^32-2 and return its value */
-static BOOL JS_AtomIsArrayIndex(JSContext *ctx, uint32_t *pval, JSAtom atom)
+static bool JS_AtomIsArrayIndex(JSContext *ctx, uint32_t *pval, JSAtom atom)
 {
     if (__JS_AtomIsTaggedInt(atom)) {
         *pval = __JS_AtomToUInt32(atom);
-        return TRUE;
+        return true;
     } else {
         JSRuntime *rt = ctx->rt;
         JSAtomStruct *p;
@@ -3300,10 +3262,10 @@ static BOOL JS_AtomIsArrayIndex(JSContext *ctx, uint32_t *pval, JSAtom atom)
         if (p->atom_type == JS_ATOM_TYPE_STRING &&
             is_num_string(&val, p) && val != -1) {
             *pval = val;
-            return TRUE;
+            return true;
         } else {
             *pval = 0;
-            return FALSE;
+            return false;
         }
     }
 }
@@ -3328,7 +3290,7 @@ static JSValue JS_AtomIsNumericIndex1(JSContext *ctx, JSAtom atom)
     p = p1;
     len = p->len;
     if (p->is_wide_char) {
-        const uint16_t *r = p->u.str16, *r_end = p->u.str16 + len;
+        const uint16_t *r = str16(p), *r_end = str16(p) + len;
         if (r >= r_end)
             return JS_UNDEFINED;
         c = *r;
@@ -3350,7 +3312,7 @@ static JSValue JS_AtomIsNumericIndex1(JSContext *ctx, JSAtom atom)
                 return JS_UNDEFINED;
         }
     } else {
-        const uint8_t *r = p->u.str8, *r_end = p->u.str8 + len;
+        const uint8_t *r = str8(p), *r_end = str8(p) + len;
         if (r >= r_end)
             return JS_UNDEFINED;
         c = *r;
@@ -3380,9 +3342,9 @@ static JSValue JS_AtomIsNumericIndex1(JSContext *ctx, JSAtom atom)
         JS_FreeValue(ctx, num);
         return str;
     }
-    ret = js_string_compare(ctx, p, JS_VALUE_GET_STRING(str));
+    ret = js_string_eq(p, JS_VALUE_GET_STRING(str));
     JS_FreeValue(ctx, str);
-    if (ret == 0) {
+    if (ret) {
         return num;
     } else {
         JS_FreeValue(ctx, num);
@@ -3390,17 +3352,17 @@ static JSValue JS_AtomIsNumericIndex1(JSContext *ctx, JSAtom atom)
     }
 }
 
-/* return -1 if exception or TRUE/FALSE */
+/* return -1 if exception or true/false */
 static int JS_AtomIsNumericIndex(JSContext *ctx, JSAtom atom)
 {
     JSValue num;
     num = JS_AtomIsNumericIndex1(ctx, atom);
     if (likely(JS_IsUndefined(num)))
-        return FALSE;
+        return false;
     if (JS_IsException(num))
         return -1;
     JS_FreeValue(ctx, num);
-    return TRUE;
+    return true;
 }
 
 void JS_FreeAtom(JSContext *ctx, JSAtom v)
@@ -3415,15 +3377,15 @@ void JS_FreeAtomRT(JSRuntime *rt, JSAtom v)
         __JS_FreeAtom(rt, v);
 }
 
-/* return TRUE if 'v' is a symbol with a string description */
-static BOOL JS_AtomSymbolHasDescription(JSContext *ctx, JSAtom v)
+/* return true if 'v' is a symbol with a string description */
+static bool JS_AtomSymbolHasDescription(JSContext *ctx, JSAtom v)
 {
     JSRuntime *rt;
     JSAtomStruct *p;
 
     rt = ctx->rt;
     if (__JS_AtomIsTaggedInt(v))
-        return FALSE;
+        return false;
     p = rt->atom_array[v];
     return (((p->atom_type == JS_ATOM_TYPE_SYMBOL &&
               p->hash == JS_ATOM_HASH_SYMBOL) ||
@@ -3525,14 +3487,14 @@ static JSAtom js_atom_concat_num(JSContext *ctx, JSAtom name, uint32_t n)
     return js_atom_concat_str(ctx, name, buf);
 }
 
-static inline BOOL JS_IsEmptyString(JSValue v)
+static inline bool JS_IsEmptyString(JSValueConst v)
 {
     return JS_VALUE_GET_TAG(v) == JS_TAG_STRING && JS_VALUE_GET_STRING(v)->len == 0;
 }
 
 /* JSClass support */
 
-/* a new class ID is allocated if *pclass_id != 0 */
+/* a new class ID is allocated if *pclass_id == 0, otherwise *pclass_id is left unchanged */
 JSClassID JS_NewClassID(JSRuntime *rt, JSClassID *pclass_id)
 {
     JSClassID class_id = *pclass_id;
@@ -3543,7 +3505,7 @@ JSClassID JS_NewClassID(JSRuntime *rt, JSClassID *pclass_id)
     return class_id;
 }
 
-JSClassID JS_GetClassID(JSValue v)
+JSClassID JS_GetClassID(JSValueConst v)
 {
   JSObject *p;
   if (JS_VALUE_GET_TAG(v) != JS_TAG_OBJECT)
@@ -3552,7 +3514,7 @@ JSClassID JS_GetClassID(JSValue v)
   return p->class_id;
 }
 
-BOOL JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id)
+bool JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id)
 {
     return (class_id < rt->class_count &&
             rt->class_array[class_id].class_id != 0);
@@ -3636,8 +3598,8 @@ static JSValue js_new_string8_len(JSContext *ctx, const char *buf, int len)
     str = js_alloc_string(ctx, len, 0);
     if (!str)
         return JS_EXCEPTION;
-    memcpy(str->u.str8, buf, len);
-    str->u.str8[len] = '\0';
+    memcpy(str8(str), buf, len);
+    str8(str)[len] = '\0';
     return JS_MKPTR(JS_TAG_STRING, str);
 }
 
@@ -3654,7 +3616,7 @@ static JSValue js_new_string16_len(JSContext *ctx, const uint16_t *buf, int len)
     str = js_alloc_string(ctx, len, 1);
     if (!str)
         return JS_EXCEPTION;
-    memcpy(str->u.str16, buf, len * 2);
+    memcpy(str16(str), buf, len * 2);
     return JS_MKPTR(JS_TAG_STRING, str);
 }
 
@@ -3683,21 +3645,21 @@ static JSValue js_sub_string(JSContext *ctx, JSString *p, int start, int end)
         int i;
         uint16_t c = 0;
         for (i = start; i < end; i++) {
-            c |= p->u.str16[i];
+            c |= str16(p)[i];
         }
         if (c > 0xFF)
-            return js_new_string16_len(ctx, p->u.str16 + start, len);
+            return js_new_string16_len(ctx, str16(p) + start, len);
 
         str = js_alloc_string(ctx, len, 0);
         if (!str)
             return JS_EXCEPTION;
         for (i = 0; i < len; i++) {
-            str->u.str8[i] = p->u.str16[start + i];
+            str8(str)[i] = str16(p)[start + i];
         }
-        str->u.str8[len] = '\0';
+        str8(str)[len] = '\0';
         return JS_MKPTR(JS_TAG_STRING, str);
     } else {
-        return js_new_string8_len(ctx, (const char *)(p->u.str8 + start), len);
+        return js_new_string8_len(ctx, (const char *)(str8(p) + start), len);
     }
 }
 
@@ -3727,7 +3689,7 @@ static int string_buffer_init2(JSContext *ctx, StringBuffer *s, int size,
         s->size = 0;
         return s->error_status = -1;
     }
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
     /* the StringBuffer may reallocate the JSString, only link it at the end */
     list_del(&s->str->link);
 #endif
@@ -3768,7 +3730,7 @@ static no_inline int string_buffer_widen(StringBuffer *s, int size)
         return string_buffer_set_error(s);
     size += slack >> 1;
     for(i = s->len; i-- > 0;) {
-        str->u.str16[i] = str->u.str8[i];
+        str16(str)[i] = str8(str)[i];
     }
     s->is_wide_char = 1;
     s->size = size;
@@ -3810,13 +3772,13 @@ static no_inline int string_buffer_putc_slow(StringBuffer *s, uint32_t c)
             return -1;
     }
     if (s->is_wide_char) {
-        s->str->u.str16[s->len++] = c;
+        str16(s->str)[s->len++] = c;
     } else if (c < 0x100) {
-        s->str->u.str8[s->len++] = c;
+        str8(s->str)[s->len++] = c;
     } else {
         if (string_buffer_widen(s, s->size))
             return -1;
-        s->str->u.str16[s->len++] = c;
+        str16(s->str)[s->len++] = c;
     }
     return 0;
 }
@@ -3829,9 +3791,9 @@ static int string_buffer_putc8(StringBuffer *s, uint32_t c)
             return -1;
     }
     if (s->is_wide_char) {
-        s->str->u.str16[s->len++] = c;
+        str16(s->str)[s->len++] = c;
     } else {
-        s->str->u.str8[s->len++] = c;
+        str8(s->str)[s->len++] = c;
     }
     return 0;
 }
@@ -3841,10 +3803,10 @@ static int string_buffer_putc16(StringBuffer *s, uint32_t c)
 {
     if (likely(s->len < s->size)) {
         if (s->is_wide_char) {
-            s->str->u.str16[s->len++] = c;
+            str16(s->str)[s->len++] = c;
             return 0;
         } else if (c < 0x100) {
-            s->str->u.str8[s->len++] = c;
+            str8(s->str)[s->len++] = c;
             return 0;
         }
     }
@@ -3863,21 +3825,21 @@ static int string_buffer_putc(StringBuffer *s, uint32_t c)
     return string_buffer_putc16(s, c);
 }
 
-static int string_getc(const JSString *p, int *pidx)
+static int string_getc(JSString *p, int *pidx)
 {
     int idx, c, c1;
     idx = *pidx;
     if (p->is_wide_char) {
-        c = p->u.str16[idx++];
+        c = str16(p)[idx++];
         if (is_hi_surrogate(c) && idx < p->len) {
-            c1 = p->u.str16[idx];
+            c1 = str16(p)[idx];
             if (is_lo_surrogate(c1)) {
                 c = from_surrogate(c, c1);
                 idx++;
             }
         }
     } else {
-        c = p->u.str8[idx++];
+        c = str8(p)[idx++];
     }
     *pidx = idx;
     return c;
@@ -3893,11 +3855,11 @@ static int string_buffer_write8(StringBuffer *s, const uint8_t *p, int len)
     }
     if (s->is_wide_char) {
         for (i = 0; i < len; i++) {
-            s->str->u.str16[s->len + i] = p[i];
+            str16(s->str)[s->len + i] = p[i];
         }
         s->len += len;
     } else {
-        memcpy(&s->str->u.str8[s->len], p, len);
+        memcpy(&str8(s->str)[s->len], p, len);
         s->len += len;
     }
     return 0;
@@ -3918,11 +3880,11 @@ static int string_buffer_write16(StringBuffer *s, const uint16_t *p, int len)
             return -1;
     }
     if (s->is_wide_char) {
-        memcpy(&s->str->u.str16[s->len], p, len << 1);
+        memcpy(&str16(s->str)[s->len], p, len << 1);
         s->len += len;
     } else {
         for (i = 0; i < len; i++) {
-            s->str->u.str8[s->len + i] = p[i];
+            str8(s->str)[s->len + i] = p[i];
         }
         s->len += len;
     }
@@ -3935,18 +3897,18 @@ static int string_buffer_puts8(StringBuffer *s, const char *str)
     return string_buffer_write8(s, (const uint8_t *)str, strlen(str));
 }
 
-static int string_buffer_concat(StringBuffer *s, const JSString *p,
+static int string_buffer_concat(StringBuffer *s, JSString *p,
                                 uint32_t from, uint32_t to)
 {
     if (to <= from)
         return 0;
     if (p->is_wide_char)
-        return string_buffer_write16(s, p->u.str16 + from, to - from);
+        return string_buffer_write16(s, str16(p) + from, to - from);
     else
-        return string_buffer_write8(s, p->u.str8 + from, to - from);
+        return string_buffer_write8(s, str8(p) + from, to - from);
 }
 
-static int string_buffer_concat_value(StringBuffer *s, JSValue v)
+static int string_buffer_concat_value(StringBuffer *s, JSValueConst v)
 {
     JSString *p;
     JSValue v1;
@@ -4026,8 +3988,8 @@ static JSValue string_buffer_end(StringBuffer *s)
         s->str = str;
     }
     if (!s->is_wide_char)
-        str->u.str8[s->len] = 0;
-#ifdef DUMP_LEAKS
+        str8(str)[s->len] = 0;
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
     list_add_tail(&str->link, &s->ctx->rt->string_list);
 #endif
     str->is_wide_char = s->is_wide_char;
@@ -4056,15 +4018,15 @@ JSValue JS_NewStringLen(JSContext *ctx, const char *buf, size_t buf_len)
         str = js_alloc_string(ctx, len, 0);
         if (!str)
             return JS_EXCEPTION;
-        memcpy(str->u.str8, buf, len);
-        str->u.str8[len] = '\0';
+        memcpy(str8(str), buf, len);
+        str8(str)[len] = '\0';
         break;
     case UTF8_NON_ASCII:
         /* buf contains non-ASCII code-points, but limited to 8-bit values */
         str = js_alloc_string(ctx, len, 0);
         if (!str)
             return JS_EXCEPTION;
-        utf8_decode_buf8(str->u.str8, len + 1, buf, buf_len);
+        utf8_decode_buf8(str8(str), len + 1, buf, buf_len);
         break;
     default:
         // This causes a potential problem in JS_ThrowError if message is invalid
@@ -4073,7 +4035,7 @@ JSValue JS_NewStringLen(JSContext *ctx, const char *buf, size_t buf_len)
         str = js_alloc_string(ctx, len, 1);
         if (!str)
             return JS_EXCEPTION;
-        utf8_decode_buf16(str->u.str16, len, buf, buf_len);
+        utf8_decode_buf16(str16(str), len, buf, buf_len);
         break;
     }
     return JS_MKPTR(JS_TAG_STRING, str);
@@ -4124,7 +4086,8 @@ JSValue JS_NewAtomString(JSContext *ctx, const char *str)
 /* return (NULL, 0) if exception. */
 /* return pointer into a JSString with a live ref_count */
 /* cesu8 determines if non-BMP1 codepoints are encoded as 1 or 2 utf-8 sequences */
-const char *JS_ToCStringLen2(JSContext *ctx, size_t *plen, JSValue val1, BOOL cesu8)
+const char *JS_ToCStringLen2(JSContext *ctx, size_t *plen, JSValueConst val1,
+                             bool cesu8)
 {
     JSValue val;
     JSString *str, *str_new;
@@ -4162,7 +4125,7 @@ go:
     str = JS_VALUE_GET_STRING(val);
     len = str->len;
     if (!str->is_wide_char) {
-        const uint8_t *src = str->u.str8;
+        const uint8_t *src = str8(str);
         int count;
 
         /* count the number of non-ASCII characters */
@@ -4183,7 +4146,7 @@ go:
         str_new = js_alloc_string(ctx, len + count, 0);
         if (!str_new)
             goto fail;
-        q = str_new->u.str8;
+        q = str8(str_new);
         for (pos = 0; pos < len; pos++) {
             c = src[pos];
             if (c < 0x80) {
@@ -4194,14 +4157,14 @@ go:
             }
         }
     } else {
-        const uint16_t *src = str->u.str16;
+        const uint16_t *src = str16(str);
         /* Allocate 3 bytes per 16 bit code point. Surrogate pairs may
            produce 4 bytes but use 2 code points.
          */
         str_new = js_alloc_string(ctx, len * 3, 0);
         if (!str_new)
             goto fail;
-        q = str_new->u.str8;
+        q = str8(str_new);
         pos = 0;
         while (pos < len) {
             c = src[pos++];
@@ -4229,11 +4192,11 @@ go:
     }
 
     *q = '\0';
-    str_new->len = q - str_new->u.str8;
+    str_new->len = q - str8(str_new);
     JS_FreeValue(ctx, val);
     if (plen)
         *plen = str_new->len;
-    return (const char *)str_new->u.str8;
+    return (const char *)str8(str_new);
  fail:
     if (plen)
         *plen = 0;
@@ -4242,12 +4205,10 @@ go:
 
 void JS_FreeCString(JSContext *ctx, const char *ptr)
 {
-    JSString *p;
     if (!ptr)
         return;
     /* purposely removing constness */
-    p = container_of(ptr, JSString, u);
-    JS_FreeValue(ctx, JS_MKPTR(JS_TAG_STRING, p));
+    JS_FreeValue(ctx, JS_MKPTR(JS_TAG_STRING, (JSString *)ptr - 1));
 }
 
 /* create a string from a narrow Unicode (latin-1) buffer */
@@ -4258,21 +4219,21 @@ JSValue JS_NewNarrowStringLen(JSContext *ctx, const char *buf, size_t buf_len)
     return js_new_string8_len(ctx, buf, buf_len);
 }
 
-JS_BOOL JS_IsStringWideChar(JSValue value)
+bool JS_IsStringWideChar(JSValueConst value)
 {
     if (unlikely(JS_VALUE_GET_TAG(value) != JS_TAG_STRING))
-        return FALSE;
+        return false;
     return JS_VALUE_GET_STRING(value)->is_wide_char;
 }
 
-uint8_t *JS_GetNarrowStringBuffer(JSValue value)
+uint8_t *JS_GetNarrowStringBuffer(JSValueConst value)
 {
     if (unlikely(JS_VALUE_GET_TAG(value) != JS_TAG_STRING))
         return NULL;
-    return JS_VALUE_GET_STRING(value)->u.str8;
+    return str8(JS_VALUE_GET_STRING(value));
 }
 
-uint32_t JS_GetStringLength(JSValue value)
+uint32_t JS_GetStringLength(JSValueConst value)
 {
     if (unlikely(JS_VALUE_GET_TAG(value) != JS_TAG_STRING))
         return 0;
@@ -4301,27 +4262,32 @@ static int memcmp16(const uint16_t *src1, const uint16_t *src2, int len)
     return 0;
 }
 
-static int js_string_memcmp(const JSString *p1, const JSString *p2, int len)
+static int js_string_memcmp(JSString *p1, JSString *p2, int len)
 {
     int res;
 
     if (likely(!p1->is_wide_char)) {
         if (likely(!p2->is_wide_char))
-            res = memcmp(p1->u.str8, p2->u.str8, len);
+            res = memcmp(str8(p1), str8(p2), len);
         else
-            res = -memcmp16_8(p2->u.str16, p1->u.str8, len);
+            res = -memcmp16_8(str16(p2), str8(p1), len);
     } else {
         if (!p2->is_wide_char)
-            res = memcmp16_8(p1->u.str16, p2->u.str8, len);
+            res = memcmp16_8(str16(p1), str8(p2), len);
         else
-            res = memcmp16(p1->u.str16, p2->u.str16, len);
+            res = memcmp16(str16(p1), str16(p2), len);
     }
     return res;
 }
 
+static bool js_string_eq(JSString *p1, JSString *p2) {
+    if (p1->len != p2->len)
+        return false;
+    return js_string_memcmp(p1, p2, p1->len) == 0;
+}
+
 /* return < 0, 0 or > 0 */
-static int js_string_compare(JSContext *ctx,
-                             const JSString *p1, const JSString *p2)
+static int js_string_compare(JSString *p1, JSString *p2)
 {
     int res, len;
     len = min_int(p1->len, p2->len);
@@ -4331,12 +4297,12 @@ static int js_string_compare(JSContext *ctx,
     return res;
 }
 
-static void copy_str16(uint16_t *dst, const JSString *p, int offset, int len)
+static void copy_str16(uint16_t *dst, JSString *p, int offset, int len)
 {
     if (p->is_wide_char) {
-        memcpy(dst, p->u.str16 + offset, len * 2);
+        memcpy(dst, str16(p) + offset, len * 2);
     } else {
-        const uint8_t *src1 = p->u.str8 + offset;
+        const uint8_t *src1 = str8(p) + offset;
         int i;
 
         for(i = 0; i < len; i++)
@@ -4344,8 +4310,7 @@ static void copy_str16(uint16_t *dst, const JSString *p, int offset, int len)
     }
 }
 
-static JSValue JS_ConcatString1(JSContext *ctx,
-                                const JSString *p1, const JSString *p2)
+static JSValue JS_ConcatString1(JSContext *ctx, JSString *p1, JSString *p2)
 {
     JSString *p;
     uint32_t len;
@@ -4359,12 +4324,12 @@ static JSValue JS_ConcatString1(JSContext *ctx,
     if (!p)
         return JS_EXCEPTION;
     if (!is_wide_char) {
-        memcpy(p->u.str8, p1->u.str8, p1->len);
-        memcpy(p->u.str8 + p1->len, p2->u.str8, p2->len);
-        p->u.str8[len] = '\0';
+        memcpy(str8(p), str8(p1), p1->len);
+        memcpy(str8(p) + p1->len, str8(p2), p2->len);
+        str8(p)[len] = '\0';
     } else {
-        copy_str16(p->u.str16, p1, 0, p1->len);
-        copy_str16(p->u.str16 + p1->len, p2, 0, p2->len);
+        copy_str16(str16(p), p1, 0, p1->len);
+        copy_str16(str16(p) + p1->len, p2, 0, p2->len);
     }
     return JS_MKPTR(JS_TAG_STRING, p);
 }
@@ -4401,12 +4366,12 @@ static JSValue JS_ConcatString(JSContext *ctx, JSValue op1, JSValue op2)
     &&  js_malloc_usable_size(ctx, p1) >= sizeof(*p1) + ((p1->len + p2->len) << p2->is_wide_char) + 1 - p1->is_wide_char) {
         /* Concatenate in place in available space at the end of p1 */
         if (p1->is_wide_char) {
-            memcpy(p1->u.str16 + p1->len, p2->u.str16, p2->len << 1);
+            memcpy(str16(p1) + p1->len, str16(p2), p2->len << 1);
             p1->len += p2->len;
         } else {
-            memcpy(p1->u.str8 + p1->len, p2->u.str8, p2->len);
+            memcpy(str8(p1) + p1->len, str8(p2), p2->len);
             p1->len += p2->len;
-            p1->u.str8[p1->len] = '\0';
+            str8(p1)[p1->len] = '\0';
         }
     ret_op1:
         JS_FreeValue(ctx, op2);
@@ -4558,8 +4523,8 @@ static no_inline JSShape *js_new_shape2(JSContext *ctx, JSObject *proto,
 
     /* insert in the hash table */
     sh->hash = shape_initial_hash(proto);
-    sh->is_hashed = TRUE;
-    sh->has_small_array_index = FALSE;
+    sh->is_hashed = true;
+    sh->has_small_array_index = false;
     js_shape_hash_link(ctx->rt, sh);
     return sh;
 }
@@ -4590,7 +4555,7 @@ static JSShape *js_clone_shape(JSContext *ctx, JSShape *sh1)
     sh = get_shape_from_alloc(sh_alloc, hash_size);
     sh->header.ref_count = 1;
     add_gc_object(ctx->rt, &sh->header, JS_GC_OBJ_TYPE_SHAPE);
-    sh->is_hashed = FALSE;
+    sh->is_hashed = false;
     if (sh->proto) {
         js_dup(JS_MKPTR(JS_TAG_OBJECT, sh->proto));
     }
@@ -4924,7 +4889,7 @@ static JSValue JS_NewObjectFromShape(JSContext *ctx, JSShape *sh, JSClassID clas
     if (unlikely(!p))
         goto fail;
     p->class_id = class_id;
-    p->extensible = TRUE;
+    p->extensible = true;
     p->free_mark = 0;
     p->is_exotic = 0;
     p->fast_array = 0;
@@ -5015,7 +4980,7 @@ static JSValue JS_NewObjectFromShape(JSContext *ctx, JSShape *sh, JSClassID clas
     return JS_MKPTR(JS_TAG_OBJECT, p);
 }
 
-static JSObject *get_proto_obj(JSValue proto_val)
+static JSObject *get_proto_obj(JSValueConst proto_val)
 {
     if (JS_VALUE_GET_TAG(proto_val) != JS_TAG_OBJECT)
         return NULL;
@@ -5024,7 +4989,7 @@ static JSObject *get_proto_obj(JSValue proto_val)
 }
 
 /* WARNING: proto must be an object or JS_NULL */
-JSValue JS_NewObjectProtoClass(JSContext *ctx, JSValue proto_val,
+JSValue JS_NewObjectProtoClass(JSContext *ctx, JSValueConst proto_val,
                                JSClassID class_id)
 {
     JSShape *sh;
@@ -5042,7 +5007,7 @@ JSValue JS_NewObjectProtoClass(JSContext *ctx, JSValue proto_val,
     return JS_NewObjectFromShape(ctx, sh, class_id);
 }
 
-static int JS_SetObjectData(JSContext *ctx, JSValue obj, JSValue val)
+static int JS_SetObjectData(JSContext *ctx, JSValueConst obj, JSValue val)
 {
     JSObject *p;
 
@@ -5071,17 +5036,117 @@ JSValue JS_NewObjectClass(JSContext *ctx, int class_id)
     return JS_NewObjectProtoClass(ctx, ctx->class_proto[class_id], class_id);
 }
 
-JSValue JS_NewObjectProto(JSContext *ctx, JSValue proto)
+JSValue JS_NewObjectProto(JSContext *ctx, JSValueConst proto)
 {
     return JS_NewObjectProtoClass(ctx, proto, JS_CLASS_OBJECT);
 }
 
+JSValue JS_NewObjectFrom(JSContext *ctx, int count, const JSAtom *props,
+                         const JSValue *values)
+{
+    JSShapeProperty *pr;
+    uint32_t *hash;
+    JSRuntime *rt;
+    JSObject *p;
+    JSShape *sh;
+    JSValue obj;
+    JSAtom atom;
+    intptr_t h;
+    int i;
+
+    rt = ctx->rt;
+    obj = JS_NewObject(ctx);
+    if (JS_IsException(obj))
+        return JS_EXCEPTION;
+    if (count > 0) {
+        p = JS_VALUE_GET_OBJ(obj);
+        sh = p->shape;
+        assert(sh->is_hashed);
+        assert(sh->header.ref_count == 1);
+        js_shape_hash_unlink(rt, sh);
+        if (resize_properties(ctx, &sh, p, count)) {
+            js_shape_hash_link(rt, sh);
+            JS_FreeValue(ctx, obj);
+            return JS_EXCEPTION;
+        }
+        p->shape = sh;
+        for (i = 0; i < count; i++) {
+            atom = props[i];
+            pr = &sh->prop[i];
+            sh->hash = shape_hash(shape_hash(sh->hash, atom), JS_PROP_C_W_E);
+            sh->has_small_array_index |= __JS_AtomIsTaggedInt(atom);
+            h = atom & sh->prop_hash_mask;
+            hash = &prop_hash_end(sh)[-h - 1];
+            pr->hash_next = *hash;
+            *hash = i + 1;
+            pr->atom = JS_DupAtom(ctx, atom);
+            pr->flags = JS_PROP_C_W_E;
+            p->prop[i].u.value = values[i];
+        }
+        js_shape_hash_link(rt, sh);
+        sh->prop_count = count;
+    }
+    return obj;
+}
+
+JSValue JS_NewObjectFromStr(JSContext *ctx, int count, const char **props,
+                            const JSValue *values)
+{
+    JSAtom atoms_s[16], *atoms = atoms_s;
+    JSValue ret;
+    int i;
+
+    i = 0;
+    ret = JS_EXCEPTION;
+    if (count < 1)
+        goto out;
+    if (count > (int)countof(atoms_s)) {
+        atoms = js_malloc(ctx, count * sizeof(*atoms));
+        if (!atoms)
+            return JS_EXCEPTION;
+    }
+    for (i = 0; i < count; i++) {
+        atoms[i] = JS_NewAtom(ctx, props[i]);
+        if (atoms[i] == JS_ATOM_NULL)
+            goto out;
+    }
+    ret = JS_NewObjectFrom(ctx, count, atoms, values);
+out:
+    while (i-- > 0)
+        JS_FreeAtom(ctx, atoms[i]);
+    if (atoms != atoms_s)
+        js_free(ctx, atoms);
+    return ret;
+}
+
 JSValue JS_NewArray(JSContext *ctx)
 {
     return JS_NewObjectFromShape(ctx, js_dup_shape(ctx->array_shape),
                                  JS_CLASS_ARRAY);
 }
 
+// note: takes ownership of |values|, unlike js_create_array
+JSValue JS_NewArrayFrom(JSContext *ctx, int count, const JSValue *values)
+{
+    JSObject *p;
+    JSValue obj;
+
+    obj = JS_NewArray(ctx);
+    if (JS_IsException(obj))
+        return JS_EXCEPTION;
+    if (count > 0) {
+        p = JS_VALUE_GET_OBJ(obj);
+        if (expand_fast_array(ctx, p, count)) {
+            JS_FreeValue(ctx, obj);
+            return JS_EXCEPTION;
+        }
+        p->u.array.count = count;
+        p->prop[0].u.value = js_int32(count);
+        memcpy(p->u.array.u.values, values, count * sizeof(*values));
+    }
+    return obj;
+}
+
 JSValue JS_NewObject(JSContext *ctx)
 {
     /* inline JS_NewObjectClass(ctx, JS_CLASS_OBJECT); */
@@ -5098,7 +5163,7 @@ static void js_function_set_properties(JSContext *ctx, JSValue func_obj,
                            JS_AtomToString(ctx, name), JS_PROP_CONFIGURABLE);
 }
 
-static BOOL js_class_has_bytecode(JSClassID class_id)
+static bool js_class_has_bytecode(JSClassID class_id)
 {
     return (class_id == JS_CLASS_BYTECODE_FUNCTION ||
             class_id == JS_CLASS_GENERATOR_FUNCTION ||
@@ -5107,7 +5172,7 @@ static BOOL js_class_has_bytecode(JSClassID class_id)
 }
 
 /* return NULL without exception if not a function or no bytecode */
-static JSFunctionBytecode *JS_GetFunctionBytecode(JSValue val)
+static JSFunctionBytecode *JS_GetFunctionBytecode(JSValueConst val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
@@ -5180,7 +5245,8 @@ static int js_method_set_properties(JSContext *ctx, JSValue func_obj,
 
 /* Note: at least 'length' arguments will be readable in 'argv' */
 /* `name` may be NULL, pure ASCII or UTF-8 encoded */
-JSValue JS_NewCFunction3(JSContext *ctx, JSCFunction *func, const char *name,
+JSValue JS_NewCFunction3(JSContext *ctx, JSCFunction *func,
+                         const char *name,
                          int length, JSCFunctionEnum cproto, int magic,
                          JSValue proto_val)
 {
@@ -5226,7 +5292,7 @@ typedef struct JSCFunctionDataRecord {
     JSValue data[];
 } JSCFunctionDataRecord;
 
-static void js_c_function_data_finalizer(JSRuntime *rt, JSValue val)
+static void js_c_function_data_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSCFunctionDataRecord *s = JS_GetOpaque(val, JS_CLASS_C_FUNCTION_DATA);
     int i;
@@ -5239,7 +5305,7 @@ static void js_c_function_data_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_c_function_data_mark(JSRuntime *rt, JSValue val,
+static void js_c_function_data_mark(JSRuntime *rt, JSValueConst val,
                                     JS_MarkFunc *mark_func)
 {
     JSCFunctionDataRecord *s = JS_GetOpaque(val, JS_CLASS_C_FUNCTION_DATA);
@@ -5252,12 +5318,12 @@ static void js_c_function_data_mark(JSRuntime *rt, JSValue val,
     }
 }
 
-static JSValue js_c_function_data_call(JSContext *ctx, JSValue func_obj,
-                                       JSValue this_val,
-                                       int argc, JSValue *argv, int flags)
+static JSValue js_c_function_data_call(JSContext *ctx, JSValueConst func_obj,
+                                       JSValueConst this_val,
+                                       int argc, JSValueConst *argv, int flags)
 {
     JSCFunctionDataRecord *s = JS_GetOpaque(func_obj, JS_CLASS_C_FUNCTION_DATA);
-    JSValue *arg_buf;
+    JSValueConst *arg_buf;
     int i;
 
     /* XXX: could add the function on the stack for debug */
@@ -5271,12 +5337,12 @@ static JSValue js_c_function_data_call(JSContext *ctx, JSValue func_obj,
         arg_buf = argv;
     }
 
-    return s->func(ctx, this_val, argc, arg_buf, s->magic, s->data);
+    return s->func(ctx, this_val, argc, arg_buf, s->magic, vc(s->data));
 }
 
 JSValue JS_NewCFunctionData(JSContext *ctx, JSCFunctionData *func,
                             int length, int magic, int data_len,
-                            JSValue *data)
+                            JSValueConst *data)
 {
     JSCFunctionDataRecord *s;
     JSValue func_obj;
@@ -5386,33 +5452,8 @@ static force_inline JSShapeProperty *find_own_property(JSProperty **ppr,
     return NULL;
 }
 
-static force_inline JSShapeProperty* find_own_property_ic(JSProperty** ppr, JSObject* p,
-                                                          JSAtom atom, uint32_t* offset)
-{
-    JSShape* sh;
-    JSShapeProperty *pr, *prop;
-    intptr_t h, i;
-    sh = p->shape;
-    h = (uintptr_t)atom & sh->prop_hash_mask;
-    h = prop_hash_end(sh)[-h - 1];
-    prop = get_shape_prop(sh);
-    while (h) {
-        i = h - 1;
-        pr = &prop[i];
-        if (likely(pr->atom == atom)) {
-            *ppr = &p->prop[i];
-            *offset = i;
-            /* the compiler should be able to assume that pr != NULL here */
-            return pr;
-        }
-        h = pr->hash_next;
-    }
-    *ppr = NULL;
-    return NULL;
-}
-
 /* indicate that the object may be part of a function prototype cycle */
-static void set_cycle_flag(JSContext *ctx, JSValue obj)
+static void set_cycle_flag(JSContext *ctx, JSValueConst obj)
 {
 }
 
@@ -5432,7 +5473,7 @@ static void free_var_ref(JSRuntime *rt, JSVarRef *var_ref)
     }
 }
 
-static void js_array_finalizer(JSRuntime *rt, JSValue val)
+static void js_array_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     int i;
@@ -5443,7 +5484,7 @@ static void js_array_finalizer(JSRuntime *rt, JSValue val)
     js_free_rt(rt, p->u.array.u.values);
 }
 
-static void js_array_mark(JSRuntime *rt, JSValue val,
+static void js_array_mark(JSRuntime *rt, JSValueConst val,
                           JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -5454,21 +5495,21 @@ static void js_array_mark(JSRuntime *rt, JSValue val,
     }
 }
 
-static void js_object_data_finalizer(JSRuntime *rt, JSValue val)
+static void js_object_data_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JS_FreeValueRT(rt, p->u.object_data);
     p->u.object_data = JS_UNDEFINED;
 }
 
-static void js_object_data_mark(JSRuntime *rt, JSValue val,
+static void js_object_data_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JS_MarkValue(rt, p->u.object_data, mark_func);
 }
 
-static void js_c_function_finalizer(JSRuntime *rt, JSValue val)
+static void js_c_function_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
 
@@ -5476,7 +5517,7 @@ static void js_c_function_finalizer(JSRuntime *rt, JSValue val)
         JS_FreeContext(p->u.cfunc.realm);
 }
 
-static void js_c_function_mark(JSRuntime *rt, JSValue val,
+static void js_c_function_mark(JSRuntime *rt, JSValueConst val,
                                JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -5485,7 +5526,7 @@ static void js_c_function_mark(JSRuntime *rt, JSValue val,
         mark_func(rt, &p->u.cfunc.realm->header);
 }
 
-static void js_bytecode_function_finalizer(JSRuntime *rt, JSValue val)
+static void js_bytecode_function_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p1, *p = JS_VALUE_GET_OBJ(val);
     JSFunctionBytecode *b;
@@ -5508,7 +5549,7 @@ static void js_bytecode_function_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_bytecode_function_mark(JSRuntime *rt, JSValue val,
+static void js_bytecode_function_mark(JSRuntime *rt, JSValueConst val,
                                       JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -5535,7 +5576,7 @@ static void js_bytecode_function_mark(JSRuntime *rt, JSValue val,
     }
 }
 
-static void js_bound_function_finalizer(JSRuntime *rt, JSValue val)
+static void js_bound_function_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSBoundFunction *bf = p->u.bound_function;
@@ -5549,7 +5590,7 @@ static void js_bound_function_finalizer(JSRuntime *rt, JSValue val)
     js_free_rt(rt, bf);
 }
 
-static void js_bound_function_mark(JSRuntime *rt, JSValue val,
+static void js_bound_function_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -5562,7 +5603,7 @@ static void js_bound_function_mark(JSRuntime *rt, JSValue val,
         JS_MarkValue(rt, bf->argv[i], mark_func);
 }
 
-static void js_for_in_iterator_finalizer(JSRuntime *rt, JSValue val)
+static void js_for_in_iterator_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSForInIterator *it = p->u.for_in_iterator;
@@ -5570,7 +5611,7 @@ static void js_for_in_iterator_finalizer(JSRuntime *rt, JSValue val)
     js_free_rt(rt, it);
 }
 
-static void js_for_in_iterator_mark(JSRuntime *rt, JSValue val,
+static void js_for_in_iterator_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -5685,8 +5726,8 @@ static void js_free_value_rt(JSRuntime *rt, JSValue v)
 {
     uint32_t tag = JS_VALUE_GET_TAG(v);
 
-#ifdef DUMP_FREE
-    if (check_dump_flag(rt, DUMP_FREE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_FREE
+    if (check_dump_flag(rt, JS_DUMP_FREE)) {
         /* Prevent invalid object access during GC */
         if ((rt->gc_phase != JS_GC_PHASE_REMOVE_CYCLES)
         ||  (tag != JS_TAG_OBJECT && tag != JS_TAG_FUNCTION_BYTECODE)) {
@@ -5708,7 +5749,7 @@ static void js_free_value_rt(JSRuntime *rt, JSValue v)
             if (p->atom_type) {
                 JS_FreeAtomStruct(rt, p);
             } else {
-#ifdef DUMP_LEAKS
+#ifdef ENABLE_DUMPS // JS_DUMP_LEAKS
                 list_del(&p->link);
 #endif
                 js_free_rt(rt, p);
@@ -5784,7 +5825,7 @@ static void remove_gc_object(JSGCObjectHeader *h)
     list_del(&h->link);
 }
 
-void JS_MarkValue(JSRuntime *rt, JSValue val, JS_MarkFunc *mark_func)
+void JS_MarkValue(JSRuntime *rt, JSValueConst val, JS_MarkFunc *mark_func)
 {
     if (JS_VALUE_HAS_REF_COUNT(val)) {
         switch(JS_VALUE_GET_TAG(val)) {
@@ -5848,7 +5889,6 @@ static void mark_children(JSRuntime *rt, JSGCObjectHeader *gp,
     case JS_GC_OBJ_TYPE_FUNCTION_BYTECODE:
         /* the template objects can be part of a cycle */
         {
-            JSShape **shape, *(*shapes)[IC_CACHE_ITEM_CAPACITY];
             JSFunctionBytecode *b = (JSFunctionBytecode *)gp;
             int i;
             for(i = 0; i < b->cpool_count; i++) {
@@ -5856,14 +5896,6 @@ static void mark_children(JSRuntime *rt, JSGCObjectHeader *gp,
             }
             if (b->realm)
                 mark_func(rt, &b->realm->header);
-            if (b->ic) {
-                for (i = 0; i < b->ic->count; i++) {
-                    shapes = &b->ic->cache[i].shape;
-                    for (shape = *shapes; shape != endof(*shapes); shape++)
-                        if (*shape)
-                            mark_func(rt, &(*shape)->header);
-                }
-            }
         }
         break;
     case JS_GC_OBJ_TYPE_VAR_REF:
@@ -6015,8 +6047,8 @@ static void gc_free_cycles(JSRuntime *rt)
 {
     struct list_head *el, *el1;
     JSGCObjectHeader *p;
-#ifdef DUMP_GC_FREE
-    BOOL header_done = FALSE;
+#ifdef ENABLE_DUMPS // JS_DUMP_GC_FREE
+    bool header_done = false;
 #endif
 
     rt->gc_phase = JS_GC_PHASE_REMOVE_CYCLES;
@@ -6032,12 +6064,12 @@ static void gc_free_cycles(JSRuntime *rt)
         switch(p->gc_obj_type) {
         case JS_GC_OBJ_TYPE_JS_OBJECT:
         case JS_GC_OBJ_TYPE_FUNCTION_BYTECODE:
-#ifdef DUMP_GC_FREE
-            if (check_dump_flag(rt, DUMP_GC_FREE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_GC_FREE
+            if (check_dump_flag(rt, JS_DUMP_GC_FREE)) {
                 if (!header_done) {
                     printf("Freeing cycles:\n");
                     JS_DumpObjectHeader(rt);
-                    header_done = TRUE;
+                    header_done = true;
                 }
                 JS_DumpGCObject(rt, p);
             }
@@ -6078,11 +6110,11 @@ void JS_RunGC(JSRuntime *rt)
 /* Return false if not an object or if the object has already been
    freed (zombie objects are visible in finalizers when freeing
    cycles). */
-BOOL JS_IsLiveObject(JSRuntime *rt, JSValue obj)
+bool JS_IsLiveObject(JSRuntime *rt, JSValueConst obj)
 {
     JSObject *p;
     if (!JS_IsObject(obj))
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(obj);
     return !p->free_mark;
 }
@@ -6587,7 +6619,7 @@ JSValue JS_GetException(JSContext *ctx)
     return val;
 }
 
-JS_BOOL JS_HasException(JSContext *ctx)
+bool JS_HasException(JSContext *ctx)
 {
     return !JS_IsUninitialized(ctx->rt->current_exception);
 }
@@ -6701,7 +6733,7 @@ fail:
 /* in order to avoid executing arbitrary code during the stack trace
    generation, we only look at simple 'name' properties containing a
    string. */
-static const char *get_func_name(JSContext *ctx, JSValue func)
+static const char *get_func_name(JSContext *ctx, JSValueConst func)
 {
     JSProperty *pr;
     JSShapeProperty *prs;
@@ -6720,6 +6752,20 @@ static const char *get_func_name(JSContext *ctx, JSValue func)
     return JS_ToCString(ctx, val);
 }
 
+/* Note: it is important that no exception is returned by this function */
+static bool can_add_backtrace(JSValueConst obj)
+{
+    JSObject *p;
+    if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)
+        return false;
+    p = JS_VALUE_GET_OBJ(obj);
+    if (p->class_id != JS_CLASS_ERROR)
+        return false;
+    if (find_own_property1(p, JS_ATOM_stack))
+        return false;
+    return true;
+}
+
 #define JS_BACKTRACE_FLAG_SKIP_FIRST_LEVEL (1 << 0)
 /* only taken into account if filename is provided */
 #define JS_BACKTRACE_FLAG_SINGLE_LEVEL     (1 << 1)
@@ -6727,9 +6773,9 @@ static const char *get_func_name(JSContext *ctx, JSValue func)
 
 /* if filename != NULL, an additional level is added with the filename
    and line number information (used for parse error). */
-static void build_backtrace(JSContext *ctx, JSValue error_obj, JSValue filter_func,
-                            const char *filename, int line_num, int col_num,
-                            int backtrace_flags)
+static void build_backtrace(JSContext *ctx, JSValueConst error_val,
+                            JSValueConst filter_func, const char *filename,
+                            int line_num, int col_num, int backtrace_flags)
 {
     JSStackFrame *sf, *sf_start;
     JSValue stack, prepare, saved_exception;
@@ -6738,28 +6784,49 @@ static void build_backtrace(JSContext *ctx, JSValue error_obj, JSValue filter_fu
     const char *str1;
     JSObject *p;
     JSFunctionBytecode *b;
-    BOOL backtrace_barrier, has_prepare;
+    bool backtrace_barrier, has_prepare, has_filter_func;
     JSRuntime *rt;
     JSCallSiteData csd[64];
     uint32_t i;
+    double d;
     int stack_trace_limit;
 
-    stack_trace_limit = ctx->error_stack_trace_limit;
+    rt = ctx->rt;
+    if (rt->in_build_stack_trace)
+        return;
+    rt->in_build_stack_trace = true;
+
+    // Save exception because conversion to double may fail.
+    saved_exception = JS_GetException(ctx);
+
+    // Extract stack trace limit.
+    // Ignore error since it sets d to NAN anyway.
+    // coverity[check_return]
+    JS_ToFloat64(ctx, &d, ctx->error_stack_trace_limit);
+    if (isnan(d) || d < 0.0)
+        stack_trace_limit = 0;
+    else if (d > INT32_MAX)
+        stack_trace_limit = INT32_MAX;
+    else
+        stack_trace_limit = fabs(d);
+
+    // Restore current exception.
+    JS_Throw(ctx, saved_exception);
+    saved_exception = JS_UNINITIALIZED;
+
     stack_trace_limit = min_int(stack_trace_limit, countof(csd));
     stack_trace_limit = max_int(stack_trace_limit, 0);
-    rt = ctx->rt;
-    has_prepare = FALSE;
+    has_prepare = false;
+    has_filter_func = backtrace_flags & JS_BACKTRACE_FLAG_FILTER_FUNC;
     i = 0;
 
-    if (!rt->in_prepare_stack_trace && !JS_IsNull(ctx->error_ctor)) {
+    if (!JS_IsNull(ctx->error_ctor)) {
         prepare = js_dup(ctx->error_prepare_stack);
         has_prepare = JS_IsFunction(ctx, prepare);
-        rt->in_prepare_stack_trace = TRUE;
     }
 
     if (has_prepare) {
-        saved_exception = rt->current_exception;
-        rt->current_exception = JS_NULL;
+        saved_exception = JS_GetException(ctx);
         if (stack_trace_limit == 0)
             goto done;
         if (filename)
@@ -6784,7 +6851,7 @@ static void build_backtrace(JSContext *ctx, JSValue error_obj, JSValue filter_fu
 
     /* Find the frame we want to start from. Note that when a filter is used the filter
        function will be the first, but we also specify we want to skip the first one. */
-    if (backtrace_flags & JS_BACKTRACE_FLAG_FILTER_FUNC) {
+    if (has_filter_func) {
         for (sf = sf_start; sf != NULL && i < stack_trace_limit; sf = sf->prev_frame) {
             if (js_same_value(ctx, sf->cur_func, filter_func)) {
                 sf_start = sf;
@@ -6801,7 +6868,7 @@ static void build_backtrace(JSContext *ctx, JSValue error_obj, JSValue filter_fu
 
         p = JS_VALUE_GET_OBJ(sf->cur_func);
         b = NULL;
-        backtrace_barrier = FALSE;
+        backtrace_barrier = false;
 
         if (js_class_has_bytecode(p->class_id)) {
             b = p->u.func.function_bytecode;
@@ -6820,23 +6887,24 @@ static void build_backtrace(JSContext *ctx, JSValue error_obj, JSValue filter_fu
             dbuf_printf(&dbuf, "    at %s", str1);
             JS_FreeCString(ctx, func_name_str);
 
-            if (b) {
+            if (b && sf->cur_pc) {
                 const char *atom_str;
                 int line_num1, col_num1;
+                uint32_t pc;
 
-                /* Bytecode functions must have cur_pc set in the stack frame. */
-                if (sf->cur_pc == NULL)
-                    abort();
-
-                line_num1 = find_line_num(ctx, b,
-                                          sf->cur_pc - b->byte_code_buf - 1,
-                                          &col_num1);
+                pc = sf->cur_pc - b->byte_code_buf - 1;
+                line_num1 = find_line_num(ctx, b, pc, &col_num1);
                 atom_str = b->filename ? JS_AtomToCString(ctx, b->filename) : NULL;
                 dbuf_printf(&dbuf, " (%s", atom_str ? atom_str : "<null>");
                 JS_FreeCString(ctx, atom_str);
                 if (line_num1 != -1)
                     dbuf_printf(&dbuf, ":%d:%d", line_num1, col_num1);
                 dbuf_putc(&dbuf, ')');
+            } else if (b) {
+                // FIXME(bnoordhuis) Missing `sf->cur_pc = pc` in bytecode
+                // handler in JS_CallInternal. Almost never user observable
+                // except with intercepting JS proxies that throw exceptions.
+                dbuf_printf(&dbuf, " (missing)");
             } else {
                 dbuf_printf(&dbuf, " (native)");
             }
@@ -6871,8 +6939,8 @@ static void build_backtrace(JSContext *ctx, JSValue error_obj, JSValue filter_fu
             JS_FreeValue(ctx, csd[k].func);
             JS_FreeValue(ctx, csd[k].func_name);
         }
-        JSValue args[] = {
-            error_obj,
+        JSValueConst args[] = {
+            error_val,
             stack,
         };
         JSValue stack2 = JS_Call(ctx, prepare, ctx->error_ctor, countof(args), args);
@@ -6882,8 +6950,7 @@ static void build_backtrace(JSContext *ctx, JSValue error_obj, JSValue filter_fu
         else
             stack = stack2;
         JS_FreeValue(ctx, prepare);
-        JS_FreeValue(ctx, rt->current_exception);
-        rt->current_exception = saved_exception;
+        JS_Throw(ctx, saved_exception);
     } else {
         if (dbuf_error(&dbuf))
             stack = JS_NULL;
@@ -6892,36 +6959,34 @@ static void build_backtrace(JSContext *ctx, JSValue error_obj, JSValue filter_fu
         dbuf_free(&dbuf);
     }
 
-    rt->in_prepare_stack_trace = FALSE;
-    JS_DefinePropertyValue(ctx, error_obj, JS_ATOM_stack, stack, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
-}
+    if (JS_IsUndefined(ctx->error_back_trace))
+        ctx->error_back_trace = js_dup(stack);
+    if (has_filter_func || can_add_backtrace(error_val)) {
+        JS_DefinePropertyValue(ctx, error_val, JS_ATOM_stack, stack,
+                               JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+    } else {
+        JS_FreeValue(ctx, stack);
+    }
 
-/* Note: it is important that no exception is returned by this function */
-static BOOL is_backtrace_needed(JSContext *ctx, JSValue obj)
-{
-    JSObject *p;
-    if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)
-        return FALSE;
-    p = JS_VALUE_GET_OBJ(obj);
-    if (p->class_id != JS_CLASS_ERROR)
-        return FALSE;
-    if (find_own_property1(p, JS_ATOM_stack))
-        return FALSE;
-    return TRUE;
+    rt->in_build_stack_trace = false;
 }
 
 JSValue JS_NewError(JSContext *ctx)
 {
-    return JS_NewObjectClass(ctx, JS_CLASS_ERROR);
+    JSValue obj = JS_NewObjectClass(ctx, JS_CLASS_ERROR);
+    if (JS_IsException(obj))
+        return JS_EXCEPTION;
+    build_backtrace(ctx, obj, JS_UNDEFINED, NULL, 0, 0, 0);
+    return obj;
 }
 
 static JSValue JS_MakeError(JSContext *ctx, JSErrorEnum error_num,
-                            const char *message, BOOL add_backtrace)
+                            const char *message, bool add_backtrace)
 {
     JSValue obj, msg;
 
     if (error_num == JS_PLAIN_ERROR) {
-        obj = JS_NewError(ctx);
+        obj = JS_NewObjectClass(ctx, JS_CLASS_ERROR);
     } else {
         obj = JS_NewObjectProtoClass(ctx, ctx->native_error_proto[error_num],
                                      JS_CLASS_ERROR);
@@ -6941,8 +7006,9 @@ static JSValue JS_MakeError(JSContext *ctx, JSErrorEnum error_num,
 }
 
 /* fmt and arguments may be pure ASCII or UTF-8 encoded contents */
-static JSValue JS_ThrowError2(JSContext *ctx, JSErrorEnum error_num,
-                              const char *fmt, va_list ap, BOOL add_backtrace)
+static JSValue JS_PRINTF_FORMAT_ATTR(4, 0)
+JS_ThrowError2(JSContext *ctx, JSErrorEnum error_num,
+               bool add_backtrace, JS_PRINTF_FORMAT const char *fmt, va_list ap)
 {
     char buf[256];
     JSValue obj;
@@ -6956,21 +7022,22 @@ static JSValue JS_ThrowError2(JSContext *ctx, JSErrorEnum error_num,
     return JS_Throw(ctx, obj);
 }
 
-static JSValue JS_ThrowError(JSContext *ctx, JSErrorEnum error_num,
-                             const char *fmt, va_list ap)
+static JSValue JS_PRINTF_FORMAT_ATTR(3, 0)
+JS_ThrowError(JSContext *ctx, JSErrorEnum error_num,
+              JS_PRINTF_FORMAT const char *fmt, va_list ap)
 {
     JSRuntime *rt = ctx->rt;
     JSStackFrame *sf;
-    BOOL add_backtrace;
+    bool add_backtrace;
 
     /* the backtrace is added later if called from a bytecode function */
     sf = rt->current_stack_frame;
     add_backtrace = !rt->in_out_of_memory &&
         (!sf || (JS_GetFunctionBytecode(sf->cur_func) == NULL));
-    return JS_ThrowError2(ctx, error_num, fmt, ap, add_backtrace);
+    return JS_ThrowError2(ctx, error_num, add_backtrace, fmt, ap);
 }
 
-JSValue __attribute__((format(printf, 2, 3))) JS_ThrowPlainError(JSContext *ctx, const char *fmt, ...)
+JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowPlainError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     JSValue val;
     va_list ap;
@@ -6981,7 +7048,7 @@ JSValue __attribute__((format(printf, 2, 3))) JS_ThrowPlainError(JSContext *ctx,
     return val;
 }
 
-JSValue __attribute__((format(printf, 2, 3))) JS_ThrowSyntaxError(JSContext *ctx, const char *fmt, ...)
+JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowSyntaxError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     JSValue val;
     va_list ap;
@@ -6992,7 +7059,7 @@ JSValue __attribute__((format(printf, 2, 3))) JS_ThrowSyntaxError(JSContext *ctx
     return val;
 }
 
-JSValue __attribute__((format(printf, 2, 3))) JS_ThrowTypeError(JSContext *ctx, const char *fmt, ...)
+JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowTypeError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     JSValue val;
     va_list ap;
@@ -7003,7 +7070,7 @@ JSValue __attribute__((format(printf, 2, 3))) JS_ThrowTypeError(JSContext *ctx,
     return val;
 }
 
-static int __attribute__((format(printf, 3, 4))) JS_ThrowTypeErrorOrFalse(JSContext *ctx, int flags, const char *fmt, ...)
+static int JS_PRINTF_FORMAT_ATTR(3, 4) JS_ThrowTypeErrorOrFalse(JSContext *ctx, int flags, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     va_list ap;
 
@@ -7014,30 +7081,30 @@ static int __attribute__((format(printf, 3, 4))) JS_ThrowTypeErrorOrFalse(JSCont
         va_end(ap);
         return -1;
     } else {
-        return FALSE;
+        return false;
     }
 }
 
-/* never use it directly */
-static JSValue __attribute__((format(printf, 3, 4))) __JS_ThrowTypeErrorAtom(JSContext *ctx, JSAtom atom, const char *fmt, ...)
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+#endif // __GNUC__
+static JSValue JS_ThrowTypeErrorAtom(JSContext *ctx, const char *fmt, JSAtom atom)
 {
     char buf[ATOM_GET_STR_BUF_SIZE];
-    return JS_ThrowTypeError(ctx, fmt,
-                             JS_AtomGetStr(ctx, buf, sizeof(buf), atom));
+    JS_AtomGetStr(ctx, buf, sizeof(buf), atom);
+    return JS_ThrowTypeError(ctx, fmt, buf);
 }
 
-/* never use it directly */
-static JSValue __attribute__((format(printf, 3, 4))) __JS_ThrowSyntaxErrorAtom(JSContext *ctx, JSAtom atom, const char *fmt, ...)
+static JSValue JS_ThrowSyntaxErrorAtom(JSContext *ctx, const char *fmt, JSAtom atom)
 {
     char buf[ATOM_GET_STR_BUF_SIZE];
-    return JS_ThrowSyntaxError(ctx, fmt,
-                             JS_AtomGetStr(ctx, buf, sizeof(buf), atom));
+    JS_AtomGetStr(ctx, buf, sizeof(buf), atom);
+    return JS_ThrowSyntaxError(ctx, fmt, buf);
 }
-
-/* %s is replaced by 'atom'. The macro is used so that gcc can check
-    the format string. */
-#define JS_ThrowTypeErrorAtom(ctx, fmt, atom) __JS_ThrowTypeErrorAtom(ctx, atom, fmt, "")
-#define JS_ThrowSyntaxErrorAtom(ctx, fmt, atom) __JS_ThrowSyntaxErrorAtom(ctx, atom, fmt, "")
+#ifdef __GNUC__
+#pragma GCC diagnostic pop // ignored "-Wformat-nonliteral"
+#endif // __GNUC__
 
 static int JS_ThrowTypeErrorReadOnly(JSContext *ctx, int flags, JSAtom atom)
 {
@@ -7046,11 +7113,11 @@ static int JS_ThrowTypeErrorReadOnly(JSContext *ctx, int flags, JSAtom atom)
         JS_ThrowTypeErrorAtom(ctx, "'%s' is read-only", atom);
         return -1;
     } else {
-        return FALSE;
+        return false;
     }
 }
 
-JSValue __attribute__((format(printf, 2, 3))) JS_ThrowReferenceError(JSContext *ctx, const char *fmt, ...)
+JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowReferenceError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     JSValue val;
     va_list ap;
@@ -7061,7 +7128,7 @@ JSValue __attribute__((format(printf, 2, 3))) JS_ThrowReferenceError(JSContext *
     return val;
 }
 
-JSValue __attribute__((format(printf, 2, 3))) JS_ThrowRangeError(JSContext *ctx, const char *fmt, ...)
+JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowRangeError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     JSValue val;
     va_list ap;
@@ -7072,7 +7139,7 @@ JSValue __attribute__((format(printf, 2, 3))) JS_ThrowRangeError(JSContext *ctx,
     return val;
 }
 
-JSValue __attribute__((format(printf, 2, 3))) JS_ThrowInternalError(JSContext *ctx, const char *fmt, ...)
+JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowInternalError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     JSValue val;
     va_list ap;
@@ -7087,9 +7154,9 @@ JSValue JS_ThrowOutOfMemory(JSContext *ctx)
 {
     JSRuntime *rt = ctx->rt;
     if (!rt->in_out_of_memory) {
-        rt->in_out_of_memory = TRUE;
+        rt->in_out_of_memory = true;
         JS_ThrowInternalError(ctx, "out of memory");
-        rt->in_out_of_memory = FALSE;
+        rt->in_out_of_memory = false;
     }
     return JS_EXCEPTION;
 }
@@ -7099,6 +7166,11 @@ static JSValue JS_ThrowStackOverflow(JSContext *ctx)
     return JS_ThrowRangeError(ctx, "Maximum call stack size exceeded");
 }
 
+static JSValue JS_ThrowTypeErrorNotAFunction(JSContext *ctx)
+{
+    return JS_ThrowTypeError(ctx, "not a function");
+}
+
 static JSValue JS_ThrowTypeErrorNotAnObject(JSContext *ctx)
 {
     return JS_ThrowTypeError(ctx, "not an object");
@@ -7126,7 +7198,7 @@ static JSValue JS_ThrowReferenceErrorUninitialized(JSContext *ctx, JSAtom name)
 
 static JSValue JS_ThrowReferenceErrorUninitialized2(JSContext *ctx,
                                                     JSFunctionBytecode *b,
-                                                    int idx, BOOL is_ref)
+                                                    int idx, bool is_ref)
 {
     JSAtom atom = JS_ATOM_NULL;
     if (is_ref) {
@@ -7155,7 +7227,7 @@ static no_inline __exception int __js_poll_interrupts(JSContext *ctx)
         if (rt->interrupt_handler(rt, rt->interrupt_opaque)) {
             /* XXX: should set a specific flag to avoid catching */
             JS_ThrowInternalError(ctx, "interrupted");
-            JS_SetUncatchableError(ctx, ctx->rt->current_exception, TRUE);
+            js_set_uncatchable_error(ctx, ctx->rt->current_exception, true);
             return -1;
         }
     }
@@ -7171,10 +7243,9 @@ static inline __exception int js_poll_interrupts(JSContext *ctx)
     }
 }
 
-/* return -1 (exception) or TRUE/FALSE */
-static int JS_SetPrototypeInternal(JSContext *ctx, JSValue obj,
-                                   JSValue proto_val,
-                                   BOOL throw_flag)
+/* return -1 (exception) or true/false */
+static int JS_SetPrototypeInternal(JSContext *ctx, JSValueConst obj,
+                                   JSValueConst proto_val, bool throw_flag)
 {
     JSObject *proto, *p, *p1;
     JSShape *sh;
@@ -7200,26 +7271,26 @@ static int JS_SetPrototypeInternal(JSContext *ctx, JSValue obj,
     }
 
     if (throw_flag && JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)
-        return TRUE;
+        return true;
 
     if (unlikely(p->class_id == JS_CLASS_PROXY))
         return js_proxy_setPrototypeOf(ctx, obj, proto_val, throw_flag);
     sh = p->shape;
     if (sh->proto == proto)
-        return TRUE;
+        return true;
     if (p == JS_VALUE_GET_OBJ(ctx->class_proto[JS_CLASS_OBJECT])) {
         if (throw_flag) {
             JS_ThrowTypeError(ctx, "'Immutable prototype object \'Object.prototype\' cannot have their prototype set'");
             return -1;
         }
-        return FALSE;
+        return false;
     }
     if (!p->extensible) {
         if (throw_flag) {
             JS_ThrowTypeError(ctx, "object is not extensible");
             return -1;
         } else {
-            return FALSE;
+            return false;
         }
     }
     if (proto) {
@@ -7231,7 +7302,7 @@ static int JS_SetPrototypeInternal(JSContext *ctx, JSValue obj,
                     JS_ThrowTypeError(ctx, "circular prototype chain");
                     return -1;
                 } else {
-                    return FALSE;
+                    return false;
                 }
             }
             /* Note: for Proxy objects, proto is NULL */
@@ -7246,47 +7317,48 @@ static int JS_SetPrototypeInternal(JSContext *ctx, JSValue obj,
     if (sh->proto)
         JS_FreeValue(ctx, JS_MKPTR(JS_TAG_OBJECT, sh->proto));
     sh->proto = proto;
-    return TRUE;
+    return true;
 }
 
-/* return -1 (exception) or TRUE/FALSE */
-int JS_SetPrototype(JSContext *ctx, JSValue obj, JSValue proto_val)
+/* return -1 (exception) or true/false */
+int JS_SetPrototype(JSContext *ctx, JSValueConst obj, JSValue proto_val)
 {
-    return JS_SetPrototypeInternal(ctx, obj, proto_val, TRUE);
+    return JS_SetPrototypeInternal(ctx, obj, proto_val, true);
 }
 
 /* Only works for primitive types, otherwise return JS_NULL. */
-static JSValue JS_GetPrototypePrimitive(JSContext *ctx, JSValue val)
+static JSValueConst JS_GetPrototypePrimitive(JSContext *ctx, JSValueConst val)
 {
+    JSValue ret;
     switch(JS_VALUE_GET_NORM_TAG(val)) {
     case JS_TAG_BIG_INT:
-        val = ctx->class_proto[JS_CLASS_BIG_INT];
+        ret = ctx->class_proto[JS_CLASS_BIG_INT];
         break;
     case JS_TAG_INT:
     case JS_TAG_FLOAT64:
-        val = ctx->class_proto[JS_CLASS_NUMBER];
+        ret = ctx->class_proto[JS_CLASS_NUMBER];
         break;
     case JS_TAG_BOOL:
-        val = ctx->class_proto[JS_CLASS_BOOLEAN];
+        ret = ctx->class_proto[JS_CLASS_BOOLEAN];
         break;
     case JS_TAG_STRING:
-        val = ctx->class_proto[JS_CLASS_STRING];
+        ret = ctx->class_proto[JS_CLASS_STRING];
         break;
     case JS_TAG_SYMBOL:
-        val = ctx->class_proto[JS_CLASS_SYMBOL];
+        ret = ctx->class_proto[JS_CLASS_SYMBOL];
         break;
     case JS_TAG_OBJECT:
     case JS_TAG_NULL:
     case JS_TAG_UNDEFINED:
     default:
-        val = JS_NULL;
+        ret = JS_NULL;
         break;
     }
-    return val;
+    return ret;
 }
 
 /* Return an Object, JS_NULL or JS_EXCEPTION in case of Proxy object. */
-JSValue JS_GetPrototype(JSContext *ctx, JSValue obj)
+JSValue JS_GetPrototype(JSContext *ctx, JSValueConst obj)
 {
     JSValue val;
     if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) {
@@ -7315,25 +7387,25 @@ static JSValue JS_GetPrototypeFree(JSContext *ctx, JSValue obj)
     return obj1;
 }
 
-int JS_GetLength(JSContext *ctx, JSValue obj, int64_t *pres) {
+int JS_GetLength(JSContext *ctx, JSValueConst obj, int64_t *pres) {
     return js_get_length64(ctx, pres, obj);
 }
 
-int JS_SetLength(JSContext *ctx, JSValue obj, int64_t len) {
+int JS_SetLength(JSContext *ctx, JSValueConst obj, int64_t len) {
     return js_set_length64(ctx, obj, len);
 }
 
-/* return TRUE, FALSE or (-1) in case of exception */
-static int JS_OrdinaryIsInstanceOf(JSContext *ctx, JSValue val,
-                                   JSValue obj)
+/* return true, false or (-1) in case of exception */
+static int JS_OrdinaryIsInstanceOf(JSContext *ctx, JSValueConst val,
+                                   JSValueConst obj)
 {
     JSValue obj_proto;
     JSObject *proto;
     const JSObject *p, *proto1;
-    BOOL ret;
+    int ret;
 
     if (!JS_IsFunction(ctx, obj))
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(obj);
     if (p->class_id == JS_CLASS_BOUND_FUNCTION) {
         JSBoundFunction *s = p->u.bound_function;
@@ -7342,7 +7414,7 @@ static int JS_OrdinaryIsInstanceOf(JSContext *ctx, JSValue val,
 
     /* Only explicitly boxed values are instances of constructors */
     if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
-        return FALSE;
+        return false;
     obj_proto = JS_GetProperty(ctx, obj, JS_ATOM_prototype);
     if (JS_VALUE_GET_TAG(obj_proto) != JS_TAG_OBJECT) {
         if (!JS_IsException(obj_proto))
@@ -7366,12 +7438,12 @@ static int JS_OrdinaryIsInstanceOf(JSContext *ctx, JSValue val,
                         break;
                     }
                     if (JS_IsNull(obj1)) {
-                        ret = FALSE;
+                        ret = false;
                         break;
                     }
                     if (proto == JS_VALUE_GET_OBJ(obj1)) {
                         JS_FreeValue(ctx, obj1);
-                        ret = TRUE;
+                        ret = true;
                         break;
                     }
                     /* must check for timeout to avoid infinite loop */
@@ -7382,13 +7454,13 @@ static int JS_OrdinaryIsInstanceOf(JSContext *ctx, JSValue val,
                     }
                 }
             } else {
-                ret = FALSE;
+                ret = false;
             }
             break;
         }
         p = proto1;
         if (proto == p) {
-            ret = TRUE;
+            ret = true;
             break;
         }
     }
@@ -7397,8 +7469,8 @@ done:
     return ret;
 }
 
-/* return TRUE, FALSE or (-1) in case of exception */
-int JS_IsInstanceOf(JSContext *ctx, JSValue val, JSValue obj)
+/* return true, false or (-1) in case of exception */
+int JS_IsInstanceOf(JSContext *ctx, JSValueConst val, JSValueConst obj)
 {
     JSValue method;
 
@@ -7455,17 +7527,16 @@ static int JS_AutoInitProperty(JSContext *ctx, JSObject *p, JSAtom prop,
     return 0;
 }
 
-static JSValue JS_GetPropertyInternal2(JSContext *ctx, JSValue obj,
-                                       JSAtom prop, JSValue this_obj,
-                                       JSInlineCacheUpdate *icu,
-                                       BOOL throw_ref_error)
+static JSValue JS_GetPropertyInternal(JSContext *ctx, JSValueConst obj,
+                                      JSAtom prop, JSValueConst this_obj,
+                                      bool throw_ref_error)
 {
     JSObject *p;
     JSProperty *pr;
     JSShapeProperty *prs;
-    uint32_t tag, offset, proto_depth;
+    uint32_t tag, proto_depth;
 
-    offset = proto_depth = 0;
+    proto_depth = 0;
     tag = JS_VALUE_GET_TAG(obj);
     if (unlikely(tag != JS_TAG_OBJECT)) {
         switch(tag) {
@@ -7502,7 +7573,7 @@ static JSValue JS_GetPropertyInternal2(JSContext *ctx, JSValue obj,
     }
 
     for(;;) {
-        prs = find_own_property_ic(&pr, p, prop, &offset);
+        prs = find_own_property(&pr, p, prop);
         if (prs) {
             /* found */
             if (unlikely(prs->flags & JS_PROP_TMASK)) {
@@ -7527,8 +7598,6 @@ static JSValue JS_GetPropertyInternal2(JSContext *ctx, JSValue obj,
                     continue;
                 }
             } else {
-                if (proto_depth == 0)
-                    add_ic_slot(ctx, icu, prop, p, offset);
                 return js_dup(pr->u.value);
             }
         }
@@ -7540,12 +7609,10 @@ static JSValue JS_GetPropertyInternal2(JSContext *ctx, JSValue obj,
                     if (idx < p->u.array.count) {
                         /* we avoid duplicating the code */
                         return JS_GetPropertyUint32(ctx, JS_MKPTR(JS_TAG_OBJECT, p), idx);
-                    } else if (p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-                               p->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+                    } else if (is_typed_array(p->class_id)) {
                         return JS_UNDEFINED;
                     }
-                } else if (p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-                           p->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+                } else if (is_typed_array(p->class_id)) {
                     int ret;
                     ret = JS_AtomIsNumericIndex(ctx, prop);
                     if (ret != 0) {
@@ -7603,34 +7670,9 @@ static JSValue JS_GetPropertyInternal2(JSContext *ctx, JSValue obj,
     }
 }
 
-static JSValue JS_GetPropertyInternal(JSContext *ctx, JSValue obj,
-                                      JSAtom prop, JSValue this_obj,
-                                      BOOL throw_ref_error)
-{
-    return JS_GetPropertyInternal2(ctx, obj, prop, this_obj, NULL, throw_ref_error);
-}
-
-JSValue JS_GetProperty(JSContext *ctx, JSValue this_obj, JSAtom prop)
-{
-    return JS_GetPropertyInternal2(ctx, this_obj, prop, this_obj, NULL, FALSE);
-}
-
-static JSValue JS_GetPropertyInternalWithIC(JSContext *ctx, JSValue obj,
-                                            JSAtom prop, JSValue this_obj,
-                                            JSInlineCacheUpdate *icu,
-                                            BOOL throw_ref_error)
+JSValue JS_GetProperty(JSContext *ctx, JSValueConst this_obj, JSAtom prop)
 {
-    uint32_t tag, offset;
-    JSObject *p;
-    tag = JS_VALUE_GET_TAG(obj);
-    if (unlikely(tag != JS_TAG_OBJECT))
-        goto slow_path;
-    p = JS_VALUE_GET_OBJ(obj);
-    offset = get_ic_prop_offset(icu, p->shape);
-    if (likely(offset != INLINE_CACHE_MISS))
-        return js_dup(p->prop[offset].u.value);
-slow_path:
-    return JS_GetPropertyInternal2(ctx, obj, prop, this_obj, icu, throw_ref_error);
+    return JS_GetPropertyInternal(ctx, this_obj, prop, this_obj, false);
 }
 
 static JSValue JS_ThrowTypeErrorPrivateNotFound(JSContext *ctx, JSAtom atom)
@@ -7641,7 +7683,7 @@ static JSValue JS_ThrowTypeErrorPrivateNotFound(JSContext *ctx, JSAtom atom)
 
 /* Private fields can be added even on non extensible objects or
    Proxies */
-static int JS_DefinePrivateField(JSContext *ctx, JSValue obj,
+static int JS_DefinePrivateField(JSContext *ctx, JSValueConst obj,
                                  JSValue name, JSValue val)
 {
     JSObject *p;
@@ -7676,8 +7718,8 @@ static int JS_DefinePrivateField(JSContext *ctx, JSValue obj,
     return 0;
 }
 
-static JSValue JS_GetPrivateField(JSContext *ctx, JSValue obj,
-                                  JSValue name)
+static JSValue JS_GetPrivateField(JSContext *ctx, JSValueConst obj,
+                                  JSValueConst name)
 {
     JSObject *p;
     JSShapeProperty *prs;
@@ -7699,8 +7741,8 @@ static JSValue JS_GetPrivateField(JSContext *ctx, JSValue obj,
     return js_dup(pr->u.value);
 }
 
-static int JS_SetPrivateField(JSContext *ctx, JSValue obj,
-                              JSValue name, JSValue val)
+static int JS_SetPrivateField(JSContext *ctx, JSValueConst obj,
+                              JSValueConst name, JSValue val)
 {
     JSObject *p;
     JSShapeProperty *prs;
@@ -7731,7 +7773,7 @@ static int JS_SetPrivateField(JSContext *ctx, JSValue obj,
 
 /* add a private brand field to 'home_obj' if not already present and
    if obj is != null add a private brand to it */
-static int JS_AddBrand(JSContext *ctx, JSValue obj, JSValue home_obj)
+static int JS_AddBrand(JSContext *ctx, JSValueConst obj, JSValueConst home_obj)
 {
     JSObject *p, *p1;
     JSShapeProperty *prs;
@@ -7820,8 +7862,7 @@ static int JS_CheckBrand(JSContext *ctx, JSValue obj, JSValue func)
     return (prs != NULL);
 }
 
-static uint32_t js_string_obj_get_length(JSContext *ctx,
-                                         JSValue obj)
+static uint32_t js_string_obj_get_length(JSContext *ctx, JSValueConst obj)
 {
     JSObject *p;
     JSString *p1;
@@ -7842,7 +7883,7 @@ static int num_keys_cmp(const void *p1, const void *p2, void *opaque)
     JSAtom atom1 = ((const JSPropertyEnum *)p1)->atom;
     JSAtom atom2 = ((const JSPropertyEnum *)p2)->atom;
     uint32_t v1, v2;
-    BOOL atom1_is_integer, atom2_is_integer;
+    bool atom1_is_integer, atom2_is_integer;
 
     atom1_is_integer = JS_AtomIsArrayIndex(ctx, &v1, atom1);
     atom2_is_integer = JS_AtomIsArrayIndex(ctx, &v2, atom2);
@@ -7879,7 +7920,7 @@ static int __exception JS_GetOwnPropertyNamesInternal(JSContext *ctx,
     JSAtom atom;
     uint32_t num_keys_count, str_keys_count, sym_keys_count, atom_count;
     uint32_t num_index, str_index, sym_index, exotic_count, exotic_keys_count;
-    BOOL is_enumerable, num_sorted;
+    bool is_enumerable, num_sorted;
     uint32_t num_key;
     JSAtomKindEnum kind;
 
@@ -7942,7 +7983,7 @@ static int __exception JS_GetOwnPropertyNamesInternal(JSContext *ctx,
                     atom = tab_exotic[i].atom;
                     kind = JS_AtomGetKind(ctx, atom);
                     if (((flags >> kind) & 1) != 0) {
-                        is_enumerable = FALSE;
+                        is_enumerable = false;
                         if (flags & (JS_GPN_SET_ENUM | JS_GPN_ENUM_ONLY)) {
                             JSPropertyDescriptor desc;
                             int res;
@@ -7982,7 +8023,7 @@ static int __exception JS_GetOwnPropertyNamesInternal(JSContext *ctx,
     str_index = num_keys_count;
     sym_index = str_index + str_keys_count;
 
-    num_sorted = TRUE;
+    num_sorted = true;
     sh = p->shape;
     for(i = 0, prs = get_shape_prop(sh); i < sh->prop_count; i++, prs++) {
         atom = prs->atom;
@@ -7993,7 +8034,7 @@ static int __exception JS_GetOwnPropertyNamesInternal(JSContext *ctx,
                 ((flags >> kind) & 1) != 0) {
                 if (JS_AtomIsArrayIndex(ctx, &num_key, atom)) {
                     j = num_index++;
-                    num_sorted = FALSE;
+                    num_sorted = false;
                 } else if (kind == JS_ATOM_KIND_STRING) {
                     j = str_index++;
                 } else {
@@ -8022,7 +8063,7 @@ static int __exception JS_GetOwnPropertyNamesInternal(JSContext *ctx,
                         js_free_prop_enum(ctx, tab_atom, num_index);
                         return -1;
                     }
-                    tab_atom[num_index].is_enumerable = TRUE;
+                    tab_atom[num_index].is_enumerable = true;
                     num_index++;
                 }
             }
@@ -8059,7 +8100,7 @@ static int __exception JS_GetOwnPropertyNamesInternal(JSContext *ctx,
 }
 
 int JS_GetOwnPropertyNames(JSContext *ctx, JSPropertyEnum **ptab,
-                           uint32_t *plen, JSValue obj, int flags)
+                           uint32_t *plen, JSValueConst obj, int flags)
 {
     if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) {
         JS_ThrowTypeErrorNotAnObject(ctx);
@@ -8070,7 +8111,7 @@ int JS_GetOwnPropertyNames(JSContext *ctx, JSPropertyEnum **ptab,
 }
 
 /* Return -1 if exception,
-   FALSE if the property does not exist, TRUE if it exists. If TRUE is
+   false if the property does not exist, true if it exists. If true is
    returned, the property descriptor 'desc' is filled present. */
 static int JS_GetOwnPropertyInternal(JSContext *ctx, JSPropertyDescriptor *desc,
                                      JSObject *p, JSAtom prop)
@@ -8120,7 +8161,7 @@ retry:
                 /* nothing to do: delay instantiation until actual value and/or attributes are read */
             }
         }
-        return TRUE;
+        return true;
     }
     if (p->is_exotic) {
         if (p->fast_array) {
@@ -8136,7 +8177,7 @@ retry:
                         desc->setter = JS_UNDEFINED;
                         desc->value = JS_GetPropertyUint32(ctx, JS_MKPTR(JS_TAG_OBJECT, p), idx);
                     }
-                    return TRUE;
+                    return true;
                 }
             }
         } else {
@@ -8147,11 +8188,11 @@ retry:
             }
         }
     }
-    return FALSE;
+    return false;
 }
 
 int JS_GetOwnProperty(JSContext *ctx, JSPropertyDescriptor *desc,
-                      JSValue obj, JSAtom prop)
+                      JSValueConst obj, JSAtom prop)
 {
     if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) {
         JS_ThrowTypeErrorNotAnObject(ctx);
@@ -8166,13 +8207,13 @@ void JS_FreePropertyEnum(JSContext *ctx, JSPropertyEnum *tab,
     js_free_prop_enum(ctx, tab, len);
 }
 
-/* return -1 if exception (Proxy object only) or TRUE/FALSE */
-int JS_IsExtensible(JSContext *ctx, JSValue obj)
+/* return -1 if exception (Proxy object only) or true/false */
+int JS_IsExtensible(JSContext *ctx, JSValueConst obj)
 {
     JSObject *p;
 
     if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT))
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(obj);
     if (unlikely(p->class_id == JS_CLASS_PROXY))
         return js_proxy_isExtensible(ctx, obj);
@@ -8180,29 +8221,29 @@ int JS_IsExtensible(JSContext *ctx, JSValue obj)
         return p->extensible;
 }
 
-/* return -1 if exception (Proxy object only) or TRUE/FALSE */
-int JS_PreventExtensions(JSContext *ctx, JSValue obj)
+/* return -1 if exception (Proxy object only) or true/false */
+int JS_PreventExtensions(JSContext *ctx, JSValueConst obj)
 {
     JSObject *p;
 
     if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT))
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(obj);
     if (unlikely(p->class_id == JS_CLASS_PROXY))
         return js_proxy_preventExtensions(ctx, obj);
-    p->extensible = FALSE;
-    return TRUE;
+    p->extensible = false;
+    return true;
 }
 
-/* return -1 if exception otherwise TRUE or FALSE */
-int JS_HasProperty(JSContext *ctx, JSValue obj, JSAtom prop)
+/* return -1 if exception otherwise true or false */
+int JS_HasProperty(JSContext *ctx, JSValueConst obj, JSAtom prop)
 {
     JSObject *p;
     int ret;
     JSValue obj1;
 
     if (unlikely(JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT))
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(obj);
     for(;;) {
         if (p->is_exotic) {
@@ -8221,31 +8262,30 @@ int JS_HasProperty(JSContext *ctx, JSValue obj, JSAtom prop)
         JS_FreeValue(ctx, JS_MKPTR(JS_TAG_OBJECT, p));
         if (ret != 0)
             return ret;
-        if (p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-            p->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+        if (is_typed_array(p->class_id)) {
             ret = JS_AtomIsNumericIndex(ctx, prop);
             if (ret != 0) {
                 if (ret < 0)
                     return -1;
-                return FALSE;
+                return false;
             }
         }
         p = p->shape->proto;
         if (!p)
             break;
     }
-    return FALSE;
+    return false;
 }
 
 /* val must be a symbol */
-static JSAtom js_symbol_to_atom(JSContext *ctx, JSValue val)
+static JSAtom js_symbol_to_atom(JSContext *ctx, JSValueConst val)
 {
     JSAtomStruct *p = JS_VALUE_GET_PTR(val);
     return js_get_atom_index(ctx->rt, p);
 }
 
 /* return JS_ATOM_NULL in case of exception */
-JSAtom JS_ValueToAtom(JSContext *ctx, JSValue val)
+JSAtom JS_ValueToAtom(JSContext *ctx, JSValueConst val)
 {
     JSAtom atom;
     uint32_t tag;
@@ -8271,66 +8311,66 @@ JSAtom JS_ValueToAtom(JSContext *ctx, JSValue val)
     return atom;
 }
 
-static BOOL js_get_fast_array_element(JSContext *ctx, JSObject *p,
+static bool js_get_fast_array_element(JSContext *ctx, JSObject *p,
                                       uint32_t idx, JSValue *pval)
 {
     switch(p->class_id) {
     case JS_CLASS_ARRAY:
     case JS_CLASS_ARGUMENTS:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_dup(p->u.array.u.values[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_INT8_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_int32(p->u.array.u.int8_ptr[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_UINT8C_ARRAY:
     case JS_CLASS_UINT8_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_int32(p->u.array.u.uint8_ptr[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_INT16_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_int32(p->u.array.u.int16_ptr[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_UINT16_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_int32(p->u.array.u.uint16_ptr[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_INT32_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_int32(p->u.array.u.int32_ptr[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_UINT32_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_uint32(p->u.array.u.uint32_ptr[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_BIG_INT64_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = JS_NewBigInt64(ctx, p->u.array.u.int64_ptr[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_BIG_UINT64_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = JS_NewBigUint64(ctx, p->u.array.u.uint64_ptr[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_FLOAT16_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_float64(fromfp16(p->u.array.u.fp16_ptr[idx]));
-        return TRUE;
+        return true;
     case JS_CLASS_FLOAT32_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_float64(p->u.array.u.float_ptr[idx]);
-        return TRUE;
+        return true;
     case JS_CLASS_FLOAT64_ARRAY:
-        if (unlikely(idx >= p->u.array.count)) return FALSE;
+        if (unlikely(idx >= p->u.array.count)) return false;
         *pval = js_float64(p->u.array.u.double_ptr[idx]);
-        return TRUE;
+        return true;
     default:
-        return FALSE;
+        return false;
     }
 }
 
-static JSValue JS_GetPropertyValue(JSContext *ctx, JSValue this_obj,
+static JSValue JS_GetPropertyValue(JSContext *ctx, JSValueConst this_obj,
                                    JSValue prop)
 {
     JSAtom atom;
@@ -8366,7 +8406,7 @@ static JSValue JS_GetPropertyValue(JSContext *ctx, JSValue this_obj,
     return ret;
 }
 
-JSValue JS_GetPropertyUint32(JSContext *ctx, JSValue this_obj,
+JSValue JS_GetPropertyUint32(JSContext *ctx, JSValueConst this_obj,
                              uint32_t idx)
 {
     return JS_GetPropertyInt64(ctx, this_obj, idx);
@@ -8374,10 +8414,10 @@ JSValue JS_GetPropertyUint32(JSContext *ctx, JSValue this_obj,
 
 /* Check if an object has a generalized numeric property. Return value:
    -1 for exception, *pval set to JS_EXCEPTION
-   TRUE if property exists, stored into *pval,
-   FALSE if property does not exist. *pval set to JS_UNDEFINED.
+   true if property exists, stored into *pval,
+   false if property does not exist. *pval set to JS_UNDEFINED.
  */
-static int JS_TryGetPropertyInt64(JSContext *ctx, JSValue obj, int64_t idx, JSValue *pval)
+static int JS_TryGetPropertyInt64(JSContext *ctx, JSValueConst obj, int64_t idx, JSValue *pval)
 {
     JSValue val;
     JSAtom prop;
@@ -8388,7 +8428,7 @@ static int JS_TryGetPropertyInt64(JSContext *ctx, JSValue obj, int64_t idx, JSVa
         /* fast path for array and typed array access */
         JSObject *p = JS_VALUE_GET_OBJ(obj);
         if (js_get_fast_array_element(ctx, p, idx, pval))
-            return TRUE;
+            return true;
     }
     val = JS_EXCEPTION;
     present = -1;
@@ -8399,7 +8439,7 @@ static int JS_TryGetPropertyInt64(JSContext *ctx, JSValue obj, int64_t idx, JSVa
             val = JS_GetProperty(ctx, obj, prop);
             if (unlikely(JS_IsException(val)))
                 present = -1;
-        } else if (present == FALSE) {
+        } else if (present == false) {
             val = JS_UNDEFINED;
         }
         JS_FreeAtom(ctx, prop);
@@ -8408,7 +8448,7 @@ static int JS_TryGetPropertyInt64(JSContext *ctx, JSValue obj, int64_t idx, JSVa
     return present;
 }
 
-JSValue JS_GetPropertyInt64(JSContext *ctx, JSValue obj, int64_t idx)
+JSValue JS_GetPropertyInt64(JSContext *ctx, JSValueConst obj, int64_t idx)
 {
     JSAtom prop;
     JSValue val;
@@ -8430,7 +8470,7 @@ JSValue JS_GetPropertyInt64(JSContext *ctx, JSValue obj, int64_t idx)
 }
 
 /* `prop` may be pure ASCII or UTF-8 encoded */
-JSValue JS_GetPropertyStr(JSContext *ctx, JSValue this_obj,
+JSValue JS_GetPropertyStr(JSContext *ctx, JSValueConst this_obj,
                           const char *prop)
 {
     JSAtom atom;
@@ -8472,7 +8512,7 @@ static JSProperty *add_property(JSContext *ctx,
             if (!new_sh)
                 return NULL;
             /* hash the cloned shape */
-            new_sh->is_hashed = TRUE;
+            new_sh->is_hashed = true;
             js_shape_hash_link(ctx->rt, new_sh);
             js_free_shape(ctx->rt, p->shape);
             p->shape = new_sh;
@@ -8540,7 +8580,7 @@ static int delete_property(JSContext *ctx, JSObject *p, JSAtom atom)
         if (likely(pr->atom == atom)) {
             /* found ! */
             if (!(pr->flags & JS_PROP_CONFIGURABLE))
-                return FALSE;
+                return false;
             /* realloc the shape if needed */
             if (lpr)
                 lpr_idx = lpr - get_shape_prop(sh);
@@ -8569,7 +8609,7 @@ static int delete_property(JSContext *ctx, JSObject *p, JSAtom atom)
                 sh->deleted_prop_count >= ((unsigned)sh->prop_count / 2)) {
                 compact_properties(ctx, p);
             }
-            return TRUE;
+            return true;
         }
         lpr = pr;
         h = pr->hash_next;
@@ -8586,13 +8626,13 @@ static int delete_property(JSContext *ctx, JSObject *p, JSAtom atom)
                     if (idx == p->u.array.count - 1) {
                         JS_FreeValue(ctx, p->u.array.u.values[idx]);
                         p->u.array.count = idx;
-                        return TRUE;
+                        return true;
                     }
                     if (convert_fast_array_to_array(ctx, p))
                         return -1;
                     goto redo;
                 } else {
-                    return FALSE;
+                    return false;
                 }
             }
         } else {
@@ -8603,23 +8643,23 @@ static int delete_property(JSContext *ctx, JSObject *p, JSAtom atom)
         }
     }
     /* not found */
-    return TRUE;
+    return true;
 }
 
 static int call_setter(JSContext *ctx, JSObject *setter,
-                       JSValue this_obj, JSValue val, int flags)
+                       JSValueConst this_obj, JSValue val, int flags)
 {
     JSValue ret, func;
     if (likely(setter)) {
         func = JS_MKPTR(JS_TAG_OBJECT, setter);
         /* Note: the field could be removed in the setter */
         func = js_dup(func);
-        ret = JS_CallFree(ctx, func, this_obj, 1, &val);
+        ret = JS_CallFree(ctx, func, this_obj, 1, vc(&val));
         JS_FreeValue(ctx, val);
         if (JS_IsException(ret))
             return -1;
         JS_FreeValue(ctx, ret);
-        return TRUE;
+        return true;
     } else {
         JS_FreeValue(ctx, val);
         if ((flags & JS_PROP_THROW) ||
@@ -8627,7 +8667,7 @@ static int call_setter(JSContext *ctx, JSObject *setter,
             JS_ThrowTypeError(ctx, "no setter for property");
             return -1;
         }
-        return FALSE;
+        return false;
     }
 }
 
@@ -8639,7 +8679,7 @@ static int set_array_length(JSContext *ctx, JSObject *p, JSValue val,
     int i, ret;
 
     /* Note: this call can reallocate the properties of 'p' */
-    ret = JS_ToArrayLengthFree(ctx, &len, val, FALSE);
+    ret = JS_ToArrayLengthFree(ctx, &len, val, false);
     if (ret)
         return -1;
     /* JS_ToArrayLengthFree() must be done before the read-only test */
@@ -8719,7 +8759,7 @@ static int set_array_length(JSContext *ctx, JSObject *p, JSValue val,
             return JS_ThrowTypeErrorOrFalse(ctx, flags, "not configurable");
         }
     }
-    return TRUE;
+    return true;
 }
 
 /* return -1 if exception */
@@ -8740,7 +8780,7 @@ static int expand_fast_array(JSContext *ctx, JSObject *p, uint32_t new_len)
 }
 
 /* Preconditions: 'p' must be of class JS_CLASS_ARRAY, p->fast_array =
-   TRUE and p->extensible = TRUE */
+   true and p->extensible = true */
 static int add_fast_array_element(JSContext *ctx, JSObject *p,
                                   JSValue val, int flags)
 {
@@ -8768,7 +8808,7 @@ static int add_fast_array_element(JSContext *ctx, JSObject *p,
     }
     p->u.array.u.values[new_len - 1] = val;
     p->u.array.count = new_len;
-    return TRUE;
+    return true;
 }
 
 static void js_free_desc(JSContext *ctx, JSPropertyDescriptor *desc)
@@ -8778,22 +8818,20 @@ static void js_free_desc(JSContext *ctx, JSPropertyDescriptor *desc)
     JS_FreeValue(ctx, desc->value);
 }
 
-/* return -1 in case of exception or TRUE or FALSE. Warning: 'val' is
+/* return -1 in case of exception or true or false. Warning: 'val' is
    freed by the function. 'flags' is a bitmask of JS_PROP_NO_ADD,
    JS_PROP_THROW or JS_PROP_THROW_STRICT. If JS_PROP_NO_ADD is set,
    the new property is not added and an error is raised.
    'obj' must be an object when obj != this_obj.
    */
-static int JS_SetPropertyInternal2(JSContext *ctx, JSValue obj, JSAtom prop,
-                                   JSValue val, JSValue this_obj, int flags,
-                                   JSInlineCacheUpdate *icu)
+static int JS_SetPropertyInternal2(JSContext *ctx, JSValueConst obj, JSAtom prop,
+                                   JSValue val, JSValueConst this_obj, int flags)
 {
     JSObject *p, *p1;
     JSShapeProperty *prs;
     JSProperty *pr;
     JSPropertyDescriptor desc;
     int ret;
-    uint32_t offset = 0;
 
     switch(JS_VALUE_GET_TAG(this_obj)) {
     case JS_TAG_NULL:
@@ -8817,14 +8855,13 @@ static int JS_SetPropertyInternal2(JSContext *ctx, JSValue obj, JSAtom prop,
     }
 
 retry:
-    prs = find_own_property_ic(&pr, p1, prop, &offset);
+    prs = find_own_property(&pr, p1, prop);
     if (prs) {
         if (likely((prs->flags & (JS_PROP_TMASK | JS_PROP_WRITABLE |
                                   JS_PROP_LENGTH)) == JS_PROP_WRITABLE)) {
             /* fast case */
-            add_ic_slot(ctx, icu, prop, p, offset);
             set_value(ctx, &pr->u.value, val);
-            return TRUE;
+            return true;
         } else if (prs->flags & JS_PROP_LENGTH) {
             assert(p->class_id == JS_CLASS_ARRAY);
             assert(prop == JS_ATOM_length);
@@ -8838,7 +8875,7 @@ retry:
             if (p->class_id == JS_CLASS_MODULE_NS)
                 goto read_only_prop;
             set_value(ctx, pr->u.var_ref->pvalue, val);
-            return TRUE;
+            return true;
         } else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) {
             /* Instantiate property and retry (potentially useless) */
             if (JS_AutoInitProperty(ctx, p, prop, pr, prs))
@@ -8859,12 +8896,10 @@ retry:
                             return JS_SetPropertyValue(ctx, this_obj, js_int32(idx), val, flags);
                         else
                             break;
-                    } else if (p1->class_id >= JS_CLASS_UINT8C_ARRAY &&
-                               p1->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+                    } else if (is_typed_array(p1->class_id)) {
                         goto typed_array_oob;
                     }
-                } else if (p1->class_id >= JS_CLASS_UINT8C_ARRAY &&
-                           p1->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+                } else if (is_typed_array(p1->class_id)) {
                     ret = JS_AtomIsNumericIndex(ctx, prop);
                     if (ret != 0) {
                         if (ret < 0)
@@ -8882,7 +8917,7 @@ retry:
                             if (JS_IsException(val))
                                 return -1;
                         }
-                        return TRUE;
+                        return true;
                     }
                 }
             } else {
@@ -8988,7 +9023,7 @@ retry:
             if (!pr)
                 goto fail;
             pr->u.value = val;
-            return TRUE;
+            return true;
         }
     }
 
@@ -9034,40 +9069,19 @@ fail:
     return -1;
 }
 
-static int JS_SetPropertyInternal(JSContext *ctx, JSValue this_obj,
-                                  JSAtom prop, JSValue val, int flags)
+static int JS_SetPropertyInternal(JSContext *ctx, JSValueConst obj, JSAtom prop,
+                                  JSValue val, int flags)
 {
-    return JS_SetPropertyInternal2(ctx, this_obj, prop, val, this_obj,
-                                   flags, NULL);
+    return JS_SetPropertyInternal2(ctx, obj, prop, val, obj, flags);
 }
 
-int JS_SetProperty(JSContext *ctx, JSValue this_obj, JSAtom prop, JSValue val)
+int JS_SetProperty(JSContext *ctx, JSValueConst this_obj, JSAtom prop, JSValue val)
 {
-    return JS_SetPropertyInternal2(ctx, this_obj, prop, val, this_obj, JS_PROP_THROW, NULL);
-}
-
-// XXX(bnoordhuis) only used by OP_put_field_ic, maybe inline at call site
-static int JS_SetPropertyInternalWithIC(JSContext *ctx, JSValue this_obj,
-                                        JSAtom prop, JSValue val, int flags,
-                                        JSInlineCacheUpdate *icu) {
-    uint32_t tag, offset;
-    JSObject *p;
-    tag = JS_VALUE_GET_TAG(this_obj);
-    if (unlikely(tag != JS_TAG_OBJECT))
-        goto slow_path;
-    p = JS_VALUE_GET_OBJ(this_obj);
-    offset = get_ic_prop_offset(icu, p->shape);
-    if (likely(offset != INLINE_CACHE_MISS)) {
-        set_value(ctx, &p->prop[offset].u.value, val);
-        return TRUE;
-    }
-slow_path:
-    return JS_SetPropertyInternal2(ctx, this_obj, prop, val, this_obj,
-                                   flags, icu);
+    return JS_SetPropertyInternal(ctx, this_obj, prop, val, JS_PROP_THROW);
 }
 
 /* flags can be JS_PROP_THROW or JS_PROP_THROW_STRICT */
-static int JS_SetPropertyValue(JSContext *ctx, JSValue this_obj,
+static int JS_SetPropertyValue(JSContext *ctx, JSValueConst this_obj,
                                JSValue prop, JSValue val, int flags)
 {
     if (likely(JS_VALUE_GET_TAG(this_obj) == JS_TAG_OBJECT &&
@@ -9179,7 +9193,7 @@ static int JS_SetPropertyValue(JSContext *ctx, JSValue this_obj,
             ta_cvt_fail:
                 if (flags & JS_PROP_REFLECT_DEFINE_PROPERTY) {
                     JS_FreeValue(ctx, JS_GetException(ctx));
-                    return FALSE;
+                    return false;
                 }
                 return -1;
             }
@@ -9188,14 +9202,14 @@ static int JS_SetPropertyValue(JSContext *ctx, JSValue this_obj,
                 if (typed_array_is_oob(p))
                     if (flags & JS_PROP_DEFINE_PROPERTY)
                         return JS_ThrowTypeErrorOrFalse(ctx, flags, "out-of-bound numeric index");
-                return TRUE; // per spec: no OOB exception
+                return true; // per spec: no OOB exception
             }
             p->u.array.u.double_ptr[idx] = d;
             break;
         default:
             goto slow_path;
         }
-        return TRUE;
+        return true;
     } else {
         JSAtom atom;
         int ret;
@@ -9212,14 +9226,14 @@ static int JS_SetPropertyValue(JSContext *ctx, JSValue this_obj,
     }
 }
 
-int JS_SetPropertyUint32(JSContext *ctx, JSValue this_obj,
+int JS_SetPropertyUint32(JSContext *ctx, JSValueConst this_obj,
                          uint32_t idx, JSValue val)
 {
     return JS_SetPropertyValue(ctx, this_obj, js_uint32(idx), val,
                                JS_PROP_THROW);
 }
 
-int JS_SetPropertyInt64(JSContext *ctx, JSValue this_obj,
+int JS_SetPropertyInt64(JSContext *ctx, JSValueConst this_obj,
                         int64_t idx, JSValue val)
 {
     JSAtom prop;
@@ -9241,7 +9255,7 @@ int JS_SetPropertyInt64(JSContext *ctx, JSValue this_obj,
 }
 
 /* `prop` may be pure ASCII or UTF-8 encoded */
-int JS_SetPropertyStr(JSContext *ctx, JSValue this_obj,
+int JS_SetPropertyStr(JSContext *ctx, JSValueConst this_obj,
                       const char *prop, JSValue val)
 {
     JSAtom atom;
@@ -9264,8 +9278,8 @@ static int get_prop_flags(int flags, int def_flags)
 }
 
 static int JS_CreateProperty(JSContext *ctx, JSObject *p,
-                             JSAtom prop, JSValue val,
-                             JSValue getter, JSValue setter,
+                             JSAtom prop, JSValueConst val,
+                             JSValueConst getter, JSValueConst setter,
                              int flags)
 {
     JSProperty *pr;
@@ -9316,8 +9330,7 @@ static int JS_CreateProperty(JSContext *ctx, JSObject *p,
                     set_value(ctx, &plen->u.value, js_uint32(len));
                 }
             }
-        } else if (p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-                   p->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+        } else if (is_typed_array(p->class_id)) {
             ret = JS_AtomIsNumericIndex(ctx, prop);
             if (ret != 0) {
                 if (ret < 0)
@@ -9372,22 +9385,22 @@ static int JS_CreateProperty(JSContext *ctx, JSObject *p,
             pr->u.value = JS_UNDEFINED;
         }
     }
-    return TRUE;
+    return true;
 }
 
-/* return FALSE if not OK */
-static BOOL check_define_prop_flags(int prop_flags, int flags)
+/* return false if not OK */
+static bool check_define_prop_flags(int prop_flags, int flags)
 {
-    BOOL has_accessor, is_getset;
+    bool has_accessor, is_getset;
 
     if (!(prop_flags & JS_PROP_CONFIGURABLE)) {
         if ((flags & (JS_PROP_HAS_CONFIGURABLE | JS_PROP_CONFIGURABLE)) ==
             (JS_PROP_HAS_CONFIGURABLE | JS_PROP_CONFIGURABLE)) {
-            return FALSE;
+            return false;
         }
         if ((flags & JS_PROP_HAS_ENUMERABLE) &&
             (flags & JS_PROP_ENUMERABLE) != (prop_flags & JS_PROP_ENUMERABLE))
-            return FALSE;
+            return false;
     }
     if (flags & (JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE |
                  JS_PROP_HAS_GET | JS_PROP_HAS_SET)) {
@@ -9395,16 +9408,16 @@ static BOOL check_define_prop_flags(int prop_flags, int flags)
             has_accessor = ((flags & (JS_PROP_HAS_GET | JS_PROP_HAS_SET)) != 0);
             is_getset = ((prop_flags & JS_PROP_TMASK) == JS_PROP_GETSET);
             if (has_accessor != is_getset)
-                return FALSE;
+                return false;
             if (!has_accessor && !is_getset && !(prop_flags & JS_PROP_WRITABLE)) {
                 /* not writable: cannot set the writable bit */
                 if ((flags & (JS_PROP_HAS_WRITABLE | JS_PROP_WRITABLE)) ==
                     (JS_PROP_HAS_WRITABLE | JS_PROP_WRITABLE))
-                    return FALSE;
+                    return false;
             }
         }
     }
-    return TRUE;
+    return true;
 }
 
 /* ensure that the shape can be safely modified */
@@ -9429,7 +9442,7 @@ static int js_shape_prepare_update(JSContext *ctx, JSObject *p,
                 *pprs = get_shape_prop(sh) + idx;
         } else {
             js_shape_hash_unlink(ctx->rt, sh);
-            sh->is_hashed = FALSE;
+            sh->is_hashed = false;
         }
     }
     return 0;
@@ -9451,14 +9464,14 @@ static int js_update_property_flags(JSContext *ctx, JSObject *p,
    JS_PROP_HAS_GET, JS_PROP_HAS_SET, JS_PROP_HAS_VALUE,
    JS_PROP_HAS_CONFIGURABLE, JS_PROP_HAS_WRITABLE, JS_PROP_HAS_ENUMERABLE,
    JS_PROP_THROW, JS_PROP_NO_EXOTIC.
-   If JS_PROP_THROW is set, return an exception instead of FALSE.
+   If JS_PROP_THROW is set, return an exception instead of false.
    if JS_PROP_NO_EXOTIC is set, do not call the exotic
    define_own_property callback.
-   return -1 (exception), FALSE or TRUE.
+   return -1 (exception), false or true.
 */
-int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
-                      JSAtom prop, JSValue val,
-                      JSValue getter, JSValue setter, int flags)
+int JS_DefineProperty(JSContext *ctx, JSValueConst this_obj,
+                      JSAtom prop, JSValueConst val,
+                      JSValueConst getter, JSValueConst setter, int flags)
 {
     JSObject *p;
     JSShapeProperty *prs;
@@ -9478,7 +9491,7 @@ int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
         if ((prs->flags & JS_PROP_LENGTH) && (flags & JS_PROP_HAS_VALUE)) {
             uint32_t array_length;
             if (JS_ToArrayLengthFree(ctx, &array_length,
-                                     js_dup(val), FALSE)) {
+                                     js_dup(val), false)) {
                 return -1;
             }
             /* this code relies on the fact that Uint32 are never allocated */
@@ -9575,7 +9588,7 @@ int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
                         if (!js_same_value(ctx, val, pr->u.value)) {
                             goto not_configurable;
                         } else {
-                            return TRUE;
+                            return true;
                         }
                     }
                 }
@@ -9589,8 +9602,7 @@ int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
                                 goto not_configurable;
                         }
                         /* update the reference */
-                        set_value(ctx, pr->u.var_ref->pvalue,
-                                  js_dup(val));
+                        set_value(ctx, pr->u.var_ref->pvalue, js_dup(val));
                     }
                     /* if writable is set to false, no longer a
                        reference (for mapped arguments) */
@@ -9607,10 +9619,9 @@ int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
                     if (flags & JS_PROP_HAS_VALUE) {
                         /* Note: no JS code is executable because
                            'val' is guaranted to be a Uint32 */
-                        res = set_array_length(ctx, p, js_dup(val),
-                                               flags);
+                        res = set_array_length(ctx, p, js_dup(val), flags);
                     } else {
-                        res = TRUE;
+                        res = true;
                     }
                     /* still need to reset the writable flag if
                        needed.  The JS_PROP_LENGTH is kept because the
@@ -9646,7 +9657,7 @@ int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
         if (js_update_property_flags(ctx, p, &prs,
                                      (prs->flags & ~mask) | (flags & mask)))
             return -1;
-        return TRUE;
+        return true;
     }
 
     /* handle modification of fast array elements */
@@ -9670,11 +9681,10 @@ int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
                     if (flags & JS_PROP_HAS_VALUE) {
                         set_value(ctx, &p->u.array.u.values[idx], js_dup(val));
                     }
-                    return TRUE;
+                    return true;
                 }
             }
-        } else if (p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-                   p->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+        } else if (is_typed_array(p->class_id)) {
             JSValue num;
             int ret;
 
@@ -9716,7 +9726,7 @@ int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
             if (flags & JS_PROP_HAS_VALUE) {
                 return JS_SetPropertyValue(ctx, this_obj, js_int32(idx), js_dup(val), flags);
             }
-            return TRUE;
+            return true;
         typed_array_done: ;
         }
     }
@@ -9724,7 +9734,7 @@ int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
     return JS_CreateProperty(ctx, p, prop, val, getter, setter, flags);
 }
 
-static int JS_DefineAutoInitProperty(JSContext *ctx, JSValue this_obj,
+static int JS_DefineAutoInitProperty(JSContext *ctx, JSValueConst this_obj,
                                      JSAtom prop, JSAutoInitIDEnum id,
                                      void *opaque, int flags)
 {
@@ -9732,14 +9742,14 @@ static int JS_DefineAutoInitProperty(JSContext *ctx, JSValue this_obj,
     JSProperty *pr;
 
     if (JS_VALUE_GET_TAG(this_obj) != JS_TAG_OBJECT)
-        return FALSE;
+        return false;
 
     p = JS_VALUE_GET_OBJ(this_obj);
 
     if (find_own_property(&pr, p, prop)) {
         /* property already exists */
         abort();
-        return FALSE;
+        return false;
     }
 
     /* Specialized CreateProperty */
@@ -9751,11 +9761,11 @@ static int JS_DefineAutoInitProperty(JSContext *ctx, JSValue this_obj,
     assert(id <= 3);
     pr->u.init.realm_and_id |= id;
     pr->u.init.opaque = opaque;
-    return TRUE;
+    return true;
 }
 
 /* shortcut to add or redefine a new property value */
-int JS_DefinePropertyValue(JSContext *ctx, JSValue this_obj,
+int JS_DefinePropertyValue(JSContext *ctx, JSValueConst this_obj,
                            JSAtom prop, JSValue val, int flags)
 {
     int ret;
@@ -9765,7 +9775,7 @@ int JS_DefinePropertyValue(JSContext *ctx, JSValue this_obj,
     return ret;
 }
 
-int JS_DefinePropertyValueValue(JSContext *ctx, JSValue this_obj,
+int JS_DefinePropertyValueValue(JSContext *ctx, JSValueConst this_obj,
                                 JSValue prop, JSValue val, int flags)
 {
     JSAtom atom;
@@ -9781,14 +9791,14 @@ int JS_DefinePropertyValueValue(JSContext *ctx, JSValue this_obj,
     return ret;
 }
 
-int JS_DefinePropertyValueUint32(JSContext *ctx, JSValue this_obj,
+int JS_DefinePropertyValueUint32(JSContext *ctx, JSValueConst this_obj,
                                  uint32_t idx, JSValue val, int flags)
 {
     return JS_DefinePropertyValueValue(ctx, this_obj, js_uint32(idx),
                                        val, flags);
 }
 
-int JS_DefinePropertyValueInt64(JSContext *ctx, JSValue this_obj,
+int JS_DefinePropertyValueInt64(JSContext *ctx, JSValueConst this_obj,
                                 int64_t idx, JSValue val, int flags)
 {
     return JS_DefinePropertyValueValue(ctx, this_obj, js_int64(idx),
@@ -9796,7 +9806,7 @@ int JS_DefinePropertyValueInt64(JSContext *ctx, JSValue this_obj,
 }
 
 /* `prop` may be pure ASCII or UTF-8 encoded */
-int JS_DefinePropertyValueStr(JSContext *ctx, JSValue this_obj,
+int JS_DefinePropertyValueStr(JSContext *ctx, JSValueConst this_obj,
                               const char *prop, JSValue val, int flags)
 {
     JSAtom atom;
@@ -9808,7 +9818,7 @@ int JS_DefinePropertyValueStr(JSContext *ctx, JSValue this_obj,
 }
 
 /* shortcut to add getter & setter */
-int JS_DefinePropertyGetSet(JSContext *ctx, JSValue this_obj,
+int JS_DefinePropertyGetSet(JSContext *ctx, JSValueConst this_obj,
                             JSAtom prop, JSValue getter, JSValue setter,
                             int flags)
 {
@@ -9821,7 +9831,7 @@ int JS_DefinePropertyGetSet(JSContext *ctx, JSValue this_obj,
     return ret;
 }
 
-static int JS_CreateDataPropertyUint32(JSContext *ctx, JSValue this_obj,
+static int JS_CreateDataPropertyUint32(JSContext *ctx, JSValueConst this_obj,
                                        int64_t idx, JSValue val, int flags)
 {
     return JS_DefinePropertyValueValue(ctx, this_obj, js_int64(idx),
@@ -9830,8 +9840,8 @@ static int JS_CreateDataPropertyUint32(JSContext *ctx, JSValue this_obj,
 }
 
 
-/* return TRUE if 'obj' has a non empty 'name' string */
-static BOOL js_object_has_name(JSContext *ctx, JSValue obj)
+/* return true if 'obj' has a non empty 'name' string */
+static bool js_object_has_name(JSContext *ctx, JSValue obj)
 {
     JSProperty *pr;
     JSShapeProperty *prs;
@@ -9840,12 +9850,12 @@ static BOOL js_object_has_name(JSContext *ctx, JSValue obj)
 
     prs = find_own_property(&pr, JS_VALUE_GET_OBJ(obj), JS_ATOM_name);
     if (!prs)
-        return FALSE;
+        return false;
     if ((prs->flags & JS_PROP_TMASK) != JS_PROP_NORMAL)
-        return TRUE;
+        return true;
     val = pr->u.value;
     if (JS_VALUE_GET_TAG(val) != JS_TAG_STRING)
-        return TRUE;
+        return true;
     p = JS_VALUE_GET_STRING(val);
     return (p->len != 0);
 }
@@ -9989,7 +9999,7 @@ static int JS_DefineGlobalFunction(JSContext *ctx, JSAtom prop,
 }
 
 static JSValue JS_GetGlobalVar(JSContext *ctx, JSAtom prop,
-                               BOOL throw_ref_error)
+                               bool throw_ref_error)
 {
     JSObject *p;
     JSShapeProperty *prs;
@@ -10056,7 +10066,7 @@ static int JS_CheckGlobalVar(JSContext *ctx, JSAtom prop)
     p = JS_VALUE_GET_OBJ(ctx->global_var_obj);
     prs = find_own_property1(p, prop);
     if (prs) {
-        ret = TRUE;
+        ret = true;
     } else {
         ret = JS_HasProperty(ctx, ctx->global_obj, prop);
         if (ret < 0)
@@ -10102,10 +10112,10 @@ static int JS_SetGlobalVar(JSContext *ctx, JSAtom prop, JSValue val,
     return JS_SetPropertyInternal(ctx, ctx->global_obj, prop, val, flags);
 }
 
-/* return -1, FALSE or TRUE. return FALSE if not configurable or
+/* return -1, false or true. return false if not configurable or
    invalid object. return -1 in case of exception.
    flags can be 0, JS_PROP_THROW or JS_PROP_THROW_STRICT */
-int JS_DeleteProperty(JSContext *ctx, JSValue obj, JSAtom prop, int flags)
+int JS_DeleteProperty(JSContext *ctx, JSValueConst obj, JSAtom prop, int flags)
 {
     JSValue obj1;
     JSObject *p;
@@ -10117,17 +10127,17 @@ int JS_DeleteProperty(JSContext *ctx, JSValue obj, JSAtom prop, int flags)
     p = JS_VALUE_GET_OBJ(obj1);
     res = delete_property(ctx, p, prop);
     JS_FreeValue(ctx, obj1);
-    if (res != FALSE)
+    if (res != false)
         return res;
     if ((flags & JS_PROP_THROW) ||
         ((flags & JS_PROP_THROW_STRICT) && is_strict_mode(ctx))) {
         JS_ThrowTypeError(ctx, "could not delete property");
         return -1;
     }
-    return FALSE;
+    return false;
 }
 
-int JS_DeletePropertyInt64(JSContext *ctx, JSValue obj, int64_t idx, int flags)
+int JS_DeletePropertyInt64(JSContext *ctx, JSValueConst obj, int64_t idx, int flags)
 {
     JSAtom prop;
     int res;
@@ -10144,15 +10154,15 @@ int JS_DeletePropertyInt64(JSContext *ctx, JSValue obj, int64_t idx, int flags)
     return res;
 }
 
-BOOL JS_IsFunction(JSContext *ctx, JSValue val)
+bool JS_IsFunction(JSContext *ctx, JSValueConst val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(val);
     switch(p->class_id) {
     case JS_CLASS_BYTECODE_FUNCTION:
-        return TRUE;
+        return true;
     case JS_CLASS_PROXY:
         return p->u.proxy_data->is_func;
     default:
@@ -10160,57 +10170,72 @@ BOOL JS_IsFunction(JSContext *ctx, JSValue val)
     }
 }
 
-BOOL JS_IsCFunction(JSContext *ctx, JSValue val, JSCFunction *func, int magic)
+static bool JS_IsCFunction(JSContext *ctx, JSValueConst val, JSCFunction *func,
+                           int magic)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(val);
     if (p->class_id == JS_CLASS_C_FUNCTION)
         return (p->u.cfunc.c_function.generic == func && p->u.cfunc.magic == magic);
     else
-        return FALSE;
+        return false;
 }
 
-BOOL JS_IsConstructor(JSContext *ctx, JSValue val)
+bool JS_IsConstructor(JSContext *ctx, JSValueConst val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(val);
     return p->is_constructor;
 }
 
-BOOL JS_SetConstructorBit(JSContext *ctx, JSValue func_obj, BOOL val)
+bool JS_SetConstructorBit(JSContext *ctx, JSValueConst func_obj, bool val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(func_obj) != JS_TAG_OBJECT)
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(func_obj);
     p->is_constructor = val;
-    return TRUE;
+    return true;
+}
+
+bool JS_IsRegExp(JSValueConst val)
+{
+    if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
+        return false;
+    return JS_VALUE_GET_OBJ(val)->class_id == JS_CLASS_REGEXP;
 }
 
-BOOL JS_IsError(JSContext *ctx, JSValue val)
+bool JS_IsMap(JSValueConst val)
+{
+    if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
+        return false;
+    return JS_VALUE_GET_OBJ(val)->class_id == JS_CLASS_MAP;
+}
+
+bool JS_IsError(JSContext *ctx, JSValueConst val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(val);
     return (p->class_id == JS_CLASS_ERROR);
 }
 
 /* used to avoid catching interrupt exceptions */
-BOOL JS_IsUncatchableError(JSContext *ctx, JSValue val)
+bool JS_IsUncatchableError(JSContext *ctx, JSValueConst val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(val);
     return p->class_id == JS_CLASS_ERROR && p->is_uncatchable_error;
 }
 
-void JS_SetUncatchableError(JSContext *ctx, JSValue val, BOOL flag)
+static void js_set_uncatchable_error(JSContext *ctx, JSValueConst val, bool flag)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
@@ -10220,12 +10245,22 @@ void JS_SetUncatchableError(JSContext *ctx, JSValue val, BOOL flag)
         p->is_uncatchable_error = flag;
 }
 
+void JS_SetUncatchableError(JSContext *ctx, JSValueConst val)
+{
+    js_set_uncatchable_error(ctx, val, true);
+}
+
+void JS_ClearUncatchableError(JSContext *ctx, JSValueConst val)
+{
+    js_set_uncatchable_error(ctx, val, false);
+}
+
 void JS_ResetUncatchableError(JSContext *ctx)
 {
-    JS_SetUncatchableError(ctx, ctx->rt->current_exception, FALSE);
+    js_set_uncatchable_error(ctx, ctx->rt->current_exception, false);
 }
 
-int JS_SetOpaque(JSValue obj, void *opaque)
+int JS_SetOpaque(JSValueConst obj, void *opaque)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) {
@@ -10250,7 +10285,7 @@ int JS_SetOpaque(JSValue obj, void *opaque)
 }
 
 /* |obj| must be a JSObject of an internal class. */
-static void JS_SetOpaqueInternal(JSValue obj, void *opaque)
+static void JS_SetOpaqueInternal(JSValueConst obj, void *opaque)
 {
     JSObject *p;
     assert(JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT);
@@ -10260,7 +10295,7 @@ static void JS_SetOpaqueInternal(JSValue obj, void *opaque)
 }
 
 /* return NULL if not an object of class class_id */
-void *JS_GetOpaque(JSValue obj, JSClassID class_id)
+void *JS_GetOpaque(JSValueConst obj, JSClassID class_id)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)
@@ -10271,7 +10306,7 @@ void *JS_GetOpaque(JSValue obj, JSClassID class_id)
     return p->u.opaque;
 }
 
-void *JS_GetOpaque2(JSContext *ctx, JSValue obj, JSClassID class_id)
+void *JS_GetOpaque2(JSContext *ctx, JSValueConst obj, JSClassID class_id)
 {
     void *p = JS_GetOpaque(obj, class_id);
     if (unlikely(!p)) {
@@ -10280,7 +10315,7 @@ void *JS_GetOpaque2(JSContext *ctx, JSValue obj, JSClassID class_id)
     return p;
 }
 
-void *JS_GetAnyOpaque(JSValue obj, JSClassID *class_id)
+void *JS_GetAnyOpaque(JSValueConst obj, JSClassID *class_id)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT) {
@@ -10295,7 +10330,7 @@ void *JS_GetAnyOpaque(JSValue obj, JSClassID *class_id)
 static JSValue JS_ToPrimitiveFree(JSContext *ctx, JSValue val, int hint)
 {
     int i;
-    BOOL force_ordinary;
+    bool force_ordinary;
 
     JSAtom method_name;
     JSValue method, ret;
@@ -10325,7 +10360,7 @@ static JSValue JS_ToPrimitiveFree(JSContext *ctx, JSValue val, int hint)
                 break;
             }
             arg = JS_AtomToString(ctx, atom);
-            ret = JS_CallFree(ctx, method, val, 1, &arg);
+            ret = JS_CallFree(ctx, method, val, 1, vc(&arg));
             JS_FreeValue(ctx, arg);
             if (JS_IsException(ret))
                 goto exception;
@@ -10366,25 +10401,25 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue JS_ToPrimitive(JSContext *ctx, JSValue val, int hint)
+static JSValue JS_ToPrimitive(JSContext *ctx, JSValueConst val, int hint)
 {
     return JS_ToPrimitiveFree(ctx, js_dup(val), hint);
 }
 
-void JS_SetIsHTMLDDA(JSContext *ctx, JSValue obj)
+void JS_SetIsHTMLDDA(JSContext *ctx, JSValueConst obj)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)
         return;
     p = JS_VALUE_GET_OBJ(obj);
-    p->is_HTMLDDA = TRUE;
+    p->is_HTMLDDA = true;
 }
 
-static inline BOOL JS_IsHTMLDDA(JSContext *ctx, JSValue obj)
+static inline bool JS_IsHTMLDDA(JSContext *ctx, JSValueConst obj)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)
-        return FALSE;
+        return false;
     p = JS_VALUE_GET_OBJ(obj);
     return p->is_HTMLDDA;
 }
@@ -10403,14 +10438,14 @@ static int JS_ToBoolFree(JSContext *ctx, JSValue val)
         return -1;
     case JS_TAG_STRING:
         {
-            BOOL ret = JS_VALUE_GET_STRING(val)->len != 0;
+            bool ret = JS_VALUE_GET_STRING(val)->len != 0;
             JS_FreeValue(ctx, val);
             return ret;
         }
     case JS_TAG_BIG_INT:
         {
             JSBigInt *p = JS_VALUE_GET_PTR(val);
-            BOOL ret;
+            bool ret;
             ret = p->num.expn != BF_EXP_ZERO && p->num.expn != BF_EXP_NAN;
             JS_FreeValue(ctx, val);
             return ret;
@@ -10418,8 +10453,7 @@ static int JS_ToBoolFree(JSContext *ctx, JSValue val)
     case JS_TAG_OBJECT:
         {
             JSObject *p = JS_VALUE_GET_OBJ(val);
-            BOOL ret;
-            ret = !p->is_HTMLDDA;
+            bool ret = !p->is_HTMLDDA;
             JS_FreeValue(ctx, val);
             return ret;
         }
@@ -10430,12 +10464,12 @@ static int JS_ToBoolFree(JSContext *ctx, JSValue val)
             return !isnan(d) && d != 0;
         } else {
             JS_FreeValue(ctx, val);
-            return TRUE;
+            return true;
         }
     }
 }
 
-int JS_ToBool(JSContext *ctx, JSValue val)
+int JS_ToBool(JSContext *ctx, JSValueConst val)
 {
     return JS_ToBoolFree(ctx, js_dup(val));
 }
@@ -10476,7 +10510,7 @@ static inline int to_digit(int c)
 }
 
 /* XXX: remove */
-static double js_strtod(const char *str, int radix, BOOL is_float)
+static double js_strtod(const char *str, int radix, bool is_float)
 {
     double d;
     int c;
@@ -10574,7 +10608,7 @@ static JSValue js_atof(JSContext *ctx, const char *p, size_t len,
     const char *p_start;
     const char *end = p + len;
     int sep;
-    BOOL is_float;
+    bool is_float;
     char buf1[64], *buf = buf1;
     size_t i, j;
     JSValue val = JS_NAN;
@@ -10625,7 +10659,7 @@ static JSValue js_atof(JSContext *ctx, const char *p, size_t len,
             goto done;
         }
     }
-    is_float = FALSE;
+    is_float = false;
     p_start = p;
     while (to_digit(*p) < radix) {
         p++;
@@ -10634,7 +10668,7 @@ static JSValue js_atof(JSContext *ctx, const char *p, size_t len,
     }
     if ((flags & ATOD_ACCEPT_FLOAT) && radix == 10) {
         if (*p == '.' && (p > p_start || to_digit(p[1]) < radix)) {
-            is_float = TRUE;
+            is_float = true;
             p++;
             while (to_digit(*p) < radix) {
                 p++;
@@ -10648,7 +10682,7 @@ static JSValue js_atof(JSContext *ctx, const char *p, size_t len,
                 i++;
             }
             if (is_digit(p[i])) {
-                is_float = TRUE;
+                is_float = true;
                 p += i + 1;
                 while (is_digit(*p) || (*p == sep && is_digit(p[1])))
                     p++;
@@ -10783,7 +10817,7 @@ static JSValue JS_ToNumericFree(JSContext *ctx, JSValue val)
     return JS_ToNumberHintFree(ctx, val, TON_FLAG_NUMERIC);
 }
 
-static JSValue JS_ToNumeric(JSContext *ctx, JSValue val)
+static JSValue JS_ToNumeric(JSContext *ctx, JSValueConst val)
 {
     return JS_ToNumericFree(ctx, js_dup(val));
 }
@@ -10796,7 +10830,7 @@ static __exception int __JS_ToFloat64Free(JSContext *ctx, double *pres,
 
     val = JS_ToNumberFree(ctx, val);
     if (JS_IsException(val)) {
-        *pres = JS_FLOAT64_NAN;
+        *pres = NAN;
         return -1;
     }
     tag = JS_VALUE_GET_NORM_TAG(val);
@@ -10840,12 +10874,12 @@ static inline int JS_ToFloat64Free(JSContext *ctx, double *pres, JSValue val)
     }
 }
 
-int JS_ToFloat64(JSContext *ctx, double *pres, JSValue val)
+int JS_ToFloat64(JSContext *ctx, double *pres, JSValueConst val)
 {
     return JS_ToFloat64Free(ctx, pres, js_dup(val));
 }
 
-static JSValue JS_ToNumber(JSContext *ctx, JSValue val)
+JSValue JS_ToNumber(JSContext *ctx, JSValueConst val)
 {
     return JS_ToNumberFree(ctx, js_dup(val));
 }
@@ -10931,13 +10965,13 @@ static int JS_ToInt32SatFree(JSContext *ctx, int *pres, JSValue val)
     return 0;
 }
 
-int JS_ToInt32Sat(JSContext *ctx, int *pres, JSValue val)
+static int JS_ToInt32Sat(JSContext *ctx, int *pres, JSValueConst val)
 {
     return JS_ToInt32SatFree(ctx, pres, js_dup(val));
 }
 
-int JS_ToInt32Clamp(JSContext *ctx, int *pres, JSValue val,
-                    int min, int max, int min_offset)
+static int JS_ToInt32Clamp(JSContext *ctx, int *pres, JSValueConst val,
+                           int min, int max, int min_offset)
 {
     int res = JS_ToInt32SatFree(ctx, pres, js_dup(val));
     if (res == 0) {
@@ -10994,12 +11028,12 @@ static int JS_ToInt64SatFree(JSContext *ctx, int64_t *pres, JSValue val)
     }
 }
 
-int JS_ToInt64Sat(JSContext *ctx, int64_t *pres, JSValue val)
+int JS_ToInt64Sat(JSContext *ctx, int64_t *pres, JSValueConst val)
 {
     return JS_ToInt64SatFree(ctx, pres, js_dup(val));
 }
 
-int JS_ToInt64Clamp(JSContext *ctx, int64_t *pres, JSValue val,
+int JS_ToInt64Clamp(JSContext *ctx, int64_t *pres, JSValueConst val,
                     int64_t min, int64_t max, int64_t neg_offset)
 {
     int res = JS_ToInt64SatFree(ctx, pres, js_dup(val));
@@ -11068,12 +11102,12 @@ static int JS_ToInt64Free(JSContext *ctx, int64_t *pres, JSValue val)
     return 0;
 }
 
-int JS_ToInt64(JSContext *ctx, int64_t *pres, JSValue val)
+int JS_ToInt64(JSContext *ctx, int64_t *pres, JSValueConst val)
 {
     return JS_ToInt64Free(ctx, pres, js_dup(val));
 }
 
-int JS_ToInt64Ext(JSContext *ctx, int64_t *pres, JSValue val)
+int JS_ToInt64Ext(JSContext *ctx, int64_t *pres, JSValueConst val)
 {
     if (JS_IsBigInt(ctx, val))
         return JS_ToBigInt64(ctx, pres, val);
@@ -11135,7 +11169,7 @@ static int JS_ToInt32Free(JSContext *ctx, int32_t *pres, JSValue val)
     return 0;
 }
 
-int JS_ToInt32(JSContext *ctx, int32_t *pres, JSValue val)
+int JS_ToInt32(JSContext *ctx, int32_t *pres, JSValueConst val)
 {
     return JS_ToInt32Free(ctx, pres, js_dup(val));
 }
@@ -11188,7 +11222,7 @@ static int JS_ToUint8ClampFree(JSContext *ctx, int32_t *pres, JSValue val)
 }
 
 static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen,
-                                            JSValue val, BOOL is_array_ctor)
+                                            JSValue val, bool is_array_ctor)
 {
     uint32_t tag, len;
 
@@ -11209,7 +11243,7 @@ static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen,
         {
             JSBigInt *p = JS_VALUE_GET_PTR(val);
             bf_t a;
-            BOOL res;
+            bool res;
             bf_get_int32((int32_t *)&len, &p->num, BF_GET_INT_MOD);
             bf_init(ctx->bf_ctx, &a);
             bf_set_ui(&a, len);
@@ -11237,7 +11271,7 @@ static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen,
                 if (JS_IsException(val))
                     return -1;
                 /* cannot recurse because val is a number */
-                if (JS_ToArrayLengthFree(ctx, &len, val, TRUE))
+                if (JS_ToArrayLengthFree(ctx, &len, val, true))
                     return -1;
             } else {
                 /* legacy behavior: must do the conversion twice and compare */
@@ -11249,7 +11283,7 @@ static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen,
                 if (JS_IsException(val))
                     return -1;
                 /* cannot recurse because val is a number */
-                if (JS_ToArrayLengthFree(ctx, &len1, val, FALSE))
+                if (JS_ToArrayLengthFree(ctx, &len1, val, false))
                     return -1;
                 if (len1 != len) {
                 fail:
@@ -11266,13 +11300,13 @@ static __exception int JS_ToArrayLengthFree(JSContext *ctx, uint32_t *plen,
 
 #define MAX_SAFE_INTEGER (((int64_t)1 << 53) - 1)
 
-static BOOL is_safe_integer(double d)
+static bool is_safe_integer(double d)
 {
     return isfinite(d) && floor(d) == d &&
         fabs(d) <= (double)MAX_SAFE_INTEGER;
 }
 
-int JS_ToIndex(JSContext *ctx, uint64_t *plen, JSValue val)
+int JS_ToIndex(JSContext *ctx, uint64_t *plen, JSValueConst val)
 {
     int64_t v;
     if (JS_ToInt64Sat(ctx, &v, val))
@@ -11297,17 +11331,17 @@ static __exception int JS_ToLengthFree(JSContext *ctx, int64_t *plen,
 }
 
 /* Note: can return an exception */
-static int JS_NumberIsInteger(JSContext *ctx, JSValue val)
+static int JS_NumberIsInteger(JSContext *ctx, JSValueConst val)
 {
     double d;
     if (!JS_IsNumber(val))
-        return FALSE;
+        return false;
     if (unlikely(JS_ToFloat64(ctx, &d, val)))
         return -1;
     return isfinite(d) && floor(d) == d;
 }
 
-static BOOL JS_NumberIsNegativeOrMinusZero(JSContext *ctx, JSValue val)
+static bool JS_NumberIsNegativeOrMinusZero(JSContext *ctx, JSValueConst val)
 {
     uint32_t tag;
 
@@ -11332,11 +11366,11 @@ static BOOL JS_NumberIsNegativeOrMinusZero(JSContext *ctx, JSValue val)
             return p->num.sign && !bf_is_zero(&p->num);
         }
     default:
-        return FALSE;
+        return false;
     }
 }
 
-static JSValue js_bigint_to_string1(JSContext *ctx, JSValue val, int radix)
+static JSValue js_bigint_to_string1(JSContext *ctx, JSValueConst val, int radix)
 {
     JSValue ret;
     bf_t a_s, *a;
@@ -11361,7 +11395,7 @@ static JSValue js_bigint_to_string1(JSContext *ctx, JSValue val, int radix)
     return ret;
 }
 
-static JSValue js_bigint_to_string(JSContext *ctx, JSValue val)
+static JSValue js_bigint_to_string(JSContext *ctx, JSValueConst val)
 {
     return js_bigint_to_string1(ctx, val, 10);
 }
@@ -11789,7 +11823,8 @@ done:
     return js_new_string8_len(ctx, ptr, ptr2 - ptr);
 }
 
-JSValue JS_ToStringInternal(JSContext *ctx, JSValue val, BOOL is_ToPropertyKey)
+JSValue JS_ToStringInternal(JSContext *ctx, JSValueConst val,
+                            bool is_ToPropertyKey)
 {
     uint32_t tag;
     char buf[32];
@@ -11841,9 +11876,9 @@ JSValue JS_ToStringInternal(JSContext *ctx, JSValue val, BOOL is_ToPropertyKey)
     }
 }
 
-JSValue JS_ToString(JSContext *ctx, JSValue val)
+JSValue JS_ToString(JSContext *ctx, JSValueConst val)
 {
-    return JS_ToStringInternal(ctx, val, FALSE);
+    return JS_ToStringInternal(ctx, val, false);
 }
 
 static JSValue JS_ToStringFree(JSContext *ctx, JSValue val)
@@ -11861,12 +11896,12 @@ static JSValue JS_ToLocaleStringFree(JSContext *ctx, JSValue val)
     return JS_InvokeFree(ctx, val, JS_ATOM_toLocaleString, 0, NULL);
 }
 
-JSValue JS_ToPropertyKey(JSContext *ctx, JSValue val)
+JSValue JS_ToPropertyKey(JSContext *ctx, JSValueConst val)
 {
-    return JS_ToStringInternal(ctx, val, TRUE);
+    return JS_ToStringInternal(ctx, val, true);
 }
 
-static JSValue JS_ToStringCheckObject(JSContext *ctx, JSValue val)
+static JSValue JS_ToStringCheckObject(JSContext *ctx, JSValueConst val)
 {
     uint32_t tag = JS_VALUE_GET_TAG(val);
     if (tag == JS_TAG_NULL || tag == JS_TAG_UNDEFINED)
@@ -11874,7 +11909,7 @@ static JSValue JS_ToStringCheckObject(JSContext *ctx, JSValue val)
     return JS_ToString(ctx, val);
 }
 
-static JSValue JS_ToQuotedString(JSContext *ctx, JSValue val1)
+static JSValue JS_ToQuotedString(JSContext *ctx, JSValueConst val1)
 {
     JSValue val;
     JSString *p;
@@ -11955,7 +11990,7 @@ static __maybe_unused void JS_DumpObject(JSRuntime *rt, JSObject *p)
     JSShape *sh;
     JSShapeProperty *prs;
     JSProperty *pr;
-    BOOL is_first = TRUE;
+    bool is_first = true;
 
     /* XXX: should encode atoms with special characters */
     sh = p->shape; /* the shape can be NULL while freeing an object */
@@ -12028,7 +12063,7 @@ static __maybe_unused void JS_DumpObject(JSRuntime *rt, JSObject *p)
                 } else {
                     JS_DumpValue(rt, pr->u.value);
                 }
-                is_first = FALSE;
+                is_first = false;
             }
         }
         printf(" }");
@@ -12085,7 +12120,7 @@ static __maybe_unused void JS_DumpGCObject(JSRuntime *rt, JSGCObjectHeader *p)
     }
 }
 
-static __maybe_unused void JS_DumpValue(JSRuntime *rt, JSValue val)
+static __maybe_unused void JS_DumpValue(JSRuntime *rt, JSValueConst val)
 {
     uint32_t tag = JS_VALUE_GET_NORM_TAG(val);
     const char *str;
@@ -12171,8 +12206,17 @@ static __maybe_unused void JS_DumpValue(JSRuntime *rt, JSValue val)
     }
 }
 
-/* return -1 if exception (proxy case) or TRUE/FALSE */
-int JS_IsArray(JSContext *ctx, JSValue val)
+bool JS_IsArray(JSValueConst val)
+{
+    if (JS_VALUE_GET_TAG(val) == JS_TAG_OBJECT) {
+        JSObject *p = JS_VALUE_GET_OBJ(val);
+        return p->class_id == JS_CLASS_ARRAY;
+    }
+    return false;
+}
+
+/* return -1 if exception (proxy case) or true/false */
+static int js_is_array(JSContext *ctx, JSValueConst val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(val) == JS_TAG_OBJECT) {
@@ -12182,7 +12226,7 @@ int JS_IsArray(JSContext *ctx, JSValue val)
         else
             return p->class_id == JS_CLASS_ARRAY;
     } else {
-        return FALSE;
+        return false;
     }
 }
 
@@ -12190,7 +12234,7 @@ static double js_math_pow(double a, double b)
 {
     if (unlikely(!isfinite(b)) && fabs(a) == 1) {
         /* not compatible with IEEE 754 */
-        return JS_FLOAT64_NAN;
+        return NAN;
     } else {
         return pow(a, b);
     }
@@ -12231,7 +12275,7 @@ JSValue JS_NewBigUint64(JSContext *ctx, uint64_t v)
    'buf'. Otherwise it is a pointer to the bigint in 'val'. Return
    NULL in case of error. */
 // TODO(bnoordhuis) Merge with JS_ToBigInt()
-static bf_t *JS_ToBigInt1(JSContext *ctx, bf_t *buf, JSValue val)
+static bf_t *JS_ToBigInt1(JSContext *ctx, bf_t *buf, JSValueConst val)
 {
     uint32_t tag;
     bf_t *r;
@@ -12342,7 +12386,7 @@ static bf_t *JS_ToBigIntFree(JSContext *ctx, bf_t *buf, JSValue val)
     return r;
 }
 
-static bf_t *JS_ToBigInt(JSContext *ctx, bf_t *buf, JSValue val)
+static bf_t *JS_ToBigInt(JSContext *ctx, bf_t *buf, JSValueConst val)
 {
     return JS_ToBigIntFree(ctx, buf, js_dup(val));
 }
@@ -12401,12 +12445,12 @@ static int JS_ToBigInt64Free(JSContext *ctx, int64_t *pres, JSValue val)
     return 0;
 }
 
-int JS_ToBigInt64(JSContext *ctx, int64_t *pres, JSValue val)
+int JS_ToBigInt64(JSContext *ctx, int64_t *pres, JSValueConst val)
 {
     return JS_ToBigInt64Free(ctx, pres, js_dup(val));
 }
 
-int JS_ToBigUint64(JSContext *ctx, uint64_t *pres, JSValue val)
+int JS_ToBigUint64(JSContext *ctx, uint64_t *pres, JSValueConst val)
 {
     return JS_ToBigInt64Free(ctx, (int64_t *)pres, js_dup(val));
 }
@@ -13058,7 +13102,7 @@ static no_inline int js_relational_slow(JSContext *ctx, JSValue *sp,
         JSString *p1, *p2;
         p1 = JS_VALUE_GET_STRING(op1);
         p2 = JS_VALUE_GET_STRING(op2);
-        res = js_string_compare(ctx, p1, p2);
+        res = js_string_compare(p1, p2);
         switch(op) {
         case OP_lt:
             res = (res < 0);
@@ -13094,7 +13138,7 @@ static no_inline int js_relational_slow(JSContext *ctx, JSValue *sp,
                 invalid_bigint_string:
                     JS_FreeValue(ctx, op1);
                     JS_FreeValue(ctx, op2);
-                    res = FALSE;
+                    res = false;
                     goto done;
                 }
             }
@@ -13159,14 +13203,14 @@ static no_inline int js_relational_slow(JSContext *ctx, JSValue *sp,
     return -1;
 }
 
-static BOOL tag_is_number(uint32_t tag)
+static bool tag_is_number(uint32_t tag)
 {
     return (tag == JS_TAG_INT || tag == JS_TAG_BIG_INT ||
             tag == JS_TAG_FLOAT64);
 }
 
 static no_inline __exception int js_eq_slow(JSContext *ctx, JSValue *sp,
-                                            BOOL is_neq)
+                                            bool is_neq)
 {
     JSValue op1, op2;
     int res;
@@ -13205,7 +13249,7 @@ static no_inline __exception int js_eq_slow(JSContext *ctx, JSValue *sp,
         res = js_strict_eq2(ctx, op1, op2, JS_EQ_STRICT);
     } else if ((tag1 == JS_TAG_NULL && tag2 == JS_TAG_UNDEFINED) ||
                (tag2 == JS_TAG_NULL && tag1 == JS_TAG_UNDEFINED)) {
-        res = TRUE;
+        res = true;
     } else if ((tag1 == JS_TAG_STRING && tag_is_number(tag2)) ||
                (tag2 == JS_TAG_STRING && tag_is_number(tag1))) {
 
@@ -13221,7 +13265,7 @@ static no_inline __exception int js_eq_slow(JSContext *ctx, JSValue *sp,
                 invalid_bigint_string:
                     JS_FreeValue(ctx, op1);
                     JS_FreeValue(ctx, op2);
-                    res = FALSE;
+                    res = false;
                     goto done;
                 }
             }
@@ -13265,9 +13309,9 @@ static no_inline __exception int js_eq_slow(JSContext *ctx, JSValue *sp,
              (tag2 == JS_TAG_NULL || tag2 == JS_TAG_UNDEFINED)) ||
             (JS_IsHTMLDDA(ctx, op2) &&
              (tag1 == JS_TAG_NULL || tag1 == JS_TAG_UNDEFINED))) {
-            res = TRUE;
+            res = true;
         } else {
-            res = FALSE;
+            res = false;
         }
         JS_FreeValue(ctx, op1);
         JS_FreeValue(ctx, op2);
@@ -13318,11 +13362,10 @@ static no_inline int js_shr_slow(JSContext *ctx, JSValue *sp)
     return -1;
 }
 
-/* XXX: Should take JSValue arguments */
-static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
+static bool js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
                           JSStrictEqModeEnum eq_mode)
 {
-    BOOL res;
+    bool res;
     int tag1, tag2;
     double d1, d2;
 
@@ -13331,7 +13374,7 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
     switch(tag1) {
     case JS_TAG_BOOL:
         if (tag1 != tag2) {
-            res = FALSE;
+            res = false;
         } else {
             res = JS_VALUE_GET_INT(op1) == JS_VALUE_GET_INT(op2);
             goto done_no_free;
@@ -13345,11 +13388,11 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
         {
             JSString *p1, *p2;
             if (tag1 != tag2) {
-                res = FALSE;
+                res = false;
             } else {
                 p1 = JS_VALUE_GET_STRING(op1);
                 p2 = JS_VALUE_GET_STRING(op2);
-                res = (js_string_compare(ctx, p1, p2) == 0);
+                res = js_string_eq(p1, p2);
             }
         }
         break;
@@ -13357,7 +13400,7 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
         {
             JSAtomStruct *p1, *p2;
             if (tag1 != tag2) {
-                res = FALSE;
+                res = false;
             } else {
                 p1 = JS_VALUE_GET_PTR(op1);
                 p2 = JS_VALUE_GET_PTR(op2);
@@ -13367,7 +13410,7 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
         break;
     case JS_TAG_OBJECT:
         if (tag1 != tag2)
-            res = FALSE;
+            res = false;
         else
             res = JS_VALUE_GET_OBJ(op1) == JS_VALUE_GET_OBJ(op2);
         break;
@@ -13380,7 +13423,7 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
             d2 = JS_VALUE_GET_FLOAT64(op2);
             goto number_test;
         } else {
-            res = FALSE;
+            res = false;
         }
         break;
     case JS_TAG_FLOAT64:
@@ -13390,7 +13433,7 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
         } else if (tag2 == JS_TAG_INT) {
             d2 = JS_VALUE_GET_INT(op2);
         } else {
-            res = FALSE;
+            res = false;
             break;
         }
     number_test:
@@ -13414,7 +13457,7 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
         {
             bf_t a_s, *a, b_s, *b;
             if (tag1 != tag2) {
-                res = FALSE;
+                res = false;
                 break;
             }
             a = JS_ToBigInt1(ctx, &a_s, op1);
@@ -13427,7 +13470,7 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
         }
         break;
     default:
-        res = FALSE;
+        res = false;
         break;
     }
     JS_FreeValue(ctx, op1);
@@ -13436,25 +13479,25 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
     return res;
 }
 
-static BOOL js_strict_eq(JSContext *ctx, JSValue op1, JSValue op2)
+static bool js_strict_eq(JSContext *ctx, JSValue op1, JSValue op2)
 {
     return js_strict_eq2(ctx, op1, op2, JS_EQ_STRICT);
 }
 
-static BOOL js_same_value(JSContext *ctx, JSValue op1, JSValue op2)
+static bool js_same_value(JSContext *ctx, JSValueConst op1, JSValueConst op2)
 {
     return js_strict_eq2(ctx, js_dup(op1), js_dup(op2), JS_EQ_SAME_VALUE);
 }
 
-static BOOL js_same_value_zero(JSContext *ctx, JSValue op1, JSValue op2)
+static bool js_same_value_zero(JSContext *ctx, JSValueConst op1, JSValueConst op2)
 {
     return js_strict_eq2(ctx, js_dup(op1), js_dup(op2), JS_EQ_SAME_VALUE_ZERO);
 }
 
 static no_inline int js_strict_eq_slow(JSContext *ctx, JSValue *sp,
-                                       BOOL is_neq)
+                                       bool is_neq)
 {
-    BOOL res;
+    bool res;
     res = js_strict_eq(ctx, sp[-2], sp[-1]);
     sp[-2] = js_bool(res ^ is_neq);
     return 0;
@@ -13542,7 +13585,7 @@ static __exception int js_has_unscopable(JSContext *ctx, JSValue obj,
 static __exception int js_operator_instanceof(JSContext *ctx, JSValue *sp)
 {
     JSValue op1, op2;
-    BOOL ret;
+    int ret;
 
     op1 = sp[-2];
     op2 = sp[-1];
@@ -13625,8 +13668,8 @@ static __exception int js_operator_delete(JSContext *ctx, JSValue *sp)
     return 0;
 }
 
-static JSValue js_throw_type_error(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_throw_type_error(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     return JS_ThrowTypeError(ctx, "invalid property access");
 }
@@ -13634,8 +13677,8 @@ static JSValue js_throw_type_error(JSContext *ctx, JSValue this_val,
 /* XXX: not 100% compatible, but mozilla seems to use a similar
    implementation to ensure that caller in non strict mode does not
    throw (ES5 compatibility) */
-static JSValue js_function_proto_caller(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv)
+static JSValue js_function_proto_caller(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv)
 {
     JSFunctionBytecode *b = JS_GetFunctionBytecode(this_val);
     if (!b || b->is_strict_mode || !b->has_prototype) {
@@ -13645,7 +13688,7 @@ static JSValue js_function_proto_caller(JSContext *ctx, JSValue this_val,
 }
 
 static JSValue js_function_proto_fileName(JSContext *ctx,
-                                          JSValue this_val)
+                                          JSValueConst this_val)
 {
     JSFunctionBytecode *b = JS_GetFunctionBytecode(this_val);
     if (b) {
@@ -13655,7 +13698,7 @@ static JSValue js_function_proto_fileName(JSContext *ctx,
 }
 
 static JSValue js_function_proto_int32(JSContext *ctx,
-                                       JSValue this_val,
+                                       JSValueConst this_val,
                                        int magic)
 {
     JSFunctionBytecode *b = JS_GetFunctionBytecode(this_val);
@@ -13667,9 +13710,10 @@ static JSValue js_function_proto_int32(JSContext *ctx,
 }
 
 static int js_arguments_define_own_property(JSContext *ctx,
-                                            JSValue this_obj,
-                                            JSAtom prop, JSValue val,
-                                            JSValue getter, JSValue setter, int flags)
+                                            JSValueConst this_obj,
+                                            JSAtom prop, JSValueConst val,
+                                            JSValueConst getter,
+                                            JSValueConst setter, int flags)
 {
     JSObject *p;
     uint32_t idx;
@@ -13689,7 +13733,7 @@ static const JSClassExoticMethods js_arguments_exotic_methods = {
     .define_own_property = js_arguments_define_own_property,
 };
 
-static JSValue js_build_arguments(JSContext *ctx, int argc, JSValue *argv)
+static JSValue js_build_arguments(JSContext *ctx, int argc, JSValueConst *argv)
 {
     JSValue val, *tab;
     JSProperty *pr;
@@ -13741,7 +13785,7 @@ static JSValue js_build_arguments(JSContext *ctx, int argc, JSValue *argv)
 
 /* legacy arguments object: add references to the function arguments */
 static JSValue js_build_mapped_arguments(JSContext *ctx, int argc,
-                                         JSValue *argv,
+                                         JSValueConst *argv,
                                          JSStackFrame *sf, int arg_count)
 {
     JSValue val;
@@ -13764,7 +13808,7 @@ static JSValue js_build_mapped_arguments(JSContext *ctx, int argc,
 
     for(i = 0; i < arg_count; i++) {
         JSVarRef *var_ref;
-        var_ref = get_var_ref(ctx, sf, i, TRUE);
+        var_ref = get_var_ref(ctx, sf, i, true);
         if (!var_ref)
             goto fail;
         pr = add_property(ctx, p, __JS_AtomFromUInt32(i), JS_PROP_C_W_E | JS_PROP_VARREF);
@@ -13797,26 +13841,6 @@ static JSValue js_build_mapped_arguments(JSContext *ctx, int argc,
     return JS_EXCEPTION;
 }
 
-static JSValue js_build_rest(JSContext *ctx, int first, int argc, JSValue *argv)
-{
-    JSValue val;
-    int i, ret;
-
-    val = JS_NewArray(ctx);
-    if (JS_IsException(val))
-        return val;
-    for (i = first; i < argc; i++) {
-        ret = JS_DefinePropertyValueUint32(ctx, val, i - first,
-                                           js_dup(argv[i]),
-                                           JS_PROP_C_W_E);
-        if (ret < 0) {
-            JS_FreeValue(ctx, val);
-            return JS_EXCEPTION;
-        }
-    }
-    return val;
-}
-
 static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj)
 {
     JSObject *p;
@@ -13842,7 +13866,7 @@ static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj)
         JS_FreeValue(ctx, obj);
         return JS_EXCEPTION;
     }
-    it->is_array = FALSE;
+    it->is_array = false;
     it->obj = obj;
     it->idx = 0;
     p = JS_VALUE_GET_OBJ(enum_obj);
@@ -13889,7 +13913,7 @@ static JSValue build_for_in_iterator(JSContext *ctx, JSValue obj)
                 goto normal_case;
         }
         /* for fast arrays, we only store the number of elements */
-        it->is_array = TRUE;
+        it->is_array = true;
         it->array_length = p->u.array.count;
     } else {
     normal_case:
@@ -14006,8 +14030,8 @@ static __exception int js_for_in_next(JSContext *ctx, JSValue *sp)
     return 0;
 }
 
-static JSValue JS_GetIterator2(JSContext *ctx, JSValue obj,
-                               JSValue method)
+static JSValue JS_GetIterator2(JSContext *ctx, JSValueConst obj,
+                               JSValueConst method)
 {
     JSValue enum_obj;
 
@@ -14021,7 +14045,7 @@ static JSValue JS_GetIterator2(JSContext *ctx, JSValue obj,
     return enum_obj;
 }
 
-static JSValue JS_GetIterator(JSContext *ctx, JSValue obj, BOOL is_async)
+static JSValue JS_GetIterator(JSContext *ctx, JSValueConst obj, bool is_async)
 {
     JSValue method, ret, sync_iter;
 
@@ -14056,9 +14080,9 @@ static JSValue JS_GetIterator(JSContext *ctx, JSValue obj, BOOL is_async)
 }
 
 /* return *pdone = 2 if the iterator object is not parsed */
-static JSValue JS_IteratorNext2(JSContext *ctx, JSValue enum_obj,
-                                JSValue method,
-                                int argc, JSValue *argv, int *pdone)
+static JSValue JS_IteratorNext2(JSContext *ctx, JSValueConst enum_obj,
+                                JSValueConst method,
+                                int argc, JSValueConst *argv, int *pdone)
 {
     JSValue obj;
 
@@ -14069,7 +14093,7 @@ static JSValue JS_IteratorNext2(JSContext *ctx, JSValue enum_obj,
         if (p->class_id == JS_CLASS_C_FUNCTION &&
             p->u.cfunc.cproto == JS_CFUNC_iterator_next) {
             JSCFunctionType func;
-            JSValue args[1];
+            JSValueConst args[1];
 
             /* in case the function expects one argument */
             if (argc == 0) {
@@ -14092,13 +14116,13 @@ static JSValue JS_IteratorNext2(JSContext *ctx, JSValue enum_obj,
     *pdone = 2;
     return obj;
  fail:
-    *pdone = FALSE;
+    *pdone = false;
     return JS_EXCEPTION;
 }
 
-static JSValue JS_IteratorNext(JSContext *ctx, JSValue enum_obj,
-                               JSValue method,
-                               int argc, JSValue *argv, BOOL *pdone)
+static JSValue JS_IteratorNext(JSContext *ctx, JSValueConst enum_obj,
+                               JSValueConst method,
+                               int argc, JSValueConst *argv, int *pdone)
 {
     JSValue obj, value, done_val;
     int done;
@@ -14123,13 +14147,13 @@ static JSValue JS_IteratorNext(JSContext *ctx, JSValue enum_obj,
     }
  fail:
     JS_FreeValue(ctx, obj);
-    *pdone = FALSE;
+    *pdone = false;
     return JS_EXCEPTION;
 }
 
 /* return < 0 in case of exception */
-static int JS_IteratorClose(JSContext *ctx, JSValue enum_obj,
-                            BOOL is_exception_pending)
+static int JS_IteratorClose(JSContext *ctx, JSValueConst enum_obj,
+                            bool is_exception_pending)
 {
     JSValue method, ret, ex_obj;
     int res;
@@ -14169,7 +14193,7 @@ static int JS_IteratorClose(JSContext *ctx, JSValue enum_obj,
 
 /* obj -> enum_rec (3 slots) */
 static __exception int js_for_of_start(JSContext *ctx, JSValue *sp,
-                                       BOOL is_async)
+                                       bool is_async)
 {
     JSValue op1, obj, method;
     op1 = sp[-1];
@@ -14217,10 +14241,10 @@ static __exception int js_for_of_next(JSContext *ctx, JSValue *sp, int offset)
 }
 
 static JSValue JS_IteratorGetCompleteValue(JSContext *ctx, JSValue obj,
-                                           BOOL *pdone)
+                                           int *pdone)
 {
     JSValue done_val, value;
-    BOOL done;
+    int done;
     done_val = JS_GetProperty(ctx, obj, JS_ATOM_done);
     if (JS_IsException(done_val))
         goto fail;
@@ -14231,14 +14255,14 @@ static JSValue JS_IteratorGetCompleteValue(JSContext *ctx, JSValue obj,
     *pdone = done;
     return value;
  fail:
-    *pdone = FALSE;
+    *pdone = false;
     return JS_EXCEPTION;
 }
 
 static __exception int js_iterator_get_value_done(JSContext *ctx, JSValue *sp)
 {
     JSValue obj, value;
-    BOOL done;
+    int done;
     obj = sp[-1];
     if (!JS_IsObject(obj)) {
         JS_ThrowTypeError(ctx, "iterator must return an object");
@@ -14255,7 +14279,7 @@ static __exception int js_iterator_get_value_done(JSContext *ctx, JSValue *sp)
 
 static JSValue js_create_iterator_result(JSContext *ctx,
                                          JSValue val,
-                                         BOOL done)
+                                         bool done)
 {
     JSValue obj;
     obj = JS_NewObject(ctx);
@@ -14276,27 +14300,27 @@ static JSValue js_create_iterator_result(JSContext *ctx,
     return obj;
 }
 
-static JSValue js_array_iterator_next(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv,
-                                      BOOL *pdone, int magic);
+static JSValue js_array_iterator_next(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv,
+                                      int *pdone, int magic);
 
-static JSValue js_create_array_iterator(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv, int magic);
+static JSValue js_create_array_iterator(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv, int magic);
 
-static BOOL js_is_fast_array(JSContext *ctx, JSValue obj)
+static bool js_is_fast_array(JSContext *ctx, JSValue obj)
 {
     /* Try and handle fast arrays explicitly */
     if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) {
         JSObject *p = JS_VALUE_GET_OBJ(obj);
         if (p->class_id == JS_CLASS_ARRAY && p->fast_array) {
-            return TRUE;
+            return true;
         }
     }
-    return FALSE;
+    return false;
 }
 
 /* Access an Array's internal JSValue array if available */
-static BOOL js_get_fast_array(JSContext *ctx, JSValue obj,
+static bool js_get_fast_array(JSContext *ctx, JSValue obj,
                               JSValue **arrpp, uint32_t *countp)
 {
     /* Try and handle fast arrays explicitly */
@@ -14305,10 +14329,10 @@ static BOOL js_get_fast_array(JSContext *ctx, JSValue obj,
         if (p->class_id == JS_CLASS_ARRAY && p->fast_array) {
             *countp = p->u.array.count;
             *arrpp = p->u.array.u.values;
-            return TRUE;
+            return true;
         }
     }
-    return FALSE;
+    return false;
 }
 
 static __exception int js_append_enumerate(JSContext *ctx, JSValue *sp)
@@ -14341,7 +14365,7 @@ static __exception int js_append_enumerate(JSContext *ctx, JSValue *sp)
                                        JS_ITERATOR_KIND_VALUE);
     JS_FreeValue(ctx, iterator);
 
-    enumobj = JS_GetIterator(ctx, sp[-1], FALSE);
+    enumobj = JS_GetIterator(ctx, sp[-1], false);
     if (JS_IsException(enumobj))
         return -1;
     method = JS_GetProperty(ctx, enumobj, JS_ATOM_next);
@@ -14370,7 +14394,7 @@ static __exception int js_append_enumerate(JSContext *ctx, JSValue *sp)
     } else {
     general_case:
         for (;;) {
-            BOOL done;
+            int done;
             value = JS_IteratorNext(ctx, enumobj, method, 0, NULL, &done);
             if (JS_IsException(value))
                 goto exception;
@@ -14389,7 +14413,7 @@ static __exception int js_append_enumerate(JSContext *ctx, JSValue *sp)
     return 0;
 
 exception:
-    JS_IteratorClose(ctx, enumobj, TRUE);
+    JS_IteratorClose(ctx, enumobj, true);
     JS_FreeValue(ctx, enumobj);
     JS_FreeValue(ctx, method);
     return -1;
@@ -14399,7 +14423,7 @@ static __exception int JS_CopyDataProperties(JSContext *ctx,
                                              JSValue target,
                                              JSValue source,
                                              JSValue excluded,
-                                             BOOL setprop)
+                                             bool setprop)
 {
     JSPropertyEnum *tab_atom;
     JSValue val;
@@ -14408,7 +14432,7 @@ static __exception int JS_CopyDataProperties(JSContext *ctx,
     JSObject *pexcl = NULL;
     int ret, gpn_flags;
     JSPropertyDescriptor desc;
-    BOOL is_enumerable;
+    bool is_enumerable;
 
     if (JS_VALUE_GET_TAG(source) != JS_TAG_OBJECT)
         return 0;
@@ -14471,13 +14495,13 @@ static __exception int JS_CopyDataProperties(JSContext *ctx,
 }
 
 /* only valid inside C functions */
-static JSValue JS_GetActiveFunction(JSContext *ctx)
+static JSValueConst JS_GetActiveFunction(JSContext *ctx)
 {
     return ctx->rt->current_stack_frame->cur_func;
 }
 
 static JSVarRef *get_var_ref(JSContext *ctx, JSStackFrame *sf,
-                             int var_idx, BOOL is_arg)
+                             int var_idx, bool is_arg)
 {
     JSVarRef *var_ref;
     struct list_head *el;
@@ -14494,7 +14518,7 @@ static JSVarRef *get_var_ref(JSContext *ctx, JSStackFrame *sf,
     if (!var_ref)
         return NULL;
     var_ref->header.ref_count = 1;
-    var_ref->is_detached = FALSE;
+    var_ref->is_detached = false;
     var_ref->is_arg = is_arg;
     var_ref->var_idx = var_idx;
     list_add_tail(&var_ref->header.link, &sf->var_ref_list);
@@ -14617,7 +14641,7 @@ static JSValue js_closure(JSContext *ctx, JSValue bfunc,
         /* add the 'prototype' property: delay instantiation to avoid
            creating cycles for every javascript function. The prototype
            object is created on the fly when first accessed */
-        JS_SetConstructorBit(ctx, func_obj, TRUE);
+        JS_SetConstructorBit(ctx, func_obj, true);
         JS_DefineAutoInitProperty(ctx, func_obj, JS_ATOM_prototype,
                                   JS_AUTOINIT_ID_PROTOTYPE, NULL,
                                   JS_PROP_WRITABLE);
@@ -14634,7 +14658,7 @@ static JSValue js_closure(JSContext *ctx, JSValue bfunc,
 static int js_op_define_class(JSContext *ctx, JSValue *sp,
                               JSAtom class_name, int class_flags,
                               JSVarRef **cur_var_refs,
-                              JSStackFrame *sf, BOOL is_computed_name)
+                              JSStackFrame *sf, bool is_computed_name)
 {
     JSValue bfunc, parent_class, proto = JS_UNDEFINED;
     JSValue ctor = JS_UNDEFINED, parent_proto = JS_UNDEFINED;
@@ -14680,7 +14704,7 @@ static int js_op_define_class(JSContext *ctx, JSValue *sp,
     if (JS_IsException(ctor))
         goto fail;
     js_method_set_home_object(ctx, ctor, proto);
-    JS_SetConstructorBit(ctx, ctor, TRUE);
+    JS_SetConstructorBit(ctx, ctor, true);
 
     JS_DefinePropertyValue(ctx, ctor, JS_ATOM_length,
                            js_int32(b->defined_arg_count),
@@ -14741,7 +14765,7 @@ static void close_var_refs(JSRuntime *rt, JSStackFrame *sf)
             var_ref->value = js_dup(sf->var_buf[var_idx]);
         var_ref->pvalue = &var_ref->value;
         /* the reference is no longer to a local variable */
-        var_ref->is_detached = TRUE;
+        var_ref->is_detached = true;
         add_gc_object(rt, &var_ref->header, JS_GC_OBJ_TYPE_VAR_REF);
     }
 }
@@ -14758,7 +14782,7 @@ static void close_lexical_var(JSContext *ctx, JSStackFrame *sf, int var_idx)
             var_ref->pvalue = &var_ref->value;
             list_del(&var_ref->header.link);
             /* the reference is no longer to a local variable */
-            var_ref->is_detached = TRUE;
+            var_ref->is_detached = true;
             add_gc_object(ctx->rt, &var_ref->header, JS_GC_OBJ_TYPE_VAR_REF);
         }
     }
@@ -14767,16 +14791,16 @@ static void close_lexical_var(JSContext *ctx, JSStackFrame *sf, int var_idx)
 #define JS_CALL_FLAG_COPY_ARGV   (1 << 1)
 #define JS_CALL_FLAG_GENERATOR   (1 << 2)
 
-static JSValue js_call_c_function(JSContext *ctx, JSValue func_obj,
-                                  JSValue this_obj,
-                                  int argc, JSValue *argv, int flags)
+static JSValue js_call_c_function(JSContext *ctx, JSValueConst func_obj,
+                                  JSValueConst this_obj,
+                                  int argc, JSValueConst *argv, int flags)
 {
     JSRuntime *rt = ctx->rt;
     JSCFunctionType func;
     JSObject *p;
     JSStackFrame sf_s, *sf = &sf_s, *prev_sf;
     JSValue ret_val;
-    JSValue *arg_buf;
+    JSValueConst *arg_buf;
     int arg_count, i;
     JSCFunctionEnum cproto;
 
@@ -14793,8 +14817,8 @@ static JSValue js_call_c_function(JSContext *ctx, JSValue func_obj,
     rt->current_stack_frame = sf;
     ctx = p->u.cfunc.realm; /* change the current realm */
 
-    sf->is_strict_mode = FALSE;
-    sf->cur_func = func_obj;
+    sf->is_strict_mode = false;
+    sf->cur_func = unsafe_unconst(func_obj);
     sf->arg_count = argc;
     arg_buf = argv;
 
@@ -14807,7 +14831,7 @@ static JSValue js_call_c_function(JSContext *ctx, JSValue func_obj,
             arg_buf[i] = JS_UNDEFINED;
         sf->arg_count = arg_count;
     }
-    sf->arg_buf = arg_buf;
+    sf->arg_buf = (JSValue *)arg_buf;
 
     func = p->u.cfunc.c_function;
     switch(cproto) {
@@ -14897,13 +14921,13 @@ static JSValue js_call_c_function(JSContext *ctx, JSValue func_obj,
     return ret_val;
 }
 
-static JSValue js_call_bound_function(JSContext *ctx, JSValue func_obj,
-                                      JSValue this_obj,
-                                      int argc, JSValue *argv, int flags)
+static JSValue js_call_bound_function(JSContext *ctx, JSValueConst func_obj,
+                                      JSValueConst this_obj,
+                                      int argc, JSValueConst *argv, int flags)
 {
     JSObject *p;
     JSBoundFunction *bf;
-    JSValue *arg_buf, new_target;
+    JSValueConst *arg_buf, new_target;
     int arg_count, i;
 
     p = JS_VALUE_GET_OBJ(func_obj);
@@ -14945,25 +14969,28 @@ typedef enum {
 #define FUNC_RET_YIELD      1
 #define FUNC_RET_YIELD_STAR 2
 
-#if defined(DUMP_BYTECODE_FINAL) || \
-    defined(DUMP_BYTECODE_PASS2) || \
-    defined(DUMP_BYTECODE_PASS1) || \
-    defined(DUMP_BYTECODE_STACK) || \
-    defined(DUMP_BYTECODE_STEP)  || \
-    defined(DUMP_READ_OBJECT)
-#define DUMP_BYTECODE
-#endif
-
-#ifdef DUMP_BYTECODE
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_*
 static void dump_single_byte_code(JSContext *ctx, const uint8_t *pc,
                                   JSFunctionBytecode *b, int start_pos);
 static void print_func_name(JSFunctionBytecode *b);
 #endif
 
+static bool needs_backtrace(JSValue exc)
+{
+    JSObject *p;
+
+    if (JS_VALUE_GET_TAG(exc) != JS_TAG_OBJECT)
+        return false;
+    p = JS_VALUE_GET_OBJ(exc);
+    if (p->class_id != JS_CLASS_ERROR)
+        return false;
+    return !find_own_property1(p, JS_ATOM_stack);
+}
+
 /* argv[] is modified if (flags & JS_CALL_FLAG_COPY_ARGV) = 0. */
-static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
-                               JSValue this_obj, JSValue new_target,
-                               int argc, JSValue *argv, int flags)
+static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
+                               JSValueConst this_obj, JSValueConst new_target,
+                               int argc, JSValueConst *argv, int flags)
 {
     JSRuntime *rt = caller_ctx->rt;
     JSContext *ctx;
@@ -14975,11 +15002,10 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
     JSValue *local_buf, *stack_buf, *var_buf, *arg_buf, *sp, ret_val, *pval;
     JSVarRef **var_refs;
     size_t alloca_size;
-    JSInlineCache *ic;
 
-#ifdef DUMP_BYTECODE_STEP
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_STEP
 #define DUMP_BYTECODE_OR_DONT(pc) \
-    if (check_dump_flag(ctx->rt, DUMP_BYTECODE_STEP)) dump_single_byte_code(ctx, pc, b, 0);
+    if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_STEP)) dump_single_byte_code(ctx, pc, b, 0);
 #else
 #define DUMP_BYTECODE_OR_DONT(pc)
 #endif
@@ -15022,7 +15048,6 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             pc = sf->cur_pc;
             sf->prev_frame = rt->current_stack_frame;
             rt->current_stack_frame = sf;
-            ic = b->ic;
             if (s->throw_flag)
                 goto exception;
             else
@@ -15037,7 +15062,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
         call_func = rt->class_array[p->class_id].call;
         if (!call_func) {
         not_a_function:
-            return JS_ThrowTypeError(caller_ctx, "not a function");
+            return JS_ThrowTypeErrorNotAFunction(caller_ctx);
         }
         return call_func(caller_ctx, func_obj, this_obj, argc,
                          argv, flags);
@@ -15056,9 +15081,9 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
         return JS_ThrowStackOverflow(caller_ctx);
 
     sf->is_strict_mode = b->is_strict_mode;
-    arg_buf = argv;
+    arg_buf = (JSValue *)argv;
     sf->arg_count = argc;
-    sf->cur_func = func_obj;
+    sf->cur_func = unsafe_unconst(func_obj);
     init_list_head(&sf->var_ref_list);
     var_refs = p->u.func.var_refs;
 
@@ -15067,7 +15092,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
         int n = min_int(argc, b->arg_count);
         arg_buf = local_buf;
         for(i = 0; i < n; i++)
-            arg_buf[i] = JS_DupValue(caller_ctx, argv[i]);
+            arg_buf[i] = js_dup(argv[i]);
         for(; i < b->arg_count; i++)
             arg_buf[i] = JS_UNDEFINED;
         sf->arg_count = b->arg_count;
@@ -15087,10 +15112,9 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
     sf->prev_frame = rt->current_stack_frame;
     rt->current_stack_frame = sf;
     ctx = b->realm; /* set the current realm */
-    ic = b->ic;
 
-#ifdef DUMP_BYTECODE_STEP
-    if (check_dump_flag(ctx->rt, DUMP_BYTECODE_STEP))
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_STEP
+    if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_STEP))
         print_func_name(b);
 #endif
 
@@ -15241,9 +15265,11 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             BREAK;
         CASE(OP_rest):
             {
-                int first = get_u16(pc);
+                int i, n, first = get_u16(pc);
                 pc += 2;
-                *sp++ = js_build_rest(ctx, first, argc, argv);
+                i = min_int(first, argc);
+                n = argc - i;
+                *sp++ = js_create_array(ctx, n, &argv[i]);
                 if (unlikely(JS_IsException(sp[-1])))
                     goto exception;
             }
@@ -15416,7 +15442,8 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 call_argv = sp - call_argc;
                 sf->cur_pc = pc;
                 ret_val = JS_CallInternal(ctx, call_argv[-1], JS_UNDEFINED,
-                                          JS_UNDEFINED, call_argc, call_argv, 0);
+                                          JS_UNDEFINED, call_argc,
+                                          vc(call_argv), 0);
                 if (unlikely(JS_IsException(ret_val)))
                     goto exception;
                 if (opcode == OP_tail_call)
@@ -15434,8 +15461,8 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 call_argv = sp - call_argc;
                 sf->cur_pc = pc;
                 ret_val = JS_CallConstructorInternal(ctx, call_argv[-2],
-                                                     call_argv[-1],
-                                                     call_argc, call_argv, 0);
+                                                     call_argv[-1], call_argc,
+                                                     vc(call_argv), 0);
                 if (unlikely(JS_IsException(ret_val)))
                     goto exception;
                 for(i = -2; i < call_argc; i++)
@@ -15452,7 +15479,8 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 call_argv = sp - call_argc;
                 sf->cur_pc = pc;
                 ret_val = JS_CallInternal(ctx, call_argv[-1], call_argv[-2],
-                                          JS_UNDEFINED, call_argc, call_argv, 0);
+                                          JS_UNDEFINED, call_argc,
+                                          vc(call_argv), 0);
                 if (unlikely(JS_IsException(ret_val)))
                     goto exception;
                 if (opcode == OP_tail_call_method)
@@ -15465,23 +15493,12 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             BREAK;
         CASE(OP_array_from):
             {
-                int i, ret;
-
                 call_argc = get_u16(pc);
                 pc += 2;
-                ret_val = JS_NewArray(ctx);
+                call_argv = sp - call_argc;
+                ret_val = JS_NewArrayFrom(ctx, call_argc, call_argv);
                 if (unlikely(JS_IsException(ret_val)))
                     goto exception;
-                call_argv = sp - call_argc;
-                for(i = 0; i < call_argc; i++) {
-                    ret = JS_DefinePropertyValue(ctx, ret_val, __JS_AtomFromUInt32(i), call_argv[i],
-                                                 JS_PROP_C_W_E | JS_PROP_THROW);
-                    call_argv[i] = JS_UNDEFINED;
-                    if (ret < 0) {
-                        JS_FreeValue(ctx, ret_val);
-                        goto exception;
-                    }
-                }
                 sp -= call_argc;
                 *sp++ = ret_val;
             }
@@ -15494,7 +15511,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 pc += 2;
                 sf->cur_pc = pc;
 
-                ret_val = js_function_apply(ctx, sp[-3], 2, &sp[-2], magic);
+                ret_val = js_function_apply(ctx, sp[-3], 2, vc(&sp[-2]), magic);
                 if (unlikely(JS_IsException(ret_val)))
                     goto exception;
                 JS_FreeValue(ctx, sp[-3]);
@@ -15512,7 +15529,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             goto done;
 
         CASE(OP_check_ctor_return):
-            /* return TRUE if 'this' should be returned */
+            /* return true if 'this' should be returned */
             if (!JS_IsObject(sp[-1])) {
                 if (!JS_IsUndefined(sp[-1])) {
                     JS_ThrowTypeError(caller_ctx, "derived class constructor must return an object or undefined");
@@ -15526,10 +15543,27 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             BREAK;
         CASE(OP_check_ctor):
             if (JS_IsUndefined(new_target)) {
+            non_ctor_call:
                 JS_ThrowTypeError(ctx, "class constructors must be invoked with 'new'");
                 goto exception;
             }
             BREAK;
+        CASE(OP_init_ctor):
+            {
+                JSValue super, ret;
+                sf->cur_pc = pc;
+                if (JS_IsUndefined(new_target))
+                    goto non_ctor_call;
+                super = JS_GetPrototype(ctx, func_obj);
+                if (JS_IsException(super))
+                    goto exception;
+                ret = JS_CallConstructor2(ctx, super, new_target, argc, argv);
+                JS_FreeValue(ctx, super);
+                if (JS_IsException(ret))
+                    goto exception;
+                *sp++ = ret;
+            }
+            BREAK;
         CASE(OP_check_brand):
             {
                 int ret = JS_CheckBrand(ctx, sp[-2], sp[-1]);
@@ -15602,7 +15636,8 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                                             JS_EVAL_TYPE_DIRECT, scope_idx);
                 } else {
                     ret_val = JS_CallInternal(ctx, call_argv[-1], JS_UNDEFINED,
-                                              JS_UNDEFINED, call_argc, call_argv, 0);
+                                              JS_UNDEFINED, call_argc,
+                                              vc(call_argv), 0);
                 }
                 if (unlikely(JS_IsException(ret_val)))
                     goto exception;
@@ -15634,8 +15669,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                     ret_val = JS_EvalObject(ctx, JS_UNDEFINED, obj,
                                             JS_EVAL_TYPE_DIRECT, scope_idx);
                 } else {
-                    ret_val = JS_Call(ctx, sp[-2], JS_UNDEFINED, len,
-                                      tab);
+                    ret_val = JS_Call(ctx, sp[-2], JS_UNDEFINED, len, vc(tab));
                 }
                 free_arg_list(ctx, tab, len);
                 if (unlikely(JS_IsException(ret_val)))
@@ -15918,7 +15952,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 pc += 2;
                 val = *var_refs[idx]->pvalue;
                 if (unlikely(JS_IsUninitialized(val))) {
-                    JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, TRUE);
+                    JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, true);
                     goto exception;
                 }
                 sp[0] = js_dup(val);
@@ -15931,7 +15965,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 idx = get_u16(pc);
                 pc += 2;
                 if (unlikely(JS_IsUninitialized(*var_refs[idx]->pvalue))) {
-                    JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, TRUE);
+                    JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, true);
                     goto exception;
                 }
                 set_value(ctx, var_refs[idx]->pvalue, sp[-1]);
@@ -15944,7 +15978,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 idx = get_u16(pc);
                 pc += 2;
                 if (unlikely(!JS_IsUninitialized(*var_refs[idx]->pvalue))) {
-                    JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, TRUE);
+                    JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, true);
                     goto exception;
                 }
                 set_value(ctx, var_refs[idx]->pvalue, sp[-1]);
@@ -15966,7 +16000,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 pc += 2;
                 if (unlikely(JS_IsUninitialized(var_buf[idx]))) {
                     JS_ThrowReferenceErrorUninitialized2(caller_ctx, b, idx,
-                                                         FALSE);
+                                                         false);
                     goto exception;
                 }
                 sp[0] = js_dup(var_buf[idx]);
@@ -15980,7 +16014,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 pc += 2;
                 if (unlikely(JS_IsUninitialized(var_buf[idx]))) {
                     JS_ThrowReferenceErrorUninitialized2(caller_ctx, b, idx,
-                                                         FALSE);
+                                                         false);
                     goto exception;
                 }
                 set_value(ctx, &var_buf[idx], sp[-1]);
@@ -16199,7 +16233,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             BREAK;
         CASE(OP_for_of_start):
             sf->cur_pc = pc;
-            if (js_for_of_start(ctx, sp, FALSE))
+            if (js_for_of_start(ctx, sp, false))
                 goto exception;
             sp += 1;
             *sp++ = JS_NewCatchOffset(ctx, 0);
@@ -16216,7 +16250,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             BREAK;
         CASE(OP_for_await_of_start):
             sf->cur_pc = pc;
-            if (js_for_of_start(ctx, sp, TRUE))
+            if (js_for_of_start(ctx, sp, true))
                 goto exception;
             sp += 1;
             *sp++ = JS_NewCatchOffset(ctx, 0);
@@ -16241,7 +16275,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             sp--;
             if (!JS_IsUndefined(sp[-1])) {
                 sf->cur_pc = pc;
-                if (JS_IteratorClose(ctx, sp[-1], FALSE))
+                if (JS_IteratorClose(ctx, sp[-1], false))
                     goto exception;
                 JS_FreeValue(ctx, sp[-1]);
             }
@@ -16270,7 +16304,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             {
                 JSValue ret;
                 sf->cur_pc = pc;
-                ret = JS_Call(ctx, sp[-3], sp[-4], 1, (sp - 1));
+                ret = JS_Call(ctx, sp[-3], sp[-4], 1, vc(sp - 1));
                 if (JS_IsException(ret))
                     goto exception;
                 JS_FreeValue(ctx, sp[-1]);
@@ -16282,7 +16316,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             /* stack: iter_obj next catch_offset val */
             {
                 JSValue method, ret;
-                BOOL ret_flag;
+                bool ret_flag;
                 int flags;
                 flags = *pc++;
                 sf->cur_pc = pc;
@@ -16291,7 +16325,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 if (JS_IsException(method))
                     goto exception;
                 if (JS_IsUndefined(method) || JS_IsNull(method)) {
-                    ret_flag = TRUE;
+                    ret_flag = true;
                 } else {
                     if (flags & 2) {
                         /* no argument */
@@ -16299,13 +16333,13 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                                           0, NULL);
                     } else {
                         ret = JS_CallFree(ctx, method, sp[-4],
-                                          1, (sp - 1));
+                                          1, vc(sp - 1));
                     }
                     if (JS_IsException(ret))
                         goto exception;
                     JS_FreeValue(ctx, sp[-1]);
                     sp[-1] = ret;
-                    ret_flag = FALSE;
+                    ret_flag = false;
                 }
                 sp[0] = js_bool(ret_flag);
                 sp += 1;
@@ -16331,39 +16365,12 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             {
                 JSValue val;
                 JSAtom atom;
-                JSInlineCacheUpdate icu;
                 atom = get_u32(pc);
                 pc += 4;
                 sf->cur_pc = pc;
-                icu = (JSInlineCacheUpdate){ic, INLINE_CACHE_MISS};
-                val = JS_GetPropertyInternal2(ctx, sp[-1], atom, sp[-1], &icu, FALSE);
-                if (unlikely(JS_IsException(val)))
-                    goto exception;
-                if (icu.offset != INLINE_CACHE_MISS) {
-                    put_u8(pc - 5, OP_get_field_ic);
-                    put_u32(pc - 4, icu.offset);
-                    JS_FreeAtom(ctx, atom);
-                }
-                JS_FreeValue(ctx, sp[-1]);
-                sp[-1] = val;
-            }
-            BREAK;
-
-        CASE(OP_get_field_ic):
-            {
-                JSValue val;
-                JSAtom atom;
-                uint32_t ic_offset;
-                JSInlineCacheUpdate icu;
-                ic_offset = get_u32(pc);
-                atom = get_ic_atom(ic, ic_offset);
-                pc += 4;
-                sf->cur_pc = pc;
-                icu = (JSInlineCacheUpdate){ic, ic_offset};
-                val = JS_GetPropertyInternalWithIC(ctx, sp[-1], atom, sp[-1], &icu, FALSE);
+                val = JS_GetPropertyInternal(ctx, sp[-1], atom, sp[-1], false);
                 if (unlikely(JS_IsException(val)))
                     goto exception;
-                assert(icu.offset == ic_offset);
                 JS_FreeValue(ctx, sp[-1]);
                 sp[-1] = val;
             }
@@ -16373,85 +16380,31 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
             {
                 JSValue val;
                 JSAtom atom;
-                JSInlineCacheUpdate icu;
                 atom = get_u32(pc);
                 pc += 4;
                 sf->cur_pc = pc;
-                icu = (JSInlineCacheUpdate){ic, INLINE_CACHE_MISS};
-                val = JS_GetPropertyInternal2(ctx, sp[-1], atom, sp[-1], &icu, FALSE);
+                val = JS_GetPropertyInternal(ctx, sp[-1], atom, sp[-1], false);
                 if (unlikely(JS_IsException(val)))
                     goto exception;
-                if (icu.offset != INLINE_CACHE_MISS) {
-                    put_u8(pc - 5, OP_get_field2_ic);
-                    put_u32(pc - 4, icu.offset);
-                    JS_FreeAtom(ctx, atom);
-                }
                 *sp++ = val;
           }
           BREAK;
 
-      CASE(OP_get_field2_ic):
-            {
-                JSValue val;
-                JSAtom atom;
-                uint32_t ic_offset;
-                JSInlineCacheUpdate icu;
-                ic_offset = get_u32(pc);
-                atom = get_ic_atom(ic, ic_offset);
-                pc += 4;
-                sf->cur_pc = pc;
-                icu = (JSInlineCacheUpdate){ic, ic_offset};
-                val = JS_GetPropertyInternalWithIC(ctx, sp[-1], atom, sp[-1], &icu, FALSE);
-                if (unlikely(JS_IsException(val)))
-                    goto exception;
-                assert(icu.offset == ic_offset);
-                *sp++ = val;
-            }
-            BREAK;
-
         CASE(OP_put_field):
             {
                 int ret;
                 JSAtom atom;
-                JSInlineCacheUpdate icu;
                 atom = get_u32(pc);
                 pc += 4;
                 sf->cur_pc = pc;
-                icu = (JSInlineCacheUpdate){ic, INLINE_CACHE_MISS};
                 ret = JS_SetPropertyInternal2(ctx,
                                               sp[-2], atom,
                                               sp[-1], sp[-2],
-                                              JS_PROP_THROW_STRICT, &icu);
+                                              JS_PROP_THROW_STRICT);
                 JS_FreeValue(ctx, sp[-2]);
                 sp -= 2;
                 if (unlikely(ret < 0))
                     goto exception;
-                if (icu.offset != INLINE_CACHE_MISS) {
-                    put_u8(pc - 5, OP_put_field_ic);
-                    put_u32(pc - 4, icu.offset);
-                    JS_FreeAtom(ctx, atom);
-                }
-            }
-            BREAK;
-
-      CASE(OP_put_field_ic):
-            {
-                int ret;
-                JSAtom atom;
-                uint32_t ic_offset;
-                JSInlineCacheUpdate icu;
-                ic_offset = get_u32(pc);
-                atom = get_ic_atom(ic, ic_offset);
-                pc += 4;
-                sf->cur_pc = pc;
-                icu = (JSInlineCacheUpdate){ic, ic_offset};
-                ret = JS_SetPropertyInternalWithIC(ctx, sp[-2], atom, sp[-1],
-                                                   JS_PROP_THROW_STRICT, &icu);
-                JS_FreeValue(ctx, sp[-2]);
-                sp -= 2;
-                if (unlikely(ret < 0))
-                    goto exception;
-                assert(icu.offset == ic_offset);
             }
             BREAK;
 
@@ -16547,7 +16500,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 JSValue proto;
                 proto = sp[-1];
                 if (JS_IsObject(proto) || JS_IsNull(proto)) {
-                    if (JS_SetPrototypeInternal(ctx, sp[-2], proto, TRUE) < 0)
+                    if (JS_SetPrototypeInternal(ctx, sp[-2], proto, true) < 0)
                         goto exception;
                 }
                 JS_FreeValue(ctx, proto);
@@ -16564,7 +16517,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 JSValue obj;
                 JSAtom atom;
                 int flags, ret, op_flags;
-                BOOL is_computed;
+                bool is_computed;
 #define OP_DEFINE_METHOD_METHOD 0
 #define OP_DEFINE_METHOD_GETTER 1
 #define OP_DEFINE_METHOD_SETTER 2
@@ -16688,7 +16641,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 atom = JS_ValueToAtom(ctx, sp[-1]);
                 if (unlikely(atom == JS_ATOM_NULL))
                     goto exception;
-                val = JS_GetPropertyInternal2(ctx, sp[-2], atom, sp[-3], NULL, FALSE);
+                val = JS_GetPropertyInternal(ctx, sp[-2], atom, sp[-3], false);
                 JS_FreeAtom(ctx, atom);
                 if (unlikely(JS_IsException(val)))
                     goto exception;
@@ -16755,7 +16708,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                 ret = JS_SetPropertyInternal2(ctx,
                                               sp[-3], atom,
                                               sp[-1], sp[-4],
-                                              JS_PROP_THROW_STRICT, NULL);
+                                              JS_PROP_THROW_STRICT);
                 JS_FreeAtom(ctx, atom);
                 JS_FreeValue(ctx, sp[-4]);
                 JS_FreeValue(ctx, sp[-3]);
@@ -17509,12 +17462,11 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
         }
     }
  exception:
-    if (is_backtrace_needed(ctx, rt->current_exception)) {
-        /* add the backtrace information now (it is not done
-           before if the exception happens in a bytecode
-           operation */
+    if (needs_backtrace(rt->current_exception)
+    || JS_IsUndefined(ctx->error_back_trace)) {
         sf->cur_pc = pc;
-        build_backtrace(ctx, rt->current_exception, JS_UNDEFINED, NULL, 0, 0, 0);
+        build_backtrace(ctx, rt->current_exception, JS_UNDEFINED,
+                        NULL, 0, 0, 0);
     }
     if (!JS_IsUncatchableError(ctx, rt->current_exception)) {
         while (sp > stack_buf) {
@@ -17526,10 +17478,12 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
                     /* enumerator: close it with a throw */
                     JS_FreeValue(ctx, sp[-1]); /* drop the next method */
                     sp--;
-                    JS_IteratorClose(ctx, sp[-1], TRUE);
+                    JS_IteratorClose(ctx, sp[-1], true);
                 } else {
                     *sp++ = rt->current_exception;
                     rt->current_exception = JS_UNINITIALIZED;
+                    JS_FreeValueRT(rt, ctx->error_back_trace);
+                    ctx->error_back_trace = JS_UNDEFINED;
                     pc = b->byte_code_buf + pos;
                     goto restart;
                 }
@@ -17559,15 +17513,15 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValue func_obj,
     return ret_val;
 }
 
-JSValue JS_Call(JSContext *ctx, JSValue func_obj, JSValue this_obj,
-                int argc, JSValue *argv)
+JSValue JS_Call(JSContext *ctx, JSValueConst func_obj, JSValueConst this_obj,
+                int argc, JSValueConst *argv)
 {
     return JS_CallInternal(ctx, func_obj, this_obj, JS_UNDEFINED,
                            argc, argv, JS_CALL_FLAG_COPY_ARGV);
 }
 
-static JSValue JS_CallFree(JSContext *ctx, JSValue func_obj, JSValue this_obj,
-                           int argc, JSValue *argv)
+static JSValue JS_CallFree(JSContext *ctx, JSValue func_obj, JSValueConst this_obj,
+                           int argc, JSValueConst *argv)
 {
     JSValue res = JS_CallInternal(ctx, func_obj, this_obj, JS_UNDEFINED,
                                   argc, argv, JS_CALL_FLAG_COPY_ARGV);
@@ -17577,7 +17531,7 @@ static JSValue JS_CallFree(JSContext *ctx, JSValue func_obj, JSValue this_obj,
 
 /* warning: the refcount of the context is not incremented. Return
    NULL in case of exception (case of revoked proxy only) */
-static JSContext *JS_GetFunctionRealm(JSContext *ctx, JSValue func_obj)
+static JSContext *JS_GetFunctionRealm(JSContext *ctx, JSValueConst func_obj)
 {
     JSObject *p;
     JSContext *realm;
@@ -17625,7 +17579,7 @@ static JSContext *JS_GetFunctionRealm(JSContext *ctx, JSValue func_obj)
     return realm;
 }
 
-static JSValue js_create_from_ctor(JSContext *ctx, JSValue ctor,
+static JSValue js_create_from_ctor(JSContext *ctx, JSValueConst ctor,
                                    int class_id)
 {
     JSValue proto, obj;
@@ -17658,9 +17612,10 @@ JSValue JS_NewObjectFromCtor(JSContext *ctx, JSValueConst ctor,
 
 /* argv[] is modified if (flags & JS_CALL_FLAG_COPY_ARGV) = 0. */
 static JSValue JS_CallConstructorInternal(JSContext *ctx,
-                                          JSValue func_obj,
-                                          JSValue new_target,
-                                          int argc, JSValue *argv, int flags)
+                                          JSValueConst func_obj,
+                                          JSValueConst new_target,
+                                          int argc, JSValueConst *argv,
+                                          int flags)
 {
     JSObject *p;
     JSFunctionBytecode *b;
@@ -17678,7 +17633,7 @@ static JSValue JS_CallConstructorInternal(JSContext *ctx,
         call_func = ctx->rt->class_array[p->class_id].call;
         if (!call_func) {
         not_a_function:
-            return JS_ThrowTypeError(ctx, "not a function");
+            return JS_ThrowTypeErrorNotAFunction(ctx);
         }
         return call_func(ctx, func_obj, new_target, argc,
                          argv, flags);
@@ -17705,25 +17660,25 @@ static JSValue JS_CallConstructorInternal(JSContext *ctx,
     }
 }
 
-JSValue JS_CallConstructor2(JSContext *ctx, JSValue func_obj,
-                            JSValue new_target,
-                            int argc, JSValue *argv)
+JSValue JS_CallConstructor2(JSContext *ctx, JSValueConst func_obj,
+                            JSValueConst new_target,
+                            int argc, JSValueConst *argv)
 {
     return JS_CallConstructorInternal(ctx, func_obj, new_target,
                                       argc, argv,
                                       JS_CALL_FLAG_COPY_ARGV);
 }
 
-JSValue JS_CallConstructor(JSContext *ctx, JSValue func_obj,
-                           int argc, JSValue *argv)
+JSValue JS_CallConstructor(JSContext *ctx, JSValueConst func_obj,
+                           int argc, JSValueConst *argv)
 {
     return JS_CallConstructorInternal(ctx, func_obj, func_obj,
                                       argc, argv,
                                       JS_CALL_FLAG_COPY_ARGV);
 }
 
-JSValue JS_Invoke(JSContext *ctx, JSValue this_val, JSAtom atom,
-                  int argc, JSValue *argv)
+JSValue JS_Invoke(JSContext *ctx, JSValueConst this_val, JSAtom atom,
+                  int argc, JSValueConst *argv)
 {
     JSValue func_obj;
     func_obj = JS_GetProperty(ctx, this_val, atom);
@@ -17733,7 +17688,7 @@ JSValue JS_Invoke(JSContext *ctx, JSValue this_val, JSAtom atom,
 }
 
 static JSValue JS_InvokeFree(JSContext *ctx, JSValue this_val, JSAtom atom,
-                             int argc, JSValue *argv)
+                             int argc, JSValueConst *argv)
 {
     JSValue res = JS_Invoke(ctx, this_val, atom, argc, argv);
     JS_FreeValue(ctx, this_val);
@@ -17742,8 +17697,9 @@ static JSValue JS_InvokeFree(JSContext *ctx, JSValue this_val, JSAtom atom,
 
 /* JSAsyncFunctionState (used by generator and async functions) */
 static __exception int async_func_init(JSContext *ctx, JSAsyncFunctionState *s,
-                                       JSValue func_obj, JSValue this_obj,
-                                       int argc, JSValue *argv)
+                                       JSValueConst func_obj,
+                                       JSValueConst this_obj,
+                                       int argc, JSValueConst *argv)
 {
     JSObject *p;
     JSFunctionBytecode *b;
@@ -17826,7 +17782,8 @@ static JSValue async_func_resume(JSContext *ctx, JSAsyncFunctionState *s)
     /* the tag does not matter provided it is not an object */
     func_obj = JS_MKPTR(JS_TAG_INT, s);
     return JS_CallInternal(ctx, func_obj, s->this_val, JS_UNDEFINED,
-                           s->argc, s->frame.arg_buf, JS_CALL_FLAG_GENERATOR);
+                           s->argc, vc(s->frame.arg_buf),
+                           JS_CALL_FLAG_GENERATOR);
 }
 
 
@@ -17853,7 +17810,7 @@ static void free_generator_stack_rt(JSRuntime *rt, JSGeneratorData *s)
     s->state = JS_GENERATOR_STATE_COMPLETED;
 }
 
-static void js_generator_finalizer(JSRuntime *rt, JSValue obj)
+static void js_generator_finalizer(JSRuntime *rt, JSValueConst obj)
 {
     JSGeneratorData *s = JS_GetOpaque(obj, JS_CLASS_GENERATOR);
 
@@ -17868,7 +17825,7 @@ static void free_generator_stack(JSContext *ctx, JSGeneratorData *s)
     free_generator_stack_rt(ctx->rt, s);
 }
 
-static void js_generator_mark(JSRuntime *rt, JSValue val,
+static void js_generator_mark(JSRuntime *rt, JSValueConst val,
                               JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -17884,15 +17841,15 @@ static void js_generator_mark(JSRuntime *rt, JSValue val,
 #define GEN_MAGIC_RETURN 1
 #define GEN_MAGIC_THROW  2
 
-static JSValue js_generator_next(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv,
-                                 BOOL *pdone, int magic)
+static JSValue js_generator_next(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv,
+                                 int *pdone, int magic)
 {
     JSGeneratorData *s = JS_GetOpaque(this_val, JS_CLASS_GENERATOR);
     JSStackFrame *sf;
     JSValue ret, func_ret;
 
-    *pdone = TRUE;
+    *pdone = true;
     if (!s)
         return JS_ThrowTypeError(ctx, "not a generator");
     sf = &s->func_state.frame;
@@ -17913,13 +17870,13 @@ static JSValue js_generator_next(JSContext *ctx, JSValue this_val,
         if (magic == GEN_MAGIC_THROW &&
             s->state == JS_GENERATOR_STATE_SUSPENDED_YIELD) {
             JS_Throw(ctx, ret);
-            s->func_state.throw_flag = TRUE;
+            s->func_state.throw_flag = true;
         } else {
             sf->cur_sp[-1] = ret;
             sf->cur_sp[0] = js_int32(magic);
             sf->cur_sp++;
         exec_no_arg:
-            s->func_state.throw_flag = FALSE;
+            s->func_state.throw_flag = false;
         }
         s->state = JS_GENERATOR_STATE_EXECUTING;
         func_ret = async_func_resume(ctx, &s->func_state);
@@ -17938,7 +17895,7 @@ static JSValue js_generator_next(JSContext *ctx, JSValue this_val,
                 /* return (value, done) object */
                 *pdone = 2;
             } else {
-                *pdone = FALSE;
+                *pdone = false;
             }
         } else {
             /* end of iterator */
@@ -17971,9 +17928,9 @@ static JSValue js_generator_next(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_generator_function_call(JSContext *ctx, JSValue func_obj,
-                                          JSValue this_obj,
-                                          int argc, JSValue *argv,
+static JSValue js_generator_function_call(JSContext *ctx, JSValueConst func_obj,
+                                          JSValueConst this_obj,
+                                          int argc, JSValueConst *argv,
                                           int flags)
 {
     JSValue obj, func_ret;
@@ -18011,7 +17968,7 @@ static void js_async_function_terminate(JSRuntime *rt, JSAsyncFunctionData *s)
 {
     if (s->is_active) {
         async_func_free(rt, &s->func_state);
-        s->is_active = FALSE;
+        s->is_active = false;
     }
 }
 
@@ -18031,7 +17988,8 @@ static void js_async_function_free(JSRuntime *rt, JSAsyncFunctionData *s)
     }
 }
 
-static void js_async_function_resolve_finalizer(JSRuntime *rt, JSValue val)
+static void js_async_function_resolve_finalizer(JSRuntime *rt,
+                                                JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSAsyncFunctionData *s = p->u.async_function_data;
@@ -18040,7 +17998,7 @@ static void js_async_function_resolve_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_async_function_resolve_mark(JSRuntime *rt, JSValue val,
+static void js_async_function_resolve_mark(JSRuntime *rt, JSValueConst val,
                                            JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -18073,20 +18031,32 @@ static int js_async_function_resolve_create(JSContext *ctx,
     return 0;
 }
 
-static void js_async_function_resume(JSContext *ctx, JSAsyncFunctionData *s)
+static bool js_async_function_resume(JSContext *ctx, JSAsyncFunctionData *s)
 {
+    bool is_success = true;
     JSValue func_ret, ret2;
 
     func_ret = async_func_resume(ctx, &s->func_state);
     if (JS_IsException(func_ret)) {
-        JSValue error;
     fail:
-        error = JS_GetException(ctx);
-        ret2 = JS_Call(ctx, s->resolving_funcs[1], JS_UNDEFINED,
-                       1, &error);
-        JS_FreeValue(ctx, error);
+        if (unlikely(JS_IsUncatchableError(ctx, ctx->rt->current_exception))) {
+            is_success = false;
+        } else {
+            JSValue error = JS_GetException(ctx);
+            ret2 = JS_Call(ctx, s->resolving_funcs[1], JS_UNDEFINED,
+                           1, vc(&error));
+            JS_FreeValue(ctx, error);
+        resolved:
+            if (unlikely(JS_IsException(ret2))) {
+                if (JS_IsUncatchableError(ctx, ctx->rt->current_exception)) {
+                    is_success = false;
+                } else {
+                    abort(); /* BUG */
+                }
+            }
+            JS_FreeValue(ctx, ret2);
+        }
         js_async_function_terminate(ctx->rt, s);
-        JS_FreeValue(ctx, ret2); /* XXX: what to do if exception ? */
     } else {
         JSValue value;
         value = s->func_state.frame.cur_sp[-1];
@@ -18094,10 +18064,9 @@ static void js_async_function_resume(JSContext *ctx, JSAsyncFunctionData *s)
         if (JS_IsUndefined(func_ret)) {
             /* function returned */
             ret2 = JS_Call(ctx, s->resolving_funcs[0], JS_UNDEFINED,
-                           1, &value);
-            JS_FreeValue(ctx, ret2); /* XXX: what to do if exception ? */
+                           1, vc(&value));
             JS_FreeValue(ctx, value);
-            js_async_function_terminate(ctx->rt, s);
+            goto resolved;
         } else {
             JSValue promise, resolving_funcs[2], resolving_funcs1[2];
             int i, res;
@@ -18105,7 +18074,7 @@ static void js_async_function_resume(JSContext *ctx, JSAsyncFunctionData *s)
             /* await */
             JS_FreeValue(ctx, func_ret); /* not used */
             promise = js_promise_resolve(ctx, ctx->promise_ctor,
-                                         1, &value, 0);
+                                         1, vc(&value), 0);
             JS_FreeValue(ctx, value);
             if (JS_IsException(promise))
                 goto fail;
@@ -18119,8 +18088,8 @@ static void js_async_function_resume(JSContext *ctx, JSAsyncFunctionData *s)
             for(i = 0; i < 2; i++)
                 resolving_funcs1[i] = JS_UNDEFINED;
             res = perform_promise_then(ctx, promise,
-                                       resolving_funcs,
-                                       resolving_funcs1);
+                                       vc(resolving_funcs),
+                                       vc(resolving_funcs1));
             JS_FreeValue(ctx, promise);
             for(i = 0; i < 2; i++)
                 JS_FreeValue(ctx, resolving_funcs[i]);
@@ -18128,18 +18097,19 @@ static void js_async_function_resume(JSContext *ctx, JSAsyncFunctionData *s)
                 goto fail;
         }
     }
+    return is_success;
 }
 
 static JSValue js_async_function_resolve_call(JSContext *ctx,
-                                              JSValue func_obj,
-                                              JSValue this_obj,
-                                              int argc, JSValue *argv,
+                                              JSValueConst func_obj,
+                                              JSValueConst this_obj,
+                                              int argc, JSValueConst *argv,
                                               int flags)
 {
     JSObject *p = JS_VALUE_GET_OBJ(func_obj);
     JSAsyncFunctionData *s = p->u.async_function_data;
-    BOOL is_reject = p->class_id - JS_CLASS_ASYNC_FUNCTION_RESOLVE;
-    JSValue arg;
+    bool is_reject = p->class_id - JS_CLASS_ASYNC_FUNCTION_RESOLVE;
+    JSValueConst arg;
 
     if (argc > 0)
         arg = argv[0];
@@ -18152,13 +18122,14 @@ static JSValue js_async_function_resolve_call(JSContext *ctx,
         /* return value of await */
         s->func_state.frame.cur_sp[-1] = js_dup(arg);
     }
-    js_async_function_resume(ctx, s);
+    if (!js_async_function_resume(ctx, s))
+        return JS_EXCEPTION;
     return JS_UNDEFINED;
 }
 
-static JSValue js_async_function_call(JSContext *ctx, JSValue func_obj,
-                                      JSValue this_obj,
-                                      int argc, JSValue *argv, int flags)
+static JSValue js_async_function_call(JSContext *ctx, JSValueConst func_obj,
+                                      JSValueConst this_obj,
+                                      int argc, JSValueConst *argv, int flags)
 {
     JSValue promise;
     JSAsyncFunctionData *s;
@@ -18168,7 +18139,7 @@ static JSValue js_async_function_call(JSContext *ctx, JSValue func_obj,
         return JS_EXCEPTION;
     s->header.ref_count = 1;
     add_gc_object(ctx->rt, &s->header, JS_GC_OBJ_TYPE_ASYNC_FUNCTION);
-    s->is_active = FALSE;
+    s->is_active = false;
     s->resolving_funcs[0] = JS_UNDEFINED;
     s->resolving_funcs[1] = JS_UNDEFINED;
 
@@ -18182,9 +18153,10 @@ static JSValue js_async_function_call(JSContext *ctx, JSValue func_obj,
         js_async_function_free(ctx->rt, s);
         return JS_EXCEPTION;
     }
-    s->is_active = TRUE;
+    s->is_active = true;
 
-    js_async_function_resume(ctx, s);
+    if (!js_async_function_resume(ctx, s))
+        goto fail;
 
     js_async_function_free(ctx->rt, s);
 
@@ -18240,7 +18212,7 @@ static void js_async_generator_free(JSRuntime *rt,
     js_free_rt(rt, s);
 }
 
-static void js_async_generator_finalizer(JSRuntime *rt, JSValue obj)
+static void js_async_generator_finalizer(JSRuntime *rt, JSValueConst obj)
 {
     JSAsyncGeneratorData *s = JS_GetOpaque(obj, JS_CLASS_ASYNC_GENERATOR);
 
@@ -18249,7 +18221,7 @@ static void js_async_generator_finalizer(JSRuntime *rt, JSValue obj)
     }
 }
 
-static void js_async_generator_mark(JSRuntime *rt, JSValue val,
+static void js_async_generator_mark(JSRuntime *rt, JSValueConst val,
                                     JS_MarkFunc *mark_func)
 {
     JSAsyncGeneratorData *s = JS_GetOpaque(val, JS_CLASS_ASYNC_GENERATOR);
@@ -18271,21 +18243,21 @@ static void js_async_generator_mark(JSRuntime *rt, JSValue val,
 }
 
 static JSValue js_async_generator_resolve_function(JSContext *ctx,
-                                          JSValue this_obj,
-                                          int argc, JSValue *argv,
-                                          int magic, JSValue *func_data);
+                                          JSValueConst this_obj,
+                                          int argc, JSValueConst *argv,
+                                          int magic, JSValueConst *func_data);
 
 static int js_async_generator_resolve_function_create(JSContext *ctx,
                                                       JSValue generator,
                                                       JSValue *resolving_funcs,
-                                                      BOOL is_resume_next)
+                                                      bool is_resume_next)
 {
     int i;
     JSValue func;
 
     for(i = 0; i < 2; i++) {
         func = JS_NewCFunctionData(ctx, js_async_generator_resolve_function, 1,
-                                   i + is_resume_next * 2, 1, &generator);
+                                   i + is_resume_next * 2, 1, vc(&generator));
         if (JS_IsException(func)) {
             if (i == 1)
                 JS_FreeValue(ctx, resolving_funcs[0]);
@@ -18304,12 +18276,12 @@ static int js_async_generator_await(JSContext *ctx,
     int i, res;
 
     promise = js_promise_resolve(ctx, ctx->promise_ctor,
-                                 1, &value, 0);
+                                 1, vc(&value), 0);
     if (JS_IsException(promise))
         goto fail;
 
     if (js_async_generator_resolve_function_create(ctx, JS_MKPTR(JS_TAG_OBJECT, s->generator),
-                                                   resolving_funcs, FALSE)) {
+                                                   resolving_funcs, false)) {
         JS_FreeValue(ctx, promise);
         goto fail;
     }
@@ -18319,8 +18291,8 @@ static int js_async_generator_await(JSContext *ctx,
     for(i = 0; i < 2; i++)
         resolving_funcs1[i] = JS_UNDEFINED;
     res = perform_promise_then(ctx, promise,
-                               resolving_funcs,
-                               resolving_funcs1);
+                               vc(resolving_funcs),
+                               vc(resolving_funcs1));
     JS_FreeValue(ctx, promise);
     for(i = 0; i < 2; i++)
         JS_FreeValue(ctx, resolving_funcs[i]);
@@ -18333,7 +18305,7 @@ static int js_async_generator_await(JSContext *ctx,
 
 static void js_async_generator_resolve_or_reject(JSContext *ctx,
                                                  JSAsyncGeneratorData *s,
-                                                 JSValue result,
+                                                 JSValueConst result,
                                                  int is_reject)
 {
     JSAsyncGeneratorRequest *next;
@@ -18353,8 +18325,8 @@ static void js_async_generator_resolve_or_reject(JSContext *ctx,
 
 static void js_async_generator_resolve(JSContext *ctx,
                                        JSAsyncGeneratorData *s,
-                                       JSValue value,
-                                       BOOL done)
+                                       JSValueConst value,
+                                       bool done)
 {
     JSValue result;
     result = js_create_iterator_result(ctx, js_dup(value), done);
@@ -18365,7 +18337,7 @@ static void js_async_generator_resolve(JSContext *ctx,
 
 static void js_async_generator_reject(JSContext *ctx,
                                        JSAsyncGeneratorData *s,
-                                       JSValue exception)
+                                       JSValueConst exception)
 {
     js_async_generator_resolve_or_reject(ctx, s, exception, 1);
 }
@@ -18387,13 +18359,13 @@ static int js_async_generator_completed_return(JSContext *ctx,
     int res;
 
     // Can fail looking up JS_ATOM_constructor when is_reject==0.
-    promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, &value,
+    promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, vc(&value),
                                  /*is_reject*/0);
     // A poisoned .constructor property is observable and the resulting
     // exception should be delivered to the catch handler.
     if (JS_IsException(promise)) {
         JSValue err = JS_GetException(ctx);
-        promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, &err,
+        promise = js_promise_resolve(ctx, ctx->promise_ctor, 1, vc(&err),
                                      /*is_reject*/1);
         JS_FreeValue(ctx, err);
         if (JS_IsException(promise))
@@ -18402,15 +18374,15 @@ static int js_async_generator_completed_return(JSContext *ctx,
     if (js_async_generator_resolve_function_create(ctx,
                                                    JS_MKPTR(JS_TAG_OBJECT, s->generator),
                                                    resolving_funcs1,
-                                                   TRUE)) {
+                                                   true)) {
         JS_FreeValue(ctx, promise);
         return -1;
     }
     resolving_funcs[0] = JS_UNDEFINED;
     resolving_funcs[1] = JS_UNDEFINED;
     res = perform_promise_then(ctx, promise,
-                               resolving_funcs1,
-                               resolving_funcs);
+                               vc(resolving_funcs1),
+                               vc(resolving_funcs));
     JS_FreeValue(ctx, resolving_funcs1[0]);
     JS_FreeValue(ctx, resolving_funcs1[1]);
     JS_FreeValue(ctx, promise);
@@ -18442,7 +18414,7 @@ static void js_async_generator_resume_next(JSContext *ctx,
             break;
         case JS_ASYNC_GENERATOR_STATE_COMPLETED:
             if (next->completion_type == GEN_MAGIC_NEXT) {
-                js_async_generator_resolve(ctx, s, JS_UNDEFINED, TRUE);
+                js_async_generator_resolve(ctx, s, JS_UNDEFINED, true);
             } else if (next->completion_type == GEN_MAGIC_RETURN) {
                 s->state = JS_ASYNC_GENERATOR_STATE_AWAITING_RETURN;
                 js_async_generator_completed_return(ctx, s, next->result);
@@ -18456,7 +18428,7 @@ static void js_async_generator_resume_next(JSContext *ctx,
             if (next->completion_type == GEN_MAGIC_THROW &&
                 s->state == JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD) {
                 JS_Throw(ctx, value);
-                s->func_state.throw_flag = TRUE;
+                s->func_state.throw_flag = true;
             } else {
                 /* 'yield' returns a value. 'yield *' also returns a value
                    in case the 'throw' method is called */
@@ -18465,7 +18437,7 @@ static void js_async_generator_resume_next(JSContext *ctx,
                     js_int32(next->completion_type);
                 s->func_state.frame.cur_sp++;
             exec_no_arg:
-                s->func_state.throw_flag = FALSE;
+                s->func_state.throw_flag = false;
             }
             s->state = JS_ASYNC_GENERATOR_STATE_EXECUTING;
         resume_exec:
@@ -18487,7 +18459,7 @@ static void js_async_generator_resume_next(JSContext *ctx,
                         s->state = JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD_STAR;
                     else
                         s->state = JS_ASYNC_GENERATOR_STATE_SUSPENDED_YIELD;
-                    js_async_generator_resolve(ctx, s, value, FALSE);
+                    js_async_generator_resolve(ctx, s, value, false);
                     JS_FreeValue(ctx, value);
                     break;
                 case FUNC_RET_AWAIT:
@@ -18495,7 +18467,7 @@ static void js_async_generator_resume_next(JSContext *ctx,
                     JS_FreeValue(ctx, value);
                     if (ret < 0) {
                         /* exception: throw it */
-                        s->func_state.throw_flag = TRUE;
+                        s->func_state.throw_flag = true;
                         goto resume_exec;
                     }
                     goto done;
@@ -18508,7 +18480,7 @@ static void js_async_generator_resume_next(JSContext *ctx,
                 value = s->func_state.frame.cur_sp[-1];
                 s->func_state.frame.cur_sp[-1] = JS_UNDEFINED;
                 js_async_generator_complete(ctx, s);
-                js_async_generator_resolve(ctx, s, value, TRUE);
+                js_async_generator_resolve(ctx, s, value, true);
                 JS_FreeValue(ctx, value);
             }
             break;
@@ -18520,13 +18492,13 @@ static void js_async_generator_resume_next(JSContext *ctx,
 }
 
 static JSValue js_async_generator_resolve_function(JSContext *ctx,
-                                                   JSValue this_obj,
-                                                   int argc, JSValue *argv,
-                                                   int magic, JSValue *func_data)
+                                                   JSValueConst this_obj,
+                                                   int argc, JSValueConst *argv,
+                                                   int magic, JSValueConst *func_data)
 {
-    BOOL is_reject = magic & 1;
+    bool is_reject = magic & 1;
     JSAsyncGeneratorData *s = JS_GetOpaque(func_data[0], JS_CLASS_ASYNC_GENERATOR);
-    JSValue arg = argv[0];
+    JSValueConst arg = argv[0];
 
     /* XXX: what if s == NULL */
 
@@ -18538,7 +18510,7 @@ static JSValue js_async_generator_resolve_function(JSContext *ctx,
         if (is_reject) {
             js_async_generator_reject(ctx, s, arg);
         } else {
-            js_async_generator_resolve(ctx, s, arg, TRUE);
+            js_async_generator_resolve(ctx, s, arg, true);
         }
     } else {
         /* restart function execution after await() */
@@ -18556,8 +18528,8 @@ static JSValue js_async_generator_resolve_function(JSContext *ctx,
 }
 
 /* magic = GEN_MAGIC_x */
-static JSValue js_async_generator_next(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv,
+static JSValue js_async_generator_next(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv,
                                        int magic)
 {
     JSAsyncGeneratorData *s = JS_GetOpaque(this_val, JS_CLASS_ASYNC_GENERATOR);
@@ -18572,7 +18544,7 @@ static JSValue js_async_generator_next(JSContext *ctx, JSValue this_val,
         JS_ThrowTypeError(ctx, "not an AsyncGenerator object");
         err = JS_GetException(ctx);
         res2 = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED,
-                       1, &err);
+                       1, vc(&err));
         JS_FreeValue(ctx, err);
         JS_FreeValue(ctx, res2);
         JS_FreeValue(ctx, resolving_funcs[0]);
@@ -18599,9 +18571,10 @@ static JSValue js_async_generator_next(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_async_generator_function_call(JSContext *ctx, JSValue func_obj,
-                                                JSValue this_obj,
-                                                int argc, JSValue *argv,
+static JSValue js_async_generator_function_call(JSContext *ctx,
+                                                JSValueConst func_obj,
+                                                JSValueConst this_obj,
+                                                int argc, JSValueConst *argv,
                                                 int flags)
 {
     JSValue obj, func_ret;
@@ -18821,29 +18794,29 @@ typedef struct JSFunctionDef {
     struct list_head child_list; /* list of JSFunctionDef.link */
     struct list_head link;
 
-    BOOL is_eval; /* TRUE if eval code */
-    int eval_type; /* only valid if is_eval = TRUE */
-    BOOL is_global_var; /* TRUE if variables are not defined locally:
+    bool is_eval; /* true if eval code */
+    int eval_type; /* only valid if is_eval = true */
+    bool is_global_var; /* true if variables are not defined locally:
                            eval global, eval module or non strict eval */
-    BOOL is_func_expr; /* TRUE if function expression */
-    BOOL has_home_object; /* TRUE if the home object is available */
-    BOOL has_prototype; /* true if a prototype field is necessary */
-    BOOL has_simple_parameter_list;
-    BOOL has_parameter_expressions; /* if true, an argument scope is created */
-    BOOL has_use_strict; /* to reject directive in special cases */
-    BOOL has_eval_call; /* true if the function contains a call to eval() */
-    BOOL has_arguments_binding; /* true if the 'arguments' binding is
+    bool is_func_expr; /* true if function expression */
+    bool has_home_object; /* true if the home object is available */
+    bool has_prototype; /* true if a prototype field is necessary */
+    bool has_simple_parameter_list;
+    bool has_parameter_expressions; /* if true, an argument scope is created */
+    bool has_use_strict; /* to reject directive in special cases */
+    bool has_eval_call; /* true if the function contains a call to eval() */
+    bool has_arguments_binding; /* true if the 'arguments' binding is
                                    available in the function */
-    BOOL has_this_binding; /* true if the 'this' and new.target binding are
+    bool has_this_binding; /* true if the 'this' and new.target binding are
                               available in the function */
-    BOOL new_target_allowed; /* true if the 'new.target' does not
+    bool new_target_allowed; /* true if the 'new.target' does not
                                 throw a syntax error */
-    BOOL super_call_allowed; /* true if super() is allowed */
-    BOOL super_allowed; /* true if super. or super[] is allowed */
-    BOOL arguments_allowed; /* true if the 'arguments' identifier is allowed */
-    BOOL is_derived_class_constructor;
-    BOOL in_function_body;
-    BOOL backtrace_barrier;
+    bool super_call_allowed; /* true if super() is allowed */
+    bool super_allowed; /* true if super. or super[] is allowed */
+    bool arguments_allowed; /* true if the 'arguments' identifier is allowed */
+    bool is_derived_class_constructor;
+    bool in_function_body;
+    bool backtrace_barrier;
     JSFunctionKindEnum func_kind : 8;
     JSParseFunctionEnum func_type : 7;
     uint8_t is_strict_mode : 1;
@@ -18869,7 +18842,7 @@ typedef struct JSFunctionDef {
     int new_target_var_idx; /* variable containg the 'new.target' value, -1 if none */
     int this_active_func_var_idx; /* variable containg the 'this.active_func' value, -1 if none */
     int home_object_var_idx;
-    BOOL need_home_object;
+    bool need_home_object;
 
     int scope_level;    /* index into fd->scopes if the current lexical scope */
     int scope_first;    /* index into vd->vars of first lexically scoped variable */
@@ -18885,7 +18858,7 @@ typedef struct JSFunctionDef {
 
     DynBuf byte_code;
     int last_opcode_pos; /* -1 if no last opcode */
-    BOOL use_short_opcodes; /* true if short opcodes are used in byte_code */
+    bool use_short_opcodes; /* true if short opcodes are used in byte_code */
 
     LabelSlot *label_slots;
     int label_size; /* allocated size for label_slots[] */
@@ -18923,8 +18896,7 @@ typedef struct JSFunctionDef {
     int source_len;
 
     JSModuleDef *module; /* != NULL when parsing a module */
-    BOOL has_await; /* TRUE if await is used (used in module eval) */
-    JSInlineCache *ic; /* inline cache for field op */
+    bool has_await; /* true if await is used (used in module eval) */
 } JSFunctionDef;
 
 typedef struct JSToken {
@@ -18942,8 +18914,8 @@ typedef struct JSToken {
         } num;
         struct {
             JSAtom atom;
-            BOOL has_escape;
-            BOOL is_reserved;
+            bool has_escape;
+            bool is_reserved;
         } ident;
         struct {
             JSValue body;
@@ -18960,7 +18932,7 @@ typedef struct JSParseState {
     int col_num;        /* column number of current offset */
     const char *filename;
     JSToken token;
-    BOOL got_lf; /* true if got line feed before the current token */
+    bool got_lf; /* true if got line feed before the current token */
     const uint8_t *last_ptr;
     const uint8_t *buf_start;
     const uint8_t *buf_ptr;
@@ -18970,12 +18942,12 @@ typedef struct JSParseState {
 
     /* current function code */
     JSFunctionDef *cur_func;
-    BOOL is_module; /* parsing a module */
-    BOOL allow_html_comments;
+    bool is_module; /* parsing a module */
+    bool allow_html_comments;
 } JSParseState;
 
 typedef struct JSOpCode {
-#ifdef DUMP_BYTECODE
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_*
     const char *name;
 #endif
     uint8_t size; /* in bytes */
@@ -18988,7 +18960,7 @@ typedef struct JSOpCode {
 
 static const JSOpCode opcode_info[OP_COUNT + (OP_TEMP_END - OP_TEMP_START)] = {
 #define FMT(f)
-#ifdef DUMP_BYTECODE
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_*
 #define DEF(id, size, n_pop, n_push, f) { #id, size, n_pop, n_push, OP_FMT_ ## f },
 #else
 #define DEF(id, size, n_pop, n_push, f) { size, n_pop, n_push, OP_FMT_ ## f },
@@ -19097,14 +19069,14 @@ static void __attribute((unused)) dump_token(JSParseState *s,
     }
 }
 
-int __attribute__((format(printf, 2, 3))) js_parse_error(JSParseState *s, const char *fmt, ...)
+int JS_PRINTF_FORMAT_ATTR(2, 3) js_parse_error(JSParseState *s, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     JSContext *ctx = s->ctx;
     va_list ap;
     int backtrace_flags;
 
     va_start(ap, fmt);
-    JS_ThrowError2(ctx, JS_SYNTAX_ERROR, fmt, ap, FALSE);
+    JS_ThrowError2(ctx, JS_SYNTAX_ERROR, false, fmt, ap);
     va_end(ap);
     backtrace_flags = 0;
     if (s->cur_func && s->cur_func->backtrace_barrier)
@@ -19230,7 +19202,7 @@ static __exception int js_parse_template_part(JSParseState *s,
 }
 
 static __exception int js_parse_string(JSParseState *s, int sep,
-                                       BOOL do_throw, const uint8_t *p,
+                                       bool do_throw, const uint8_t *p,
                                        JSToken *token, const uint8_t **pp)
 {
     const uint8_t *p_next;
@@ -19320,7 +19292,7 @@ static __exception int js_parse_string(JSParseState *s, int sep,
                     if (c == CP_LS || c == CP_PS)
                         continue;
                 } else {
-                    ret = lre_parse_escape(&p, TRUE);
+                    ret = lre_parse_escape(&p, true);
                     if (ret == -1) {
                         if (do_throw) {
                             js_parse_error(s, "Invalid %s escape sequence",
@@ -19363,7 +19335,7 @@ static __exception int js_parse_string(JSParseState *s, int sep,
     return -1;
 }
 
-static inline BOOL token_is_pseudo_keyword(JSParseState *s, JSAtom atom) {
+static inline bool token_is_pseudo_keyword(JSParseState *s, JSAtom atom) {
     return s->token.val == TOK_IDENT && s->token.u.ident.atom == atom &&
         !s->token.u.ident.has_escape;
 }
@@ -19371,14 +19343,14 @@ static inline BOOL token_is_pseudo_keyword(JSParseState *s, JSAtom atom) {
 static __exception int js_parse_regexp(JSParseState *s)
 {
     const uint8_t *p, *p_next;
-    BOOL in_class;
+    bool in_class;
     StringBuffer b_s, *b = &b_s;
     StringBuffer b2_s, *b2 = &b2_s;
     uint32_t c;
 
     p = s->buf_ptr;
     p++;
-    in_class = FALSE;
+    in_class = false;
     if (string_buffer_init(s->ctx, b, 32))
         return -1;
     if (string_buffer_init(s->ctx, b2, 1))
@@ -19396,10 +19368,10 @@ static __exception int js_parse_regexp(JSParseState *s)
             if (!in_class)
                 break;
         } else if (c == '[') {
-            in_class = TRUE;
+            in_class = true;
         } else if (c == ']') {
             /* XXX: incorrect as the first character in a class */
-            in_class = FALSE;
+            in_class = false;
         } else if (c == '\\') {
             if (string_buffer_putc8(b, c))
                 goto fail;
@@ -19505,7 +19477,7 @@ static void update_token_ident(JSParseState *s)
            ((s->cur_func->parent->func_kind & JS_FUNC_ASYNC) ||
             s->cur_func->parent->func_type == JS_PARSE_FUNC_CLASS_STATIC_INIT))))) {
         if (s->token.u.ident.has_escape) {
-            s->token.u.ident.is_reserved = TRUE;
+            s->token.u.ident.is_reserved = true;
             s->token.val = TOK_IDENT;
         } else {
             /* The keywords atoms are pre allocated */
@@ -19522,14 +19494,14 @@ static void reparse_ident_token(JSParseState *s)
         (s->token.val >= TOK_FIRST_KEYWORD &&
          s->token.val <= TOK_LAST_KEYWORD)) {
         s->token.val = TOK_IDENT;
-        s->token.u.ident.is_reserved = FALSE;
+        s->token.u.ident.is_reserved = false;
         update_token_ident(s);
     }
 }
 
 /* 'c' is the first character. Return JS_ATOM_NULL in case of error */
 static JSAtom parse_ident(JSParseState *s, const uint8_t **pp,
-                          BOOL *pident_has_escape, int c, BOOL is_private)
+                          bool *pident_has_escape, int c, bool is_private)
 {
     const uint8_t *p, *p_next;
     char ident_buf[128], *buf;
@@ -19551,8 +19523,8 @@ static JSAtom parse_ident(JSParseState *s, const uint8_t **pp,
         c = *p;
         p_next = p + 1;
         if (c == '\\' && *p_next == 'u') {
-            c = lre_parse_escape(&p_next, TRUE);
-            *pident_has_escape = TRUE;
+            c = lre_parse_escape(&p_next, true);
+            *pident_has_escape = true;
         } else if (c >= 0x80) {
             c = utf8_decode(p, &p_next);
             /* no need to test for invalid UTF-8, 0xFFFD is not ident_next */
@@ -19579,7 +19551,7 @@ static __exception int next_token(JSParseState *s)
 {
     const uint8_t *p, *p_next;
     int c;
-    BOOL ident_has_escape;
+    bool ident_has_escape;
     JSAtom atom;
     int flags, radix;
 
@@ -19591,7 +19563,7 @@ static __exception int next_token(JSParseState *s)
     free_token(s, &s->token);
 
     p = s->last_ptr = s->buf_ptr;
-    s->got_lf = FALSE;
+    s->got_lf = false;
     s->last_line_num = s->token.line_num;
     s->last_col_num = s->token.col_num;
  redo:
@@ -19614,7 +19586,7 @@ static __exception int next_token(JSParseState *s)
         break;
     case '\'':
     case '\"':
-        if (js_parse_string(s, c, TRUE, p + 1, &s->token, &p))
+        if (js_parse_string(s, c, true, p + 1, &s->token, &p))
             goto fail;
         break;
     case '\r':  /* accept DOS and MAC newline sequences */
@@ -19627,7 +19599,7 @@ static __exception int next_token(JSParseState *s)
     line_terminator:
         s->eol = &p[-1];
         s->mark = p;
-        s->got_lf = TRUE;
+        s->got_lf = true;
         s->line_num++;
         goto redo;
     case '\f':
@@ -19651,17 +19623,17 @@ static __exception int next_token(JSParseState *s)
                 }
                 if (*p == '\n') {
                     s->line_num++;
-                    s->got_lf = TRUE; /* considered as LF for ASI */
+                    s->got_lf = true; /* considered as LF for ASI */
                     s->eol = p++;
                     s->mark = p;
                 } else if (*p == '\r') {
-                    s->got_lf = TRUE; /* considered as LF for ASI */
+                    s->got_lf = true; /* considered as LF for ASI */
                     p++;
                 } else if (*p >= 0x80) {
                     c = utf8_decode(p, &p);
                     /* ignore invalid UTF-8 in comments */
                     if (c == CP_LS || c == CP_PS) {
-                        s->got_lf = TRUE; /* considered as LF for ASI */
+                        s->got_lf = true; /* considered as LF for ASI */
                     }
                 } else {
                     p++;
@@ -19702,11 +19674,11 @@ static __exception int next_token(JSParseState *s)
     case '\\':
         if (p[1] == 'u') {
             const uint8_t *p1 = p + 1;
-            int c1 = lre_parse_escape(&p1, TRUE);
+            int c1 = lre_parse_escape(&p1, true);
             if (c1 >= 0 && lre_js_is_ident_first(c1)) {
                 c = c1;
                 p = p1;
-                ident_has_escape = TRUE;
+                ident_has_escape = true;
                 goto has_ident;
             } else {
                 /* XXX: syntax error? */
@@ -19732,14 +19704,14 @@ static __exception int next_token(JSParseState *s)
         /* identifier */
         s->mark = p;
         p++;
-        ident_has_escape = FALSE;
+        ident_has_escape = false;
     has_ident:
-        atom = parse_ident(s, &p, &ident_has_escape, c, FALSE);
+        atom = parse_ident(s, &p, &ident_has_escape, c, false);
         if (atom == JS_ATOM_NULL)
             goto fail;
         s->token.u.ident.atom = atom;
         s->token.u.ident.has_escape = ident_has_escape;
-        s->token.u.ident.is_reserved = FALSE;
+        s->token.u.ident.is_reserved = false;
         s->token.val = TOK_IDENT;
         update_token_ident(s);
         break;
@@ -19750,7 +19722,7 @@ static __exception int next_token(JSParseState *s)
             c = *p;
             p_next = p + 1;
             if (c == '\\' && *p_next == 'u') {
-                c = lre_parse_escape(&p_next, TRUE);
+                c = lre_parse_escape(&p_next, true);
             } else if (c >= 0x80) {
                 c = utf8_decode(p, &p_next);
                 if (p_next == p + 1)
@@ -19761,8 +19733,8 @@ static __exception int next_token(JSParseState *s)
                 goto fail;
             }
             p = p_next;
-            ident_has_escape = FALSE; /* not used */
-            atom = parse_ident(s, &p, &ident_has_escape, c, TRUE);
+            ident_has_escape = false; /* not used */
+            atom = parse_ident(s, &p, &ident_has_escape, c, true);
             if (atom == JS_ATOM_NULL)
                 goto fail;
             s->token.u.ident.atom = atom;
@@ -20033,7 +20005,7 @@ static __exception int next_token(JSParseState *s)
                     s->mark = p;
                     goto redo;
                 } else if (lre_js_is_ident_first(c)) {
-                    ident_has_escape = FALSE;
+                    ident_has_escape = false;
                     goto has_ident;
                 } else {
                     js_parse_error(s, "unexpected character");
@@ -20306,8 +20278,8 @@ static __exception int json_next_token(JSParseState *s)
         if (atom == JS_ATOM_NULL)
             goto fail;
         s->token.u.ident.atom = atom;
-        s->token.u.ident.has_escape = FALSE;
-        s->token.u.ident.is_reserved = FALSE;
+        s->token.u.ident.has_escape = false;
+        s->token.u.ident.is_reserved = false;
         s->token.val = TOK_IDENT;
         break;
     case '-':
@@ -20362,7 +20334,7 @@ static __exception int json_next_token(JSParseState *s)
 /* only used for ':' and '=>', 'let' or 'function' look-ahead. *pp is
    only set if TOK_IMPORT is returned */
 /* XXX: handle all unicode cases */
-static int simple_next_token(const uint8_t **pp, BOOL no_line_terminator)
+static int simple_next_token(const uint8_t **pp, bool no_line_terminator)
 {
     const uint8_t *p;
     uint32_t c;
@@ -20441,7 +20413,7 @@ static int simple_next_token(const uint8_t **pp, BOOL no_line_terminator)
     }
 }
 
-static int peek_token(JSParseState *s, BOOL no_line_terminator)
+static int peek_token(JSParseState *s, bool no_line_terminator)
 {
     const uint8_t *p = s->buf_ptr;
     return simple_next_token(&p, no_line_terminator);
@@ -20477,7 +20449,7 @@ static inline int get_prev_opcode(JSFunctionDef *fd) {
         return fd->byte_code.buf[fd->last_opcode_pos];
 }
 
-static BOOL js_is_live_code(JSParseState *s) {
+static bool js_is_live_code(JSParseState *s) {
     switch (get_prev_opcode(s->cur_func)) {
     case OP_tail_call:
     case OP_tail_call_method:
@@ -20490,9 +20462,9 @@ static BOOL js_is_live_code(JSParseState *s) {
     case OP_goto8:
     case OP_goto16:
     case OP_ret:
-        return FALSE;
+        return false;
     default:
-        return TRUE;
+        return true;
     }
 }
 
@@ -20517,8 +20489,8 @@ static void emit_source_loc(JSParseState *s)
     DynBuf *bc = &fd->byte_code;
 
     dbuf_putc(bc, OP_source_loc);
-    dbuf_put_u32(bc, s->last_line_num);
-    dbuf_put_u32(bc, s->last_col_num);
+    dbuf_put_u32(bc, s->token.line_num);
+    dbuf_put_u32(bc, s->token.col_num);
 }
 
 static void emit_op(JSParseState *s, uint8_t val)
@@ -20535,36 +20507,6 @@ static void emit_atom(JSParseState *s, JSAtom name)
     emit_u32(s, JS_DupAtom(s->ctx, name));
 }
 
-static force_inline uint32_t get_index_hash(JSAtom atom, int hash_bits)
-{
-    return (atom * 0x9e370001) >> (32 - hash_bits);
-}
-
-static void emit_ic(JSParseState *s, JSAtom atom)
-{
-    uint32_t h;
-    JSContext *ctx;
-    JSInlineCache *ic;
-    JSInlineCacheHashSlot *ch;
-
-    ic = s->cur_func->ic;
-    ctx = s->ctx;
-    if (ic->count + 1 >= ic->capacity && resize_ic_hash(ctx, ic))
-        return;
-    h = get_index_hash(atom, ic->hash_bits);
-    for (ch = ic->hash[h]; ch != NULL; ch = ch->next)
-        if (ch->atom == atom)
-            return;
-    ch = js_malloc(ctx, sizeof(*ch));
-    if (unlikely(!ch))
-        return;
-    ch->atom = JS_DupAtom(ctx, atom);
-    ch->index = 0;
-    ch->next = ic->hash[h];
-    ic->hash[h] = ch;
-    ic->count += 1;
-}
-
 static int update_label(JSFunctionDef *s, int label, int delta)
 {
     LabelSlot *ls;
@@ -20649,14 +20591,14 @@ static int cpool_add(JSParseState *s, JSValue val)
 }
 
 static __exception int emit_push_const(JSParseState *s, JSValue val,
-                                       BOOL as_atom)
+                                       bool as_atom)
 {
     int idx;
 
     if (JS_VALUE_GET_TAG(val) == JS_TAG_STRING && as_atom) {
         JSAtom atom;
         /* warning: JS_NewAtomStr frees the string value */
-        JS_DupValue(s->ctx, val);
+        js_dup(val);
         atom = JS_NewAtomStr(s->ctx, JS_VALUE_GET_STRING(val));
         if (atom != JS_ATOM_NULL && !__JS_AtomIsTaggedInt(atom)) {
             emit_op(s, OP_push_atom_value);
@@ -20665,7 +20607,7 @@ static __exception int emit_push_const(JSParseState *s, JSValue val,
         }
     }
 
-    idx = cpool_add(s, JS_DupValue(s->ctx, val));
+    idx = cpool_add(s, js_dup(val));
     if (idx < 0)
         return -1;
     emit_op(s, OP_push_const);
@@ -20805,15 +20747,15 @@ static int find_var_in_scope(JSContext *ctx, JSFunctionDef *fd,
 
 /* return true if scope == parent_scope or if scope is a child of
    parent_scope */
-static BOOL is_child_scope(JSContext *ctx, JSFunctionDef *fd,
+static bool is_child_scope(JSContext *ctx, JSFunctionDef *fd,
                            int scope, int parent_scope)
 {
     while (scope >= 0) {
         if (scope == parent_scope)
-            return TRUE;
+            return true;
         scope = fd->scopes[scope].parent;
     }
-    return FALSE;
+    return false;
 }
 
 /* find a 'var' declaration in the same scope or a child scope */
@@ -20855,7 +20797,7 @@ static JSGlobalVar *find_lexical_global_var(JSFunctionDef *fd, JSAtom name)
 }
 
 static int find_lexical_decl(JSContext *ctx, JSFunctionDef *fd, JSAtom name,
-                             int scope_idx, BOOL check_catch_var)
+                             int scope_idx, bool check_catch_var)
 {
     while (scope_idx >= 0) {
         JSVarDef *vd = &fd->vars[scope_idx];
@@ -20986,7 +20928,7 @@ static int add_func_var(JSContext *ctx, JSFunctionDef *fd, JSAtom name)
         fd->func_var_idx = idx;
         fd->vars[idx].var_kind = JS_VAR_FUNCTION_NAME;
         if (fd->is_strict_mode)
-            fd->vars[idx].is_const = TRUE;
+            fd->vars[idx].is_const = true;
     }
     return idx;
 }
@@ -21017,7 +20959,7 @@ static int add_arguments_arg(JSContext *ctx, JSFunctionDef *fd)
             fd->vars[idx].scope_next = fd->scopes[ARG_SCOPE_INDEX].first;
             fd->scopes[ARG_SCOPE_INDEX].first = idx;
             fd->vars[idx].scope_level = ARG_SCOPE_INDEX;
-            fd->vars[idx].is_lexical = TRUE;
+            fd->vars[idx].is_lexical = true;
 
             fd->arguments_arg_idx = idx;
         }
@@ -21058,9 +21000,9 @@ static JSGlobalVar *add_global_var(JSContext *ctx, JSFunctionDef *s,
         return NULL;
     hf = &s->global_vars[s->global_var_count++];
     hf->cpool_idx = -1;
-    hf->force_init = FALSE;
-    hf->is_lexical = FALSE;
-    hf->is_const = FALSE;
+    hf->force_init = false;
+    hf->is_lexical = false;
+    hf->is_const = false;
     hf->scope_level = s->scope_level;
     hf->var_name = JS_DupAtom(ctx, name);
     return hf;
@@ -21092,7 +21034,7 @@ static int define_var(JSParseState *s, JSFunctionDef *fd, JSAtom name,
     case JS_VAR_DEF_CONST:
     case JS_VAR_DEF_FUNCTION_DECL:
     case JS_VAR_DEF_NEW_FUNCTION_DECL:
-        idx = find_lexical_decl(ctx, fd, name, fd->scope_first, TRUE);
+        idx = find_lexical_decl(ctx, fd, name, fd->scope_first, true);
         if (idx >= 0) {
             if (idx < GLOBAL_VAR_OFFSET) {
                 if (fd->vars[idx].scope_level == fd->scope_level) {
@@ -21143,7 +21085,7 @@ static int define_var(JSParseState *s, JSFunctionDef *fd, JSAtom name,
             hf = add_global_var(s->ctx, fd, name);
             if (!hf)
                 return -1;
-            hf->is_lexical = TRUE;
+            hf->is_lexical = true;
             hf->is_const = (var_def_type == JS_VAR_DEF_CONST);
             idx = GLOBAL_VAR_OFFSET;
         } else {
@@ -21169,7 +21111,7 @@ static int define_var(JSParseState *s, JSFunctionDef *fd, JSAtom name,
 
     case JS_VAR_DEF_VAR:
         if (find_lexical_decl(ctx, fd, name, fd->scope_first,
-                              FALSE) >= 0) {
+                              false) >= 0) {
        invalid_lexical_redefinition:
             /* error to redefine a var that inside a lexical scope */
             return js_parse_error(s, "invalid redefinition of lexical identifier");
@@ -21206,7 +21148,7 @@ static int define_var(JSParseState *s, JSFunctionDef *fd, JSAtom name,
 
 /* add a private field variable in the current scope */
 static int add_private_class_field(JSParseState *s, JSFunctionDef *fd,
-                                   JSAtom name, JSVarKindEnum var_kind, BOOL is_static)
+                                   JSAtom name, JSVarKindEnum var_kind, bool is_static)
 {
     JSContext *ctx = s->ctx;
     JSVarDef *vd;
@@ -21263,7 +21205,7 @@ static int seal_template_obj(JSContext *ctx, JSValue obj)
                                      prs->flags & ~(JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE)))
             return -1;
     }
-    p->extensible = FALSE;
+    p->extensible = false;
     return 0;
 }
 
@@ -21309,7 +21251,7 @@ static __exception int js_parse_template(JSParseState *s, int call, int *argc)
             /* re-parse the string with escape sequences but do not throw a
                syntax error if it contains invalid sequences
              */
-            if (js_parse_string(s, '`', FALSE, p, &cooked, &p)) {
+            if (js_parse_string(s, '`', false, p, &cooked, &p)) {
                 cooked.u.str.str = JS_UNDEFINED;
             }
             if (JS_DefinePropertyValueUint32(ctx, template_object, depth,
@@ -21324,7 +21266,7 @@ static __exception int js_parse_template(JSParseState *s, int call, int *argc)
              */
             JS_FreeValue(ctx, s->token.u.str.str);
             s->token.u.str.str = JS_UNDEFINED;
-            if (js_parse_string(s, '`', TRUE, p, &cooked, &p))
+            if (js_parse_string(s, '`', true, p, &cooked, &p))
                 return -1;
             str = JS_VALUE_GET_STRING(cooked.u.str.str);
             if (str->len != 0 || depth == 0) {
@@ -21337,7 +21279,6 @@ static __exception int js_parse_template(JSParseState *s, int call, int *argc)
                         goto done1;
                     emit_op(s, OP_get_field2);
                     emit_atom(s, JS_ATOM_concat);
-                    emit_ic(s, JS_ATOM_concat);
                 }
                 depth++;
             } else {
@@ -21358,7 +21299,7 @@ static __exception int js_parse_template(JSParseState *s, int call, int *argc)
         free_token(s, &s->token);
         /* Resume TOK_TEMPLATE parsing (s->token.line_num and
          * s->token.ptr are OK) */
-        s->got_lf = FALSE;
+        s->got_lf = false;
         s->last_line_num = s->token.line_num;
         s->last_col_num = s->token.col_num;
         if (js_parse_template_part(s, s->buf_ptr))
@@ -21391,7 +21332,7 @@ static __exception int js_parse_template(JSParseState *s, int call, int *argc)
 
 #define PROP_TYPE_PRIVATE (1 << 4)
 
-static BOOL token_is_ident(int tok)
+static bool token_is_ident(int tok)
 {
     /* Accept keywords and reserved words as property names */
     return (tok == TOK_IDENT ||
@@ -21402,11 +21343,11 @@ static BOOL token_is_ident(int tok)
 /* if the property is an expression, name = JS_ATOM_NULL */
 static int __exception js_parse_property_name(JSParseState *s,
                                               JSAtom *pname,
-                                              BOOL allow_method, BOOL allow_var,
-                                              BOOL allow_private)
+                                              bool allow_method, bool allow_var,
+                                              bool allow_private)
 {
     int is_private = 0;
-    BOOL is_non_reserved_ident;
+    bool is_non_reserved_ident;
     JSAtom name;
     int prop_type;
 
@@ -21421,7 +21362,7 @@ static int __exception js_parse_property_name(JSParseState *s,
             if (s->token.val == ':' || s->token.val == ',' ||
                 s->token.val == '}' || s->token.val == '(' ||
                 s->token.val == '=' || s->token.val == ';') {
-                is_non_reserved_ident = TRUE;
+                is_non_reserved_ident = true;
                 goto ident_found;
             }
             prop_type = PROP_TYPE_GET + (name == JS_ATOM_set);
@@ -21431,14 +21372,14 @@ static int __exception js_parse_property_name(JSParseState *s,
                 goto fail;
             prop_type = PROP_TYPE_STAR;
         } else if (token_is_pseudo_keyword(s, JS_ATOM_async) &&
-                   peek_token(s, TRUE) != '\n') {
+                   peek_token(s, true) != '\n') {
             name = JS_DupAtom(s->ctx, s->token.u.ident.atom);
             if (next_token(s))
                 goto fail1;
             if (s->token.val == ':' || s->token.val == ',' ||
                 s->token.val == '}' || s->token.val == '(' ||
                 s->token.val == '=' || s->token.val == ';') {
-                is_non_reserved_ident = TRUE;
+                is_non_reserved_ident = true;
                 goto ident_found;
             }
             JS_FreeAtom(s->ctx, name);
@@ -21519,7 +21460,7 @@ typedef struct JSParsePos {
     int last_col_num;
     int line_num;
     int col_num;
-    BOOL got_lf;
+    bool got_lf;
     const uint8_t *ptr;
     const uint8_t *eol;
     const uint8_t *mark;
@@ -21551,8 +21492,8 @@ static __exception int js_parse_seek_token(JSParseState *s, const JSParsePos *sp
     return next_token(s);
 }
 
-/* return TRUE if a regexp literal is allowed after this token */
-static BOOL is_regexp_allowed(int tok)
+/* return true if a regexp literal is allowed after this token */
+static bool is_regexp_allowed(int tok)
 {
     switch (tok) {
     case TOK_NUMBER:
@@ -21568,9 +21509,9 @@ static BOOL is_regexp_allowed(int tok)
     case ']':
     case '}': /* XXX: regexp may occur after */
     case TOK_IDENT:
-        return FALSE;
+        return false;
     default:
-        return TRUE;
+        return true;
     }
 }
 
@@ -21581,7 +21522,7 @@ static BOOL is_regexp_allowed(int tok)
 /* XXX: improve speed with early bailout */
 /* XXX: no longer works if regexps are present. Could use previous
    regexp parsing heuristics to handle most cases */
-static int js_parse_skip_parens_token(JSParseState *s, int *pbits, BOOL no_line_terminator)
+static int js_parse_skip_parens_token(JSParseState *s, int *pbits, bool no_line_terminator)
 {
     char state[256];
     size_t level = 0;
@@ -21618,7 +21559,7 @@ static int js_parse_skip_parens_token(JSParseState *s, int *pbits, BOOL no_line_
                 free_token(s, &s->token);
                 /* Resume TOK_TEMPLATE parsing (s->token.line_num and
                  * s->token.ptr are OK) */
-                s->got_lf = FALSE;
+                s->got_lf = false;
                 s->last_line_num = s->token.line_num;
                 s->last_col_num = s->token.col_num;
                 if (js_parse_template_part(s, s->buf_ptr))
@@ -21753,13 +21694,13 @@ static __exception int js_parse_object_literal(JSParseState *s)
     JSAtom name = JS_ATOM_NULL;
     const uint8_t *start_ptr;
     int start_line, start_col, prop_type;
-    BOOL has_proto;
+    bool has_proto;
 
     if (next_token(s))
         goto fail;
     /* XXX: add an initial length that will be patched back */
     emit_op(s, OP_object);
-    has_proto = FALSE;
+    has_proto = false;
     while (s->token.val != '}') {
         /* specific case for getter/setter */
         start_ptr = s->token.ptr;
@@ -21779,7 +21720,7 @@ static __exception int js_parse_object_literal(JSParseState *s)
             goto next;
         }
 
-        prop_type = js_parse_property_name(s, &name, TRUE, TRUE, FALSE);
+        prop_type = js_parse_property_name(s, &name, true, true, false);
         if (prop_type < 0)
             goto fail;
 
@@ -21791,7 +21732,7 @@ static __exception int js_parse_object_literal(JSParseState *s)
             emit_op(s, OP_define_field);
             emit_atom(s, name);
         } else if (s->token.val == '(') {
-            BOOL is_getset = (prop_type == PROP_TYPE_GET ||
+            bool is_getset = (prop_type == PROP_TYPE_GET ||
                               prop_type == PROP_TYPE_SET);
             JSParseFunctionEnum func_type;
             JSFunctionKindEnum func_kind;
@@ -21840,7 +21781,7 @@ static __exception int js_parse_object_literal(JSParseState *s)
                     goto fail;
                 }
                 emit_op(s, OP_set_proto);
-                has_proto = TRUE;
+                has_proto = true;
             } else {
                 set_object_name(s, name);
                 emit_op(s, OP_define_field);
@@ -21932,9 +21873,9 @@ static JSAtom get_private_setter_name(JSContext *ctx, JSAtom name)
 typedef struct {
     JSFunctionDef *fields_init_fd;
     int computed_fields_count;
-    BOOL need_brand;
+    bool need_brand;
     int brand_push_pos;
-    BOOL is_static;
+    bool is_static;
 } ClassFieldsDef;
 
 static __exception int emit_class_init_start(JSParseState *s,
@@ -21987,88 +21928,59 @@ static void emit_class_init_end(JSParseState *s, ClassFieldsDef *cf)
     emit_op(s, OP_set_home_object);
 }
 
-static void emit_return(JSParseState *s, BOOL hasval);
+static void emit_return(JSParseState *s, bool hasval);
 
 static JSFunctionDef *js_new_function_def(JSContext *ctx,
                                           JSFunctionDef *parent,
-                                          BOOL is_eval,
-                                          BOOL is_func_expr,
+                                          bool is_eval,
+                                          bool is_func_expr,
                                           const char *filename,
                                           int line_num,
                                           int col_num);
 
 static __exception int js_parse_class_default_ctor(JSParseState *s,
-                                                   BOOL has_super,
+                                                   bool has_super,
                                                    JSFunctionDef **pfd)
 {
     JSParseFunctionEnum func_type;
     JSFunctionDef *fd = s->cur_func;
 
-    fd = js_new_function_def(s->ctx, fd, FALSE, FALSE, s->filename,
+    fd = js_new_function_def(s->ctx, fd, false, false, s->filename,
                              s->token.line_num, s->token.col_num);
     if (!fd)
         return -1;
 
     s->cur_func = fd;
-    fd->has_home_object = TRUE;
-    fd->super_allowed = TRUE;
-    fd->has_prototype = FALSE;
-    fd->has_this_binding = TRUE;
-    fd->new_target_allowed = TRUE;
-
-    /* error if not invoked as a constructor */
-    emit_op(s, OP_check_ctor);
+    fd->has_home_object = true;
+    fd->super_allowed = true;
+    fd->has_prototype = false;
+    fd->has_this_binding = true;
+    fd->new_target_allowed = true;
 
     push_scope(s);  /* enter body scope */
     fd->body_scope = fd->scope_level;
     if (has_super) {
-        fd->is_derived_class_constructor = TRUE;
-        fd->super_call_allowed = TRUE;
-        fd->arguments_allowed = TRUE;
-        fd->has_arguments_binding = TRUE;
-
+        fd->is_derived_class_constructor = true;
+        fd->super_call_allowed = true;
+        fd->arguments_allowed = true;
+        fd->has_arguments_binding = true;
         func_type = JS_PARSE_FUNC_DERIVED_CLASS_CONSTRUCTOR;
-        /* super */
-        emit_op(s, OP_scope_get_var);
-        emit_atom(s, JS_ATOM_this_active_func);
-        emit_u16(s, 0);
-
-        emit_op(s, OP_get_super);
-
-        emit_op(s, OP_scope_get_var);
-        emit_atom(s, JS_ATOM_new_target);
-        emit_u16(s, 0);
-
-        emit_op(s, OP_array_from);
-        emit_u16(s, 0);
-        emit_op(s, OP_push_i32);
-        emit_u32(s, 0);
-
-        /* arguments */
-        emit_op(s, OP_scope_get_var);
-        emit_atom(s, JS_ATOM_arguments);
-        emit_u16(s, 0);
-
-        emit_op(s, OP_append);
-        /* drop the index */
-        emit_op(s, OP_drop);
-
-        emit_op(s, OP_apply);
-        emit_u16(s, 1);
-        /* set the 'this' value */
-        emit_op(s, OP_dup);
+        emit_op(s, OP_init_ctor);
+        // TODO(bnoordhuis) roll into OP_init_ctor
         emit_op(s, OP_scope_put_var_init);
         emit_atom(s, JS_ATOM_this);
         emit_u16(s, 0);
         emit_class_field_init(s);
     } else {
         func_type = JS_PARSE_FUNC_CLASS_CONSTRUCTOR;
+        /* error if not invoked as a constructor */
+        emit_op(s, OP_check_ctor);
         emit_class_field_init(s);
     }
 
     fd->func_kind = JS_FUNC_NORMAL;
     fd->func_type = func_type;
-    emit_return(s, FALSE);
+    emit_return(s, false);
 
     s->cur_func = fd->parent;
     if (pfd)
@@ -22083,7 +21995,7 @@ static __exception int js_parse_class_default_ctor(JSParseState *s,
 }
 
 
-static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
+static __exception int js_parse_class(JSParseState *s, bool is_class_expr,
                                       JSParseExportEnum export_flag)
 {
     JSContext *ctx = s->ctx;
@@ -22093,14 +22005,14 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
     JSFunctionDef *method_fd, *ctor_fd;
     int class_name_var_idx, prop_type, ctor_cpool_offset;
     int class_flags = 0, i, define_class_offset;
-    BOOL is_static, is_private, is_strict_mode;
+    bool is_static, is_private, is_strict_mode;
     const uint8_t *class_start_ptr = s->token.ptr;
     const uint8_t *start_ptr;
     ClassFieldsDef class_fields[2];
 
     /* classes are parsed and executed in strict mode */
     is_strict_mode = fd->is_strict_mode;
-    fd->is_strict_mode = TRUE;
+    fd->is_strict_mode = true;
     if (next_token(s))
         goto fail;
     if (s->token.val == TOK_IDENT) {
@@ -22170,7 +22082,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
         ClassFieldsDef *cf = &class_fields[i];
         cf->fields_init_fd = NULL;
         cf->computed_fields_count = 0;
-        cf->need_brand = FALSE;
+        cf->need_brand = false;
         cf->is_static = i;
     }
 
@@ -22181,11 +22093,11 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
                 goto fail;
             continue;
         }
-        is_static = FALSE;
+        is_static = false;
         if (s->token.val == TOK_STATIC) {
-            int next = peek_token(s, TRUE);
+            int next = peek_token(s, true);
             if (!(next == ';' || next == '}' || next == '(' || next == '='))
-                is_static = TRUE;
+                is_static = true;
         }
         prop_type = -1;
         if (is_static) {
@@ -22233,7 +22145,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
             }
             /* allow "static" field name */
             if (s->token.val == ';' || s->token.val == '=') {
-                is_static = FALSE;
+                is_static = false;
                 name = JS_DupAtom(ctx, JS_ATOM_static);
                 prop_type = PROP_TYPE_IDENT;
             }
@@ -22242,7 +22154,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
             emit_op(s, OP_swap);
         start_ptr = s->token.ptr;
         if (prop_type < 0) {
-            prop_type = js_parse_property_name(s, &name, TRUE, FALSE, TRUE);
+            prop_type = js_parse_property_name(s, &name, true, false, true);
             if (prop_type < 0)
                 goto fail;
         }
@@ -22257,7 +22169,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
             goto fail;
         }
         if (prop_type == PROP_TYPE_GET || prop_type == PROP_TYPE_SET) {
-            BOOL is_set = prop_type - PROP_TYPE_GET;
+            bool is_set = prop_type - PROP_TYPE_GET;
             JSFunctionDef *method_fd;
 
             if (is_private) {
@@ -22280,7 +22192,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
                                                 JS_VAR_PRIVATE_GETTER + is_set, is_static) < 0)
                         goto fail;
                 }
-                class_fields[is_static].need_brand = TRUE;
+                class_fields[is_static].need_brand = true;
             }
 
             if (js_parse_function_decl2(s, JS_PARSE_FUNC_GETTER + is_set,
@@ -22291,7 +22203,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
                                         JS_PARSE_EXPORT_NONE, &method_fd))
                 goto fail;
             if (is_private) {
-                method_fd->need_home_object = TRUE; /* needed for brand check */
+                method_fd->need_home_object = true; /* needed for brand check */
                 emit_op(s, OP_set_home_object);
                 /* XXX: missing function name */
                 emit_op(s, OP_scope_put_var_init);
@@ -22437,7 +22349,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
                     func_type = JS_PARSE_FUNC_CLASS_CONSTRUCTOR;
             }
             if (is_private) {
-                class_fields[is_static].need_brand = TRUE;
+                class_fields[is_static].need_brand = true;
             }
             if (js_parse_function_decl2(s, func_type, func_kind, JS_ATOM_NULL,
                                         start_ptr,
@@ -22449,7 +22361,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
                 func_type == JS_PARSE_FUNC_CLASS_CONSTRUCTOR) {
                 ctor_fd = method_fd;
             } else if (is_private) {
-                method_fd->need_home_object = TRUE; /* needed for brand check */
+                method_fd->need_home_object = true; /* needed for brand check */
                 if (find_private_class_field(ctx, fd, name,
                                              fd->scope_level) >= 0) {
                 private_field_already_defined:
@@ -22613,7 +22525,7 @@ static __exception int js_parse_class(JSParseState *s, BOOL is_class_expr,
 static __exception int js_parse_array_literal(JSParseState *s)
 {
     uint32_t idx;
-    BOOL need_length;
+    bool need_length;
 
     if (next_token(s))
         return -1;
@@ -22637,17 +22549,17 @@ static __exception int js_parse_array_literal(JSParseState *s)
     emit_u16(s, idx);
 
     /* larger arrays and holes are handled with explicit indices */
-    need_length = FALSE;
+    need_length = false;
     while (s->token.val != ']' && idx < 0x7fffffff) {
         if (s->token.val == TOK_ELLIPSIS)
             break;
-        need_length = TRUE;
+        need_length = true;
         if (s->token.val != ',') {
             if (js_parse_assign_expr(s))
                 return -1;
             emit_op(s, OP_define_field);
             emit_u32(s, __JS_AtomFromUInt32(idx));
-            need_length = FALSE;
+            need_length = false;
         }
         idx++;
         /* accept trailing comma */
@@ -22665,7 +22577,6 @@ static __exception int js_parse_array_literal(JSParseState *s)
             emit_u32(s, idx);
             emit_op(s, OP_put_field);
             emit_atom(s, JS_ATOM_length);
-            emit_ic(s, JS_ATOM_length);
         }
         goto done;
     }
@@ -22683,13 +22594,13 @@ static __exception int js_parse_array_literal(JSParseState *s)
                 return -1;
             emit_op(s, OP_append);
         } else {
-            need_length = TRUE;
+            need_length = true;
             if (s->token.val != ',') {
                 if (js_parse_assign_expr(s))
                     return -1;
                 /* a idx val */
                 emit_op(s, OP_define_array_el);
-                need_length = FALSE;
+                need_length = false;
             }
             emit_op(s, OP_inc);
         }
@@ -22704,7 +22615,6 @@ static __exception int js_parse_array_literal(JSParseState *s)
         emit_op(s, OP_dup1);    /* array length - array array length */
         emit_op(s, OP_put_field);
         emit_atom(s, JS_ATOM_length);
-        emit_ic(s, JS_ATOM_length);
     } else {
         emit_op(s, OP_drop);    /* array length - array */
     }
@@ -22713,7 +22623,7 @@ done:
 }
 
 /* XXX: remove */
-static BOOL has_with_scope(JSFunctionDef *s, int scope_level)
+static bool has_with_scope(JSFunctionDef *s, int scope_level)
 {
     /* check if scope chain contains a with statement */
     while (s) {
@@ -22722,18 +22632,18 @@ static BOOL has_with_scope(JSFunctionDef *s, int scope_level)
             JSVarDef *vd = &s->vars[scope_idx];
 
             if (vd->var_name == JS_ATOM__with_)
-                return TRUE;
+                return true;
             scope_idx = vd->scope_next;
         }
         /* check parent scopes */
         scope_level = s->parent_scope_level;
         s = s->parent;
     }
-    return FALSE;
+    return false;
 }
 
 static __exception int get_lvalue(JSParseState *s, int *popcode, int *pscope,
-                                  JSAtom *pname, int *plabel, int *pdepth, BOOL keep,
+                                  JSAtom *pname, int *plabel, int *pdepth, bool keep,
                                   int tok)
 {
     JSFunctionDef *fd;
@@ -22805,7 +22715,6 @@ static __exception int get_lvalue(JSParseState *s, int *popcode, int *pscope,
         case OP_get_field:
             emit_op(s, OP_get_field2);
             emit_atom(s, name);
-            emit_ic(s, name);
             break;
         case OP_scope_get_private_field:
             emit_op(s, OP_scope_get_private_field2);
@@ -22870,7 +22779,7 @@ typedef enum {
    OP_scope_get_var which is never generated by get_lvalue(). */
 static void put_lvalue(JSParseState *s, int opcode, int scope,
                        JSAtom name, int label, PutLValueEnum special,
-                       BOOL is_let)
+                       bool is_let)
 {
     switch(opcode) {
     case OP_get_field:
@@ -22953,7 +22862,6 @@ static void put_lvalue(JSParseState *s, int opcode, int scope,
     case OP_get_field:
         emit_op(s, OP_put_field);
         emit_u32(s, name);  /* name has refcount */
-        emit_ic(s, name);
         break;
     case OP_scope_get_private_field:
         emit_op(s, OP_scope_put_private_field);
@@ -23082,7 +22990,7 @@ duplicate:
     return js_parse_error(s, "Duplicate parameter name not allowed in this context");
 }
 
-static JSAtom js_parse_destructuring_var(JSParseState *s, int tok, int is_arg)
+static JSAtom js_parse_destructuring_var(JSParseState *s, int tok, bool is_arg)
 {
     JSAtom name;
 
@@ -23106,21 +23014,23 @@ fail:
 
 /* Return -1 if error, 0 if no initializer, 1 if an initializer is
    present at the top level. */
-static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
-                                        int hasval, int has_ellipsis,
-                                        BOOL allow_initializer)
+static int js_parse_destructuring_element(JSParseState *s, int tok,
+                                          bool is_arg, bool hasval,
+                                          int has_ellipsis, // tri-state
+                                          bool allow_initializer,
+                                          bool export_flag)
 {
     int label_parse, label_assign, label_done, label_lvalue, depth_lvalue;
     int start_addr, assign_addr;
     JSAtom prop_name, var_name;
     int opcode, scope, tok1, skip_bits;
-    BOOL has_initializer;
+    bool has_initializer;
 
     label_lvalue = -1;
 
     if (has_ellipsis < 0) {
         /* pre-parse destructuration target for spread detection */
-        js_parse_skip_parens_token(s, &skip_bits, FALSE);
+        js_parse_skip_parens_token(s, &skip_bits, false);
         has_ellipsis = skip_bits & SKIP_HAS_ELLIPSIS;
     }
 
@@ -23174,7 +23084,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                         return -1;
 
                     if (get_lvalue(s, &opcode, &scope, &var_name,
-                                   &label_lvalue, &depth_lvalue, FALSE, '{'))
+                                   &label_lvalue, &depth_lvalue, false, '{'))
                         return -1;
                 }
                 if (s->token.val != '}') {
@@ -23186,7 +23096,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                 emit_u8(s, 0 | ((depth_lvalue + 1) << 2) | ((depth_lvalue + 2) << 5));
                 goto set_val;
             }
-            prop_type = js_parse_property_name(s, &prop_name, FALSE, TRUE, FALSE);
+            prop_type = js_parse_property_name(s, &prop_name, false, true, false);
             if (prop_type < 0)
                 return -1;
             var_name = JS_ATOM_NULL;
@@ -23198,7 +23108,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                 if (next_token(s))
                     goto prop_error;
                 if ((s->token.val == '[' || s->token.val == '{')
-                    &&  ((tok1 = js_parse_skip_parens_token(s, &skip_bits, FALSE)) == ',' ||
+                    &&  ((tok1 = js_parse_skip_parens_token(s, &skip_bits, false)) == ',' ||
                          tok1 == '=' || tok1 == '}')) {
                     if (prop_name == JS_ATOM_NULL) {
                         /* computed property name on stack */
@@ -23225,9 +23135,8 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                         /* get the named property from the source object */
                         emit_op(s, OP_get_field2);
                         emit_u32(s, prop_name);
-                        emit_ic(s, prop_name);
                     }
-                    if (js_parse_destructuring_element(s, tok, is_arg, TRUE, -1, TRUE) < 0)
+                    if (js_parse_destructuring_element(s, tok, is_arg, true, -1, true, export_flag) < 0)
                         return -1;
                     if (s->token.val == '}')
                         break;
@@ -23268,7 +23177,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                         goto prop_error;
                 lvalue:
                     if (get_lvalue(s, &opcode, &scope, &var_name,
-                                   &label_lvalue, &depth_lvalue, FALSE, '{'))
+                                   &label_lvalue, &depth_lvalue, false, '{'))
                         goto prop_error;
                     /* swap ref and lvalue object if any */
                     if (prop_name == JS_ATOM_NULL) {
@@ -23315,7 +23224,6 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                     /* source -- val */
                     emit_op(s, OP_get_field);
                     emit_u32(s, prop_name);
-                    emit_ic(s, prop_name);
                 }
             } else {
                 /* prop_type = PROP_TYPE_VAR, cannot be a computed property */
@@ -23347,12 +23255,16 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                 /* source -- source val */
                 emit_op(s, OP_get_field2);
                 emit_u32(s, prop_name);
-                emit_ic(s, prop_name);
             }
         set_val:
             if (tok) {
                 if (js_define_var(s, var_name, tok))
                     goto var_error;
+                if (export_flag) {
+                    if (!add_export_entry(s, s->cur_func->module, var_name, var_name,
+                                          JS_EXPORT_TYPE_LOCAL))
+                        goto var_error;
+                }
                 scope = s->cur_func->scope_level;
             }
             if (s->token.val == '=') {  /* handle optional default value */
@@ -23388,7 +23300,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
         if (next_token(s))
             return -1;
     } else if (s->token.val == '[') {
-        BOOL has_spread;
+        bool has_spread;
         int enum_depth;
         BlockEnv block_env;
 
@@ -23398,9 +23310,9 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
            'yield' triggers a 'return' */
         push_break_entry(s->cur_func, &block_env,
                          JS_ATOM_NULL, -1, -1, 2);
-        block_env.has_iterator = TRUE;
+        block_env.has_iterator = true;
         emit_op(s, OP_for_of_start);
-        has_spread = FALSE;
+        has_spread = false;
         while (s->token.val != ']') {
             /* get the next value */
             if (s->token.val == TOK_ELLIPSIS) {
@@ -23408,7 +23320,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                     return -1;
                 if (s->token.val == ',' || s->token.val == ']')
                     return js_parse_error(s, "missing binding pattern...");
-                has_spread = TRUE;
+                has_spread = true;
             }
             if (s->token.val == ',') {
                 /* do nothing, skip the value, has_spread is false */
@@ -23417,7 +23329,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                 emit_op(s, OP_drop);
                 emit_op(s, OP_drop);
             } else if ((s->token.val == '[' || s->token.val == '{')
-                   &&  ((tok1 = js_parse_skip_parens_token(s, &skip_bits, FALSE)) == ',' ||
+                   &&  ((tok1 = js_parse_skip_parens_token(s, &skip_bits, false)) == ',' ||
                         tok1 == '=' || tok1 == ']')) {
                 if (has_spread) {
                     if (tok1 == '=')
@@ -23428,7 +23340,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                     emit_u8(s, 0);
                     emit_op(s, OP_drop);
                 }
-                if (js_parse_destructuring_element(s, tok, is_arg, TRUE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE) < 0)
+                if (js_parse_destructuring_element(s, tok, is_arg, true, skip_bits & SKIP_HAS_ELLIPSIS, true, export_flag) < 0)
                     return -1;
             } else {
                 var_name = JS_ATOM_NULL;
@@ -23445,7 +23357,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
                     if (js_parse_left_hand_side_expr(s))
                         return -1;
                     if (get_lvalue(s, &opcode, &scope, &var_name,
-                                   &label_lvalue, &enum_depth, FALSE, '[')) {
+                                   &label_lvalue, &enum_depth, false, '[')) {
                         return -1;
                     }
                 }
@@ -23505,7 +23417,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
             return -1;
         emit_goto(s, OP_goto, label_assign);
         emit_label(s, label_done);
-        has_initializer = TRUE;
+        has_initializer = true;
     } else {
         /* normally hasval is true except if
            js_parse_skip_parens_token() was wrong in the parsing */
@@ -23518,7 +23430,7 @@ static int js_parse_destructuring_element(JSParseState *s, int tok, int is_arg,
         memset(s->cur_func->byte_code.buf + start_addr, OP_nop,
                assign_addr - start_addr);
         s->cur_func->label_slots[label_parse].ref_count--;
-        has_initializer = FALSE;
+        has_initializer = false;
     }
     return has_initializer;
 
@@ -23558,7 +23470,7 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
 {
     FuncCallType call_type;
     int optional_chaining_label;
-    BOOL accept_lparen = (parse_flags & PF_POSTFIX_CALL) != 0;
+    bool accept_lparen = (parse_flags & PF_POSTFIX_CALL) != 0;
 
     call_type = FUNC_CALL_NORMAL;
     switch(s->token.val) {
@@ -23643,7 +23555,7 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
             return -1;
         break;
     case TOK_CLASS:
-        if (js_parse_class(s, TRUE, JS_PARSE_EXPORT_NONE))
+        if (js_parse_class(s, true, JS_PARSE_EXPORT_NONE))
             return -1;
         break;
     case TOK_NULL:
@@ -23675,7 +23587,7 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
                 return js_parse_error_reserved_identifier(s);
             }
             if (token_is_pseudo_keyword(s, JS_ATOM_async) &&
-                peek_token(s, TRUE) != '\n') {
+                peek_token(s, true) != '\n') {
                 const uint8_t *source_ptr;
                 int source_line_num;
                 int source_col_num;
@@ -23718,8 +23630,8 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
     case '[':
         {
             int skip_bits;
-            if (js_parse_skip_parens_token(s, &skip_bits, FALSE) == '=') {
-                if (js_parse_destructuring_element(s, 0, 0, FALSE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE) < 0)
+            if (js_parse_skip_parens_token(s, &skip_bits, false) == '=') {
+                if (js_parse_destructuring_element(s, 0, false, false, skip_bits & SKIP_HAS_ELLIPSIS, true, false) < 0)
                     return -1;
             } else {
                 if (s->token.val == '{') {
@@ -23751,7 +23663,7 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
             emit_source_loc(s);
             if (js_parse_postfix_expr(s, 0))
                 return -1;
-            accept_lparen = TRUE;
+            accept_lparen = true;
             if (s->token.val != '(') {
                 /* new operator on an object */
                 emit_op(s, OP_dup);
@@ -23817,13 +23729,13 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
     optional_chaining_label = -1;
     for(;;) {
         JSFunctionDef *fd = s->cur_func;
-        BOOL has_optional_chain = FALSE;
+        bool has_optional_chain = false;
 
         if (s->token.val == TOK_QUESTION_MARK_DOT) {
             /* optional chaining */
             if (next_token(s))
                 return -1;
-            has_optional_chain = TRUE;
+            has_optional_chain = true;
             if (s->token.val == '(' && accept_lparen) {
                 goto parse_func_call;
             } else if (s->token.val == '[') {
@@ -24031,7 +23943,7 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
                 case OP_eval:
                     emit_op(s, OP_apply_eval);
                     emit_u16(s, fd->scope_level);
-                    fd->has_eval_call = TRUE;
+                    fd->has_eval_call = true;
                     break;
                 default:
                     if (call_type == FUNC_CALL_SUPER_CTOR) {
@@ -24074,7 +23986,7 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
                     emit_op(s, OP_eval);
                     emit_u16(s, arg_count);
                     emit_u16(s, fd->scope_level);
-                    fd->has_eval_call = TRUE;
+                    fd->has_eval_call = true;
                     break;
                 default:
                     if (call_type == FUNC_CALL_SUPER_CTOR) {
@@ -24133,7 +24045,6 @@ static __exception int js_parse_postfix_expr(JSParseState *s, int parse_flags)
                     }
                     emit_op(s, OP_get_field);
                     emit_atom(s, s->token.u.ident.atom);
-                    emit_ic(s, s->token.u.ident.atom);
                 }
             }
             if (next_token(s))
@@ -24321,11 +24232,11 @@ static __exception int js_parse_unary(JSParseState *s, int parse_flags)
                 return -1;
             if (js_parse_unary(s, 0))
                 return -1;
-            if (get_lvalue(s, &opcode, &scope, &name, &label, NULL, TRUE, op))
+            if (get_lvalue(s, &opcode, &scope, &name, &label, NULL, true, op))
                 return -1;
             emit_op(s, OP_dec + op - TOK_DEC);
             put_lvalue(s, opcode, scope, name, label, PUT_LVALUE_KEEP_TOP,
-                       FALSE);
+                       false);
         }
         break;
     case TOK_TYPEOF:
@@ -24359,7 +24270,7 @@ static __exception int js_parse_unary(JSParseState *s, int parse_flags)
             return -1;
         if (js_parse_unary(s, PF_POW_FORBIDDEN))
             return -1;
-        s->cur_func->has_await = TRUE;
+        s->cur_func->has_await = true;
         emit_op(s, OP_await);
         parse_flags = 0;
         break;
@@ -24371,11 +24282,11 @@ static __exception int js_parse_unary(JSParseState *s, int parse_flags)
             int opcode, op, scope, label;
             JSAtom name;
             op = s->token.val;
-            if (get_lvalue(s, &opcode, &scope, &name, &label, NULL, TRUE, op))
+            if (get_lvalue(s, &opcode, &scope, &name, &label, NULL, true, op))
                 return -1;
             emit_op(s, OP_post_dec + op - TOK_DEC);
             put_lvalue(s, opcode, scope, name, label, PUT_LVALUE_KEEP_SECOND,
-                       FALSE);
+                       false);
             if (next_token(s))
                 return -1;
         }
@@ -24410,7 +24321,7 @@ static __exception int js_parse_expr_binary(JSParseState *s, int level,
         return js_parse_unary(s, PF_POW_ALLOWED);
     } else if (s->token.val == TOK_PRIVATE_NAME &&
                (parse_flags & PF_IN_ACCEPTED) && level == 4 &&
-               peek_token(s, FALSE) == TOK_IN) {
+               peek_token(s, false) == TOK_IN) {
         JSAtom atom;
         atom = JS_DupAtom(s->ctx, s->token.u.ident.atom);
         if (next_token(s))
@@ -24556,6 +24467,7 @@ static __exception int js_parse_expr_binary(JSParseState *s, int level,
         }
         if (next_token(s))
             return -1;
+        emit_source_loc(s);
         if (js_parse_expr_binary(s, level - 1, parse_flags))
             return -1;
         emit_op(s, opcode);
@@ -24669,7 +24581,7 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
     JSAtom name;
 
     if (s->token.val == TOK_YIELD) {
-        BOOL is_star = FALSE, is_async;
+        bool is_star = false, is_async;
 
         if (!(s->cur_func->func_kind & JS_FUNC_GENERATOR))
             return js_parse_error(s, "unexpected 'yield' keyword");
@@ -24683,7 +24595,7 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
             s->token.val != ']' && s->token.val != '}' &&
             s->token.val != ',' && s->token.val != ':' && !s->got_lf) {
             if (s->token.val == '*') {
-                is_star = TRUE;
+                is_star = true;
                 if (next_token(s))
                     return -1;
             }
@@ -24718,14 +24630,12 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
             emit_op(s, OP_iterator_check_object);
             emit_op(s, OP_get_field2);
             emit_atom(s, JS_ATOM_done);
-            emit_ic(s, JS_ATOM_done);
             label_next = emit_goto(s, OP_if_true, -1); /* end of loop */
             emit_label(s, label_yield);
             if (is_async) {
                 /* OP_async_yield_star takes the value as parameter */
                 emit_op(s, OP_get_field);
                 emit_atom(s, JS_ATOM_value);
-                emit_ic(s, JS_ATOM_value);
                 emit_op(s, OP_async_yield_star);
             } else {
                 /* OP_yield_star takes (value, done) as parameter */
@@ -24753,18 +24663,16 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
             emit_op(s, OP_iterator_check_object);
             emit_op(s, OP_get_field2);
             emit_atom(s, JS_ATOM_done);
-            emit_ic(s, JS_ATOM_done);
             emit_goto(s, OP_if_false, label_yield);
 
             emit_op(s, OP_get_field);
             emit_atom(s, JS_ATOM_value);
-            emit_ic(s, JS_ATOM_value);
 
             emit_label(s, label_return1);
             emit_op(s, OP_nip);
             emit_op(s, OP_nip);
             emit_op(s, OP_nip);
-            emit_return(s, TRUE);
+            emit_return(s, true);
 
             /* throw handling */
             emit_label(s, label_throw);
@@ -24776,7 +24684,6 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
             emit_op(s, OP_iterator_check_object);
             emit_op(s, OP_get_field2);
             emit_atom(s, JS_ATOM_done);
-            emit_ic(s, JS_ATOM_done);
             emit_goto(s, OP_if_false, label_yield);
             emit_goto(s, OP_goto, label_next);
             /* close the iterator and throw a type error exception */
@@ -24795,7 +24702,6 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
             emit_label(s, label_next);
             emit_op(s, OP_get_field);
             emit_atom(s, JS_ATOM_value);
-            emit_ic(s, JS_ATOM_value);
             emit_op(s, OP_nip); /* keep the value associated with
                                    done = true */
             emit_op(s, OP_nip);
@@ -24807,12 +24713,12 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
                 emit_op(s, OP_await);
             emit_op(s, OP_yield);
             label_next = emit_goto(s, OP_if_false, -1);
-            emit_return(s, TRUE);
+            emit_return(s, true);
             emit_label(s, label_next);
         }
         return 0;
     } else if (s->token.val == '(' &&
-               js_parse_skip_parens_token(s, NULL, TRUE) == TOK_ARROW) {
+               js_parse_skip_parens_token(s, NULL, true) == TOK_ARROW) {
         return js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
                                       JS_FUNC_NORMAL, JS_ATOM_NULL,
                                       s->token.ptr, s->token.line_num,
@@ -24823,7 +24729,7 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
         JSParsePos pos;
 
         /* fast test */
-        tok = peek_token(s, TRUE);
+        tok = peek_token(s, true);
         if (tok == TOK_FUNCTION || tok == '\n')
             goto next;
 
@@ -24834,9 +24740,9 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
         if (next_token(s))
             return -1;
         if ((s->token.val == '(' &&
-             js_parse_skip_parens_token(s, NULL, TRUE) == TOK_ARROW) ||
+             js_parse_skip_parens_token(s, NULL, true) == TOK_ARROW) ||
             (s->token.val == TOK_IDENT && !s->token.u.ident.is_reserved &&
-             peek_token(s, TRUE) == TOK_ARROW)) {
+             peek_token(s, true) == TOK_ARROW)) {
             return js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
                                           JS_FUNC_ASYNC, JS_ATOM_NULL,
                                           source_ptr, source_line_num,
@@ -24847,7 +24753,7 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
                 return -1;
         }
     } else if (s->token.val == TOK_IDENT &&
-               peek_token(s, TRUE) == TOK_ARROW) {
+               peek_token(s, true) == TOK_ARROW) {
         return js_parse_function_decl(s, JS_PARSE_FUNC_ARROW,
                                       JS_FUNC_NORMAL, JS_ATOM_NULL,
                                       s->token.ptr, s->token.line_num,
@@ -24910,14 +24816,14 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
         } else {
             emit_op(s, op - TOK_MUL_ASSIGN + OP_mul);
         }
-        put_lvalue(s, opcode, scope, name, label, PUT_LVALUE_KEEP_TOP, FALSE);
+        put_lvalue(s, opcode, scope, name, label, PUT_LVALUE_KEEP_TOP, false);
     } else if (op >= TOK_LAND_ASSIGN && op <= TOK_DOUBLE_QUESTION_MARK_ASSIGN) {
         int label, label1, depth_lvalue, label2;
 
         if (next_token(s))
             return -1;
         if (get_lvalue(s, &opcode, &scope, &name, &label,
-                       &depth_lvalue, TRUE, op) < 0)
+                       &depth_lvalue, true, op) < 0)
             return -1;
 
         emit_op(s, OP_dup);
@@ -24953,7 +24859,7 @@ static __exception int js_parse_assign_expr2(JSParseState *s, int parse_flags)
         /* XXX: we disable the OP_put_ref_value optimization by not
            using put_lvalue() otherwise depth_lvalue is not correct */
         put_lvalue(s, opcode, scope, name, label, PUT_LVALUE_NOKEEP_DEPTH,
-                   FALSE);
+                   false);
         label2 = emit_goto(s, OP_goto, -1);
 
         emit_label(s, label1);
@@ -24977,7 +24883,7 @@ static __exception int js_parse_assign_expr(JSParseState *s)
 /* allowed parse_flags: PF_IN_ACCEPTED */
 static __exception int js_parse_expr2(JSParseState *s, int parse_flags)
 {
-    BOOL comma = FALSE;
+    bool comma = false;
     for(;;) {
         if (js_parse_assign_expr2(s, parse_flags))
             return -1;
@@ -24991,7 +24897,7 @@ static __exception int js_parse_expr2(JSParseState *s, int parse_flags)
         }
         if (s->token.val != ',')
             break;
-        comma = TRUE;
+        comma = true;
         if (next_token(s))
             return -1;
         emit_op(s, OP_drop);
@@ -25017,8 +24923,8 @@ static void push_break_entry(JSFunctionDef *fd, BlockEnv *be,
     be->drop_count = drop_count;
     be->label_finally = -1;
     be->scope_level = fd->scope_level;
-    be->has_iterator = FALSE;
-    be->is_regular_stmt = FALSE;
+    be->has_iterator = false;
+    be->is_regular_stmt = false;
 }
 
 static void pop_break_entry(JSFunctionDef *fd)
@@ -25078,7 +24984,7 @@ static __exception int emit_break(JSParseState *s, JSAtom name, int is_cont)
 }
 
 /* execute the finally blocks before return */
-static void emit_return(JSParseState *s, BOOL hasval)
+static void emit_return(JSParseState *s, bool hasval)
 {
     BlockEnv *top;
 
@@ -25086,7 +24992,7 @@ static void emit_return(JSParseState *s, BOOL hasval)
         if (!hasval) {
             /* no value: direct return in case of async generator */
             emit_op(s, OP_undefined);
-            hasval = TRUE;
+            hasval = true;
         } else if (s->cur_func->func_kind == JS_FUNC_ASYNC_GENERATOR) {
             /* the await must be done before handling the "finally" in
                case it raises an exception */
@@ -25099,7 +25005,7 @@ static void emit_return(JSParseState *s, BOOL hasval)
         if (top->has_iterator || top->label_finally != -1) {
             if (!hasval) {
                 emit_op(s, OP_undefined);
-                hasval = TRUE;
+                hasval = true;
             }
             /* Remove the stack elements up to and including the catch
                offset. When 'yield' is used in an expression we have
@@ -25114,7 +25020,6 @@ static void emit_return(JSParseState *s, BOOL hasval)
                     emit_op(s, OP_swap);
                     emit_op(s, OP_get_field2);
                     emit_atom(s, JS_ATOM_return);
-                    emit_ic(s, JS_ATOM_return);
                     /* stack: iter_obj return_func */
                     emit_op(s, OP_dup);
                     emit_op(s, OP_is_undefined_or_null);
@@ -25203,7 +25108,7 @@ static __exception int js_parse_block(JSParseState *s)
 
 /* allowed parse_flags: PF_IN_ACCEPTED */
 static __exception int js_parse_var(JSParseState *s, int parse_flags, int tok,
-                                    BOOL export_flag)
+                                    bool export_flag)
 {
     JSContext *ctx = s->ctx;
     JSFunctionDef *fd = s->cur_func;
@@ -25240,7 +25145,7 @@ static __exception int js_parse_var(JSParseState *s, int parse_flags, int tok,
                     emit_op(s, OP_scope_get_var);
                     emit_atom(s, name);
                     emit_u16(s, fd->scope_level);
-                    if (get_lvalue(s, &opcode, &scope, &name1, &label, NULL, FALSE, '=') < 0)
+                    if (get_lvalue(s, &opcode, &scope, &name1, &label, NULL, false, '=') < 0)
                         goto var_error;
                     if (js_parse_assign_expr2(s, parse_flags)) {
                         JS_FreeAtom(ctx, name1);
@@ -25248,7 +25153,7 @@ static __exception int js_parse_var(JSParseState *s, int parse_flags, int tok,
                     }
                     set_object_name(s, name);
                     put_lvalue(s, opcode, scope, name1, label,
-                               PUT_LVALUE_NOKEEP, FALSE);
+                               PUT_LVALUE_NOKEEP, false);
                 } else {
                     if (js_parse_assign_expr2(s, parse_flags))
                         goto var_error;
@@ -25275,9 +25180,9 @@ static __exception int js_parse_var(JSParseState *s, int parse_flags, int tok,
         } else {
             int skip_bits;
             if ((s->token.val == '[' || s->token.val == '{')
-            &&  js_parse_skip_parens_token(s, &skip_bits, FALSE) == '=') {
+            &&  js_parse_skip_parens_token(s, &skip_bits, false) == '=') {
                 emit_op(s, OP_undefined);
-                if (js_parse_destructuring_element(s, tok, 0, TRUE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE) < 0)
+                if (js_parse_destructuring_element(s, tok, false, true, skip_bits & SKIP_HAS_ELLIPSIS, true, export_flag) < 0)
                     return -1;
             } else {
                 return js_parse_error(s, "variable name expected");
@@ -25296,16 +25201,16 @@ static __exception int js_parse_var(JSParseState *s, int parse_flags, int tok,
 }
 
 /* test if the current token is a label. Use simplistic look-ahead scanner */
-static BOOL is_label(JSParseState *s)
+static bool is_label(JSParseState *s)
 {
     return (s->token.val == TOK_IDENT && !s->token.u.ident.is_reserved &&
-            peek_token(s, FALSE) == ':');
+            peek_token(s, false) == ':');
 }
 
 /* test if the current token is a let keyword. Use simplistic look-ahead scanner */
 static int is_let(JSParseState *s, int decl_mask)
 {
-    int res = FALSE;
+    int res = false;
 
     if (token_is_pseudo_keyword(s, JS_ATOM_let)) {
         JSParsePos pos;
@@ -25318,7 +25223,7 @@ static int is_let(JSParseState *s, int decl_mask)
             if (s->token.val == '[') {
                 /* let [ is a syntax restriction:
                    it never introduces an ExpressionStatement */
-                res = TRUE;
+                res = true;
                 break;
             }
             if (s->token.val == '{' ||
@@ -25330,7 +25235,7 @@ static int is_let(JSParseState *s, int decl_mask)
                 /* XXX: should also check that `{` introduces a BindingPattern,
                    but Firefox does not and rejects eval("let=1;let\n{if(1)2;}") */
                 if (s->last_line_num == s->token.line_num || (decl_mask & DECL_MASK_OTHER)) {
-                    res = TRUE;
+                    res = true;
                     break;
                 }
                 break;
@@ -25347,20 +25252,20 @@ static int is_let(JSParseState *s, int decl_mask)
 /* XXX: handle IteratorClose when exiting the loop before the
    enumeration is done */
 static __exception int js_parse_for_in_of(JSParseState *s, int label_name,
-                                          BOOL is_async)
+                                          bool is_async)
 {
     JSContext *ctx = s->ctx;
     JSFunctionDef *fd = s->cur_func;
     JSAtom var_name;
-    BOOL has_initializer, is_for_of, has_destructuring;
+    bool has_initializer, is_for_of, has_destructuring;
     int tok, tok1, opcode, scope, block_scope_level;
     int label_next, label_expr, label_cont, label_body, label_break;
     int pos_next, pos_expr;
     BlockEnv break_entry;
 
-    has_initializer = FALSE;
-    has_destructuring = FALSE;
-    is_for_of = FALSE;
+    has_initializer = false;
+    has_destructuring = false;
+    is_for_of = false;
     block_scope_level = fd->scope_level;
     label_cont = new_label(s);
     label_body = new_label(s);
@@ -25385,10 +25290,10 @@ static __exception int js_parse_for_in_of(JSParseState *s, int label_name,
 
     tok = s->token.val;
     switch (is_let(s, DECL_MASK_OTHER)) {
-    case TRUE:
+    case true:
         tok = TOK_LET;
         break;
-    case FALSE:
+    case false:
         break;
     default:
         return -1;
@@ -25399,9 +25304,9 @@ static __exception int js_parse_for_in_of(JSParseState *s, int label_name,
 
         if (!(s->token.val == TOK_IDENT && !s->token.u.ident.is_reserved)) {
             if (s->token.val == '[' || s->token.val == '{') {
-                if (js_parse_destructuring_element(s, tok, 0, TRUE, -1, FALSE) < 0)
+                if (js_parse_destructuring_element(s, tok, false, true, -1, false, false) < 0)
                     return -1;
-                has_destructuring = TRUE;
+                has_destructuring = true;
             } else {
                 return js_parse_error(s, "variable name expected");
             }
@@ -25421,23 +25326,23 @@ static __exception int js_parse_for_in_of(JSParseState *s, int label_name,
             emit_atom(s, var_name);
             emit_u16(s, fd->scope_level);
         }
-    } else if (!is_async && token_is_pseudo_keyword(s, JS_ATOM_async) && peek_token(s, FALSE) == TOK_OF) {
+    } else if (!is_async && token_is_pseudo_keyword(s, JS_ATOM_async) && peek_token(s, false) == TOK_OF) {
         return js_parse_error(s, "'for of' expression cannot start with 'async'");
     } else {
         int skip_bits;
         if ((s->token.val == '[' || s->token.val == '{')
-        &&  ((tok1 = js_parse_skip_parens_token(s, &skip_bits, FALSE)) == TOK_IN || tok1 == TOK_OF)) {
-            if (js_parse_destructuring_element(s, 0, 0, TRUE, skip_bits & SKIP_HAS_ELLIPSIS, TRUE) < 0)
+        &&  ((tok1 = js_parse_skip_parens_token(s, &skip_bits, false)) == TOK_IN || tok1 == TOK_OF)) {
+            if (js_parse_destructuring_element(s, 0, false, true, skip_bits & SKIP_HAS_ELLIPSIS, true, false) < 0)
                 return -1;
         } else {
             int lvalue_label;
             if (js_parse_left_hand_side_expr(s))
                 return -1;
             if (get_lvalue(s, &opcode, &scope, &var_name, &lvalue_label,
-                           NULL, FALSE, TOK_FOR))
+                           NULL, false, TOK_FOR))
                 return -1;
             put_lvalue(s, opcode, scope, var_name, lvalue_label,
-                       PUT_LVALUE_NOKEEP_BOTTOM, FALSE);
+                       PUT_LVALUE_NOKEEP_BOTTOM, false);
         }
         var_name = JS_ATOM_NULL;
     }
@@ -25447,7 +25352,7 @@ static __exception int js_parse_for_in_of(JSParseState *s, int label_name,
     emit_label(s, label_expr);
     if (s->token.val == '=') {
         /* XXX: potential scoping issue if inside `with` statement */
-        has_initializer = TRUE;
+        has_initializer = true;
         /* parse and evaluate initializer prior to evaluating the
            object (only used with "for in" with a non lexical variable
            in non strict mode */
@@ -25464,8 +25369,8 @@ static __exception int js_parse_for_in_of(JSParseState *s, int label_name,
     JS_FreeAtom(ctx, var_name);
 
     if (token_is_pseudo_keyword(s, JS_ATOM_of)) {
-        is_for_of = TRUE;
-        break_entry.has_iterator = TRUE;
+        is_for_of = true;
+        break_entry.has_iterator = true;
         break_entry.drop_count += 2;
         if (has_initializer)
             goto initializer_error;
@@ -25649,9 +25554,9 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
         if (s->token.val != ';' && s->token.val != '}' && !s->got_lf) {
             if (js_parse_expr(s))
                 goto fail;
-            emit_return(s, TRUE);
+            emit_return(s, true);
         } else {
-            emit_return(s, FALSE);
+            emit_return(s, false);
         }
         if (js_parse_expect_semi(s))
             goto fail;
@@ -25663,6 +25568,7 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
             js_parse_error(s, "line terminator not allowed after throw");
             goto fail;
         }
+        emit_source_loc(s);
         if (js_parse_expr(s))
             goto fail;
         emit_op(s, OP_throw);
@@ -25680,7 +25586,7 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
     case TOK_VAR:
         if (next_token(s))
             goto fail;
-        if (js_parse_var(s, TRUE, tok, FALSE))
+        if (js_parse_var(s, PF_IN_ACCEPTED, tok, /*export_flag*/false))
             goto fail;
         if (js_parse_expect_semi(s))
             goto fail;
@@ -25794,25 +25700,25 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
             int pos_cont, pos_body, block_scope_level;
             BlockEnv break_entry;
             int tok, bits;
-            BOOL is_async;
+            bool is_async;
 
             if (next_token(s))
                 goto fail;
 
             set_eval_ret_undefined(s);
             bits = 0;
-            is_async = FALSE;
+            is_async = false;
             if (s->token.val == '(') {
-                js_parse_skip_parens_token(s, &bits, FALSE);
+                js_parse_skip_parens_token(s, &bits, false);
             } else if (s->token.val == TOK_AWAIT) {
                 if (!(s->cur_func->func_kind & JS_FUNC_ASYNC)) {
                     js_parse_error(s, "for await is only valid in asynchronous functions");
                     goto fail;
                 }
-                is_async = TRUE;
+                is_async = true;
                 if (next_token(s))
                     goto fail;
-                s->cur_func->has_await = TRUE;
+                s->cur_func->has_await = true;
             }
             if (js_parse_expect(s, '('))
                 goto fail;
@@ -25832,10 +25738,10 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
             tok = s->token.val;
             if (tok != ';') {
                 switch (is_let(s, DECL_MASK_OTHER)) {
-                case TRUE:
+                case true:
                     tok = TOK_LET;
                     break;
-                case FALSE:
+                case false:
                     break;
                 default:
                     goto fail;
@@ -25843,10 +25749,10 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
                 if (tok == TOK_VAR || tok == TOK_LET || tok == TOK_CONST) {
                     if (next_token(s))
                         goto fail;
-                    if (js_parse_var(s, FALSE, tok, FALSE))
+                    if (js_parse_var(s, 0, tok, /*export_flag*/false))
                         goto fail;
                 } else {
-                    if (js_parse_expr2(s, FALSE))
+                    if (js_parse_expr2(s, false))
                         goto fail;
                     emit_op(s, OP_drop);
                 }
@@ -26105,7 +26011,7 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
                     if (!(s->token.val == TOK_IDENT && !s->token.u.ident.is_reserved)) {
                         if (s->token.val == '[' || s->token.val == '{') {
                             /* XXX: TOK_LET is not completely correct */
-                            if (js_parse_destructuring_element(s, TOK_LET, 0, TRUE, -1, TRUE) < 0)
+                            if (js_parse_destructuring_element(s, TOK_LET, false, true, -1, true, false) < 0)
                                 goto fail;
                         } else {
                             js_parse_error(s, "identifier expected");
@@ -26247,7 +26153,7 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
         /* ES6 Annex B.3.2 and B.3.3 semantics */
         if (!(decl_mask & DECL_MASK_FUNC))
             goto func_decl_error;
-        if (!(decl_mask & DECL_MASK_OTHER) && peek_token(s, FALSE) == '*')
+        if (!(decl_mask & DECL_MASK_OTHER) && peek_token(s, false) == '*')
             goto func_decl_error;
         goto parse_func_var;
     case TOK_IDENT:
@@ -26257,16 +26163,16 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
         }
         /* Determine if `let` introduces a Declaration or an ExpressionStatement */
         switch (is_let(s, decl_mask)) {
-        case TRUE:
+        case true:
             tok = TOK_LET;
             goto haslet;
-        case FALSE:
+        case false:
             break;
         default:
             goto fail;
         }
         if (token_is_pseudo_keyword(s, JS_ATOM_async) &&
-            peek_token(s, TRUE) == TOK_FUNCTION) {
+            peek_token(s, true) == TOK_FUNCTION) {
             if (!(decl_mask & DECL_MASK_OTHER)) {
             func_decl_error:
                 js_parse_error(s, "function declarations can't appear in single-statement context");
@@ -26288,7 +26194,7 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
             js_parse_error(s, "class declarations can't appear in single-statement context");
             goto fail;
         }
-        if (js_parse_class(s, FALSE, JS_PARSE_EXPORT_NONE))
+        if (js_parse_class(s, false, JS_PARSE_EXPORT_NONE))
             return -1;
         break;
 
@@ -26927,7 +26833,7 @@ static int find_exported_name(GetExportNamesState *s, JSAtom name)
 
 static __exception int get_exported_names(JSContext *ctx,
                                           GetExportNamesState *s,
-                                          JSModuleDef *m, BOOL from_star)
+                                          JSModuleDef *m, bool from_star)
 {
     ExportedNameEntry *en;
     int i, j;
@@ -26968,14 +26874,14 @@ static __exception int get_exported_names(JSContext *ctx,
         JSStarExportEntry *se = &m->star_export_entries[i];
         JSModuleDef *m1;
         m1 = m->req_module_entries[se->req_module_idx].module;
-        if (get_exported_names(ctx, s, m1, TRUE))
+        if (get_exported_names(ctx, s, m1, true))
             return -1;
     }
     return 0;
 }
 
 /* Unfortunately, the spec gives a different behavior from GetOwnProperty ! */
-static int js_module_ns_has(JSContext *ctx, JSValue obj, JSAtom atom)
+static int js_module_ns_has(JSContext *ctx, JSValueConst obj, JSAtom atom)
 {
     return (find_own_property1(JS_VALUE_GET_OBJ(obj), atom) != NULL);
 }
@@ -26999,7 +26905,7 @@ static int exported_names_cmp(const void *p1, const void *p2, void *opaque)
         /* XXX: raise an error ? */
         ret = 0;
     } else {
-        ret = js_string_compare(ctx, JS_VALUE_GET_STRING(str1),
+        ret = js_string_compare(JS_VALUE_GET_STRING(str1),
                                 JS_VALUE_GET_STRING(str2));
     }
     JS_FreeValue(ctx, str1);
@@ -27028,7 +26934,7 @@ static JSValue js_build_module_ns(JSContext *ctx, JSModuleDef *m)
     p = JS_VALUE_GET_OBJ(obj);
 
     memset(s, 0, sizeof(*s));
-    ret = get_exported_names(ctx, s, m, FALSE);
+    ret = get_exported_names(ctx, s, m, false);
     js_free(ctx, s->modules);
     if (ret)
         goto fail;
@@ -27114,7 +27020,7 @@ static JSValue js_build_module_ns(JSContext *ctx, JSModuleDef *m)
                            JS_AtomToString(ctx, JS_ATOM_Module),
                            0);
 
-    p->extensible = FALSE;
+    p->extensible = false;
     return obj;
  fail:
     js_free(ctx, s->exported_names);
@@ -27134,10 +27040,10 @@ JSValue JS_GetModuleNamespace(JSContext *ctx, JSModuleDef *m)
     return js_dup(m->module_ns);
 }
 
-#ifdef DUMP_MODULE_RESOLVE
+#ifdef ENABLE_DUMPS // JS_DUMP_MODULE_RESOLVE
 #define module_trace(ctx, ...) \
    do { \
-     if (check_dump_flag(ctx->rt, DUMP_MODULE_RESOLVE)) \
+     if (check_dump_flag(ctx->rt, JS_DUMP_MODULE_RESOLVE)) \
        printf(__VA_ARGS__); \
    } while (0)
 #else
@@ -27152,13 +27058,13 @@ static int js_resolve_module(JSContext *ctx, JSModuleDef *m)
 
     if (m->resolved)
         return 0;
-#ifdef DUMP_MODULE_RESOLVE
-    if (check_dump_flag(ctx->rt, DUMP_MODULE_RESOLVE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_MODULE_RESOLVE
+    if (check_dump_flag(ctx->rt, JS_DUMP_MODULE_RESOLVE)) {
         char buf1[ATOM_GET_STR_BUF_SIZE];
         printf("resolving module '%s':\n", JS_AtomGetStr(ctx, buf1, sizeof(buf1), m->module_name));
     }
 #endif
-    m->resolved = TRUE;
+    m->resolved = true;
     /* resolve each requested module */
     for(i = 0; i < m->req_module_entries_count; i++) {
         JSReqModuleEntry *rme = &m->req_module_entries[i];
@@ -27175,7 +27081,7 @@ static int js_resolve_module(JSContext *ctx, JSModuleDef *m)
     return 0;
 }
 
-static JSVarRef *js_create_module_var(JSContext *ctx, BOOL is_lexical)
+static JSVarRef *js_create_module_var(JSContext *ctx, bool is_lexical)
 {
     JSVarRef *var_ref;
     var_ref = js_malloc(ctx, sizeof(JSVarRef));
@@ -27187,7 +27093,7 @@ static JSVarRef *js_create_module_var(JSContext *ctx, BOOL is_lexical)
     else
         var_ref->value = JS_UNDEFINED;
     var_ref->pvalue = &var_ref->value;
-    var_ref->is_detached = TRUE;
+    var_ref->is_detached = true;
     add_gc_object(ctx->rt, &var_ref->header, JS_GC_OBJ_TYPE_VAR_REF);
     return var_ref;
 }
@@ -27230,7 +27136,7 @@ static int js_create_module_bytecode_function(JSContext *ctx, JSModuleDef *m)
                 if (!var_ref)
                     goto fail;
 
-                module_trace(ctx, "local %d: %p\n", i, var_ref);
+                module_trace(ctx, "local %d: %p\n", i, (void *)var_ref);
 
                 var_refs[i] = var_ref;
             }
@@ -27247,7 +27153,7 @@ static int js_create_module_bytecode_function(JSContext *ctx, JSModuleDef *m)
 /* must be done before js_link_module() because of cyclic references */
 static int js_create_module_function(JSContext *ctx, JSModuleDef *m)
 {
-    BOOL is_c_module;
+    bool is_c_module;
     int i;
     JSVarRef *var_ref;
 
@@ -27261,7 +27167,7 @@ static int js_create_module_function(JSContext *ctx, JSModuleDef *m)
         for(i = 0; i < m->export_entries_count; i++) {
             JSExportEntry *me = &m->export_entries[i];
             if (me->export_type == JS_EXPORT_TYPE_LOCAL) {
-                var_ref = js_create_module_var(ctx, FALSE);
+                var_ref = js_create_module_var(ctx, false);
                 if (!var_ref)
                     return -1;
                 me->u.local.var_ref = var_ref;
@@ -27271,7 +27177,7 @@ static int js_create_module_function(JSContext *ctx, JSModuleDef *m)
         if (js_create_module_bytecode_function(ctx, m))
             return -1;
     }
-    m->func_created = TRUE;
+    m->func_created = true;
 
     /* do it on the dependencies */
 
@@ -27295,7 +27201,7 @@ static int js_inner_module_linking(JSContext *ctx, JSModuleDef *m,
     JSModuleDef *m1;
     JSVarRef **var_refs, *var_ref;
     JSObject *p;
-    BOOL is_c_module;
+    bool is_c_module;
     JSValue ret_val;
 
     if (js_check_stack_overflow(ctx->rt, 0)) {
@@ -27303,8 +27209,8 @@ static int js_inner_module_linking(JSContext *ctx, JSModuleDef *m,
         return -1;
     }
 
-#ifdef DUMP_MODULE_RESOLVE
-    if (check_dump_flag(ctx->rt, DUMP_MODULE_RESOLVE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_MODULE_RESOLVE
+    if (check_dump_flag(ctx->rt, JS_DUMP_MODULE_RESOLVE)) {
         char buf1[ATOM_GET_STR_BUF_SIZE];
         printf("js_inner_module_linking '%s':\n", JS_AtomGetStr(ctx, buf1, sizeof(buf1), m->module_name));
     }
@@ -27341,8 +27247,8 @@ static int js_inner_module_linking(JSContext *ctx, JSModuleDef *m,
         }
     }
 
-#ifdef DUMP_MODULE_RESOLVE
-    if (check_dump_flag(ctx->rt, DUMP_MODULE_RESOLVE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_MODULE_RESOLVE
+    if (check_dump_flag(ctx->rt, JS_DUMP_MODULE_RESOLVE)) {
         char buf1[ATOM_GET_STR_BUF_SIZE];
         printf("instantiating module '%s':\n", JS_AtomGetStr(ctx, buf1, sizeof(buf1), m->module_name));
     }
@@ -27364,8 +27270,8 @@ static int js_inner_module_linking(JSContext *ctx, JSModuleDef *m,
         }
     }
 
-#ifdef DUMP_MODULE_RESOLVE
-    if (check_dump_flag(ctx->rt, DUMP_MODULE_RESOLVE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_MODULE_RESOLVE
+    if (check_dump_flag(ctx->rt, JS_DUMP_MODULE_RESOLVE)) {
         printf("exported bindings:\n");
         for(i = 0; i < m->export_entries_count; i++) {
             JSExportEntry *me = &m->export_entries[i];
@@ -27384,8 +27290,8 @@ static int js_inner_module_linking(JSContext *ctx, JSModuleDef *m,
 
         for(i = 0; i < m->import_entries_count; i++) {
             mi = &m->import_entries[i];
-#ifdef DUMP_MODULE_RESOLVE
-            if (check_dump_flag(ctx->rt, DUMP_MODULE_RESOLVE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_MODULE_RESOLVE
+            if (check_dump_flag(ctx->rt, JS_DUMP_MODULE_RESOLVE)) {
                 printf("import var_idx=%d name=", mi->var_idx);
                 print_atom(ctx, mi->import_name);
                 printf(": ");
@@ -27422,7 +27328,7 @@ static int js_inner_module_linking(JSContext *ctx, JSModuleDef *m,
                     val = JS_GetModuleNamespace(ctx, m2);
                     if (JS_IsException(val))
                         goto fail;
-                    var_ref = js_create_module_var(ctx, TRUE);
+                    var_ref = js_create_module_var(ctx, true);
                     if (!var_ref) {
                         JS_FreeValue(ctx, val);
                         goto fail;
@@ -27441,7 +27347,7 @@ static int js_inner_module_linking(JSContext *ctx, JSModuleDef *m,
                     var_ref->header.ref_count++;
                     var_refs[mi->var_idx] = var_ref;
 
-                    module_trace(ctx, "local export (var_ref=%p)\n", var_ref);
+                    module_trace(ctx, "local export (var_ref=%p)\n", (void *)var_ref);
                 }
             }
         }
@@ -27477,8 +27383,8 @@ static int js_inner_module_linking(JSContext *ctx, JSModuleDef *m,
         }
     }
 
-#ifdef DUMP_MODULE_RESOLVE
-    if (check_dump_flag(ctx->rt, DUMP_MODULE_RESOLVE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_MODULE_RESOLVE
+    if (check_dump_flag(ctx->rt, JS_DUMP_MODULE_RESOLVE)) {
         printf("js_inner_module_linking done\n");
     }
 #endif
@@ -27493,8 +27399,8 @@ static int js_link_module(JSContext *ctx, JSModuleDef *m)
 {
     JSModuleDef *stack_top, *m1;
 
-#ifdef DUMP_MODULE_RESOLVE
-    if (check_dump_flag(ctx->rt, DUMP_MODULE_RESOLVE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_MODULE_RESOLVE
+    if (check_dump_flag(ctx->rt, JS_DUMP_MODULE_RESOLVE)) {
         char buf1[ATOM_GET_STR_BUF_SIZE];
         printf("js_link_module '%s':\n", JS_AtomGetStr(ctx, buf1, sizeof(buf1), m->module_name));
     }
@@ -27589,13 +27495,14 @@ static JSValue js_import_meta(JSContext *ctx)
 
 static JSValue JS_NewModuleValue(JSContext *ctx, JSModuleDef *m)
 {
-    return JS_DupValue(ctx, JS_MKPTR(JS_TAG_MODULE, m));
+    return js_dup(JS_MKPTR(JS_TAG_MODULE, m));
 }
 
 static JSValue js_load_module_rejected(JSContext *ctx, JSValueConst this_val,
-                                       int argc, JSValueConst *argv, int magic, JSValue *func_data)
+                                       int argc, JSValueConst *argv, int magic,
+                                       JSValueConst *func_data)
 {
-    JSValueConst *resolving_funcs = (JSValueConst *)func_data;
+    JSValueConst *resolving_funcs = func_data;
     JSValueConst error;
     JSValue ret;
 
@@ -27604,16 +27511,16 @@ static JSValue js_load_module_rejected(JSContext *ctx, JSValueConst this_val,
         error = argv[0];
     else
         error = JS_UNDEFINED;
-    ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED,
-                  1, &error);
+    ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED, 1, &error);
     JS_FreeValue(ctx, ret);
     return JS_UNDEFINED;
 }
 
 static JSValue js_load_module_fulfilled(JSContext *ctx, JSValueConst this_val,
-                                        int argc, JSValueConst *argv, int magic, JSValue *func_data)
+                                        int argc, JSValueConst *argv, int magic,
+                                        JSValueConst *func_data)
 {
-    JSValueConst *resolving_funcs = (JSValueConst *)func_data;
+    JSValueConst *resolving_funcs = func_data;
     JSModuleDef *m = JS_VALUE_GET_PTR(func_data[2]);
     JSValue ret, ns;
 
@@ -27621,11 +27528,10 @@ static JSValue js_load_module_fulfilled(JSContext *ctx, JSValueConst this_val,
     ns = JS_GetModuleNamespace(ctx, m);
     if (JS_IsException(ns)) {
         JSValue err = JS_GetException(ctx);
-        js_load_module_rejected(ctx, JS_UNDEFINED, 1, (JSValueConst *)&err, 0, func_data);
+        js_load_module_rejected(ctx, JS_UNDEFINED, 1, vc(&err), 0, func_data);
         return JS_UNDEFINED;
     }
-    ret = JS_Call(ctx, resolving_funcs[0], JS_UNDEFINED,
-                   1, (JSValueConst *)&ns);
+    ret = JS_Call(ctx, resolving_funcs[0], JS_UNDEFINED, 1, vc(&ns));
     JS_FreeValue(ctx, ret);
     JS_FreeValue(ctx, ns);
     return JS_UNDEFINED;
@@ -27655,8 +27561,7 @@ static void JS_LoadModuleInternal(JSContext *ctx, const char *basename,
     if (JS_IsException(evaluate_promise)) {
     fail:
         err = JS_GetException(ctx);
-        ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED,
-                      1, (JSValueConst *)&err);
+        ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED, 1, vc(&err));
         JS_FreeValue(ctx, ret); /* XXX: what to do if exception ? */
         JS_FreeValue(ctx, err);
         return;
@@ -27669,7 +27574,7 @@ static void JS_LoadModuleInternal(JSContext *ctx, const char *basename,
     evaluate_resolving_funcs[0] = JS_NewCFunctionData(ctx, js_load_module_fulfilled, 0, 0, 3, func_data);
     evaluate_resolving_funcs[1] = JS_NewCFunctionData(ctx, js_load_module_rejected, 0, 0, 3, func_data);
     JS_FreeValue(ctx, func_obj);
-    ret = js_promise_then(ctx, evaluate_promise, 2, (JSValueConst *)evaluate_resolving_funcs);
+    ret = js_promise_then(ctx, evaluate_promise, 2, vc(evaluate_resolving_funcs));
     JS_FreeValue(ctx, ret);
     JS_FreeValue(ctx, evaluate_resolving_funcs[0]);
     JS_FreeValue(ctx, evaluate_resolving_funcs[1]);
@@ -27686,19 +27591,18 @@ JSValue JS_LoadModule(JSContext *ctx, const char *basename,
     promise = JS_NewPromiseCapability(ctx, resolving_funcs);
     if (JS_IsException(promise))
         return JS_EXCEPTION;
-    JS_LoadModuleInternal(ctx, basename, filename,
-                          (JSValueConst *)resolving_funcs);
+    JS_LoadModuleInternal(ctx, basename, filename, vc(resolving_funcs));
     JS_FreeValue(ctx, resolving_funcs[0]);
     JS_FreeValue(ctx, resolving_funcs[1]);
     return promise;
 }
 
 static JSValue js_dynamic_import_job(JSContext *ctx,
-                                     int argc, JSValue *argv)
+                                     int argc, JSValueConst *argv)
 {
-    JSValue *resolving_funcs = argv;
-    JSValue basename_val = argv[2];
-    JSValue specifier = argv[3];
+    JSValueConst *resolving_funcs = argv;
+    JSValueConst basename_val = argv[2];
+    JSValueConst specifier = argv[3];
     const char *basename = NULL, *filename;
     JSValue ret, err;
 
@@ -27721,15 +27625,14 @@ static JSValue js_dynamic_import_job(JSContext *ctx,
     return JS_UNDEFINED;
  exception:
     err = JS_GetException(ctx);
-    ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED,
-                   1, &err);
+    ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED, 1, vc(&err));
     JS_FreeValue(ctx, ret); /* XXX: what to do if exception ? */
     JS_FreeValue(ctx, err);
     JS_FreeCString(ctx, basename);
     return JS_UNDEFINED;
 }
 
-static JSValue js_dynamic_import(JSContext *ctx, JSValue specifier)
+static JSValue js_dynamic_import(JSContext *ctx, JSValueConst specifier)
 {
     JSAtom basename;
     JSValue promise, resolving_funcs[2], basename_val;
@@ -27753,11 +27656,11 @@ static JSValue js_dynamic_import(JSContext *ctx, JSValue specifier)
     args[0] = resolving_funcs[0];
     args[1] = resolving_funcs[1];
     args[2] = basename_val;
-    args[3] = specifier;
+    args[3] = unsafe_unconst(specifier);
 
     /* cannot run JS_LoadModuleInternal synchronously because it would
        cause an unexpected recursion in js_evaluate_module() */
-    JS_EnqueueJob(ctx, js_dynamic_import_job, 4, args);
+    JS_EnqueueJob(ctx, js_dynamic_import_job, 4, vc(args));
 
     JS_FreeValue(ctx, basename_val);
     JS_FreeValue(ctx, resolving_funcs[0]);
@@ -27769,11 +27672,10 @@ static void js_set_module_evaluated(JSContext *ctx, JSModuleDef *m)
 {
     m->status = JS_MODULE_STATUS_EVALUATED;
     if (!JS_IsUndefined(m->promise)) {
-        JSValue value, ret_val;
+        JSValue ret_val;
         assert(m->cycle_root == m);
-        value = JS_UNDEFINED;
-        ret_val = JS_Call(ctx, m->resolving_funcs[0], JS_UNDEFINED,
-                          1, (JSValueConst *)&value);
+        JSValueConst value = JS_UNDEFINED;
+        ret_val = JS_Call(ctx, m->resolving_funcs[0], JS_UNDEFINED, 1, &value);
         JS_FreeValue(ctx, ret_val);
     }
 }
@@ -27785,14 +27687,14 @@ typedef struct {
 } ExecModuleList;
 
 /* XXX: slow. Could use a linked list instead of ExecModuleList */
-static BOOL find_in_exec_module_list(ExecModuleList *exec_list, JSModuleDef *m)
+static bool find_in_exec_module_list(ExecModuleList *exec_list, JSModuleDef *m)
 {
     int i;
     for(i = 0; i < exec_list->count; i++) {
         if (exec_list->tab[i] == m)
-            return TRUE;
+            return true;
     }
-    return FALSE;
+    return false;
 }
 
 static int gather_available_ancestors(JSContext *ctx, JSModuleDef *module,
@@ -27841,7 +27743,8 @@ static int js_execute_sync_module(JSContext *ctx, JSModuleDef *m,
                                   JSValue *pvalue);
 
 static JSValue js_async_module_execution_rejected(JSContext *ctx, JSValueConst this_val,
-                                                  int argc, JSValueConst *argv, int magic, JSValue *func_data)
+                                                  int argc, JSValueConst *argv, int magic,
+                                                  JSValueConst *func_data)
 {
     JSModuleDef *module = JS_VALUE_GET_PTR(func_data[0]);
     JSValueConst error = argv[0];
@@ -27859,15 +27762,15 @@ static JSValue js_async_module_execution_rejected(JSContext *ctx, JSValueConst t
     assert(!module->eval_has_exception);
     assert(module->async_evaluation);
 
-    module->eval_has_exception = TRUE;
-    module->eval_exception = JS_DupValue(ctx, error);
+    module->eval_has_exception = true;
+    module->eval_exception = js_dup(error);
     module->status = JS_MODULE_STATUS_EVALUATED;
 
     for(i = 0; i < module->async_parent_modules_count; i++) {
         JSModuleDef *m = module->async_parent_modules[i];
         JSValue m_obj = JS_NewModuleValue(ctx, m);
         js_async_module_execution_rejected(ctx, JS_UNDEFINED, 1, &error, 0,
-                                           &m_obj);
+                                           vc(&m_obj));
         JS_FreeValue(ctx, m_obj);
     }
 
@@ -27882,7 +27785,8 @@ static JSValue js_async_module_execution_rejected(JSContext *ctx, JSValueConst t
 }
 
 static JSValue js_async_module_execution_fulfilled(JSContext *ctx, JSValueConst this_val,
-                                                   int argc, JSValueConst *argv, int magic, JSValue *func_data)
+                                                   int argc, JSValueConst *argv, int magic,
+                                                   JSValueConst *func_data)
 {
     JSModuleDef *module = JS_VALUE_GET_PTR(func_data[0]);
     ExecModuleList exec_list_s, *exec_list = &exec_list_s;
@@ -27895,7 +27799,7 @@ static JSValue js_async_module_execution_fulfilled(JSContext *ctx, JSValueConst
     assert(module->status == JS_MODULE_STATUS_EVALUATING_ASYNC);
     assert(!module->eval_has_exception);
     assert(module->async_evaluation);
-    module->async_evaluation = FALSE;
+    module->async_evaluation = false;
     js_set_module_evaluated(ctx, module);
 
     exec_list->tab = NULL;
@@ -27922,8 +27826,8 @@ static JSValue js_async_module_execution_fulfilled(JSContext *ctx, JSValueConst
             if (js_execute_sync_module(ctx, m, &error) < 0) {
                 JSValue m_obj = JS_NewModuleValue(ctx, m);
                 js_async_module_execution_rejected(ctx, JS_UNDEFINED,
-                                                   1, (JSValueConst *)&error, 0,
-                                                   &m_obj);
+                                                   1, vc(&error),
+                                                   0, vc(&m_obj));
                 JS_FreeValue(ctx, m_obj);
                 JS_FreeValue(ctx, error);
             } else {
@@ -27943,9 +27847,9 @@ static int js_execute_async_module(JSContext *ctx, JSModuleDef *m)
     if (JS_IsException(promise))
         return -1;
     m_obj = JS_NewModuleValue(ctx, m);
-    resolve_funcs[0] = JS_NewCFunctionData(ctx, js_async_module_execution_fulfilled, 0, 0, 1, (JSValueConst *)&m_obj);
-    resolve_funcs[1] = JS_NewCFunctionData(ctx, js_async_module_execution_rejected, 0, 0, 1, (JSValueConst *)&m_obj);
-    ret_val = js_promise_then(ctx, promise, 2, (JSValueConst *)resolve_funcs);
+    resolve_funcs[0] = JS_NewCFunctionData(ctx, js_async_module_execution_fulfilled, 0, 0, 1, vc(&m_obj));
+    resolve_funcs[1] = JS_NewCFunctionData(ctx, js_async_module_execution_rejected, 0, 0, 1, vc(&m_obj));
+    ret_val = js_promise_then(ctx, promise, 2, vc(resolve_funcs));
     JS_FreeValue(ctx, ret_val);
     JS_FreeValue(ctx, m_obj);
     JS_FreeValue(ctx, resolve_funcs[0]);
@@ -28003,8 +27907,8 @@ static int js_inner_module_evaluation(JSContext *ctx, JSModuleDef *m,
         return -1;
     }
 
-#ifdef DUMP_MODULE_RESOLVE
-    if (check_dump_flag(ctx->rt, DUMP_MODULE_RESOLVE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_MODULE_RESOLVE
+    if (check_dump_flag(ctx->rt, JS_DUMP_MODULE_RESOLVE)) {
         char buf1[ATOM_GET_STR_BUF_SIZE];
         printf("js_inner_module_evaluation '%s':\n", JS_AtomGetStr(ctx, buf1, sizeof(buf1), m->module_name));
     }
@@ -28013,7 +27917,7 @@ static int js_inner_module_evaluation(JSContext *ctx, JSModuleDef *m,
     if (m->status == JS_MODULE_STATUS_EVALUATING_ASYNC ||
         m->status == JS_MODULE_STATUS_EVALUATED) {
         if (m->eval_has_exception) {
-            *pvalue = JS_DupValue(ctx, m->eval_exception);
+            *pvalue = js_dup(m->eval_exception);
             return -1;
         } else {
             *pvalue = JS_UNDEFINED;
@@ -28052,7 +27956,7 @@ static int js_inner_module_evaluation(JSContext *ctx, JSModuleDef *m,
             assert(m1->status == JS_MODULE_STATUS_EVALUATING_ASYNC ||
                    m1->status == JS_MODULE_STATUS_EVALUATED);
             if (m1->eval_has_exception) {
-                *pvalue = JS_DupValue(ctx, m1->eval_exception);
+                *pvalue = js_dup(m1->eval_exception);
                 return -1;
             }
         }
@@ -28068,12 +27972,12 @@ static int js_inner_module_evaluation(JSContext *ctx, JSModuleDef *m,
 
     if (m->pending_async_dependencies > 0) {
         assert(!m->async_evaluation);
-        m->async_evaluation = TRUE;
+        m->async_evaluation = true;
         m->async_evaluation_timestamp =
             ctx->rt->module_async_evaluation_next_timestamp++;
     } else if (m->has_tla) {
         assert(!m->async_evaluation);
-        m->async_evaluation = TRUE;
+        m->async_evaluation = true;
         m->async_evaluation_timestamp =
             ctx->rt->module_async_evaluation_next_timestamp++;
         js_execute_async_module(ctx, m);
@@ -28119,7 +28023,7 @@ static JSValue js_evaluate_module(JSContext *ctx, JSModuleDef *m)
     }
     /* a promise may be created only on the cycle_root of a cycle */
     if (!JS_IsUndefined(m->promise))
-        return JS_DupValue(ctx, m->promise);
+        return js_dup(m->promise);
     m->promise = JS_NewPromiseCapability(ctx, m->resolving_funcs);
     if (JS_IsException(m->promise))
         return JS_EXCEPTION;
@@ -28130,8 +28034,8 @@ static JSValue js_evaluate_module(JSContext *ctx, JSModuleDef *m)
             m1 = stack_top;
             assert(m1->status == JS_MODULE_STATUS_EVALUATING);
             m1->status = JS_MODULE_STATUS_EVALUATED;
-            m1->eval_has_exception = TRUE;
-            m1->eval_exception = JS_DupValue(ctx, result);
+            m1->eval_has_exception = true;
+            m1->eval_exception = js_dup(result);
             m1->cycle_root = m; /* spec bug: should be present */
             stack_top = m1->stack_prev;
         }
@@ -28139,23 +28043,22 @@ static JSValue js_evaluate_module(JSContext *ctx, JSModuleDef *m)
         assert(m->status == JS_MODULE_STATUS_EVALUATED);
         assert(m->eval_has_exception);
         ret_val = JS_Call(ctx, m->resolving_funcs[1], JS_UNDEFINED,
-                          1, (JSValueConst *)&m->eval_exception);
+                          1, vc(&m->eval_exception));
         JS_FreeValue(ctx, ret_val);
     } else {
         assert(m->status == JS_MODULE_STATUS_EVALUATING_ASYNC ||
                m->status == JS_MODULE_STATUS_EVALUATED);
         assert(!m->eval_has_exception);
         if (!m->async_evaluation) {
-            JSValue value;
             assert(m->status == JS_MODULE_STATUS_EVALUATED);
-            value = JS_UNDEFINED;
+            JSValueConst value = JS_UNDEFINED;
             ret_val = JS_Call(ctx, m->resolving_funcs[0], JS_UNDEFINED,
-                              1, (JSValueConst *)&value);
+                              1, &value);
             JS_FreeValue(ctx, ret_val);
         }
         assert(stack_top == NULL);
     }
-    return JS_DupValue(ctx, m->promise);
+    return js_dup(m->promise);
 }
 
 static __exception JSAtom js_parse_from_clause(JSParseState *s)
@@ -28195,10 +28098,10 @@ static __exception int js_parse_export(JSParseState *s)
 
     tok = s->token.val;
     if (tok == TOK_CLASS) {
-        return js_parse_class(s, FALSE, JS_PARSE_EXPORT_NAMED);
+        return js_parse_class(s, false, JS_PARSE_EXPORT_NAMED);
     } else if (tok == TOK_FUNCTION ||
                (token_is_pseudo_keyword(s, JS_ATOM_async) &&
-                peek_token(s, TRUE) == TOK_FUNCTION)) {
+                peek_token(s, true) == TOK_FUNCTION)) {
         return js_parse_function_decl2(s, JS_PARSE_FUNC_STATEMENT,
                                        JS_FUNC_NORMAL, JS_ATOM_NULL,
                                        s->token.ptr,
@@ -28307,10 +28210,10 @@ static __exception int js_parse_export(JSParseState *s)
         break;
     case TOK_DEFAULT:
         if (s->token.val == TOK_CLASS) {
-            return js_parse_class(s, FALSE, JS_PARSE_EXPORT_DEFAULT);
+            return js_parse_class(s, false, JS_PARSE_EXPORT_DEFAULT);
         } else if (s->token.val == TOK_FUNCTION ||
                    (token_is_pseudo_keyword(s, JS_ATOM_async) &&
-                    peek_token(s, TRUE) == TOK_FUNCTION)) {
+                    peek_token(s, true) == TOK_FUNCTION)) {
             return js_parse_function_decl2(s, JS_PARSE_FUNC_STATEMENT,
                                            JS_FUNC_NORMAL, JS_ATOM_NULL,
                                            s->token.ptr,
@@ -28340,7 +28243,7 @@ static __exception int js_parse_export(JSParseState *s)
     case TOK_VAR:
     case TOK_LET:
     case TOK_CONST:
-        return js_parse_var(s, TRUE, tok, TRUE);
+        return js_parse_var(s, PF_IN_ACCEPTED, tok, /*export_flag*/true);
     default:
         return js_parse_error(s, "invalid export syntax");
     }
@@ -28348,9 +28251,9 @@ static __exception int js_parse_export(JSParseState *s)
 }
 
 static int add_closure_var(JSContext *ctx, JSFunctionDef *s,
-                           BOOL is_local, BOOL is_arg,
+                           bool is_local, bool is_arg,
                            int var_idx, JSAtom var_name,
-                           BOOL is_const, BOOL is_lexical,
+                           bool is_const, bool is_lexical,
                            JSVarKindEnum var_kind);
 
 static int add_import(JSParseState *s, JSModuleDef *m,
@@ -28359,7 +28262,7 @@ static int add_import(JSParseState *s, JSModuleDef *m,
     JSContext *ctx = s->ctx;
     int i, var_idx;
     JSImportEntry *mi;
-    BOOL is_local;
+    bool is_local;
 
     if (local_name == JS_ATOM_arguments || local_name == JS_ATOM_eval)
         return js_parse_error(s, "invalid import binding");
@@ -28372,9 +28275,9 @@ static int add_import(JSParseState *s, JSModuleDef *m,
     }
 
     is_local = (import_name == JS_ATOM__star_);
-    var_idx = add_closure_var(ctx, s->cur_func, is_local, FALSE,
+    var_idx = add_closure_var(ctx, s->cur_func, is_local, false,
                               m->import_entries_count,
-                              local_name, TRUE, TRUE, JS_VAR_NORMAL);
+                              local_name, true, true, JS_VAR_NORMAL);
     if (var_idx < 0)
         return -1;
     if (js_resize_array(ctx, (void **)&m->import_entries,
@@ -28510,7 +28413,7 @@ static __exception int js_parse_source_element(JSParseState *s)
 
     if (s->token.val == TOK_FUNCTION ||
         (token_is_pseudo_keyword(s, JS_ATOM_async) &&
-         peek_token(s, TRUE) == TOK_FUNCTION)) {
+         peek_token(s, true) == TOK_FUNCTION)) {
         if (js_parse_function_decl(s, JS_PARSE_FUNC_STATEMENT,
                                    JS_FUNC_NORMAL, JS_ATOM_NULL,
                                    s->token.ptr,
@@ -28521,7 +28424,7 @@ static __exception int js_parse_source_element(JSParseState *s)
         if (js_parse_export(s))
             return -1;
     } else if (s->token.val == TOK_IMPORT && fd->module &&
-               ((tok = peek_token(s, FALSE)) != '(' && tok != '.'))  {
+               ((tok = peek_token(s, false)) != '(' && tok != '.'))  {
         /* the peek_token is needed to avoid confusion with ImportCall
            (dynamic import) or import.meta */
         if (js_parse_import(s))
@@ -28536,8 +28439,8 @@ static __exception int js_parse_source_element(JSParseState *s)
 /* `filename` may be pure ASCII or UTF-8 encoded */
 static JSFunctionDef *js_new_function_def(JSContext *ctx,
                                           JSFunctionDef *parent,
-                                          BOOL is_eval,
-                                          BOOL is_func_expr,
+                                          bool is_eval,
+                                          bool is_func_expr,
                                           const char *filename,
                                           int line_num,
                                           int col_num)
@@ -28594,13 +28497,12 @@ static JSFunctionDef *js_new_function_def(JSContext *ctx,
     //fd->pc2line_last_line_num = line_num;
     //fd->pc2line_last_pc = 0;
 
-    fd->ic = init_ic(ctx);
     return fd;
 }
 
 static void free_bytecode_atoms(JSRuntime *rt,
                                 const uint8_t *bc_buf, int bc_len,
-                                BOOL use_short_opcodes)
+                                bool use_short_opcodes)
 {
     int pos, len, op;
     JSAtom atom;
@@ -28650,10 +28552,6 @@ static void js_free_function_def(JSContext *ctx, JSFunctionDef *fd)
     js_free(ctx, fd->label_slots);
     js_free(ctx, fd->source_loc_slots);
 
-    /* free ic */
-    if (fd->ic)
-        free_ic(ctx->rt, fd->ic);
-
     for(i = 0; i < fd->cpool_count; i++) {
         JS_FreeValue(ctx, fd->cpool[i]);
     }
@@ -28697,7 +28595,7 @@ static void js_free_function_def(JSContext *ctx, JSFunctionDef *fd)
     js_free(ctx, fd);
 }
 
-#ifdef DUMP_BYTECODE
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_*
 static const char *skip_lines(const char *p, int n) {
     while (p && n-- > 0 && *p) {
         while (*p && *p++ != '\n')
@@ -28735,7 +28633,7 @@ static void dump_byte_code(JSContext *ctx, int pass,
     const JSOpCode *oi;
     int pos, pos_next, op, size, idx, addr, line, line1, in_source;
     uint8_t *bits = js_mallocz(ctx, len * sizeof(*bits));
-    BOOL use_short_opcodes = (b != NULL);
+    bool use_short_opcodes = (b != NULL);
 
     if (start_pos != 0 || bits == NULL)
         goto no_labels;
@@ -28824,8 +28722,8 @@ static void dump_byte_code(JSContext *ctx, int pass,
             printf("truncated opcode (0x%02x)\n", op);
             break;
         }
-#ifdef DUMP_BYTECODE_HEX
-        if (check_dump_flag(ctx->rt, DUMP_BYTECODE_HEX)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_HEX
+        if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_HEX)) {
             int i, x, x0;
             x = x0 = printf("%5d ", pos);
             for (i = 0; i < size; i++) {
@@ -29087,6 +28985,7 @@ static __maybe_unused void js_dump_function_bytecode(JSContext *ctx, JSFunctionB
     int i;
     char atom_buf[ATOM_GET_STR_BUF_SIZE];
     const char *str;
+    const uint8_t *op;
 
     if (b->filename != JS_ATOM_NULL) {
         str = JS_AtomGetStr(ctx, atom_buf, sizeof(atom_buf), b->filename);
@@ -29133,15 +29032,19 @@ static __maybe_unused void js_dump_function_bytecode(JSContext *ctx, JSFunctionB
         }
     }
     printf("  stack_size: %d\n", b->stack_size);
-    printf("  opcodes:\n");
+    printf("  byte_code_len: %d\n", b->byte_code_len);
+    op = b->byte_code_buf;
+    for (i = 0; op < &b->byte_code_buf[b->byte_code_len]; i++)
+        op += short_opcode_info(*op).size;
+    printf("  opcodes: %d\n", i);
     dump_byte_code(ctx, 3, b->byte_code_buf, b->byte_code_len,
                    b->vardefs, b->arg_count,
                    b->vardefs ? b->vardefs + b->arg_count : NULL, b->var_count,
                    b->closure_var, b->closure_var_count,
                    b->cpool, b->cpool_count,
                    b->source, b->line_num, NULL, b, 0);
-#ifdef DUMP_BYTECODE_PC2LINE
-    if (check_dump_flag(ctx->rt, DUMP_BYTECODE_PC2LINE))
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_PC2LINE
+    if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_PC2LINE))
         dump_pc2line(ctx, b->pc2line_buf, b->pc2line_len, b->line_num, b->col_num);
 #endif
     printf("\n");
@@ -29149,9 +29052,9 @@ static __maybe_unused void js_dump_function_bytecode(JSContext *ctx, JSFunctionB
 #endif
 
 static int add_closure_var(JSContext *ctx, JSFunctionDef *s,
-                           BOOL is_local, BOOL is_arg,
+                           bool is_local, bool is_arg,
                            int var_idx, JSAtom var_name,
-                           BOOL is_const, BOOL is_lexical,
+                           bool is_const, bool is_lexical,
                            JSVarKindEnum var_kind)
 {
     JSClosureVar *cv;
@@ -29192,12 +29095,12 @@ static int find_closure_var(JSContext *ctx, JSFunctionDef *s,
 }
 
 /* 'fd' must be a parent of 's'. Create in 's' a closure referencing a
-   local variable (is_local = TRUE) or a closure (is_local = FALSE) in
+   local variable (is_local = true) or a closure (is_local = false) in
    'fd' */
 static int get_closure_var2(JSContext *ctx, JSFunctionDef *s,
-                            JSFunctionDef *fd, BOOL is_local,
-                            BOOL is_arg, int var_idx, JSAtom var_name,
-                            BOOL is_const, BOOL is_lexical,
+                            JSFunctionDef *fd, bool is_local,
+                            bool is_arg, int var_idx, JSAtom var_name,
+                            bool is_const, bool is_lexical,
                             JSVarKindEnum var_kind)
 {
     int i;
@@ -29208,7 +29111,7 @@ static int get_closure_var2(JSContext *ctx, JSFunctionDef *s,
                                    is_const, is_lexical, var_kind);
         if (var_idx < 0)
             return -1;
-        is_local = FALSE;
+        is_local = false;
     }
     for(i = 0; i < s->closure_var_count; i++) {
         JSClosureVar *cv = &s->closure_var[i];
@@ -29221,12 +29124,12 @@ static int get_closure_var2(JSContext *ctx, JSFunctionDef *s,
 }
 
 static int get_closure_var(JSContext *ctx, JSFunctionDef *s,
-                           JSFunctionDef *fd, BOOL is_arg,
+                           JSFunctionDef *fd, bool is_arg,
                            int var_idx, JSAtom var_name,
-                           BOOL is_const, BOOL is_lexical,
+                           bool is_const, bool is_lexical,
                            JSVarKindEnum var_kind)
 {
-    return get_closure_var2(ctx, s, fd, TRUE, is_arg,
+    return get_closure_var2(ctx, s, fd, true, is_arg,
                             var_idx, var_name, is_const, is_lexical,
                             var_kind);
 }
@@ -29239,7 +29142,7 @@ static int get_with_scope_opcode(int op)
         return OP_with_get_var + (op - OP_scope_get_var);
 }
 
-static BOOL can_opt_put_ref_value(const uint8_t *bc_buf, int pos)
+static bool can_opt_put_ref_value(const uint8_t *bc_buf, int pos)
 {
     int opcode = bc_buf[pos];
     return (bc_buf[pos + 1] == OP_put_ref_value &&
@@ -29249,7 +29152,7 @@ static BOOL can_opt_put_ref_value(const uint8_t *bc_buf, int pos)
              opcode == OP_rot3l));
 }
 
-static BOOL can_opt_put_global_ref_value(const uint8_t *bc_buf, int pos)
+static bool can_opt_put_global_ref_value(const uint8_t *bc_buf, int pos)
 {
     int opcode = bc_buf[pos];
     return (bc_buf[pos + 1] == OP_put_ref_value &&
@@ -29309,7 +29212,7 @@ static int optimize_scope_make_global_ref(JSContext *ctx, JSFunctionDef *s,
                                           JSAtom var_name)
 {
     int label_pos, end_pos, pos, op;
-    BOOL is_strict_mode = s->is_strict_mode;
+    bool is_strict_mode = s->is_strict_mode;
 
     /* replace the reference get/put with normal variable
        accesses */
@@ -29427,7 +29330,7 @@ static int resolve_pseudo_var(JSContext *ctx, JSFunctionDef *s,
    the case, handle it and jump to 'label_done' */
 static void var_object_test(JSContext *ctx, JSFunctionDef *s,
                             JSAtom var_name, int op, DynBuf *bc,
-                            int *plabel_done, BOOL is_with)
+                            int *plabel_done, bool is_with)
 {
     dbuf_putc(bc, get_with_scope_opcode(op));
     dbuf_put_u32(bc, JS_DupAtom(ctx, var_name));
@@ -29448,7 +29351,7 @@ static int resolve_scope_var(JSContext *ctx, JSFunctionDef *s,
     int label_done;
     JSFunctionDef *fd;
     JSVarDef *vd;
-    BOOL is_pseudo_var, is_arg_scope;
+    bool is_pseudo_var, is_arg_scope;
 
     label_done = -1;
 
@@ -29631,7 +29534,7 @@ static int resolve_scope_var(JSContext *ctx, JSFunctionDef *s,
                 break;
             } else if (vd->var_name == JS_ATOM__with_ && !is_pseudo_var) {
                 vd->is_captured = 1;
-                idx = get_closure_var(ctx, s, fd, FALSE, idx, vd->var_name, FALSE, FALSE, JS_VAR_NORMAL);
+                idx = get_closure_var(ctx, s, fd, false, idx, vd->var_name, false, false, JS_VAR_NORMAL);
                 if (idx >= 0) {
                     dbuf_putc(bc, OP_get_var_ref);
                     dbuf_put_u16(bc, idx);
@@ -29668,9 +29571,9 @@ static int resolve_scope_var(JSContext *ctx, JSFunctionDef *s,
         if (!is_arg_scope && fd->var_object_idx >= 0 && !is_pseudo_var) {
             vd = &fd->vars[fd->var_object_idx];
             vd->is_captured = 1;
-            idx = get_closure_var(ctx, s, fd, FALSE,
+            idx = get_closure_var(ctx, s, fd, false,
                                   fd->var_object_idx, vd->var_name,
-                                  FALSE, FALSE, JS_VAR_NORMAL);
+                                  false, false, JS_VAR_NORMAL);
             dbuf_putc(bc, OP_get_var_ref);
             dbuf_put_u16(bc, idx);
             var_object_test(ctx, s, var_name, op, bc, &label_done, 0);
@@ -29680,9 +29583,9 @@ static int resolve_scope_var(JSContext *ctx, JSFunctionDef *s,
         if (fd->arg_var_object_idx >= 0 && !is_pseudo_var) {
             vd = &fd->vars[fd->arg_var_object_idx];
             vd->is_captured = 1;
-            idx = get_closure_var(ctx, s, fd, FALSE,
+            idx = get_closure_var(ctx, s, fd, false,
                                   fd->arg_var_object_idx, vd->var_name,
-                                  FALSE, FALSE, JS_VAR_NORMAL);
+                                  false, false, JS_VAR_NORMAL);
             dbuf_putc(bc, OP_get_var_ref);
             dbuf_put_u16(bc, idx);
             var_object_test(ctx, s, var_name, op, bc, &label_done, 0);
@@ -29703,7 +29606,7 @@ static int resolve_scope_var(JSContext *ctx, JSFunctionDef *s,
             if (var_name == cv->var_name) {
                 if (fd != s) {
                     idx = get_closure_var2(ctx, s, fd,
-                                           FALSE,
+                                           false,
                                            cv->is_arg, idx1,
                                            cv->var_name, cv->is_const,
                                            cv->is_lexical, cv->var_kind);
@@ -29717,9 +29620,9 @@ static int resolve_scope_var(JSContext *ctx, JSFunctionDef *s,
                 int is_with = (cv->var_name == JS_ATOM__with_);
                 if (fd != s) {
                     idx = get_closure_var2(ctx, s, fd,
-                                           FALSE,
+                                           false,
                                            cv->is_arg, idx1,
-                                           cv->var_name, FALSE, FALSE,
+                                           cv->var_name, false, false,
                                            JS_VAR_NORMAL);
                 } else {
                     idx = idx1;
@@ -29736,12 +29639,12 @@ static int resolve_scope_var(JSContext *ctx, JSFunctionDef *s,
         if (var_idx & ARGUMENT_VAR_OFFSET) {
             fd->args[var_idx - ARGUMENT_VAR_OFFSET].is_captured = 1;
             idx = get_closure_var(ctx, s, fd,
-                                  TRUE, var_idx - ARGUMENT_VAR_OFFSET,
-                                  var_name, FALSE, FALSE, JS_VAR_NORMAL);
+                                  true, var_idx - ARGUMENT_VAR_OFFSET,
+                                  var_name, false, false, JS_VAR_NORMAL);
         } else {
             fd->vars[var_idx].is_captured = 1;
             idx = get_closure_var(ctx, s, fd,
-                                  FALSE, var_idx,
+                                  false, var_idx,
                                   var_name,
                                   fd->vars[var_idx].is_const,
                                   fd->vars[var_idx].is_lexical,
@@ -29886,7 +29789,7 @@ static int find_private_class_field_all(JSContext *ctx, JSFunctionDef *fd,
     return -1;
 }
 
-static void get_loc_or_ref(DynBuf *bc, BOOL is_ref, int idx)
+static void get_loc_or_ref(DynBuf *bc, bool is_ref, int idx)
 {
     /* if the field is not initialized, the error is catched when
        accessing it */
@@ -29898,23 +29801,23 @@ static void get_loc_or_ref(DynBuf *bc, BOOL is_ref, int idx)
 }
 
 static int resolve_scope_private_field1(JSContext *ctx,
-                                        BOOL *pis_ref, int *pvar_kind,
+                                        bool *pis_ref, int *pvar_kind,
                                         JSFunctionDef *s,
                                         JSAtom var_name, int scope_level)
 {
     int idx, var_kind;
     JSFunctionDef *fd;
-    BOOL is_ref;
+    bool is_ref;
 
     fd = s;
-    is_ref = FALSE;
+    is_ref = false;
     for(;;) {
         idx = find_private_class_field_all(ctx, fd, var_name, scope_level);
         if (idx >= 0) {
             var_kind = fd->vars[idx].var_kind;
             if (is_ref) {
-                idx = get_closure_var(ctx, s, fd, FALSE, idx, var_name,
-                                      TRUE, TRUE, JS_VAR_NORMAL);
+                idx = get_closure_var(ctx, s, fd, false, idx, var_name,
+                                      true, true, JS_VAR_NORMAL);
                 if (idx < 0)
                     return -1;
             }
@@ -29928,10 +29831,10 @@ static int resolve_scope_private_field1(JSContext *ctx,
                     JSClosureVar *cv = &fd->closure_var[idx];
                     if (cv->var_name == var_name) {
                         var_kind = cv->var_kind;
-                        is_ref = TRUE;
+                        is_ref = true;
                         if (fd != s) {
                             idx = get_closure_var2(ctx, s, fd,
-                                                   FALSE,
+                                                   false,
                                                    cv->is_arg, idx,
                                                    cv->var_name, cv->is_const,
                                                    cv->is_lexical,
@@ -29951,7 +29854,7 @@ static int resolve_scope_private_field1(JSContext *ctx,
         } else {
             fd = fd->parent;
         }
-        is_ref = TRUE;
+        is_ref = true;
     }
  done:
     *pis_ref = is_ref;
@@ -29965,7 +29868,7 @@ static int resolve_scope_private_field(JSContext *ctx, JSFunctionDef *s,
                                        DynBuf *bc)
 {
     int idx, var_kind;
-    BOOL is_ref;
+    bool is_ref;
 
     idx = resolve_scope_private_field1(ctx, &is_ref, &var_kind, s,
                                        var_name, scope_level);
@@ -30074,7 +29977,7 @@ static void mark_eval_captured_variables(JSContext *ctx, JSFunctionDef *s,
 }
 
 /* XXX: should handle the argument scope generically */
-static BOOL is_var_in_arg_scope(const JSVarDef *vd)
+static bool is_var_in_arg_scope(const JSVarDef *vd)
 {
     return (vd->var_name == JS_ATOM_home_object ||
             vd->var_name == JS_ATOM_this_active_func ||
@@ -30089,7 +29992,7 @@ static void add_eval_variables(JSContext *ctx, JSFunctionDef *s)
     JSFunctionDef *fd;
     JSVarDef *vd;
     int i, scope_level, scope_idx;
-    BOOL has_arguments_binding, has_this_binding, is_arg_scope;
+    bool has_arguments_binding, has_this_binding, is_arg_scope;
 
     /* in non strict mode, variables are created in the caller's
        environment object */
@@ -30149,12 +30052,12 @@ static void add_eval_variables(JSContext *ctx, JSFunctionDef *s)
                 fd->this_active_func_var_idx = add_var(ctx, fd, JS_ATOM_this_active_func);
             if (fd->has_home_object && fd->home_object_var_idx < 0)
                 fd->home_object_var_idx = add_var(ctx, fd, JS_ATOM_home_object);
-            has_this_binding = TRUE;
+            has_this_binding = true;
         }
         /* add 'arguments' if it was not previously added */
         if (!has_arguments_binding && fd->has_arguments_binding) {
             add_arguments_var(ctx, fd);
-            has_arguments_binding = TRUE;
+            has_arguments_binding = true;
         }
         /* add function name */
         if (fd->is_func_expr && fd->func_name != JS_ATOM_NULL)
@@ -30165,7 +30068,7 @@ static void add_eval_variables(JSContext *ctx, JSFunctionDef *s)
         while (scope_idx >= 0) {
             vd = &fd->vars[scope_idx];
             vd->is_captured = 1;
-            get_closure_var(ctx, s, fd, FALSE, scope_idx,
+            get_closure_var(ctx, s, fd, false, scope_idx,
                             vd->var_name, vd->is_const, vd->is_lexical, vd->var_kind);
             scope_idx = vd->scope_next;
         }
@@ -30177,7 +30080,7 @@ static void add_eval_variables(JSContext *ctx, JSFunctionDef *s)
                 vd = &fd->args[i];
                 if (vd->var_name != JS_ATOM_NULL) {
                     get_closure_var(ctx, s, fd,
-                                    TRUE, i, vd->var_name, FALSE,
+                                    true, i, vd->var_name, false,
                                     vd->is_lexical, JS_VAR_NORMAL);
                 }
             }
@@ -30188,7 +30091,7 @@ static void add_eval_variables(JSContext *ctx, JSFunctionDef *s)
                     vd->var_name != JS_ATOM__ret_ &&
                     vd->var_name != JS_ATOM_NULL) {
                     get_closure_var(ctx, s, fd,
-                                    FALSE, i, vd->var_name, FALSE,
+                                    false, i, vd->var_name, false,
                                     vd->is_lexical, JS_VAR_NORMAL);
                 }
             }
@@ -30198,7 +30101,7 @@ static void add_eval_variables(JSContext *ctx, JSFunctionDef *s)
                 /* do not close top level last result */
                 if (vd->scope_level == 0 && is_var_in_arg_scope(vd)) {
                     get_closure_var(ctx, s, fd,
-                                    FALSE, i, vd->var_name, FALSE,
+                                    false, i, vd->var_name, false,
                                     vd->is_lexical, JS_VAR_NORMAL);
                 }
             }
@@ -30210,7 +30113,7 @@ static void add_eval_variables(JSContext *ctx, JSFunctionDef *s)
             for (idx = 0; idx < fd->closure_var_count; idx++) {
                 JSClosureVar *cv = &fd->closure_var[idx];
                 get_closure_var2(ctx, s, fd,
-                                 FALSE, cv->is_arg,
+                                 false, cv->is_arg,
                                  idx, cv->var_name, cv->is_const,
                                  cv->is_lexical, cv->var_kind);
             }
@@ -30221,8 +30124,8 @@ static void add_eval_variables(JSContext *ctx, JSFunctionDef *s)
 static void set_closure_from_var(JSContext *ctx, JSClosureVar *cv,
                                  JSVarDef *vd, int var_idx)
 {
-    cv->is_local = TRUE;
-    cv->is_arg = FALSE;
+    cv->is_local = true;
+    cv->is_arg = false;
     cv->is_const = vd->is_const;
     cv->is_lexical = vd->is_lexical;
     cv->var_kind = vd->var_kind;
@@ -30237,7 +30140,7 @@ static __exception int add_closure_variables(JSContext *ctx, JSFunctionDef *s,
 {
     int i, count;
     JSVarDef *vd;
-    BOOL is_arg_scope;
+    bool is_arg_scope;
 
     count = b->arg_count + b->var_count + b->closure_var_count;
     s->closure_var = NULL;
@@ -30263,10 +30166,10 @@ static __exception int add_closure_variables(JSContext *ctx, JSFunctionDef *s,
         for(i = 0; i < b->arg_count; i++) {
             JSClosureVar *cv = &s->closure_var[s->closure_var_count++];
             vd = &b->vardefs[i];
-            cv->is_local = TRUE;
-            cv->is_arg = TRUE;
-            cv->is_const = FALSE;
-            cv->is_lexical = FALSE;
+            cv->is_local = true;
+            cv->is_arg = true;
+            cv->is_const = false;
+            cv->is_lexical = false;
             cv->var_kind = JS_VAR_NORMAL;
             cv->var_idx = i;
             cv->var_name = JS_DupAtom(ctx, vd->var_name);
@@ -30292,7 +30195,7 @@ static __exception int add_closure_variables(JSContext *ctx, JSFunctionDef *s,
     for(i = 0; i < b->closure_var_count; i++) {
         JSClosureVar *cv0 = &b->closure_var[i];
         JSClosureVar *cv = &s->closure_var[s->closure_var_count++];
-        cv->is_local = FALSE;
+        cv->is_local = false;
         cv->is_arg = cv0->is_arg;
         cv->is_const = cv0->is_const;
         cv->is_lexical = cv0->is_lexical;
@@ -30320,12 +30223,12 @@ typedef struct CodeContext {
 #define M3(op1, op2, op3)       ((uint32_t)(op1) | ((uint32_t)(op2) << 8) | ((uint32_t)(op3) << 16))
 #define M4(op1, op2, op3, op4)  ((uint32_t)(op1) | ((uint32_t)(op2) << 8) | ((uint32_t)(op3) << 16) | ((uint32_t)(op4) << 24))
 
-static BOOL code_match(CodeContext *s, int pos, ...)
+static bool code_match(CodeContext *s, int pos, ...)
 {
     const uint8_t *tab = s->bc_buf;
     int op, len, op1, line_num, col_num, pos_next;
     va_list ap;
-    BOOL ret = FALSE;
+    bool ret = false;
 
     line_num = -1;
     col_num = -1;
@@ -30337,7 +30240,7 @@ static BOOL code_match(CodeContext *s, int pos, ...)
             s->pos = pos;
             s->line_num = line_num;
             s->col_num = col_num;
-            ret = TRUE;
+            ret = true;
             break;
         }
         for (;;) {
@@ -30490,7 +30393,7 @@ static void instantiate_hoisted_definitions(JSContext *ctx, JSFunctionDef *s, Dy
     for(i = 0; i < s->global_var_count; i++) {
         JSGlobalVar *hf = &s->global_vars[i];
         int has_closure = 0;
-        BOOL force_init = hf->force_init;
+        bool force_init = hf->force_init;
         /* we are in an eval, so the closure contains all the
            enclosing variables */
         /* If the outer function has a variable environment,
@@ -30499,7 +30402,7 @@ static void instantiate_hoisted_definitions(JSContext *ctx, JSFunctionDef *s, Dy
             JSClosureVar *cv = &s->closure_var[idx];
             if (cv->var_name == hf->var_name) {
                 has_closure = 2;
-                force_init = FALSE;
+                force_init = false;
                 break;
             }
             if (cv->var_name == JS_ATOM__var_ ||
@@ -30507,7 +30410,7 @@ static void instantiate_hoisted_definitions(JSContext *ctx, JSFunctionDef *s, Dy
                 dbuf_putc(bc, OP_get_var_ref);
                 dbuf_put_u16(bc, idx);
                 has_closure = 1;
-                force_init = TRUE;
+                force_init = true;
                 break;
             }
         }
@@ -31085,7 +30988,7 @@ static RelocEntry *add_reloc(JSContext *ctx, LabelSlot *ls, uint32_t addr, int s
     return re;
 }
 
-static BOOL code_has_label(CodeContext *s, int pos, int label)
+static bool code_has_label(CodeContext *s, int pos, int label)
 {
     while (pos < s->bc_len) {
         int op = s->bc_buf[pos];
@@ -31096,18 +30999,18 @@ static BOOL code_has_label(CodeContext *s, int pos, int label)
         if (op == OP_label) {
             int lab = get_u32(s->bc_buf + pos + 1);
             if (lab == label)
-                return TRUE;
+                return true;
             pos += 5;
             continue;
         }
         if (op == OP_goto) {
             int lab = get_u32(s->bc_buf + pos + 1);
             if (lab == label)
-                return TRUE;
+                return true;
         }
         break;
     }
-    return FALSE;
+    return false;
 }
 
 /* return the target label, following the OP_goto jumps
@@ -32094,7 +31997,7 @@ static __exception int resolve_labels(JSContext *ctx, JSFunctionDef *s)
     /* set the new byte code */
     dbuf_free(&s->byte_code);
     s->byte_code = bc_out;
-    s->use_short_opcodes = TRUE;
+    s->use_short_opcodes = true;
     if (dbuf_error(&s->byte_code)) {
         JS_ThrowOutOfMemory(ctx);
         return -1;
@@ -32201,8 +32104,8 @@ static __exception int compute_stack_size(JSContext *ctx,
             goto fail;
         }
         oi = &short_opcode_info(op);
-#ifdef DUMP_BYTECODE_STACK
-        if (check_dump_flag(ctx->rt, DUMP_BYTECODE_STACK))
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_STACK
+        if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_STACK))
             printf("%5d: %10s %5d %5d\n", pos, oi->name, stack_len, catch_pos);
 #endif
         pos_next = pos + oi->size;
@@ -32369,7 +32272,7 @@ static int add_module_variables(JSContext *ctx, JSFunctionDef *fd)
 
     for(i = 0; i < fd->global_var_count; i++) {
         hf = &fd->global_vars[i];
-        if (add_closure_var(ctx, fd, TRUE, FALSE, i, hf->var_name, hf->is_const,
+        if (add_closure_var(ctx, fd, true, false, i, hf->var_name, hf->is_const,
                             hf->is_lexical, JS_VAR_NORMAL) < 0)
             return -1;
     }
@@ -32457,8 +32360,8 @@ static JSValue js_create_function(JSContext *ctx, JSFunctionDef *fd)
         fd->cpool[cpool_idx] = func_obj;
     }
 
-#ifdef DUMP_BYTECODE_PASS1
-    if (check_dump_flag(ctx->rt, DUMP_BYTECODE_PASS1)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_PASS1
+    if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_PASS1)) {
         printf("pass 1\n");
         dump_byte_code(ctx, 1, fd->byte_code.buf, fd->byte_code.size,
                        fd->args, fd->arg_count, fd->vars, fd->var_count,
@@ -32472,8 +32375,8 @@ static JSValue js_create_function(JSContext *ctx, JSFunctionDef *fd)
     if (resolve_variables(ctx, fd))
         goto fail;
 
-#ifdef DUMP_BYTECODE_PASS2
-    if (check_dump_flag(ctx->rt, DUMP_BYTECODE_PASS2)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_PASS2
+    if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_PASS2)) {
         printf("pass 2\n");
         dump_byte_code(ctx, 2, fd->byte_code.buf, fd->byte_code.size,
                        fd->args, fd->arg_count, fd->vars, fd->var_count,
@@ -32573,18 +32476,11 @@ static JSValue js_create_function(JSContext *ctx, JSFunctionDef *fd)
     b->arguments_allowed = fd->arguments_allowed;
     b->backtrace_barrier = fd->backtrace_barrier;
     b->realm = JS_DupContext(ctx);
-    b->ic = fd->ic;
-    fd->ic = NULL;
-    rebuild_ic(ctx, b->ic);
-    if (b->ic->count == 0) {
-      free_ic(ctx->rt, b->ic);
-      b->ic = NULL;
-    }
 
     add_gc_object(ctx->rt, &b->header, JS_GC_OBJ_TYPE_FUNCTION_BYTECODE);
 
-#ifdef DUMP_BYTECODE_FINAL
-    if (check_dump_flag(ctx->rt, DUMP_BYTECODE_FINAL))
+#ifdef ENABLE_DUMPS // JS_DUMP_BYTECODE_FINAL
+    if (check_dump_flag(ctx->rt, JS_DUMP_BYTECODE_FINAL))
         js_dump_function_bytecode(ctx, b);
 #endif
 
@@ -32604,10 +32500,7 @@ static void free_function_bytecode(JSRuntime *rt, JSFunctionBytecode *b)
 {
     int i;
 
-    free_bytecode_atoms(rt, b->byte_code_buf, b->byte_code_len, TRUE);
-
-    if (b->ic)
-        free_ic(rt, b->ic);
+    free_bytecode_atoms(rt, b->byte_code_buf, b->byte_code_len, true);
 
     if (b->vardefs) {
         for(i = 0; i < b->arg_count + b->var_count; i++) {
@@ -32641,7 +32534,7 @@ static __exception int js_parse_directives(JSParseState *s)
 {
     char str[20];
     JSParsePos pos;
-    BOOL has_semi;
+    bool has_semi;
 
     if (s->token.val != TOK_STRING)
         return 0;
@@ -32656,16 +32549,16 @@ static __exception int js_parse_directives(JSParseState *s)
         if (next_token(s))
             return -1;
 
-        has_semi = FALSE;
+        has_semi = false;
         switch (s->token.val) {
         case ';':
             if (next_token(s))
                 return -1;
-            has_semi = TRUE;
+            has_semi = true;
             break;
         case '}':
         case TOK_EOF:
-            has_semi = TRUE;
+            has_semi = true;
             break;
         case TOK_NUMBER:
         case TOK_STRING:
@@ -32708,7 +32601,7 @@ static __exception int js_parse_directives(JSParseState *s)
         case TOK_STATIC:
             /* automatic insertion of ';' */
             if (s->got_lf)
-                has_semi = TRUE;
+                has_semi = true;
             break;
         default:
             break;
@@ -32716,14 +32609,14 @@ static __exception int js_parse_directives(JSParseState *s)
         if (!has_semi)
             break;
         if (!strcmp(str, "use strict")) {
-            s->cur_func->has_use_strict = TRUE;
-            s->cur_func->is_strict_mode = TRUE;
+            s->cur_func->has_use_strict = true;
+            s->cur_func->is_strict_mode = true;
         }
     }
     return js_parse_seek_token(s, &pos);
 }
 
-static BOOL js_invalid_strict_name(JSAtom name) {
+static bool js_invalid_strict_name(JSAtom name) {
     switch (name) {
     case JS_ATOM_eval:
     case JS_ATOM_arguments:
@@ -32736,9 +32629,9 @@ static BOOL js_invalid_strict_name(JSAtom name) {
     case JS_ATOM_public:
     case JS_ATOM_static:
     case JS_ATOM_yield:
-        return TRUE;
+        return true;
     default:
-        return FALSE;
+        return false;
     }
 }
 
@@ -32796,21 +32689,21 @@ static JSFunctionDef *js_parse_function_class_fields_init(JSParseState *s)
 {
     JSFunctionDef *fd;
 
-    fd = js_new_function_def(s->ctx, s->cur_func, FALSE, FALSE,
+    fd = js_new_function_def(s->ctx, s->cur_func, false, false,
                              s->filename, 0, 0);
     if (!fd)
         return NULL;
     fd->func_name = JS_ATOM_NULL;
-    fd->has_prototype = FALSE;
-    fd->has_home_object = TRUE;
-
-    fd->has_arguments_binding = FALSE;
-    fd->has_this_binding = TRUE;
-    fd->is_derived_class_constructor = FALSE;
-    fd->new_target_allowed = TRUE;
-    fd->super_call_allowed = FALSE;
+    fd->has_prototype = false;
+    fd->has_home_object = true;
+
+    fd->has_arguments_binding = false;
+    fd->has_this_binding = true;
+    fd->is_derived_class_constructor = false;
+    fd->new_target_allowed = true;
+    fd->super_call_allowed = false;
     fd->super_allowed = fd->has_home_object;
-    fd->arguments_allowed = FALSE;
+    fd->arguments_allowed = false;
 
     fd->func_kind = JS_FUNC_NORMAL;
     fd->func_type = JS_PARSE_FUNC_METHOD;
@@ -32831,10 +32724,10 @@ static __exception int js_parse_function_decl2(JSParseState *s,
 {
     JSContext *ctx = s->ctx;
     JSFunctionDef *fd = s->cur_func;
-    BOOL is_expr;
+    bool is_expr;
     int func_idx, lexical_func_idx = -1;
-    BOOL has_opt_arg;
-    BOOL create_func_var = FALSE;
+    bool has_opt_arg;
+    bool create_func_var = false;
 
     is_expr = (func_type != JS_PARSE_FUNC_STATEMENT &&
                func_type != JS_PARSE_FUNC_VAR);
@@ -32844,7 +32737,7 @@ static __exception int js_parse_function_decl2(JSParseState *s,
         func_type == JS_PARSE_FUNC_EXPR) {
         if (func_kind == JS_FUNC_NORMAL &&
             token_is_pseudo_keyword(s, JS_ATOM_async) &&
-            peek_token(s, TRUE) != '\n') {
+            peek_token(s, true) != '\n') {
             if (next_token(s))
                 return -1;
             func_kind = JS_FUNC_ASYNC;
@@ -32903,10 +32796,10 @@ static __exception int js_parse_function_decl2(JSParseState *s,
     if (func_type == JS_PARSE_FUNC_VAR) {
         if (!fd->is_strict_mode
         && func_kind == JS_FUNC_NORMAL
-        &&  find_lexical_decl(ctx, fd, func_name, fd->scope_first, FALSE) < 0
+        &&  find_lexical_decl(ctx, fd, func_name, fd->scope_first, false) < 0
         &&  !((func_idx = find_var(ctx, fd, func_name)) >= 0 && (func_idx & ARGUMENT_VAR_OFFSET))
         &&  !(func_name == JS_ATOM_arguments && fd->has_arguments_binding)) {
-            create_func_var = TRUE;
+            create_func_var = true;
         }
         /* Create the lexical name here so that the function closure
            contains it */
@@ -32939,7 +32832,7 @@ static __exception int js_parse_function_decl2(JSParseState *s,
         }
     }
 
-    fd = js_new_function_def(ctx, fd, FALSE, is_expr, s->filename,
+    fd = js_new_function_def(ctx, fd, false, is_expr, s->filename,
                              function_line_num, function_col_num);
     if (!fd) {
         JS_FreeAtom(ctx, func_name);
@@ -32969,18 +32862,18 @@ static __exception int js_parse_function_decl2(JSParseState *s,
         fd->super_allowed = fd->parent->super_allowed;
         fd->arguments_allowed = fd->parent->arguments_allowed;
     } else if (func_type == JS_PARSE_FUNC_CLASS_STATIC_INIT) {
-        fd->new_target_allowed = TRUE; // although new.target === undefined
-        fd->super_call_allowed = FALSE;
-        fd->super_allowed = TRUE;
-        fd->arguments_allowed = FALSE;
+        fd->new_target_allowed = true; // although new.target === undefined
+        fd->super_call_allowed = false;
+        fd->super_allowed = true;
+        fd->arguments_allowed = false;
     } else {
-        fd->new_target_allowed = TRUE;
+        fd->new_target_allowed = true;
         fd->super_call_allowed = fd->is_derived_class_constructor;
         fd->super_allowed = fd->has_home_object;
-        fd->arguments_allowed = TRUE;
+        fd->arguments_allowed = true;
     }
 
-    /* fd->in_function_body == FALSE prevents yield/await during the parsing
+    /* fd->in_function_body == false prevents yield/await during the parsing
        of the arguments in generator/async functions. They are parsed as
        regular identifiers for other function kinds. */
     fd->func_kind = func_kind;
@@ -32997,9 +32890,9 @@ static __exception int js_parse_function_decl2(JSParseState *s,
     }
 
     /* parse arguments */
-    fd->has_simple_parameter_list = TRUE;
-    fd->has_parameter_expressions = FALSE;
-    has_opt_arg = FALSE;
+    fd->has_simple_parameter_list = true;
+    fd->has_parameter_expressions = false;
+    has_opt_arg = false;
     if (func_type == JS_PARSE_FUNC_ARROW && s->token.val == TOK_IDENT) {
         JSAtom name;
         if (s->token.u.ident.is_reserved) {
@@ -33015,9 +32908,9 @@ static __exception int js_parse_function_decl2(JSParseState *s,
             int skip_bits;
             /* if there is an '=' inside the parameter list, we
                consider there is a parameter expression inside */
-            js_parse_skip_parens_token(s, &skip_bits, FALSE);
+            js_parse_skip_parens_token(s, &skip_bits, false);
             if (skip_bits & SKIP_HAS_ASSIGNMENT)
-                fd->has_parameter_expressions = TRUE;
+                fd->has_parameter_expressions = true;
             if (next_token(s))
                 goto fail;
         } else {
@@ -33033,17 +32926,17 @@ static __exception int js_parse_function_decl2(JSParseState *s,
 
         while (s->token.val != ')') {
             JSAtom name;
-            BOOL rest = FALSE;
+            bool rest = false;
             int idx, has_initializer;
 
             if (s->token.val == TOK_ELLIPSIS) {
-                fd->has_simple_parameter_list = FALSE;
-                rest = TRUE;
+                fd->has_simple_parameter_list = false;
+                rest = true;
                 if (next_token(s))
                     goto fail;
             }
             if (s->token.val == '[' || s->token.val == '{') {
-                fd->has_simple_parameter_list = FALSE;
+                fd->has_simple_parameter_list = false;
                 if (rest) {
                     emit_op(s, OP_rest);
                     emit_u16(s, fd->arg_count);
@@ -33053,11 +32946,11 @@ static __exception int js_parse_function_decl2(JSParseState *s,
                     emit_op(s, OP_get_arg);
                     emit_u16(s, idx);
                 }
-                has_initializer = js_parse_destructuring_element(s, fd->has_parameter_expressions ? TOK_LET : TOK_VAR, 1, TRUE, -1, TRUE);
+                has_initializer = js_parse_destructuring_element(s, fd->has_parameter_expressions ? TOK_LET : TOK_VAR, true, true, -1, true, false);
                 if (has_initializer < 0)
                     goto fail;
                 if (has_initializer)
-                    has_opt_arg = TRUE;
+                    has_opt_arg = true;
                 if (!has_opt_arg)
                     fd->defined_arg_count++;
             } else if (s->token.val == TOK_IDENT) {
@@ -33093,13 +32986,13 @@ static __exception int js_parse_function_decl2(JSParseState *s,
                     }
                     emit_op(s, OP_put_arg);
                     emit_u16(s, idx);
-                    fd->has_simple_parameter_list = FALSE;
-                    has_opt_arg = TRUE;
+                    fd->has_simple_parameter_list = false;
+                    has_opt_arg = true;
                 } else if (s->token.val == '=') {
                     int label;
 
-                    fd->has_simple_parameter_list = FALSE;
-                    has_opt_arg = TRUE;
+                    fd->has_simple_parameter_list = false;
+                    has_opt_arg = true;
 
                     if (next_token(s))
                         goto fail;
@@ -33200,7 +33093,7 @@ static __exception int js_parse_function_decl2(JSParseState *s,
 
     /* in generators, yield expression is forbidden during the parsing
        of the arguments */
-    fd->in_function_body = TRUE;
+    fd->in_function_body = true;
     push_scope(s);  /* enter body scope */
     fd->body_scope = fd->scope_level;
 
@@ -33262,7 +33155,7 @@ static __exception int js_parse_function_decl2(JSParseState *s,
 
     /* in case there is no return, add one */
     if (js_is_live_code(s)) {
-        emit_return(s, FALSE);
+        emit_return(s, false);
     }
 done:
     s->cur_func = fd->parent;
@@ -33440,9 +33333,9 @@ static __exception int js_parse_program(JSParseState *s)
             emit_op(s, OP_get_loc);
             emit_u16(s, fd->eval_ret_idx);
         }
-        emit_return(s, TRUE);
+        emit_return(s, true);
     } else {
-        emit_return(s, FALSE);
+        emit_return(s, false);
     }
 
     return 0;
@@ -33450,12 +33343,12 @@ static __exception int js_parse_program(JSParseState *s)
 
 static void js_parse_init(JSContext *ctx, JSParseState *s,
                           const char *input, size_t input_len,
-                          const char *filename)
+                          const char *filename, int line)
 {
     memset(s, 0, sizeof(*s));
     s->ctx = ctx;
     s->filename = filename;
-    s->line_num = 1;
+    s->line_num = line;
     s->col_num = 1;
     s->buf_start = s->buf_ptr = (const uint8_t *)input;
     s->buf_end = s->buf_ptr + input_len;
@@ -33467,7 +33360,7 @@ static void js_parse_init(JSContext *ctx, JSParseState *s,
 }
 
 static JSValue JS_EvalFunctionInternal(JSContext *ctx, JSValue fun_obj,
-                                       JSValue this_obj,
+                                       JSValueConst this_obj,
                                        JSVarRef **var_refs, JSStackFrame *sf)
 {
     JSValue ret_val;
@@ -33505,9 +33398,9 @@ JSValue JS_EvalFunction(JSContext *ctx, JSValue fun_obj)
 
 /* 'input' must be zero terminated i.e. input[input_len] = '\0'. */
 /* `export_name` and `input` may be pure ASCII or UTF-8 encoded */
-static JSValue __JS_EvalInternal(JSContext *ctx, JSValue this_obj,
+static JSValue __JS_EvalInternal(JSContext *ctx, JSValueConst this_obj,
                                  const char *input, size_t input_len,
-                                 const char *filename, int flags, int scope_idx)
+                                 const char *filename, int line, int flags, int scope_idx)
 {
     JSParseState s1, *s = &s1;
     int err, eval_type;
@@ -33517,9 +33410,9 @@ static JSValue __JS_EvalInternal(JSContext *ctx, JSValue this_obj,
     JSFunctionBytecode *b;
     JSFunctionDef *fd;
     JSModuleDef *m;
-    BOOL is_strict_mode;
+    bool is_strict_mode;
 
-    js_parse_init(ctx, s, input, input_len, filename);
+    js_parse_init(ctx, s, input, input_len, filename, line);
     skip_shebang(&s->buf_ptr, s->buf_end);
 
     eval_type = flags & JS_EVAL_TYPE_MASK;
@@ -33546,10 +33439,10 @@ static JSValue __JS_EvalInternal(JSContext *ctx, JSValue this_obj,
             m = js_new_module_def(ctx, module_name);
             if (!m)
                 return JS_EXCEPTION;
-            is_strict_mode = TRUE;
+            is_strict_mode = true;
         }
     }
-    fd = js_new_function_def(ctx, NULL, TRUE, FALSE, filename, 1, 1);
+    fd = js_new_function_def(ctx, NULL, true, false, filename, line, 1);
     if (!fd)
         goto fail1;
     s->cur_func = fd;
@@ -33562,10 +33455,10 @@ static JSValue __JS_EvalInternal(JSContext *ctx, JSValue this_obj,
         fd->super_allowed = b->super_allowed;
         fd->arguments_allowed = b->arguments_allowed;
     } else {
-        fd->new_target_allowed = FALSE;
-        fd->super_call_allowed = FALSE;
-        fd->super_allowed = FALSE;
-        fd->arguments_allowed = TRUE;
+        fd->new_target_allowed = false;
+        fd->super_call_allowed = false;
+        fd->super_allowed = false;
+        fd->arguments_allowed = true;
     }
     fd->is_strict_mode = is_strict_mode;
     fd->func_name = JS_DupAtom(ctx, JS_ATOM__eval_);
@@ -33575,7 +33468,7 @@ static JSValue __JS_EvalInternal(JSContext *ctx, JSValue this_obj,
     }
     fd->module = m;
     if (m != NULL || (flags & JS_EVAL_FLAG_ASYNC)) {
-        fd->in_function_body = TRUE;
+        fd->in_function_body = true;
         fd->func_kind = JS_FUNC_ASYNC;
     }
     s->is_module = (m != NULL);
@@ -33620,19 +33513,25 @@ static JSValue __JS_EvalInternal(JSContext *ctx, JSValue this_obj,
 }
 
 /* the indirection is needed to make 'eval' optional */
-static JSValue JS_EvalInternal(JSContext *ctx, JSValue this_obj,
+static JSValue JS_EvalInternal(JSContext *ctx, JSValueConst this_obj,
                                const char *input, size_t input_len,
-                               const char *filename, int flags, int scope_idx)
+                               const char *filename, int line, int flags, int scope_idx)
 {
+    JSRuntime *rt = ctx->rt;
+
     if (unlikely(!ctx->eval_internal)) {
         return JS_ThrowTypeError(ctx, "eval is not supported");
     }
-    return ctx->eval_internal(ctx, this_obj, input, input_len, filename,
+    if (!rt->current_stack_frame) {
+        JS_FreeValueRT(rt, ctx->error_back_trace);
+        ctx->error_back_trace = JS_UNDEFINED;
+    }
+    return ctx->eval_internal(ctx, this_obj, input, input_len, filename, line,
                               flags, scope_idx);
 }
 
-static JSValue JS_EvalObject(JSContext *ctx, JSValue this_obj,
-                             JSValue val, int flags, int scope_idx)
+static JSValue JS_EvalObject(JSContext *ctx, JSValueConst this_obj,
+                             JSValueConst val, int flags, int scope_idx)
 {
     JSValue ret;
     const char *str;
@@ -33643,21 +33542,46 @@ static JSValue JS_EvalObject(JSContext *ctx, JSValue this_obj,
     str = JS_ToCStringLen(ctx, &len, val);
     if (!str)
         return JS_EXCEPTION;
-    ret = JS_EvalInternal(ctx, this_obj, str, len, "<input>", flags, scope_idx);
+    ret = JS_EvalInternal(ctx, this_obj, str, len, "<input>", 1, flags, scope_idx);
     JS_FreeCString(ctx, str);
     return ret;
 
 }
 
-JSValue JS_EvalThis(JSContext *ctx, JSValue this_obj,
+JSValue JS_EvalThis(JSContext *ctx, JSValueConst this_obj,
                     const char *input, size_t input_len,
                     const char *filename, int eval_flags)
 {
+    JSEvalOptions options = {
+        .version = JS_EVAL_OPTIONS_VERSION,
+        .filename = filename,
+        .line_num = 1,
+        .eval_flags = eval_flags
+    };
+    return JS_EvalThis2(ctx, this_obj, input, input_len, &options);
+}
+
+JSValue JS_EvalThis2(JSContext *ctx, JSValueConst this_obj,
+                     const char *input, size_t input_len,
+                     JSEvalOptions *options)
+{
+    const char *filename = "<unnamed>";
+    int line = 1;
+    int eval_flags = 0;
+    if (options) {
+        if (options->version != JS_EVAL_OPTIONS_VERSION)
+            return JS_ThrowInternalError(ctx, "bad JSEvalOptions version");
+        if (options->filename)
+            filename = options->filename;
+        if (options->line_num != 0)
+            line = options->line_num;
+        eval_flags = options->eval_flags;
+    }
     JSValue ret;
 
     assert((eval_flags & JS_EVAL_TYPE_MASK) == JS_EVAL_TYPE_GLOBAL ||
            (eval_flags & JS_EVAL_TYPE_MASK) == JS_EVAL_TYPE_MODULE);
-    ret = JS_EvalInternal(ctx, this_obj, input, input_len, filename,
+    ret = JS_EvalInternal(ctx, this_obj, input, input_len, filename, line,
                           eval_flags, -1);
     return ret;
 }
@@ -33665,11 +33589,21 @@ JSValue JS_EvalThis(JSContext *ctx, JSValue this_obj,
 JSValue JS_Eval(JSContext *ctx, const char *input, size_t input_len,
                 const char *filename, int eval_flags)
 {
-    return JS_EvalThis(ctx, ctx->global_obj, input, input_len, filename,
-                       eval_flags);
+    JSEvalOptions options = {
+        .version = JS_EVAL_OPTIONS_VERSION,
+        .filename = filename,
+        .line_num = 1,
+        .eval_flags = eval_flags
+    };
+    return JS_EvalThis2(ctx, ctx->global_obj, input, input_len, &options);
 }
 
-int JS_ResolveModule(JSContext *ctx, JSValue obj)
+JSValue JS_Eval2(JSContext *ctx, const char *input, size_t input_len, JSEvalOptions *options)
+{
+    return JS_EvalThis2(ctx, ctx->global_obj, input, input_len, options);
+}
+
+int JS_ResolveModule(JSContext *ctx, JSValueConst obj)
 {
     if (JS_VALUE_GET_TAG(obj) == JS_TAG_MODULE) {
         JSModuleDef *m = JS_VALUE_GET_PTR(obj);
@@ -33819,11 +33753,11 @@ typedef enum BCTagEnum {
 typedef struct BCWriterState {
     JSContext *ctx;
     DynBuf dbuf;
-    BOOL allow_bytecode : 8;
-    BOOL allow_sab : 8;
-    BOOL allow_reference : 8;
-    BOOL allow_source : 1;
-    BOOL allow_debug : 1;
+    bool allow_bytecode;
+    bool allow_sab;
+    bool allow_reference;
+    bool allow_source;
+    bool allow_debug;
     uint32_t first_atom;
     uint32_t *atom_to_idx;
     int atom_to_idx_size;
@@ -33833,11 +33767,11 @@ typedef struct BCWriterState {
     uint8_t **sab_tab;
     int sab_tab_len;
     int sab_tab_size;
-    /* list of referenced objects (used if allow_reference = TRUE) */
+    /* list of referenced objects (used if allow_reference = true) */
     JSObjectList object_list;
 } BCWriterState;
 
-#ifdef DUMP_READ_OBJECT
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
 static const char * const bc_tag_str[] = {
     "invalid",
     "null",
@@ -34023,11 +33957,6 @@ static void bc_byte_swap(uint8_t *bc_buf, int bc_len)
     }
 }
 
-static BOOL is_ic_op(uint8_t op)
-{
-    return op >= OP_get_field_ic && op <= OP_put_field_ic;
-}
-
 static int JS_WriteFunctionBytecode(BCWriterState *s,
                                     const JSFunctionBytecode *b)
 {
@@ -34058,16 +33987,6 @@ static int JS_WriteFunctionBytecode(BCWriterState *s,
             put_u32(bc_buf + pos + 1, val);
             break;
         default:
-            // IC (inline cache) opcodes should not end up in the serialized
-            // bytecode; translate them to their non-IC counterparts here
-            if (is_ic_op(op)) {
-                val = get_u32(bc_buf + pos + 1);
-                atom = get_ic_atom(b->ic, val);
-                if (bc_atom_to_idx(s, &val, atom))
-                    goto fail;
-                put_u32(bc_buf + pos + 1, val);
-                bc_buf[pos] -= (OP_get_field_ic - OP_get_field);
-            }
             break;
         }
         pos += len;
@@ -34091,13 +34010,13 @@ static void JS_WriteString(BCWriterState *s, JSString *p)
     bc_put_leb128(s, ((uint32_t)p->len << 1) | p->is_wide_char);
     if (p->is_wide_char) {
         for(i = 0; i < p->len; i++)
-            bc_put_u16(s, p->u.str16[i]);
+            bc_put_u16(s, str16(p)[i]);
     } else {
-        dbuf_put(&s->dbuf, p->u.str8, p->len);
+        dbuf_put(&s->dbuf, str8(p), p->len);
     }
 }
 
-static int JS_WriteBigInt(BCWriterState *s, JSValue obj)
+static int JS_WriteBigInt(BCWriterState *s, JSValueConst obj)
 {
     uint32_t tag, tag1;
     int64_t e;
@@ -34169,9 +34088,9 @@ static int JS_WriteBigInt(BCWriterState *s, JSValue obj)
     return 0;
 }
 
-static int JS_WriteObjectRec(BCWriterState *s, JSValue obj);
+static int JS_WriteObjectRec(BCWriterState *s, JSValueConst obj);
 
-static int JS_WriteFunctionTag(BCWriterState *s, JSValue obj)
+static int JS_WriteFunctionTag(BCWriterState *s, JSValueConst obj)
 {
     JSFunctionBytecode *b = JS_VALUE_GET_PTR(obj);
     uint32_t flags;
@@ -34264,7 +34183,7 @@ static int JS_WriteFunctionTag(BCWriterState *s, JSValue obj)
     return -1;
 }
 
-static int JS_WriteModule(BCWriterState *s, JSValue obj)
+static int JS_WriteModule(BCWriterState *s, JSValueConst obj)
 {
     JSModuleDef *m = JS_VALUE_GET_PTR(obj);
     int i;
@@ -34314,22 +34233,22 @@ static int JS_WriteModule(BCWriterState *s, JSValue obj)
     return -1;
 }
 
-static int JS_WriteArray(BCWriterState *s, JSValue obj)
+static int JS_WriteArray(BCWriterState *s, JSValueConst obj)
 {
     JSObject *p = JS_VALUE_GET_OBJ(obj);
     uint32_t i, len;
     JSValue val;
     int ret;
-    BOOL is_template;
+    bool is_template;
 
     if (s->allow_bytecode && !p->extensible) {
         /* not extensible array: we consider it is a
            template when we are saving bytecode */
         bc_put_u8(s, BC_TAG_TEMPLATE_OBJECT);
-        is_template = TRUE;
+        is_template = true;
     } else {
         bc_put_u8(s, BC_TAG_ARRAY);
-        is_template = FALSE;
+        is_template = false;
     }
     if (js_get_length32(s->ctx, &len, obj))
         goto fail1;
@@ -34357,7 +34276,7 @@ static int JS_WriteArray(BCWriterState *s, JSValue obj)
     return -1;
 }
 
-static int JS_WriteObjectTag(BCWriterState *s, JSValue obj)
+static int JS_WriteObjectTag(BCWriterState *s, JSValueConst obj)
 {
     JSObject *p = JS_VALUE_GET_OBJ(obj);
     uint32_t i, prop_count;
@@ -34394,7 +34313,7 @@ static int JS_WriteObjectTag(BCWriterState *s, JSValue obj)
     return -1;
 }
 
-static int JS_WriteTypedArray(BCWriterState *s, JSValue obj)
+static int JS_WriteTypedArray(BCWriterState *s, JSValueConst obj)
 {
     JSObject *p = JS_VALUE_GET_OBJ(obj);
     JSTypedArray *ta = p->u.typed_array;
@@ -34408,7 +34327,7 @@ static int JS_WriteTypedArray(BCWriterState *s, JSValue obj)
     return 0;
 }
 
-static int JS_WriteArrayBuffer(BCWriterState *s, JSValue obj)
+static int JS_WriteArrayBuffer(BCWriterState *s, JSValueConst obj)
 {
     JSObject *p = JS_VALUE_GET_OBJ(obj);
     JSArrayBuffer *abuf = p->u.array_buffer;
@@ -34423,7 +34342,7 @@ static int JS_WriteArrayBuffer(BCWriterState *s, JSValue obj)
     return 0;
 }
 
-static int JS_WriteSharedArrayBuffer(BCWriterState *s, JSValue obj)
+static int JS_WriteSharedArrayBuffer(BCWriterState *s, JSValueConst obj)
 {
     JSObject *p = JS_VALUE_GET_OBJ(obj);
     JSArrayBuffer *abuf = p->u.array_buffer;
@@ -34448,12 +34367,12 @@ static int JS_WriteRegExp(BCWriterState *s, JSRegExp regexp)
     JS_WriteString(s, regexp.pattern);
 
     if (is_be())
-        lre_byte_swap(bc->u.str8, bc->len, /*is_byte_swapped*/FALSE);
+        lre_byte_swap(str8(bc), bc->len, /*is_byte_swapped*/false);
 
     JS_WriteString(s, bc);
 
     if (is_be())
-        lre_byte_swap(bc->u.str8, bc->len, /*is_byte_swapped*/TRUE);
+        lre_byte_swap(str8(bc), bc->len, /*is_byte_swapped*/true);
 
     return 0;
 }
@@ -34461,7 +34380,7 @@ static int JS_WriteRegExp(BCWriterState *s, JSRegExp regexp)
 static int JS_WriteMap(BCWriterState *s, struct JSMapState *map_state);
 static int JS_WriteSet(BCWriterState *s, struct JSMapState *map_state);
 
-static int JS_WriteObjectRec(BCWriterState *s, JSValue obj)
+static int JS_WriteObjectRec(BCWriterState *s, JSValueConst obj)
 {
     uint32_t tag;
 
@@ -34573,8 +34492,7 @@ static int JS_WriteObjectRec(BCWriterState *s, JSValue obj)
                 ret = JS_WriteSet(s, p->u.map_state);
                 break;
             default:
-                if (p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-                    p->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+                if (is_typed_array(p->class_id)) {
                     ret = JS_WriteTypedArray(s, obj);
                 } else {
                     JS_ThrowTypeError(s->ctx, "unsupported object class");
@@ -34660,7 +34578,7 @@ static int JS_WriteObjectAtoms(BCWriterState *s)
     return -1;
 }
 
-uint8_t *JS_WriteObject2(JSContext *ctx, size_t *psize, JSValue obj,
+uint8_t *JS_WriteObject2(JSContext *ctx, size_t *psize, JSValueConst obj,
                          int flags, JSSABTab *psab_tab)
 {
     BCWriterState ss, *s = &ss;
@@ -34708,7 +34626,7 @@ uint8_t *JS_WriteObject2(JSContext *ctx, size_t *psize, JSValue obj,
     return NULL;
 }
 
-uint8_t *JS_WriteObject(JSContext *ctx, size_t *psize, JSValue obj,
+uint8_t *JS_WriteObject(JSContext *ctx, size_t *psize, JSValueConst obj,
                         int flags)
 {
     return JS_WriteObject2(ctx, psize, obj, flags, NULL);
@@ -34721,9 +34639,9 @@ typedef struct BCReaderState {
     uint32_t idx_to_atom_count;
     JSAtom *idx_to_atom;
     int error_state;
-    BOOL allow_sab : 8;
-    BOOL allow_bytecode : 8;
-    BOOL allow_reference : 8;
+    bool allow_sab;
+    bool allow_bytecode;
+    bool allow_reference;
     /* object references */
     JSObject **objects;
     int objects_count;
@@ -34732,17 +34650,17 @@ typedef struct BCReaderState {
     uint8_t **sab_tab;
     int sab_tab_len;
     int sab_tab_size;
-    /* used for DUMP_READ_OBJECT */
+    /* used for JS_DUMP_READ_OBJECT */
     const uint8_t *ptr_last;
     int level;
 } BCReaderState;
 
-#ifdef DUMP_READ_OBJECT
-static void __attribute__((format(printf, 2, 3))) bc_read_trace(BCReaderState *s, const char *fmt, ...) {
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
+static void JS_PRINTF_FORMAT_ATTR(2, 3) bc_read_trace(BCReaderState *s, JS_PRINTF_FORMAT const char *fmt, ...) {
     va_list ap;
     int i, n, n0;
 
-    if (!check_dump_flag(s->ctx->rt, DUMP_READ_OBJECT))
+    if (!check_dump_flag(s->ctx->rt, JS_DUMP_READ_OBJECT))
         return;
 
     if (!s->ptr_last)
@@ -34925,7 +34843,7 @@ static JSString *JS_ReadString(BCReaderState *s)
 {
     uint32_t len;
     size_t size;
-    BOOL is_wide_char;
+    bool is_wide_char;
     JSString *p;
 
     if (bc_get_leb128(s, &len))
@@ -34943,19 +34861,19 @@ static JSString *JS_ReadString(BCReaderState *s)
         js_free_string(s->ctx->rt, p);
         return NULL;
     }
-    memcpy(p->u.str8, s->ptr, size);
+    memcpy(str8(p), s->ptr, size);
     s->ptr += size;
     if (is_wide_char) {
         if (is_be()) {
             uint32_t i;
             for (i = 0; i < len; i++)
-                p->u.str16[i] = bswap16(p->u.str16[i]);
+                str16(p)[i] = bswap16(str16(p)[i]);
         }
     } else {
-        p->u.str8[size] = '\0'; /* add the trailing zero for 8 bit strings */
+        str8(p)[size] = '\0'; /* add the trailing zero for 8 bit strings */
     }
-#ifdef DUMP_READ_OBJECT
-    if (check_dump_flag(s->ctx->rt, DUMP_READ_OBJECT)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
+    if (check_dump_flag(s->ctx->rt, JS_DUMP_READ_OBJECT)) {
         bc_read_trace(s, "%s", ""); // hex dump and indentation
         JS_DumpString(s->ctx->rt, p);
         printf("\n");
@@ -35008,11 +34926,10 @@ static int JS_ReadFunctionBytecode(BCReaderState *s, JSFunctionBytecode *b,
             put_u32(bc_buf + pos + 1, atom);
             break;
         default:
-            assert(!is_ic_op(op)); // should not end up in serialized bytecode
             break;
         }
-#ifdef DUMP_READ_OBJECT
-        if (check_dump_flag(s->ctx->rt, DUMP_READ_OBJECT)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
+        if (check_dump_flag(s->ctx->rt, JS_DUMP_READ_OBJECT)) {
             const uint8_t *save_ptr = s->ptr;
             s->ptr = s->ptr_last + len;
             s->level -= 4;
@@ -35207,8 +35124,8 @@ static JSValue JS_ReadFunctionTag(BCReaderState *s)
 
     obj = JS_MKPTR(JS_TAG_FUNCTION_BYTECODE, b);
 
-#ifdef DUMP_READ_OBJECT
-    if (check_dump_flag(s->ctx->rt, DUMP_READ_OBJECT)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
+    if (check_dump_flag(s->ctx->rt, JS_DUMP_READ_OBJECT)) {
         if (b->func_name) {
             bc_read_trace(s, "name: ");
             print_atom(s->ctx, b->func_name);
@@ -35241,8 +35158,8 @@ static JSValue JS_ReadFunctionTag(BCReaderState *s)
             vd->is_const = bc_get_flags(v8, &idx, 1);
             vd->is_lexical = bc_get_flags(v8, &idx, 1);
             vd->is_captured = bc_get_flags(v8, &idx, 1);
-#ifdef DUMP_READ_OBJECT
-            if (check_dump_flag(s->ctx->rt, DUMP_READ_OBJECT)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
+            if (check_dump_flag(s->ctx->rt, JS_DUMP_READ_OBJECT)) {
                 bc_read_trace(s, "%3d  %d%c%c%c %4d  ",
                               i, vd->var_kind,
                               vd->is_const ? 'C' : '.',
@@ -35275,8 +35192,8 @@ static JSValue JS_ReadFunctionTag(BCReaderState *s)
             cv->is_const = bc_get_flags(v8, &idx, 1);
             cv->is_lexical = bc_get_flags(v8, &idx, 1);
             cv->var_kind = bc_get_flags(v8, &idx, 4);
-#ifdef DUMP_READ_OBJECT
-            if (check_dump_flag(s->ctx->rt, DUMP_READ_OBJECT)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
+            if (check_dump_flag(s->ctx->rt, JS_DUMP_READ_OBJECT)) {
                 bc_read_trace(s, "%3d  %d%c%c%c%c %3d  ",
                               i, cv->var_kind,
                               cv->is_local ? 'L' : '.',
@@ -35319,8 +35236,8 @@ static JSValue JS_ReadFunctionTag(BCReaderState *s)
         goto fail;
     if (bc_get_leb128_int(s, &b->col_num))
         goto fail;
-#ifdef DUMP_READ_OBJECT
-    if (check_dump_flag(s->ctx->rt, DUMP_READ_OBJECT)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
+    if (check_dump_flag(s->ctx->rt, JS_DUMP_READ_OBJECT)) {
         bc_read_trace(s, "filename: ");
         print_atom(s->ctx, b->filename);
         printf(", line: %d, column: %d\n", b->line_num, b->col_num);
@@ -35372,8 +35289,8 @@ static JSValue JS_ReadModule(BCReaderState *s)
 
     if (bc_get_atom(s, &module_name))
         goto fail;
-#ifdef DUMP_READ_OBJECT
-    if (check_dump_flag(s->ctx->rt, DUMP_READ_OBJECT)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
+    if (check_dump_flag(s->ctx->rt, JS_DUMP_READ_OBJECT)) {
         bc_read_trace(s, "name: ");
         print_atom(s->ctx, module_name);
         printf("\n");
@@ -35393,8 +35310,21 @@ static JSValue JS_ReadModule(BCReaderState *s)
             goto fail;
         for(i = 0; i < m->req_module_entries_count; i++) {
             JSReqModuleEntry *rme = &m->req_module_entries[i];
+            JSModuleDef **pm = &rme->module;
             if (bc_get_atom(s, &rme->module_name))
                 goto fail;
+            // Resolves a module either from the cache or by requesting
+            // it from the module loader. From cache is not ideal because
+            // the module may not be the one it was a time of serialization
+            // but directly petitioning the module loader is not correct
+            // either because then the same module can get loaded twice.
+            // JS_WriteModule() does not serialize modules transitively
+            // because that doesn't work for C modules and is also prone
+            // to loading the same JS module twice.
+            *pm = js_host_resolve_imported_module_atom(s->ctx, m->module_name,
+                                                       rme->module_name);
+            if (!*pm)
+                goto fail;
         }
     }
 
@@ -35488,8 +35418,8 @@ static JSValue JS_ReadObjectTag(BCReaderState *s)
     for(i = 0; i < prop_count; i++) {
         if (bc_get_atom(s, &atom))
             goto fail;
-#ifdef DUMP_READ_OBJECT
-        if (check_dump_flag(s->ctx->rt, DUMP_READ_OBJECT)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_READ_OBJECT
+        if (check_dump_flag(s->ctx->rt, JS_DUMP_READ_OBJECT)) {
             bc_read_trace(s, "propname: ");
             print_atom(s->ctx, atom);
             printf("\n");
@@ -35518,7 +35448,7 @@ static JSValue JS_ReadArray(BCReaderState *s, int tag)
     uint32_t len, i;
     JSValue val;
     int ret, prop_flags;
-    BOOL is_template;
+    bool is_template;
 
     obj = JS_NewArray(ctx);
     if (BC_add_object_ref(s, obj))
@@ -35561,7 +35491,7 @@ static JSValue JS_ReadTypedArray(BCReaderState *s)
     JSContext *ctx = s->ctx;
     JSValue obj = JS_UNDEFINED, array_buffer = JS_UNDEFINED;
     uint8_t array_tag;
-    JSValue args[3];
+    JSValueConst args[3];
     uint32_t offset, len, idx;
 
     if (bc_get_u8(s, &array_tag))
@@ -35630,7 +35560,7 @@ static JSValue JS_ReadArrayBuffer(BCReaderState *s)
                                        JS_CLASS_ARRAY_BUFFER,
                                        (uint8_t*)s->ptr,
                                        js_array_buffer_free, NULL,
-                                       /*alloc_flag*/TRUE);
+                                       /*alloc_flag*/true);
     if (JS_IsException(obj))
         goto fail;
     if (BC_add_object_ref(s, obj))
@@ -35674,7 +35604,7 @@ static JSValue JS_ReadSharedArrayBuffer(BCReaderState *s)
                                        byte_length, pmax_byte_length,
                                        JS_CLASS_SHARED_ARRAY_BUFFER,
                                        data_ptr,
-                                       NULL, NULL, FALSE);
+                                       NULL, NULL, false);
     if (JS_IsException(obj))
         goto fail;
     if (BC_add_object_ref(s, obj))
@@ -35708,7 +35638,7 @@ static JSValue JS_ReadRegExp(BCReaderState *s)
     }
 
     if (is_be())
-        lre_byte_swap(bc->u.str8, bc->len, /*is_byte_swapped*/TRUE);
+        lre_byte_swap(str8(bc), bc->len, /*is_byte_swapped*/true);
 
     return js_regexp_constructor_internal(ctx, JS_UNDEFINED,
                                           JS_MKPTR(JS_TAG_STRING, pattern),
@@ -36018,18 +35948,18 @@ JSValue JS_ReadObject(JSContext *ctx, const uint8_t *buf, size_t buf_len,
 /*******************************************************************/
 /* runtime functions & objects */
 
-static JSValue js_string_constructor(JSContext *ctx, JSValue this_val,
-                                     int argc, JSValue *argv);
-static JSValue js_boolean_constructor(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv);
-static JSValue js_number_constructor(JSContext *ctx, JSValue this_val,
-                                     int argc, JSValue *argv);
+static JSValue js_string_constructor(JSContext *ctx, JSValueConst this_val,
+                                     int argc, JSValueConst *argv);
+static JSValue js_boolean_constructor(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv);
+static JSValue js_number_constructor(JSContext *ctx, JSValueConst this_val,
+                                     int argc, JSValueConst *argv);
 
-static int check_function(JSContext *ctx, JSValue obj)
+static int check_function(JSContext *ctx, JSValueConst obj)
 {
     if (likely(JS_IsFunction(ctx, obj)))
         return 0;
-    JS_ThrowTypeError(ctx, "not a function");
+    JS_ThrowTypeErrorNotAFunction(ctx);
     return -1;
 }
 
@@ -36053,7 +35983,7 @@ static JSAtom find_atom(JSContext *ctx, const char *name)
         for(atom = JS_ATOM_Symbol_toPrimitive; atom < JS_ATOM_END; atom++) {
             JSAtomStruct *p = ctx->rt->atom_array[atom];
             JSString *str = p;
-            if (str->len == len && !memcmp(str->u.str8, name, len))
+            if (str->len == len && !memcmp(str8(str), name, len))
                 return JS_DupAtom(ctx, atom);
         }
         abort();
@@ -36245,8 +36175,8 @@ int JS_SetModuleExportList(JSContext *ctx, JSModuleDef *m,
 
 /* Note: 'func_obj' is not necessarily a constructor */
 static void JS_SetConstructor2(JSContext *ctx,
-                               JSValue func_obj,
-                               JSValue proto,
+                               JSValueConst func_obj,
+                               JSValueConst proto,
                                int proto_flags, int ctor_flags)
 {
     JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_prototype,
@@ -36257,8 +36187,8 @@ static void JS_SetConstructor2(JSContext *ctx,
     set_cycle_flag(ctx, proto);
 }
 
-void JS_SetConstructor(JSContext *ctx, JSValue func_obj,
-                       JSValue proto)
+void JS_SetConstructor(JSContext *ctx, JSValueConst func_obj,
+                       JSValueConst proto)
 {
     JS_SetConstructor2(ctx, func_obj, proto,
                        0, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
@@ -36267,18 +36197,18 @@ void JS_SetConstructor(JSContext *ctx, JSValue func_obj,
 static void JS_NewGlobalCConstructor2(JSContext *ctx,
                                       JSValue func_obj,
                                       const char *name,
-                                      JSValue proto)
+                                      JSValueConst proto)
 {
     JS_DefinePropertyValueStr(ctx, ctx->global_obj, name,
-                           js_dup(func_obj),
-                           JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+                              js_dup(func_obj),
+                              JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
     JS_SetConstructor(ctx, func_obj, proto);
     JS_FreeValue(ctx, func_obj);
 }
 
 static JSValue JS_NewGlobalCConstructor(JSContext *ctx, const char *name,
-                                             JSCFunction *func, int length,
-                                             JSValue proto)
+                                        JSCFunction *func, int length,
+                                        JSValueConst proto)
 {
     JSValue func_obj;
     func_obj = JS_NewCFunction2(ctx, func, name, length, JS_CFUNC_constructor_or_func, 0);
@@ -36287,8 +36217,8 @@ static JSValue JS_NewGlobalCConstructor(JSContext *ctx, const char *name,
 }
 
 static JSValue JS_NewGlobalCConstructorOnly(JSContext *ctx, const char *name,
-                                                 JSCFunction *func, int length,
-                                                 JSValue proto)
+                                            JSCFunction *func, int length,
+                                            JSValue proto)
 {
     JSValue func_obj;
     func_obj = JS_NewCFunction2(ctx, func, name, length, JS_CFUNC_constructor, 0);
@@ -36296,14 +36226,14 @@ static JSValue JS_NewGlobalCConstructorOnly(JSContext *ctx, const char *name,
     return func_obj;
 }
 
-static JSValue js_global_eval(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_global_eval(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
     return JS_EvalObject(ctx, ctx->global_obj, argv[0], JS_EVAL_TYPE_INDIRECT, -1);
 }
 
-static JSValue js_global_isNaN(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_global_isNaN(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     double d;
 
@@ -36312,10 +36242,10 @@ static JSValue js_global_isNaN(JSContext *ctx, JSValue this_val,
     return js_bool(isnan(d));
 }
 
-static JSValue js_global_isFinite(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_global_isFinite(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
-    BOOL res;
+    bool res;
     double d;
     if (unlikely(JS_ToFloat64(ctx, &d, argv[0])))
         return JS_EXCEPTION;
@@ -36324,13 +36254,13 @@ static JSValue js_global_isFinite(JSContext *ctx, JSValue this_val,
 }
 
 static JSValue js_microtask_job(JSContext *ctx,
-                                int argc, JSValue *argv)
+                                int argc, JSValueConst *argv)
 {
     return JS_Call(ctx, argv[0], ctx->global_obj, 0, NULL);
 }
 
-static JSValue js_global_queueMicrotask(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv)
+static JSValue js_global_queueMicrotask(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv)
 {
     if (check_function(ctx, argv[0]))
         return JS_EXCEPTION;
@@ -36341,7 +36271,7 @@ static JSValue js_global_queueMicrotask(JSContext *ctx, JSValue this_val,
 
 /* Object class */
 
-static JSValue JS_ToObject(JSContext *ctx, JSValue val)
+JSValue JS_ToObject(JSContext *ctx, JSValueConst val)
 {
     int tag = JS_VALUE_GET_NORM_TAG(val);
     JSValue obj;
@@ -36389,7 +36319,7 @@ static JSValue JS_ToObjectFree(JSContext *ctx, JSValue val)
 }
 
 static int js_obj_to_desc(JSContext *ctx, JSPropertyDescriptor *d,
-                          JSValue desc)
+                          JSValueConst desc)
 {
     JSValue val, getter, setter;
     int present;
@@ -36486,8 +36416,8 @@ static int js_obj_to_desc(JSContext *ctx, JSPropertyDescriptor *d,
     return -1;
 }
 
-static __exception int JS_DefinePropertyDesc(JSContext *ctx, JSValue obj,
-                                             JSAtom prop, JSValue desc,
+static __exception int JS_DefinePropertyDesc(JSContext *ctx, JSValueConst obj,
+                                             JSAtom prop, JSValueConst desc,
                                              int flags)
 {
     JSPropertyDescriptor d;
@@ -36503,8 +36433,8 @@ static __exception int JS_DefinePropertyDesc(JSContext *ctx, JSValue obj,
 }
 
 static __exception int JS_ObjectDefineProperties(JSContext *ctx,
-                                                 JSValue obj,
-                                                 JSValue properties)
+                                                 JSValueConst obj,
+                                                 JSValueConst properties)
 {
     JSValue props, desc;
     JSObject *p;
@@ -36544,8 +36474,8 @@ exception:
     return ret;
 }
 
-static JSValue js_object_constructor(JSContext *ctx, JSValue new_target,
-                                     int argc, JSValue *argv)
+static JSValue js_object_constructor(JSContext *ctx, JSValueConst new_target,
+                                     int argc, JSValueConst *argv)
 {
     JSValue ret;
     if (!JS_IsUndefined(new_target) &&
@@ -36567,10 +36497,10 @@ static JSValue js_object_constructor(JSContext *ctx, JSValue new_target,
     return ret;
 }
 
-static JSValue js_object_create(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_object_create(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
-    JSValue proto, props;
+    JSValueConst proto, props;
     JSValue obj;
 
     proto = argv[0];
@@ -36589,12 +36519,10 @@ static JSValue js_object_create(JSContext *ctx, JSValue this_val,
     return obj;
 }
 
-static JSValue js_object_getPrototypeOf(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv, int magic)
+static JSValue js_object_getPrototypeOf(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv, int magic)
 {
-    JSValue val;
-
-    val = argv[0];
+    JSValueConst val = argv[0];
     if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT) {
         /* ES6 feature non compatible with ES5.1: primitive types are
            accepted */
@@ -36605,21 +36533,20 @@ static JSValue js_object_getPrototypeOf(JSContext *ctx, JSValue this_val,
     return JS_GetPrototype(ctx, val);
 }
 
-static JSValue js_object_setPrototypeOf(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv)
+static JSValue js_object_setPrototypeOf(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv)
 {
-    JSValue obj;
-    obj = argv[0];
-    if (JS_SetPrototypeInternal(ctx, obj, argv[1], TRUE) < 0)
+    JSValueConst obj = argv[0];
+    if (JS_SetPrototypeInternal(ctx, obj, argv[1], true) < 0)
         return JS_EXCEPTION;
     return js_dup(obj);
 }
 
 /* magic = 1 if called as Reflect.defineProperty */
-static JSValue js_object_defineProperty(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv, int magic)
+static JSValue js_object_defineProperty(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv, int magic)
 {
-    JSValue obj, prop, desc;
+    JSValueConst obj, prop, desc;
     int ret, flags;
     JSAtom atom;
 
@@ -36646,24 +36573,22 @@ static JSValue js_object_defineProperty(JSContext *ctx, JSValue this_val,
     }
 }
 
-static JSValue js_object_defineProperties(JSContext *ctx, JSValue this_val,
-                                          int argc, JSValue *argv)
+static JSValue js_object_defineProperties(JSContext *ctx, JSValueConst this_val,
+                                          int argc, JSValueConst *argv)
 {
     // defineProperties(obj, properties)
-    JSValue obj = argv[0];
-
+    JSValueConst obj = argv[0];
     if (JS_ObjectDefineProperties(ctx, obj, argv[1]))
         return JS_EXCEPTION;
-    else
-        return js_dup(obj);
+    return js_dup(obj);
 }
 
 /* magic = 1 if called as __defineSetter__ */
-static JSValue js_object___defineGetter__(JSContext *ctx, JSValue this_val,
-                                          int argc, JSValue *argv, int magic)
+static JSValue js_object___defineGetter__(JSContext *ctx, JSValueConst this_val,
+                                          int argc, JSValueConst *argv, int magic)
 {
     JSValue obj;
-    JSValue prop, value, get, set;
+    JSValueConst prop, value, get, set;
     int ret, flags;
     JSAtom atom;
 
@@ -36705,10 +36630,10 @@ static JSValue js_object___defineGetter__(JSContext *ctx, JSValue this_val,
     }
 }
 
-static JSValue js_object_getOwnPropertyDescriptor(JSContext *ctx, JSValue this_val,
-                                                  int argc, JSValue *argv, int magic)
+static JSValue js_object_getOwnPropertyDescriptor(JSContext *ctx, JSValueConst this_val,
+                                                  int argc, JSValueConst *argv, int magic)
 {
-    JSValue prop;
+    JSValueConst prop;
     JSAtom atom;
     JSValue ret, obj;
     JSPropertyDescriptor desc;
@@ -36772,8 +36697,8 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_object_getOwnPropertyDescriptors(JSContext *ctx, JSValue this_val,
-                                                   int argc, JSValue *argv)
+static JSValue js_object_getOwnPropertyDescriptors(JSContext *ctx, JSValueConst this_val,
+                                                   int argc, JSValueConst *argv)
 {
     //getOwnPropertyDescriptors(obj)
     JSValue obj, r;
@@ -36795,7 +36720,7 @@ static JSValue js_object_getOwnPropertyDescriptors(JSContext *ctx, JSValue this_
         goto exception;
     for(i = 0; i < len; i++) {
         JSValue atomValue, desc;
-        JSValue args[2];
+        JSValueConst args[2];
 
         atomValue = JS_AtomToValue(ctx, props[i].atom);
         if (JS_IsException(atomValue))
@@ -36823,7 +36748,7 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue JS_GetOwnPropertyNames2(JSContext *ctx, JSValue obj1,
+static JSValue JS_GetOwnPropertyNames2(JSContext *ctx, JSValueConst obj1,
                                        int flags, int kind)
 {
     JSValue obj, r, val, key, value;
@@ -36902,27 +36827,27 @@ done:
     return r;
 }
 
-static JSValue js_object_getOwnPropertyNames(JSContext *ctx, JSValue this_val,
-                                             int argc, JSValue *argv)
+static JSValue js_object_getOwnPropertyNames(JSContext *ctx, JSValueConst this_val,
+                                             int argc, JSValueConst *argv)
 {
     return JS_GetOwnPropertyNames2(ctx, argv[0],
                                    JS_GPN_STRING_MASK, JS_ITERATOR_KIND_KEY);
 }
 
-static JSValue js_object_getOwnPropertySymbols(JSContext *ctx, JSValue this_val,
-                                             int argc, JSValue *argv)
+static JSValue js_object_getOwnPropertySymbols(JSContext *ctx, JSValueConst this_val,
+                                             int argc, JSValueConst *argv)
 {
     return JS_GetOwnPropertyNames2(ctx, argv[0],
                                    JS_GPN_SYMBOL_MASK, JS_ITERATOR_KIND_KEY);
 }
 
-static JSValue js_object_groupBy(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_object_groupBy(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
-    JSValue cb, res, iter, next, groups, k, v, prop;
-    JSValue args[2];
+    JSValue res, iter, next, groups, k, v, prop;
+    JSValueConst cb, args[2];
     int64_t idx;
-    BOOL done;
+    int done;
 
     // "is function?" check must be observed before argv[0] is accessed
     cb = argv[1];
@@ -36932,7 +36857,7 @@ static JSValue js_object_groupBy(JSContext *ctx, JSValue this_val,
     // TODO(bnoordhuis) add fast path for arrays but as groupBy() is
     // defined in terms of iterators, the fast path must check that
     // this[Symbol.iterator] is the built-in array iterator
-    iter = JS_GetIterator(ctx, argv[0], /*is_async*/FALSE);
+    iter = JS_GetIterator(ctx, argv[0], /*is_async*/false);
     if (JS_IsException(iter))
         return JS_EXCEPTION;
 
@@ -36979,7 +36904,7 @@ static JSValue js_object_groupBy(JSContext *ctx, JSValue this_val,
             }
         }
 
-        res = js_array_push(ctx, prop, 1, &v, /*unshift*/0);
+        res = js_array_push(ctx, prop, 1, vc(&v), /*unshift*/0);
         if (JS_IsException(res))
             goto exception;
         // res is an int64
@@ -37006,17 +36931,17 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_object_keys(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv, int kind)
+static JSValue js_object_keys(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv, int kind)
 {
     return JS_GetOwnPropertyNames2(ctx, argv[0],
                                    JS_GPN_ENUM_ONLY | JS_GPN_STRING_MASK, kind);
 }
 
-static JSValue js_object_isExtensible(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv, int reflect)
+static JSValue js_object_isExtensible(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv, int reflect)
 {
-    JSValue obj;
+    JSValueConst obj;
     int ret;
 
     obj = argv[0];
@@ -37033,10 +36958,10 @@ static JSValue js_object_isExtensible(JSContext *ctx, JSValue this_val,
         return js_bool(ret);
 }
 
-static JSValue js_object_preventExtensions(JSContext *ctx, JSValue this_val,
-                                           int argc, JSValue *argv, int reflect)
+static JSValue js_object_preventExtensions(JSContext *ctx, JSValueConst this_val,
+                                           int argc, JSValueConst *argv, int reflect)
 {
-    JSValue obj;
+    JSValueConst obj;
     int ret;
 
     obj = argv[0];
@@ -37058,13 +36983,13 @@ static JSValue js_object_preventExtensions(JSContext *ctx, JSValue this_val,
     }
 }
 
-static JSValue js_object_hasOwnProperty(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv)
+static JSValue js_object_hasOwnProperty(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv)
 {
     JSValue obj;
     JSAtom atom;
     JSObject *p;
-    BOOL ret;
+    int ret;
 
     atom = JS_ValueToAtom(ctx, argv[0]); /* must be done first */
     if (unlikely(atom == JS_ATOM_NULL))
@@ -37084,13 +37009,13 @@ static JSValue js_object_hasOwnProperty(JSContext *ctx, JSValue this_val,
         return js_bool(ret);
 }
 
-static JSValue js_object_hasOwn(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_object_hasOwn(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSValue obj;
     JSAtom atom;
     JSObject *p;
-    BOOL ret;
+    int ret;
 
     obj = JS_ToObject(ctx, argv[0]);
     if (JS_IsException(obj))
@@ -37110,14 +37035,14 @@ static JSValue js_object_hasOwn(JSContext *ctx, JSValue this_val,
         return js_bool(ret);
 }
 
-static JSValue js_object_valueOf(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_object_valueOf(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     return JS_ToObject(ctx, this_val);
 }
 
-static JSValue js_object_toString(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_object_toString(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     JSValue obj, tag;
     int is_array;
@@ -37132,7 +37057,7 @@ static JSValue js_object_toString(JSContext *ctx, JSValue this_val,
         obj = JS_ToObject(ctx, this_val);
         if (JS_IsException(obj))
             return obj;
-        is_array = JS_IsArray(ctx, obj);
+        is_array = js_is_array(ctx, obj);
         if (is_array < 0) {
             JS_FreeValue(ctx, obj);
             return JS_EXCEPTION;
@@ -37171,14 +37096,19 @@ static JSValue js_object_toString(JSContext *ctx, JSValue this_val,
     return JS_ConcatString3(ctx, "[object ", tag, "]");
 }
 
-static JSValue js_object_toLocaleString(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv)
+JSValue JS_ToObjectString(JSContext *ctx, JSValueConst val)
+{
+    return js_object_toString(ctx, val, 0, NULL);
+}
+
+static JSValue js_object_toLocaleString(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv)
 {
     return JS_Invoke(ctx, this_val, JS_ATOM_toString, 0, NULL);
 }
 
-static JSValue js_object_assign(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_object_assign(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     // Object.assign(obj, source1)
     JSValue obj, s;
@@ -37193,7 +37123,7 @@ static JSValue js_object_assign(JSContext *ctx, JSValue this_val,
             s = JS_ToObject(ctx, argv[i]);
             if (JS_IsException(s))
                 goto exception;
-            if (JS_CopyDataProperties(ctx, obj, s, JS_UNDEFINED, TRUE))
+            if (JS_CopyDataProperties(ctx, obj, s, JS_UNDEFINED, true))
                 goto exception;
             JS_FreeValue(ctx, s);
         }
@@ -37205,11 +37135,13 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_object_seal(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv, int freeze_flag)
+static JSValue js_object_seal(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv, int freeze_flag)
 {
-    JSValue obj = argv[0];
+    JSValueConst obj = argv[0];
     JSObject *p;
+    JSTypedArray *ta;
+    JSArrayBuffer *abuf;
     JSPropertyEnum *props;
     uint32_t len, i;
     int flags, desc_flags, res;
@@ -37230,6 +37162,13 @@ static JSValue js_object_seal(JSContext *ctx, JSValue this_val,
         return JS_ThrowTypeError(ctx, "proxy preventExtensions handler returned false");
     }
 
+    if (freeze_flag && is_typed_array(p->class_id)) {
+        ta = p->u.typed_array;
+        abuf = ta->buffer->u.array_buffer;
+        if (array_buffer_is_resizable(abuf) || typed_array_is_oob(p))
+            return JS_ThrowTypeError(ctx, "cannot freeze resizable typed array");
+    }
+
     flags = JS_GPN_STRING_MASK | JS_GPN_SYMBOL_MASK;
     if (JS_GetOwnPropertyNamesInternal(ctx, &props, &len, p, flags))
         return JS_EXCEPTION;
@@ -37261,10 +37200,10 @@ static JSValue js_object_seal(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_object_isSealed(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv, int is_frozen)
+static JSValue js_object_isSealed(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv, int is_frozen)
 {
-    JSValue obj = argv[0];
+    JSValueConst obj = argv[0];
     JSObject *p;
     JSPropertyEnum *props;
     uint32_t len, i;
@@ -37289,7 +37228,7 @@ static JSValue js_object_isSealed(JSContext *ctx, JSValue this_val,
             js_free_desc(ctx, &desc);
             if ((desc.flags & JS_PROP_CONFIGURABLE)
             ||  (is_frozen && (desc.flags & JS_PROP_WRITABLE))) {
-                res = FALSE;
+                res = false;
                 goto done;
             }
         }
@@ -37307,12 +37246,28 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_object_fromEntries(JSContext *ctx, JSValue this_val,
-                                     int argc, JSValue *argv)
+int JS_SealObject(JSContext *ctx, JSValueConst obj)
+{
+    JSValue value = js_object_seal(ctx, JS_UNDEFINED, 1, &obj, 0);
+    int result = JS_IsException(value) ? -1 : true;
+    JS_FreeValue(ctx, value);
+    return result;
+}
+
+int JS_FreezeObject(JSContext *ctx, JSValueConst obj)
+{
+    JSValue value = js_object_seal(ctx, JS_UNDEFINED, 1, &obj, 1);
+    int result = JS_IsException(value) ? -1 : true;
+    JS_FreeValue(ctx, value);
+    return result;
+}
+
+static JSValue js_object_fromEntries(JSContext *ctx, JSValueConst this_val,
+                                     int argc, JSValueConst *argv)
 {
     JSValue obj, iter, next_method = JS_UNDEFINED;
-    JSValue iterable;
-    BOOL done;
+    JSValueConst iterable;
+    int done;
 
     /*  RequireObjectCoercible() not necessary because it is tested in
         JS_GetIterator() by JS_GetProperty() */
@@ -37322,7 +37277,7 @@ static JSValue js_object_fromEntries(JSContext *ctx, JSValue this_val,
     if (JS_IsException(obj))
         return obj;
 
-    iter = JS_GetIterator(ctx, iterable, FALSE);
+    iter = JS_GetIterator(ctx, iterable, false);
     if (JS_IsException(iter))
         goto fail;
     next_method = JS_GetProperty(ctx, iter, JS_ATOM_next);
@@ -37367,7 +37322,7 @@ static JSValue js_object_fromEntries(JSContext *ctx, JSValue this_val,
  fail:
     if (JS_IsObject(iter)) {
         /* close the iterator object, preserving pending exception */
-        JS_IteratorClose(ctx, iter, TRUE);
+        JS_IteratorClose(ctx, iter, true);
     }
     JS_FreeValue(ctx, next_method);
     JS_FreeValue(ctx, iter);
@@ -37375,14 +37330,14 @@ static JSValue js_object_fromEntries(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_object_is(JSContext *ctx, JSValue this_val,
-                            int argc, JSValue *argv)
+static JSValue js_object_is(JSContext *ctx, JSValueConst this_val,
+                            int argc, JSValueConst *argv)
 {
     return js_bool(js_same_value(ctx, argv[0], argv[1]));
 }
 
-static JSValue JS_SpeciesConstructor(JSContext *ctx, JSValue obj,
-                                     JSValue defaultConstructor)
+static JSValue JS_SpeciesConstructor(JSContext *ctx, JSValueConst obj,
+                                     JSValueConst defaultConstructor)
 {
     JSValue ctor, species;
 
@@ -37410,7 +37365,7 @@ static JSValue JS_SpeciesConstructor(JSContext *ctx, JSValue obj,
     return species;
 }
 
-static JSValue js_object_get___proto__(JSContext *ctx, JSValue this_val)
+static JSValue js_object_get___proto__(JSContext *ctx, JSValueConst this_val)
 {
     JSValue val, ret;
 
@@ -37422,24 +37377,24 @@ static JSValue js_object_get___proto__(JSContext *ctx, JSValue this_val)
     return ret;
 }
 
-static JSValue js_object_set___proto__(JSContext *ctx, JSValue this_val,
-                                       JSValue proto)
+static JSValue js_object_set___proto__(JSContext *ctx, JSValueConst this_val,
+                                       JSValueConst proto)
 {
     if (JS_IsUndefined(this_val) || JS_IsNull(this_val))
         return JS_ThrowTypeErrorNotAnObject(ctx);
     if (!JS_IsObject(proto) && !JS_IsNull(proto))
         return JS_UNDEFINED;
-    if (JS_SetPrototypeInternal(ctx, this_val, proto, TRUE) < 0)
+    if (JS_SetPrototypeInternal(ctx, this_val, proto, true) < 0)
         return JS_EXCEPTION;
     else
         return JS_UNDEFINED;
 }
 
-static JSValue js_object_isPrototypeOf(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_object_isPrototypeOf(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
     JSValue obj, v1;
-    JSValue v;
+    JSValueConst v;
     int res;
 
     v = argv[0];
@@ -37454,11 +37409,11 @@ static JSValue js_object_isPrototypeOf(JSContext *ctx, JSValue this_val,
         if (JS_IsException(v1))
             goto exception;
         if (JS_IsNull(v1)) {
-            res = FALSE;
+            res = false;
             break;
         }
         if (JS_VALUE_GET_OBJ(obj) == JS_VALUE_GET_OBJ(v1)) {
-            res = TRUE;
+            res = true;
             break;
         }
         /* avoid infinite loop (possible with proxies) */
@@ -37475,8 +37430,8 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_object_propertyIsEnumerable(JSContext *ctx, JSValue this_val,
-                                              int argc, JSValue *argv)
+static JSValue js_object_propertyIsEnumerable(JSContext *ctx, JSValueConst this_val,
+                                              int argc, JSValueConst *argv)
 {
     JSValue obj, res = JS_EXCEPTION;
     JSAtom prop = JS_ATOM_NULL;
@@ -37506,8 +37461,8 @@ exception:
     return res;
 }
 
-static JSValue js_object___lookupGetter__(JSContext *ctx, JSValue this_val,
-                                          int argc, JSValue *argv, int setter)
+static JSValue js_object___lookupGetter__(JSContext *ctx, JSValueConst this_val,
+                                          int argc, JSValueConst *argv, int setter)
 {
     JSValue obj, res = JS_EXCEPTION;
     JSAtom prop = JS_ATOM_NULL;
@@ -37593,15 +37548,15 @@ static const JSCFunctionListEntry js_object_proto_funcs[] = {
 
 /* Function class */
 
-static JSValue js_function_proto(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_function_proto(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     return JS_UNDEFINED;
 }
 
 /* XXX: add a specific eval mode so that Function("}), ({") is rejected */
-static JSValue js_function_constructor(JSContext *ctx, JSValue new_target,
-                                       int argc, JSValue *argv, int magic)
+static JSValue js_function_constructor(JSContext *ctx, JSValueConst new_target,
+                                       int argc, JSValueConst *argv, int magic)
 {
     JSFunctionKindEnum func_kind = magic;
     int i, n, ret;
@@ -37656,7 +37611,7 @@ static JSValue js_function_constructor(JSContext *ctx, JSValue new_target,
                 goto fail1;
             proto = js_dup(realm->class_proto[func_kind_to_class_id[func_kind]]);
         }
-        ret = JS_SetPrototypeInternal(ctx, obj, proto, TRUE);
+        ret = JS_SetPrototypeInternal(ctx, obj, proto, true);
         JS_FreeValue(ctx, proto);
         if (ret < 0)
             goto fail1;
@@ -37671,7 +37626,7 @@ static JSValue js_function_constructor(JSContext *ctx, JSValue new_target,
 }
 
 static __exception int js_get_length32(JSContext *ctx, uint32_t *pres,
-                                       JSValue obj)
+                                       JSValueConst obj)
 {
     JSValue len_val;
     len_val = JS_GetProperty(ctx, obj, JS_ATOM_length);
@@ -37683,7 +37638,7 @@ static __exception int js_get_length32(JSContext *ctx, uint32_t *pres,
 }
 
 static __exception int js_get_length64(JSContext *ctx, int64_t *pres,
-                                       JSValue obj)
+                                       JSValueConst obj)
 {
     JSValue len_val;
     len_val = JS_GetProperty(ctx, obj, JS_ATOM_length);
@@ -37694,7 +37649,8 @@ static __exception int js_get_length64(JSContext *ctx, int64_t *pres,
     return JS_ToLengthFree(ctx, pres, len_val);
 }
 
-static __exception int js_set_length64(JSContext *ctx, JSValue obj, int64_t len)
+static __exception int js_set_length64(JSContext *ctx, JSValueConst obj,
+                                       int64_t len)
 {
     return JS_SetProperty(ctx, obj, JS_ATOM_length, js_int64(len));
 }
@@ -37710,7 +37666,7 @@ static void free_arg_list(JSContext *ctx, JSValue *tab, uint32_t len)
 
 /* XXX: should use ValueArray */
 static JSValue *build_arg_list(JSContext *ctx, uint32_t *plen,
-                               JSValue array_arg)
+                               JSValueConst array_arg)
 {
     uint32_t len, i;
     JSValue *tab, ret;
@@ -37755,10 +37711,10 @@ static JSValue *build_arg_list(JSContext *ctx, uint32_t *plen,
 
 /* magic value: 0 = normal apply, 1 = apply for constructor, 2 =
    Reflect.apply */
-static JSValue js_function_apply(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv, int magic)
+static JSValue js_function_apply(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv, int magic)
 {
-    JSValue this_arg, array_arg;
+    JSValueConst this_arg, array_arg;
     uint32_t len;
     JSValue *tab, ret;
 
@@ -37774,16 +37730,16 @@ static JSValue js_function_apply(JSContext *ctx, JSValue this_val,
     if (!tab)
         return JS_EXCEPTION;
     if (magic & 1) {
-        ret = JS_CallConstructor2(ctx, this_val, this_arg, len, tab);
+        ret = JS_CallConstructor2(ctx, this_val, this_arg, len, vc(tab));
     } else {
-        ret = JS_Call(ctx, this_val, this_arg, len, tab);
+        ret = JS_Call(ctx, this_val, this_arg, len, vc(tab));
     }
     free_arg_list(ctx, tab, len);
     return ret;
 }
 
-static JSValue js_function_call(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_function_call(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     if (argc <= 0) {
         return JS_Call(ctx, this_val, JS_UNDEFINED, 0, NULL);
@@ -37792,8 +37748,8 @@ static JSValue js_function_call(JSContext *ctx, JSValue this_val,
     }
 }
 
-static JSValue js_function_bind(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_function_bind(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSBoundFunction *bf;
     JSValue func_obj, name1, len_val;
@@ -37877,8 +37833,8 @@ static JSValue js_function_bind(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_function_toString(JSContext *ctx, JSValue this_val,
-                                    int argc, JSValue *argv)
+static JSValue js_function_toString(JSContext *ctx, JSValueConst this_val,
+                                    int argc, JSValueConst *argv)
 {
     JSObject *p;
     JSFunctionKindEnum func_kind = JS_FUNC_NORMAL;
@@ -37920,8 +37876,8 @@ static JSValue js_function_toString(JSContext *ctx, JSValue this_val,
     }
 }
 
-static JSValue js_function_hasInstance(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_function_hasInstance(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
     int ret;
     ret = JS_OrdinaryIsInstanceOf(ctx, argv[0], this_val);
@@ -37946,14 +37902,14 @@ static const JSCFunctionListEntry js_function_proto_funcs[] = {
 
 /* Error class */
 
-static JSValue iterator_to_array(JSContext *ctx, JSValue items)
+static JSValue iterator_to_array(JSContext *ctx, JSValueConst items)
 {
     JSValue iter, next_method = JS_UNDEFINED;
     JSValue v, r = JS_UNDEFINED;
     int64_t k;
-    BOOL done;
+    int done;
 
-    iter = JS_GetIterator(ctx, items, FALSE);
+    iter = JS_GetIterator(ctx, items, false);
     if (JS_IsException(iter))
         goto exception;
     next_method = JS_GetProperty(ctx, iter, JS_ATOM_next);
@@ -37977,20 +37933,19 @@ static JSValue iterator_to_array(JSContext *ctx, JSValue items)
     JS_FreeValue(ctx, iter);
     return r;
  exception_close:
-    JS_IteratorClose(ctx, iter, TRUE);
+    JS_IteratorClose(ctx, iter, true);
  exception:
     JS_FreeValue(ctx, r);
     r = JS_EXCEPTION;
     goto done;
 }
 
-static JSValue js_error_constructor(JSContext *ctx, JSValue new_target,
-                                    int argc, JSValue *argv, int magic)
+static JSValue js_error_constructor(JSContext *ctx, JSValueConst new_target,
+                                    int argc, JSValueConst *argv, int magic)
 {
     JSValue obj, msg, proto, cause;
-    JSValue message;
-    int opts;
-    BOOL present;
+    JSValueConst message;
+    int present, opts;
 
     if (JS_IsUndefined(new_target))
         new_target = JS_GetActiveFunction(ctx);
@@ -38061,8 +38016,8 @@ static JSValue js_error_constructor(JSContext *ctx, JSValue new_target,
     return JS_EXCEPTION;
 }
 
-static JSValue js_error_toString(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_error_toString(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSValue name, msg;
 
@@ -38096,13 +38051,13 @@ static const JSCFunctionListEntry js_error_proto_funcs[] = {
     JS_PROP_STRING_DEF("message", "", JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE ),
 };
 
-static JSValue js_error_isError(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_error_isError(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     return js_bool(JS_IsError(ctx, argv[0]));
 }
 
-static JSValue js_error_get_stackTraceLimit(JSContext *ctx, JSValue this_val)
+static JSValue js_error_get_stackTraceLimit(JSContext *ctx, JSValueConst this_val)
 {
     JSValue val;
 
@@ -38110,21 +38065,18 @@ static JSValue js_error_get_stackTraceLimit(JSContext *ctx, JSValue this_val)
     if (JS_IsException(val))
         return val;
     JS_FreeValue(ctx, val);
-    return js_int32(ctx->error_stack_trace_limit);
+    return js_dup(ctx->error_stack_trace_limit);
 }
 
-static JSValue js_error_set_stackTraceLimit(JSContext *ctx, JSValue this_val, JSValue value)
+static JSValue js_error_set_stackTraceLimit(JSContext *ctx, JSValueConst this_val, JSValueConst value)
 {
     if (JS_IsUndefined(this_val) || JS_IsNull(this_val))
         return JS_ThrowTypeErrorNotAnObject(ctx);
-    int limit;
-    if (JS_ToInt32(ctx, &limit, value) < 0)
-        return JS_EXCEPTION;
-    ctx->error_stack_trace_limit = limit;
+    ctx->error_stack_trace_limit = js_dup(value);
     return JS_UNDEFINED;
 }
 
-static JSValue js_error_get_prepareStackTrace(JSContext *ctx, JSValue this_val)
+static JSValue js_error_get_prepareStackTrace(JSContext *ctx, JSValueConst this_val)
 {
     JSValue val;
 
@@ -38135,7 +38087,7 @@ static JSValue js_error_get_prepareStackTrace(JSContext *ctx, JSValue this_val)
     return js_dup(ctx->error_prepare_stack);
 }
 
-static JSValue js_error_set_prepareStackTrace(JSContext *ctx, JSValue this_val, JSValue value)
+static JSValue js_error_set_prepareStackTrace(JSContext *ctx, JSValueConst this_val, JSValueConst value)
 {
     if (JS_IsUndefined(this_val) || JS_IsNull(this_val))
         return JS_ThrowTypeErrorNotAnObject(ctx);
@@ -38144,10 +38096,10 @@ static JSValue js_error_set_prepareStackTrace(JSContext *ctx, JSValue this_val,
     return JS_UNDEFINED;
 }
 
-static JSValue js_error_capture_stack_trace(JSContext *ctx, JSValue this_val,
-                                            int argc, JSValue *argv)
+static JSValue js_error_capture_stack_trace(JSContext *ctx, JSValueConst this_val,
+                                            int argc, JSValueConst *argv)
 {
-    JSValue v = argv[0];
+    JSValueConst v = argv[0];
     if (JS_VALUE_GET_TAG(v) != JS_TAG_OBJECT)
         return JS_ThrowTypeErrorNotAnObject(ctx);
     build_backtrace(ctx, v, argv[1], NULL, 0, 0, JS_BACKTRACE_FLAG_SKIP_FIRST_LEVEL|JS_BACKTRACE_FLAG_FILTER_FUNC);
@@ -38165,7 +38117,7 @@ static const JSCFunctionListEntry js_error_funcs[] = {
 
 /* used by C code. */
 static JSValue js_aggregate_error_constructor(JSContext *ctx,
-                                              JSValue errors)
+                                              JSValueConst errors)
 {
     JSValue obj;
 
@@ -38251,8 +38203,8 @@ static int JS_CopySubArray(JSContext *ctx,
     return -1;
 }
 
-static JSValue js_array_constructor(JSContext *ctx, JSValue new_target,
-                                    int argc, JSValue *argv)
+static JSValue js_array_constructor(JSContext *ctx, JSValueConst new_target,
+                                    int argc, JSValueConst *argv)
 {
     JSValue obj;
     int i;
@@ -38262,7 +38214,7 @@ static JSValue js_array_constructor(JSContext *ctx, JSValue new_target,
         return obj;
     if (argc == 1 && JS_IsNumber(argv[0])) {
         uint32_t len;
-        if (JS_ToArrayLengthFree(ctx, &len, js_dup(argv[0]), TRUE))
+        if (JS_ToArrayLengthFree(ctx, &len, js_dup(argv[0]), true))
             goto fail;
         if (JS_SetProperty(ctx, obj, JS_ATOM_length, js_uint32(len)) < 0)
             goto fail;
@@ -38278,18 +38230,18 @@ fail:
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_from(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_array_from(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     // from(items, mapfn = void 0, this_arg = void 0)
-    JSValue items = argv[0], mapfn, this_arg;
-    JSValue args[2];
+    JSValueConst items = argv[0], mapfn, this_arg;
+    JSValueConst args[2];
     JSValue stack[2];
     JSValue iter, r, v, v2, arrayLike;
     int64_t k, len;
     int done, mapping;
 
-    mapping = FALSE;
+    mapping = false;
     mapfn = JS_UNDEFINED;
     this_arg = JS_UNDEFINED;
     r = JS_UNDEFINED;
@@ -38319,7 +38271,7 @@ static JSValue js_array_from(JSContext *ctx, JSValue this_val,
         if (JS_IsException(r))
             goto exception;
         stack[0] = js_dup(items);
-        if (js_for_of_start(ctx, &stack[1], FALSE))
+        if (js_for_of_start(ctx, &stack[1], false))
             goto exception;
         for (k = 0;; k++) {
             v = JS_IteratorNext(ctx, stack[0], stack[1], 0, NULL, &done);
@@ -38380,7 +38332,7 @@ static JSValue js_array_from(JSContext *ctx, JSValue this_val,
 
  exception_close:
     if (!JS_IsUndefined(stack[0]))
-        JS_IteratorClose(ctx, stack[0], TRUE);
+        JS_IteratorClose(ctx, stack[0], true);
  exception:
     JS_FreeValue(ctx, r);
     r = JS_EXCEPTION;
@@ -38391,15 +38343,15 @@ static JSValue js_array_from(JSContext *ctx, JSValue this_val,
     return r;
 }
 
-static JSValue js_array_of(JSContext *ctx, JSValue this_val,
-                           int argc, JSValue *argv)
+static JSValue js_array_of(JSContext *ctx, JSValueConst this_val,
+                           int argc, JSValueConst *argv)
 {
-    JSValue obj, args[1];
+    JSValue n, obj;
     int i;
 
     if (JS_IsConstructor(ctx, this_val)) {
-        args[0] = js_int32(argc);
-        obj = JS_CallConstructor(ctx, this_val, 1, args);
+        n = js_int32(argc);
+        obj = JS_CallConstructor(ctx, this_val, 1, vc(&n));
     } else {
         obj = JS_NewArray(ctx);
     }
@@ -38419,31 +38371,30 @@ static JSValue js_array_of(JSContext *ctx, JSValue this_val,
     return obj;
 }
 
-static JSValue js_array_isArray(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_array_isArray(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     int ret;
-    ret = JS_IsArray(ctx, argv[0]);
+    ret = js_is_array(ctx, argv[0]);
     if (ret < 0)
         return JS_EXCEPTION;
     else
         return js_bool(ret);
 }
 
-static JSValue js_get_this(JSContext *ctx,
-                           JSValue this_val)
+static JSValue js_get_this(JSContext *ctx, JSValueConst this_val)
 {
     return js_dup(this_val);
 }
 
-static JSValue JS_ArraySpeciesCreate(JSContext *ctx, JSValue obj,
-                                     JSValue len_val)
+static JSValue JS_ArraySpeciesCreate(JSContext *ctx, JSValueConst obj,
+                                     JSValueConst len_val)
 {
     JSValue ctor, ret, species;
     int res;
     JSContext *realm;
 
-    res = JS_IsArray(ctx, obj);
+    res = js_is_array(ctx, obj);
     if (res < 0)
         return JS_EXCEPTION;
     if (!res)
@@ -38489,22 +38440,22 @@ static const JSCFunctionListEntry js_array_funcs[] = {
     JS_CGETSET_DEF("[Symbol.species]", js_get_this, NULL ),
 };
 
-static int JS_isConcatSpreadable(JSContext *ctx, JSValue obj)
+static int JS_isConcatSpreadable(JSContext *ctx, JSValueConst obj)
 {
     JSValue val;
 
     if (!JS_IsObject(obj))
-        return FALSE;
+        return false;
     val = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_isConcatSpreadable);
     if (JS_IsException(val))
         return -1;
     if (!JS_IsUndefined(val))
         return JS_ToBoolFree(ctx, val);
-    return JS_IsArray(ctx, obj);
+    return js_is_array(ctx, obj);
 }
 
-static JSValue js_array_at(JSContext *ctx, JSValue this_val,
-                           int argc, JSValue *argv)
+static JSValue js_array_at(JSContext *ctx, JSValueConst this_val,
+                           int argc, JSValueConst *argv)
 {
     JSValue obj, ret;
     int64_t len, idx;
@@ -38531,8 +38482,8 @@ static JSValue js_array_at(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_array_with(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_array_with(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     JSValue arr, obj, ret, *arrp, *pval;
     JSObject *p;
@@ -38605,11 +38556,11 @@ exception:
     return ret;
 }
 
-static JSValue js_array_concat(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_array_concat(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     JSValue obj, arr, val;
-    JSValue e;
+    JSValueConst e;
     int64_t len, k, n;
     int i, res;
 
@@ -38678,14 +38629,13 @@ exception:
 #define special_filter   4
 #define special_TA       8
 
-static JSObject *get_typed_array(JSContext *ctx, JSValue this_val)
+static JSObject *get_typed_array(JSContext *ctx, JSValueConst this_val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(this_val) != JS_TAG_OBJECT)
         goto fail;
     p = JS_VALUE_GET_OBJ(this_val);
-    if (!(p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-          p->class_id <= JS_CLASS_FLOAT64_ARRAY)) {
+    if (!is_typed_array(p->class_id)) {
     fail:
         JS_ThrowTypeError(ctx, "not a TypedArray");
         return NULL;
@@ -38701,7 +38651,7 @@ static JSObject *get_typed_array(JSContext *ctx, JSValue this_val)
 // Exclusively reading or writing elements with JS_GetProperty,
 // JS_GetPropertyInt64, JS_SetProperty, etc. is safe because they
 // perform bounds checks, as does js_get_fast_array_element.
-static int js_typed_array_get_length_unsafe(JSContext *ctx, JSValue obj)
+static int js_typed_array_get_length_unsafe(JSContext *ctx, JSValueConst obj)
 {
     JSObject *p;
     p = get_typed_array(ctx, obj);
@@ -38715,15 +38665,15 @@ static int js_typed_array_get_length_unsafe(JSContext *ctx, JSValue obj)
 }
 
 static JSValue js_typed_array___speciesCreate(JSContext *ctx,
-                                              JSValue this_val,
-                                              int argc, JSValue *argv);
+                                              JSValueConst this_val,
+                                              int argc, JSValueConst *argv);
 
-static JSValue js_array_every(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv, int special)
+static JSValue js_array_every(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv, int special)
 {
     JSValue obj, val, index_val, res, ret;
-    JSValue args[3];
-    JSValue func, this_arg;
+    JSValueConst args[3];
+    JSValueConst func, this_arg;
     int64_t len, k, n;
     int present;
 
@@ -38787,7 +38737,7 @@ static JSValue js_array_every(JSContext *ctx, JSValue this_val,
             val = JS_GetPropertyInt64(ctx, obj, k);
             if (JS_IsException(val))
                 goto exception;
-            present = TRUE;
+            present = true;
         } else {
             present = JS_TryGetPropertyInt64(ctx, obj, k, &val);
             if (present < 0)
@@ -38871,12 +38821,12 @@ exception:
 #define special_reduce       0
 #define special_reduceRight  1
 
-static JSValue js_array_reduce(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv, int special)
+static JSValue js_array_reduce(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv, int special)
 {
     JSValue obj, val, index_val, acc, acc1;
-    JSValue args[4];
-    JSValue func;
+    JSValueConst args[4];
+    JSValueConst func;
     int64_t len, k, k1;
     int present;
 
@@ -38928,7 +38878,7 @@ static JSValue js_array_reduce(JSContext *ctx, JSValue this_val,
             val = JS_GetPropertyInt64(ctx, obj, k1);
             if (JS_IsException(val))
                 goto exception;
-            present = TRUE;
+            present = true;
         } else {
             present = JS_TryGetPropertyInt64(ctx, obj, k1, &val);
             if (present < 0)
@@ -38960,8 +38910,8 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_fill(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_array_fill(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     JSValue obj;
     int64_t len, start, end;
@@ -38995,8 +38945,8 @@ static JSValue js_array_fill(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_includes(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_array_includes(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSValue obj, val;
     int64_t len, n;
@@ -39008,7 +38958,7 @@ static JSValue js_array_includes(JSContext *ctx, JSValue this_val,
     if (js_get_length64(ctx, &len, obj))
         goto exception;
 
-    res = TRUE;
+    res = true;
     if (len > 0) {
         n = 0;
         if (argc > 1) {
@@ -39033,7 +38983,7 @@ static JSValue js_array_includes(JSContext *ctx, JSValue this_val,
             }
         }
     }
-    res = FALSE;
+    res = false;
  done:
     JS_FreeValue(ctx, obj);
     return js_bool(res);
@@ -39043,8 +38993,8 @@ static JSValue js_array_includes(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_indexOf(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_array_indexOf(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSValue obj, val;
     int64_t len, n;
@@ -39090,8 +39040,8 @@ static JSValue js_array_indexOf(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_lastIndexOf(JSContext *ctx, JSValue this_val,
-                                    int argc, JSValue *argv)
+static JSValue js_array_lastIndexOf(JSContext *ctx, JSValueConst this_val,
+                                    int argc, JSValueConst *argv)
 {
     JSValue obj, val;
     int64_t len, n;
@@ -39144,11 +39094,11 @@ enum {
     ArrayFindLastIndex,
 };
 
-static JSValue js_array_find(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv, int mode)
+static JSValue js_array_find(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv, int mode)
 {
-    JSValue func, this_arg;
-    JSValue args[3];
+    JSValueConst func, this_arg;
+    JSValueConst args[3];
     JSValue obj, val, index_val, res;
     int64_t len, k, end;
     int dir;
@@ -39215,8 +39165,8 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_toString(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_array_toString(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSValue obj, method, ret;
 
@@ -39238,8 +39188,8 @@ static JSValue js_array_toString(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_array_join(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv, int toLocaleString)
+static JSValue js_array_join(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv, int toLocaleString)
 {
     JSValue obj, sep = JS_UNDEFINED, el;
     StringBuffer b_s, *b = &b_s;
@@ -39258,7 +39208,7 @@ static JSValue js_array_join(JSContext *ctx, JSValue this_val,
             goto exception;
         p = JS_VALUE_GET_STRING(sep);
         if (p->len == 1 && !p->is_wide_char)
-            c = p->u.str8[0];
+            c = str8(p)[0];
         else
             c = -1;
     }
@@ -39295,8 +39245,8 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_pop(JSContext *ctx, JSValue this_val,
-                            int argc, JSValue *argv, int shift)
+static JSValue js_array_pop(JSContext *ctx, JSValueConst this_val,
+                            int argc, JSValueConst *argv, int shift)
 {
     JSValue obj, res = JS_UNDEFINED;
     int64_t len, newLen;
@@ -39348,8 +39298,8 @@ static JSValue js_array_pop(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_push(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv, int unshift)
+static JSValue js_array_push(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv, int unshift)
 {
     JSValue obj;
     int i;
@@ -39384,8 +39334,8 @@ static JSValue js_array_push(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_reverse(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_array_reverse(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSValue obj, lval, hval;
     JSValue *arrp;
@@ -39457,8 +39407,8 @@ static JSValue js_array_reverse(JSContext *ctx, JSValue this_val,
 // leaves holes in sparse arrays intact whereas a.toReversed() replaces them
 // with undefined, thus in effect creating a dense array.
 // Does not use Array[@@species], always returns a base Array.
-static JSValue js_array_toReversed(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_array_toReversed(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     JSValue arr, obj, ret, *arrp, *pval;
     JSObject *p;
@@ -39516,8 +39466,8 @@ exception:
     return ret;
 }
 
-static JSValue js_array_slice(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv, int splice)
+static JSValue js_array_slice(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv, int splice)
 {
     JSValue obj, arr, val, len_val;
     int64_t len, start, k, final, n, count, del_count, new_len;
@@ -39622,8 +39572,8 @@ static JSValue js_array_slice(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_toSpliced(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_array_toSpliced(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     JSValue arr, obj, ret, *arrp, *pval, *last;
     JSObject *p;
@@ -39717,8 +39667,8 @@ exception:
     return ret;
 }
 
-static JSValue js_array_copyWithin(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_array_copyWithin(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     JSValue obj;
     int64_t len, from, to, final, count;
@@ -39752,11 +39702,11 @@ static JSValue js_array_copyWithin(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static int64_t JS_FlattenIntoArray(JSContext *ctx, JSValue target,
-                                   JSValue source, int64_t sourceLen,
+static int64_t JS_FlattenIntoArray(JSContext *ctx, JSValueConst target,
+                                   JSValueConst source, int64_t sourceLen,
                                    int64_t targetIndex, int depth,
-                                   JSValue mapperFunction,
-                                   JSValue thisArg)
+                                   JSValueConst mapperFunction,
+                                   JSValueConst thisArg)
 {
     JSValue element;
     int64_t sourceIndex, elementLen;
@@ -39774,15 +39724,17 @@ static int64_t JS_FlattenIntoArray(JSContext *ctx, JSValue target,
         if (!present)
             continue;
         if (!JS_IsUndefined(mapperFunction)) {
-            JSValue args[3] = { element, js_int64(sourceIndex), source };
-            element = JS_Call(ctx, mapperFunction, thisArg, 3, args);
-            JS_FreeValue(ctx, args[0]);
-            JS_FreeValue(ctx, args[1]);
-            if (JS_IsException(element))
+            JSValue index = js_int64(sourceIndex);
+            JSValueConst args[3] = { element, index, source };
+            JSValue ret = JS_Call(ctx, mapperFunction, thisArg, 3, args);
+            JS_FreeValue(ctx, element);
+            JS_FreeValue(ctx, index);
+            if (JS_IsException(ret))
                 return -1;
+            element = ret;
         }
         if (depth > 0) {
-            is_array = JS_IsArray(ctx, element);
+            is_array = js_is_array(ctx, element);
             if (is_array < 0)
                 goto fail;
             if (is_array) {
@@ -39814,11 +39766,11 @@ fail:
     return -1;
 }
 
-static JSValue js_array_flatten(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv, int map)
+static JSValue js_array_flatten(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv, int map)
 {
     JSValue obj, arr;
-    JSValue mapperFunction, thisArg;
+    JSValueConst mapperFunction, thisArg;
     int64_t sourceLen;
     int depthNum;
 
@@ -39870,13 +39822,13 @@ struct array_sort_context {
     JSContext *ctx;
     int exception;
     int has_method;
-    JSValue method;
+    JSValueConst method;
 };
 
 static int js_array_cmp_generic(const void *a, const void *b, void *opaque) {
     struct array_sort_context *psc = opaque;
     JSContext *ctx = psc->ctx;
-    JSValue argv[2];
+    JSValueConst argv[2];
     JSValue res;
     ValueSlot *ap = (ValueSlot *)(void *)a;
     ValueSlot *bp = (ValueSlot *)(void *)b;
@@ -39921,7 +39873,7 @@ static int js_array_cmp_generic(const void *a, const void *b, void *opaque) {
                 goto exception;
             bp->str = JS_VALUE_GET_STRING(str);
         }
-        cmp = js_string_compare(ctx, ap->str, bp->str);
+        cmp = js_string_compare(ap->str, bp->str);
     }
     if (cmp != 0)
         return cmp;
@@ -39934,8 +39886,8 @@ exception:
     return 0;
 }
 
-static JSValue js_array_sort(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_array_sort(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     struct array_sort_context asc = { ctx, 0, 0, argv[0] };
     JSValue obj = JS_UNDEFINED;
@@ -40024,8 +39976,8 @@ fail:
 // leaves holes in sparse arrays intact whereas a.toSorted() replaces them
 // with undefined, thus in effect creating a dense array.
 // Does not use Array[@@species], always returns a base Array.
-static JSValue js_array_toSorted(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_array_toSorted(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSValue arr, obj, ret, *arrp, *pval;
     JSObject *p;
@@ -40035,7 +39987,7 @@ static JSValue js_array_toSorted(JSContext *ctx, JSValue this_val,
 
     ok = JS_IsUndefined(argv[0]) || JS_IsFunction(ctx, argv[0]);
     if (!ok)
-        return JS_ThrowTypeError(ctx, "not a function");
+        return JS_ThrowTypeErrorNotAFunction(ctx);
 
     ret = JS_EXCEPTION;
     arr = JS_UNDEFINED;
@@ -40097,7 +40049,7 @@ typedef struct JSArrayIteratorData {
     uint32_t idx;
 } JSArrayIteratorData;
 
-static void js_array_iterator_finalizer(JSRuntime *rt, JSValue val)
+static void js_array_iterator_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSArrayIteratorData *it = p->u.array_iterator_data;
@@ -40107,7 +40059,7 @@ static void js_array_iterator_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_array_iterator_mark(JSRuntime *rt, JSValue val,
+static void js_array_iterator_mark(JSRuntime *rt, JSValueConst val,
                                    JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -40117,7 +40069,7 @@ static void js_array_iterator_mark(JSRuntime *rt, JSValue val,
     }
 }
 
-static JSValue js_create_array(JSContext *ctx, int len, JSValue *tab)
+static JSValue js_create_array(JSContext *ctx, int len, JSValueConst *tab)
 {
     JSValue obj;
     int i;
@@ -40134,8 +40086,8 @@ static JSValue js_create_array(JSContext *ctx, int len, JSValue *tab)
     return obj;
 }
 
-static JSValue js_create_array_iterator(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv, int magic)
+static JSValue js_create_array_iterator(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv, int magic)
 {
     JSValue enum_obj, arr;
     JSArrayIteratorData *it;
@@ -40171,9 +40123,9 @@ static JSValue js_create_array_iterator(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_array_iterator_next(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv,
-                                      BOOL *pdone, int magic)
+static JSValue js_array_iterator_next(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv,
+                                      int *pdone, int magic)
 {
     JSArrayIteratorData *it;
     uint32_t len, idx;
@@ -40186,8 +40138,7 @@ static JSValue js_array_iterator_next(JSContext *ctx, JSValue this_val,
     if (JS_IsUndefined(it->obj))
         goto done;
     p = JS_VALUE_GET_OBJ(it->obj);
-    if (p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-        p->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+    if (is_typed_array(p->class_id)) {
         if (typed_array_is_oob(p)) {
             JS_ThrowTypeErrorArrayBufferOOB(ctx);
             goto fail1;
@@ -40196,7 +40147,7 @@ static JSValue js_array_iterator_next(JSContext *ctx, JSValue this_val,
     } else {
         if (js_get_length32(ctx, &len, it->obj)) {
         fail1:
-            *pdone = FALSE;
+            *pdone = false;
             return JS_EXCEPTION;
         }
     }
@@ -40205,11 +40156,11 @@ static JSValue js_array_iterator_next(JSContext *ctx, JSValue this_val,
         JS_FreeValue(ctx, it->obj);
         it->obj = JS_UNDEFINED;
     done:
-        *pdone = TRUE;
+        *pdone = true;
         return JS_UNDEFINED;
     }
     it->idx = idx + 1;
-    *pdone = FALSE;
+    *pdone = false;
     if (it->kind == JS_ITERATOR_KIND_KEY) {
         return js_uint32(idx);
     } else {
@@ -40219,7 +40170,7 @@ static JSValue js_array_iterator_next(JSContext *ctx, JSValue this_val,
         if (it->kind == JS_ITERATOR_KIND_VALUE) {
             return val;
         } else {
-            JSValue args[2];
+            JSValueConst args[2];
             JSValue num;
             num = js_uint32(idx);
             args[0] = num;
@@ -40237,7 +40188,7 @@ typedef struct JSIteratorWrapData {
     JSValue wrapped_next;
 } JSIteratorWrapData;
 
-static void js_iterator_wrap_finalizer(JSRuntime *rt, JSValue val)
+static void js_iterator_wrap_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSIteratorWrapData *it = p->u.iterator_wrap_data;
@@ -40248,7 +40199,7 @@ static void js_iterator_wrap_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_iterator_wrap_mark(JSRuntime *rt, JSValue val,
+static void js_iterator_wrap_mark(JSRuntime *rt, JSValueConst val,
                                   JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -40259,9 +40210,9 @@ static void js_iterator_wrap_mark(JSRuntime *rt, JSValue val,
     }
 }
 
-static JSValue js_iterator_wrap_next(JSContext *ctx, JSValue this_val,
-                                     int argc, JSValue *argv,
-                                     BOOL *pdone, int magic)
+static JSValue js_iterator_wrap_next(JSContext *ctx, JSValueConst this_val,
+                                     int argc, JSValueConst *argv,
+                                     int *pdone, int magic)
 {
     JSIteratorWrapData *it;
     JSValue method, ret;
@@ -40274,7 +40225,7 @@ static JSValue js_iterator_wrap_next(JSContext *ctx, JSValue this_val,
     if (JS_IsException(method))
         return JS_EXCEPTION;
     if (JS_IsNull(method) || JS_IsUndefined(method)) {
-        *pdone = TRUE;
+        *pdone = true;
         return JS_UNDEFINED;
     }
     ret = JS_IteratorNext2(ctx, it->wrapped_iter, method, argc, argv, pdone);
@@ -40287,8 +40238,8 @@ static const JSCFunctionListEntry js_iterator_wrap_proto_funcs[] = {
     JS_ITERATOR_NEXT_DEF("return", 0, js_iterator_wrap_next, GEN_MAGIC_RETURN ),
 };
 
-static JSValue js_iterator_constructor(JSContext *ctx, JSValue new_target,
-                                       int argc, JSValue *argv)
+static JSValue js_iterator_constructor(JSContext *ctx, JSValueConst new_target,
+                                       int argc, JSValueConst *argv)
 {
     JSObject *p;
 
@@ -40301,14 +40252,14 @@ static JSValue js_iterator_constructor(JSContext *ctx, JSValue new_target,
     return js_create_from_ctor(ctx, new_target, JS_CLASS_ITERATOR);
 }
 
-static JSValue js_iterator_from(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_iterator_from(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
-    JSValue obj, method, iter;
+    JSValue method, iter;
     JSIteratorWrapData *it;
     int ret;
 
-    obj = argv[0];
+    JSValueConst obj = argv[0];
     if (JS_IsString(obj)) {
         method = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_iterator);
         if (JS_IsException(method))
@@ -40351,7 +40302,7 @@ fail:
     return JS_EXCEPTION;
 }
 
-static int check_iterator(JSContext *ctx, JSValue obj)
+static int check_iterator(JSContext *ctx, JSValueConst obj)
 {
     if (!JS_IsObject(obj)) {
         JS_ThrowTypeErrorNotAnObject(ctx);
@@ -40371,10 +40322,11 @@ typedef struct JSIteratorHelperData {
     uint8_t done : 1;
 } JSIteratorHelperData;
 
-static JSValue js_create_iterator_helper(JSContext *ctx, JSValue this_val,
-                                         int argc, JSValue *argv, int magic)
+static JSValue js_create_iterator_helper(JSContext *ctx, JSValueConst this_val,
+                                         int argc, JSValueConst *argv, int magic)
 {
-    JSValue func, obj, method;
+    JSValueConst func;
+    JSValue obj, method;
     int64_t count;
     JSIteratorHelperData *it;
 
@@ -40460,13 +40412,13 @@ static JSValue js_create_iterator_helper(JSContext *ctx, JSValue this_val,
     return obj;
 }
 
-static JSValue js_iterator_proto_func(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv, int magic)
+static JSValue js_iterator_proto_func(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv, int magic)
 {
     JSValue item, method, ret, func, index_val, r;
-    JSValue args[2];
+    JSValueConst args[2];
     int64_t idx;
-    BOOL done;
+    int done;
 
     if (check_iterator(ctx, this_val) < 0)
         return JS_EXCEPTION;
@@ -40498,7 +40450,7 @@ static JSValue js_iterator_proto_func(JSContext *ctx, JSValue this_val,
                 if (JS_IsException(ret))
                     goto fail;
                 if (!JS_ToBoolFree(ctx, ret)) {
-                    if (JS_IteratorClose(ctx, this_val, FALSE) < 0)
+                    if (JS_IteratorClose(ctx, this_val, false) < 0)
                         r = JS_EXCEPTION;
                     else
                         r = JS_FALSE;
@@ -40528,7 +40480,7 @@ static JSValue js_iterator_proto_func(JSContext *ctx, JSValue this_val,
                     goto fail;
                 }
                 if (JS_ToBoolFree(ctx, ret)) {
-                    if (JS_IteratorClose(ctx, this_val, FALSE) < 0) {
+                    if (JS_IteratorClose(ctx, this_val, false) < 0) {
                         JS_FreeValue(ctx, item);
                         r = JS_EXCEPTION;
                     } else {
@@ -40583,7 +40535,7 @@ static JSValue js_iterator_proto_func(JSContext *ctx, JSValue this_val,
                 if (JS_IsException(ret))
                     goto fail;
                 if (JS_ToBoolFree(ctx, ret)) {
-                    if (JS_IteratorClose(ctx, this_val, FALSE) < 0)
+                    if (JS_IteratorClose(ctx, this_val, false) < 0)
                         r = JS_EXCEPTION;
                     else
                         r = JS_TRUE;
@@ -40604,19 +40556,19 @@ static JSValue js_iterator_proto_func(JSContext *ctx, JSValue this_val,
     JS_FreeValue(ctx, method);
     return r;
 fail:
-    JS_IteratorClose(ctx, this_val, TRUE);
+    JS_IteratorClose(ctx, this_val, true);
     JS_FreeValue(ctx, func);
     JS_FreeValue(ctx, method);
     return JS_EXCEPTION;
 }
 
-static JSValue js_iterator_proto_reduce(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv)
+static JSValue js_iterator_proto_reduce(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv)
 {
     JSValue item, method, ret, func, index_val, acc;
-    JSValue args[3];
+    JSValueConst args[3];
     int64_t idx;
-    BOOL done;
+    int done;
 
     if (check_iterator(ctx, this_val) < 0)
         return JS_EXCEPTION;
@@ -40665,19 +40617,19 @@ static JSValue js_iterator_proto_reduce(JSContext *ctx, JSValue this_val,
     JS_FreeValue(ctx, method);
     return acc;
 exception:
-    JS_IteratorClose(ctx, this_val, TRUE);
+    JS_IteratorClose(ctx, this_val, true);
     JS_FreeValue(ctx, acc);
     JS_FreeValue(ctx, func);
     JS_FreeValue(ctx, method);
     return JS_EXCEPTION;
 }
 
-static JSValue js_iterator_proto_toArray(JSContext *ctx, JSValue this_val,
-                                         int argc, JSValue *argv)
+static JSValue js_iterator_proto_toArray(JSContext *ctx, JSValueConst this_val,
+                                         int argc, JSValueConst *argv)
 {
     JSValue item, method, result;
     int64_t idx;
-    BOOL done;
+    int done;
 
     result = JS_UNDEFINED;
     if (check_iterator(ctx, this_val) < 0)
@@ -40708,18 +40660,18 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_iterator_proto_iterator(JSContext *ctx, JSValue this_val,
-                                          int argc, JSValue *argv)
+static JSValue js_iterator_proto_iterator(JSContext *ctx, JSValueConst this_val,
+                                          int argc, JSValueConst *argv)
 {
     return js_dup(this_val);
 }
 
-static JSValue js_iterator_proto_get_toStringTag(JSContext *ctx, JSValue this_val)
+static JSValue js_iterator_proto_get_toStringTag(JSContext *ctx, JSValueConst this_val)
 {
     return JS_AtomToString(ctx, JS_ATOM_Iterator);
 }
 
-static JSValue js_iterator_proto_set_toStringTag(JSContext *ctx, JSValue this_val, JSValue val)
+static JSValue js_iterator_proto_set_toStringTag(JSContext *ctx, JSValueConst this_val, JSValueConst val)
 {
     int res;
 
@@ -40740,7 +40692,7 @@ static JSValue js_iterator_proto_set_toStringTag(JSContext *ctx, JSValue this_va
     return JS_UNDEFINED;
 }
 
-static void js_iterator_helper_finalizer(JSRuntime *rt, JSValue val)
+static void js_iterator_helper_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSIteratorHelperData *it = p->u.iterator_helper_data;
@@ -40753,7 +40705,7 @@ static void js_iterator_helper_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_iterator_helper_mark(JSRuntime *rt, JSValue val,
+static void js_iterator_helper_mark(JSRuntime *rt, JSValueConst val,
                                    JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -40766,14 +40718,14 @@ static void js_iterator_helper_mark(JSRuntime *rt, JSValue val,
     }
 }
 
-static JSValue js_iterator_helper_next(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv,
-                                      BOOL *pdone, int magic)
+static JSValue js_iterator_helper_next(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv,
+                                      int *pdone, int magic)
 {
     JSIteratorHelperData *it;
     JSValue ret;
 
-    *pdone = FALSE;
+    *pdone = false;
 
     it = JS_GetOpaque2(ctx, this_val, JS_CLASS_ITERATOR_HELPER);
     if (!it)
@@ -40781,7 +40733,7 @@ static JSValue js_iterator_helper_next(JSContext *ctx, JSValue this_val,
     if (it->executing)
         return JS_ThrowTypeError(ctx, "cannot invoke a running iterator");
     if (it->done) {
-        *pdone = TRUE;
+        *pdone = true;
         return JS_UNDEFINED;
     }
 
@@ -40807,7 +40759,7 @@ static JSValue js_iterator_helper_next(JSContext *ctx, JSValue this_val,
                 }
                 JS_FreeValue(ctx, item);
                 if (magic == GEN_MAGIC_RETURN)
-                    *pdone = TRUE;
+                    *pdone = true;
                 if (*pdone) {
                     JS_FreeValue(ctx, method);
                     ret = JS_UNDEFINED;
@@ -40825,7 +40777,8 @@ static JSValue js_iterator_helper_next(JSContext *ctx, JSValue this_val,
         break;
     case JS_ITERATOR_HELPER_KIND_FILTER:
         {
-            JSValue item, method, selected, index_val, args[2];
+            JSValue item, method, selected, index_val;
+            JSValueConst args[2];
             if (magic == GEN_MAGIC_NEXT) {
                 method = js_dup(it->next);
             } else {
@@ -40863,7 +40816,8 @@ static JSValue js_iterator_helper_next(JSContext *ctx, JSValue this_val,
         break;
     case JS_ITERATOR_HELPER_KIND_FLAT_MAP:
         {
-            JSValue item, method, index_val, args[2], iter;
+            JSValue item, method, index_val, iter;
+            JSValueConst args[2];
         flat_map_again:
             if (JS_IsUndefined(it->inner)) {
                 if (magic == GEN_MAGIC_NEXT) {
@@ -40919,7 +40873,7 @@ static JSValue js_iterator_helper_next(JSContext *ctx, JSValue this_val,
                 method = JS_GetProperty(ctx, it->inner, JS_ATOM_return);
             if (JS_IsException(method)) {
             inner_fail:
-                JS_IteratorClose(ctx, it->inner, FALSE);
+                JS_IteratorClose(ctx, it->inner, false);
                 JS_FreeValue(ctx, it->inner);
                 it->inner = JS_UNDEFINED;
                 goto fail;
@@ -40934,8 +40888,8 @@ static JSValue js_iterator_helper_next(JSContext *ctx, JSValue this_val,
             }
             if (*pdone) {
             inner_end:
-                *pdone = FALSE; // The outer iterator must continue.
-                JS_IteratorClose(ctx, it->inner, FALSE);
+                *pdone = false; // The outer iterator must continue.
+                JS_IteratorClose(ctx, it->inner, false);
                 JS_FreeValue(ctx, it->inner);
                 it->inner = JS_UNDEFINED;
                 goto flat_map_again;
@@ -40946,7 +40900,8 @@ static JSValue js_iterator_helper_next(JSContext *ctx, JSValue this_val,
         break;
     case JS_ITERATOR_HELPER_KIND_MAP:
         {
-            JSValue item, method, index_val, args[2];
+            JSValue item, method, index_val;
+            JSValueConst args[2];
             if (magic == GEN_MAGIC_NEXT) {
                 method = js_dup(it->next);
             } else {
@@ -40992,8 +40947,8 @@ static JSValue js_iterator_helper_next(JSContext *ctx, JSValue this_val,
                 goto done;
             }
 
-            *pdone = TRUE;
-            if (JS_IteratorClose(ctx, it->obj, FALSE))
+            *pdone = true;
+            if (JS_IteratorClose(ctx, it->obj, false))
                 ret = JS_EXCEPTION;
             else
                 ret = JS_UNDEFINED;
@@ -41010,7 +40965,7 @@ done:
     return ret;
 fail:
     /* close the iterator object, preserving pending exception */
-    JS_IteratorClose(ctx, it->obj, TRUE);
+    JS_IteratorClose(ctx, it->obj, true);
     ret = JS_EXCEPTION;
     goto done;
 }
@@ -41090,8 +41045,8 @@ static const JSCFunctionListEntry js_array_iterator_proto_funcs[] = {
 
 /* Number */
 
-static JSValue js_number_constructor(JSContext *ctx, JSValue new_target,
-                                     int argc, JSValue *argv)
+static JSValue js_number_constructor(JSContext *ctx, JSValueConst new_target,
+                                     int argc, JSValueConst *argv)
 {
     JSValue val, obj;
     if (argc == 0) {
@@ -41124,24 +41079,24 @@ static JSValue js_number_constructor(JSContext *ctx, JSValue new_target,
     }
 }
 
-static JSValue js_number_isNaN(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_number_isNaN(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     if (!JS_IsNumber(argv[0]))
         return JS_FALSE;
     return js_global_isNaN(ctx, this_val, argc, argv);
 }
 
-static JSValue js_number_isFinite(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_number_isFinite(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     if (!JS_IsNumber(argv[0]))
         return JS_FALSE;
     return js_global_isFinite(ctx, this_val, argc, argv);
 }
 
-static JSValue js_number_isInteger(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_number_isInteger(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     int ret;
     ret = JS_NumberIsInteger(ctx, argv[0]);
@@ -41151,8 +41106,8 @@ static JSValue js_number_isInteger(JSContext *ctx, JSValue this_val,
         return js_bool(ret);
 }
 
-static JSValue js_number_isSafeInteger(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_number_isSafeInteger(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
     double d;
     if (!JS_IsNumber(argv[0]))
@@ -41180,7 +41135,7 @@ static const JSCFunctionListEntry js_number_funcs[] = {
     JS_PROP_DOUBLE_DEF("MIN_SAFE_INTEGER", -9007199254740991.0, 0 ), /* ES6 */
 };
 
-static JSValue js_thisNumberValue(JSContext *ctx, JSValue this_val)
+static JSValue js_thisNumberValue(JSContext *ctx, JSValueConst this_val)
 {
     if (JS_IsNumber(this_val))
         return js_dup(this_val);
@@ -41195,13 +41150,13 @@ static JSValue js_thisNumberValue(JSContext *ctx, JSValue this_val)
     return JS_ThrowTypeError(ctx, "not a number");
 }
 
-static JSValue js_number_valueOf(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_number_valueOf(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     return js_thisNumberValue(ctx, this_val);
 }
 
-static int js_get_radix(JSContext *ctx, JSValue val)
+static int js_get_radix(JSContext *ctx, JSValueConst val)
 {
     int radix;
     if (JS_ToInt32Sat(ctx, &radix, val))
@@ -41213,8 +41168,8 @@ static int js_get_radix(JSContext *ctx, JSValue val)
     return radix;
 }
 
-static JSValue js_number_toString(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv, int magic)
+static JSValue js_number_toString(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv, int magic)
 {
     char buf[72];
     JSValue val;
@@ -41249,8 +41204,8 @@ static JSValue js_number_toString(JSContext *ctx, JSValue this_val,
     return js_dtoa(ctx, d, 0, JS_DTOA_TOSTRING);
 }
 
-static JSValue js_number_toFixed(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_number_toFixed(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSValue val;
     int f;
@@ -41274,8 +41229,8 @@ static JSValue js_number_toFixed(JSContext *ctx, JSValue this_val,
     }
 }
 
-static JSValue js_number_toExponential(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_number_toExponential(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
     JSValue val;
     double d;
@@ -41299,8 +41254,8 @@ static JSValue js_number_toExponential(JSContext *ctx, JSValue this_val,
     return js_dtoa(ctx, d, f, JS_DTOA_EXPONENTIAL);
 }
 
-static JSValue js_number_toPrecision(JSContext *ctx, JSValue this_val,
-                                     int argc, JSValue *argv)
+static JSValue js_number_toPrecision(JSContext *ctx, JSValueConst this_val,
+                                     int argc, JSValueConst *argv)
 {
     JSValue val;
     int p;
@@ -41332,8 +41287,8 @@ static const JSCFunctionListEntry js_number_proto_funcs[] = {
     JS_CFUNC_DEF("valueOf", 0, js_number_valueOf ),
 };
 
-static JSValue js_parseInt(JSContext *ctx, JSValue this_val,
-                           int argc, JSValue *argv)
+static JSValue js_parseInt(JSContext *ctx, JSValueConst this_val,
+                           int argc, JSValueConst *argv)
 {
     const char *str;
     int radix, flags;
@@ -41357,8 +41312,8 @@ static JSValue js_parseInt(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_parseFloat(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_parseFloat(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     const char *str;
     JSValue ret;
@@ -41375,8 +41330,8 @@ static JSValue js_parseFloat(JSContext *ctx, JSValue this_val,
 }
 
 /* Boolean */
-static JSValue js_boolean_constructor(JSContext *ctx, JSValue new_target,
-                                     int argc, JSValue *argv)
+static JSValue js_boolean_constructor(JSContext *ctx, JSValueConst new_target,
+                                     int argc, JSValueConst *argv)
 {
     JSValue val, obj;
     val = js_bool(JS_ToBool(ctx, argv[0]));
@@ -41390,7 +41345,7 @@ static JSValue js_boolean_constructor(JSContext *ctx, JSValue new_target,
     }
 }
 
-static JSValue js_thisBooleanValue(JSContext *ctx, JSValue this_val)
+static JSValue js_thisBooleanValue(JSContext *ctx, JSValueConst this_val)
 {
     if (JS_VALUE_GET_TAG(this_val) == JS_TAG_BOOL)
         return js_dup(this_val);
@@ -41405,8 +41360,8 @@ static JSValue js_thisBooleanValue(JSContext *ctx, JSValue this_val)
     return JS_ThrowTypeError(ctx, "not a boolean");
 }
 
-static JSValue js_boolean_toString(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_boolean_toString(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     JSValue val = js_thisBooleanValue(ctx, this_val);
     if (JS_IsException(val))
@@ -41415,8 +41370,8 @@ static JSValue js_boolean_toString(JSContext *ctx, JSValue this_val,
                        JS_ATOM_true : JS_ATOM_false);
 }
 
-static JSValue js_boolean_valueOf(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_boolean_valueOf(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     return js_thisBooleanValue(ctx, this_val);
 }
@@ -41430,7 +41385,7 @@ static const JSCFunctionListEntry js_boolean_proto_funcs[] = {
 
 static int js_string_get_own_property(JSContext *ctx,
                                       JSPropertyDescriptor *desc,
-                                      JSValue obj, JSAtom prop)
+                                      JSValueConst obj, JSAtom prop)
 {
     JSObject *p;
     JSString *p1;
@@ -41450,18 +41405,18 @@ static int js_string_get_own_property(JSContext *ctx,
                     desc->getter = JS_UNDEFINED;
                     desc->setter = JS_UNDEFINED;
                 }
-                return TRUE;
+                return true;
             }
         }
     }
-    return FALSE;
+    return false;
 }
 
 static int js_string_define_own_property(JSContext *ctx,
-                                         JSValue this_obj,
-                                         JSAtom prop, JSValue val,
-                                         JSValue getter,
-                                         JSValue setter, int flags)
+                                         JSValueConst this_obj,
+                                         JSAtom prop, JSValueConst val,
+                                         JSValueConst getter,
+                                         JSValueConst setter, int flags)
 {
     uint32_t idx;
     JSObject *p;
@@ -41489,7 +41444,7 @@ static int js_string_define_own_property(JSContext *ctx,
                 return JS_ThrowTypeErrorOrFalse(ctx, flags, "property is not configurable");
             }
         }
-        return TRUE;
+        return true;
     } else {
     def:
         return JS_DefineProperty(ctx, this_obj, prop, val, getter, setter,
@@ -41498,17 +41453,17 @@ static int js_string_define_own_property(JSContext *ctx,
 }
 
 static int js_string_delete_property(JSContext *ctx,
-                                     JSValue obj, JSAtom prop)
+                                     JSValueConst obj, JSAtom prop)
 {
     uint32_t idx;
 
     if (__JS_AtomIsTaggedInt(prop)) {
         idx = __JS_AtomToUInt32(prop);
         if (idx < js_string_obj_get_length(ctx, obj)) {
-            return FALSE;
+            return false;
         }
     }
-    return TRUE;
+    return true;
 }
 
 static const JSClassExoticMethods js_string_exotic_methods = {
@@ -41517,8 +41472,8 @@ static const JSClassExoticMethods js_string_exotic_methods = {
     .delete_property = js_string_delete_property,
 };
 
-static JSValue js_string_constructor(JSContext *ctx, JSValue new_target,
-                                     int argc, JSValue *argv)
+static JSValue js_string_constructor(JSContext *ctx, JSValueConst new_target,
+                                     int argc, JSValueConst *argv)
 {
     JSValue val, obj;
     if (argc == 0) {
@@ -41547,7 +41502,7 @@ static JSValue js_string_constructor(JSContext *ctx, JSValue new_target,
     }
 }
 
-static JSValue js_thisStringValue(JSContext *ctx, JSValue this_val)
+static JSValue js_thisStringValue(JSContext *ctx, JSValueConst this_val)
 {
     if (JS_VALUE_GET_TAG(this_val) == JS_TAG_STRING)
         return js_dup(this_val);
@@ -41562,8 +41517,8 @@ static JSValue js_thisStringValue(JSContext *ctx, JSValue this_val)
     return JS_ThrowTypeError(ctx, "not a string");
 }
 
-static JSValue js_string_fromCharCode(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv)
+static JSValue js_string_fromCharCode(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv)
 {
     int i;
     StringBuffer b_s, *b = &b_s;
@@ -41586,8 +41541,8 @@ static JSValue js_string_fromCharCode(JSContext *ctx, JSValue this_val,
     return string_buffer_end(b);
 }
 
-static JSValue js_string_fromCodePoint(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_string_fromCodePoint(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
     double d;
     int i, c;
@@ -41635,8 +41590,8 @@ static JSValue js_string_fromCodePoint(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_string_raw(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_string_raw(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     // raw(temp,...a)
     JSValue cooked, val, raw;
@@ -41676,8 +41631,8 @@ exception:
 }
 
 /* only used in test262 */
-JSValue js_string_codePointRange(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+JSValue js_string_codePointRange(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     uint32_t start, end, i, n;
     StringBuffer b_s, *b = &b_s;
@@ -41702,8 +41657,8 @@ JSValue js_string_codePointRange(JSContext *ctx, JSValue this_val,
     return string_buffer_end(b);
 }
 
-static JSValue js_string_at(JSContext *ctx, JSValue this_val,
-                            int argc, JSValue *argv)
+static JSValue js_string_at(JSContext *ctx, JSValueConst this_val,
+                            int argc, JSValueConst *argv)
 {
     JSValue val, ret;
     JSString *p;
@@ -41729,8 +41684,8 @@ static JSValue js_string_at(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_string_charCodeAt(JSContext *ctx, JSValue this_val,
-                                     int argc, JSValue *argv)
+static JSValue js_string_charCodeAt(JSContext *ctx, JSValueConst this_val,
+                                     int argc, JSValueConst *argv)
 {
     JSValue val, ret;
     JSString *p;
@@ -41754,8 +41709,8 @@ static JSValue js_string_charCodeAt(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_string_charAt(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_string_charAt(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSValue val, ret;
     JSString *p;
@@ -41779,8 +41734,8 @@ static JSValue js_string_charAt(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_string_codePointAt(JSContext *ctx, JSValue this_val,
-                                     int argc, JSValue *argv)
+static JSValue js_string_codePointAt(JSContext *ctx, JSValueConst this_val,
+                                     int argc, JSValueConst *argv)
 {
     JSValue val, ret;
     JSString *p;
@@ -41804,8 +41759,8 @@ static JSValue js_string_codePointAt(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_string_concat(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_string_concat(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSValue r;
     int i;
@@ -41838,13 +41793,13 @@ static int string_indexof_char(JSString *p, int c, int from)
     int i, len = p->len;
     if (p->is_wide_char) {
         for (i = from; i < len; i++) {
-            if (p->u.str16[i] == c)
+            if (str16(p)[i] == c)
                 return i;
         }
     } else {
         if ((c & ~0xff) == 0) {
             for (i = from; i < len; i++) {
-                if (p->u.str8[i] == (uint8_t)c)
+                if (str8(p)[i] == (uint8_t)c)
                     return i;
             }
         }
@@ -41868,7 +41823,7 @@ static int string_indexof(JSString *p1, JSString *p2, int from)
     return -1;
 }
 
-static int64_t string_advance_index(JSString *p, int64_t index, BOOL unicode)
+static int64_t string_advance_index(JSString *p, int64_t index, bool unicode)
 {
     if (!unicode || index >= p->len || !p->is_wide_char) {
         index++;
@@ -41880,8 +41835,8 @@ static int64_t string_advance_index(JSString *p, int64_t index, BOOL unicode)
     return index;
 }
 
-static JSValue js_string_isWellFormed(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv)
+static JSValue js_string_isWellFormed(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv)
 {
     JSValue str;
     JSValue ret;
@@ -41898,12 +41853,12 @@ static JSValue js_string_isWellFormed(JSContext *ctx, JSValue this_val,
         goto done; // by definition well-formed
 
     for (i = 0, n = p->len; i < n; i++) {
-        c = p->u.str16[i];
+        c = str16(p)[i];
         if (!is_surrogate(c))
             continue;
         if (is_lo_surrogate(c) || i + 1 == n)
             break;
-        c = p->u.str16[++i];
+        c = str16(p)[++i];
         if (!is_lo_surrogate(c))
             break;
     }
@@ -41916,8 +41871,8 @@ done:
     return ret;
 }
 
-static JSValue js_string_toWellFormed(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv)
+static JSValue js_string_toWellFormed(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv)
 {
     JSValue str;
     JSValue ret;
@@ -41933,30 +41888,30 @@ static JSValue js_string_toWellFormed(JSContext *ctx, JSValue this_val,
         return str; // by definition well-formed
 
     // TODO(bnoordhuis) don't clone when input is well-formed
-    ret = js_new_string16_len(ctx, p->u.str16, p->len);
+    ret = js_new_string16_len(ctx, str16(p), p->len);
     JS_FreeValue(ctx, str);
     if (JS_IsException(ret))
         return JS_EXCEPTION;
 
     p = JS_VALUE_GET_STRING(ret);
     for (i = 0, n = p->len; i < n; i++) {
-        c = p->u.str16[i];
+        c = str16(p)[i];
         if (!is_surrogate(c))
             continue;
         if (is_lo_surrogate(c) || i + 1 == n) {
-            p->u.str16[i] = 0xFFFD;
+            str16(p)[i] = 0xFFFD;
             continue;
         }
-        c = p->u.str16[++i];
+        c = str16(p)[++i];
         if (!is_lo_surrogate(c))
-            p->u.str16[--i] = 0xFFFD;
+            str16(p)[--i] = 0xFFFD;
     }
 
     return ret;
 }
 
-static JSValue js_string_indexOf(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv, int lastIndexOf)
+static JSValue js_string_indexOf(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv, int lastIndexOf)
 {
     JSValue str, v;
     int i, len, v_len, pos, start, stop, ret, inc;
@@ -42020,11 +41975,11 @@ fail:
     return JS_EXCEPTION;
 }
 
-/* return < 0 if exception or TRUE/FALSE */
-static int js_is_regexp(JSContext *ctx, JSValue obj);
+/* return < 0 if exception or true/false */
+static int js_is_regexp(JSContext *ctx, JSValueConst obj);
 
-static JSValue js_string_includes(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv, int magic)
+static JSValue js_string_includes(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv, int magic)
 {
     JSValue str, v = JS_UNDEFINED;
     int i, len, v_len, pos, start, stop, ret;
@@ -42087,7 +42042,7 @@ fail:
     return JS_EXCEPTION;
 }
 
-static int check_regexp_g_flag(JSContext *ctx, JSValue regexp)
+static int check_regexp_g_flag(JSContext *ctx, JSValueConst regexp)
 {
     int ret;
     JSValue flags;
@@ -42116,12 +42071,12 @@ static int check_regexp_g_flag(JSContext *ctx, JSValue regexp)
     return 0;
 }
 
-static JSValue js_string_match(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv, int atom)
+static JSValue js_string_match(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv, int atom)
 {
     // match(rx), search(rx), matchAll(rx)
     // atom is JS_ATOM_Symbol_match, JS_ATOM_Symbol_search, or JS_ATOM_Symbol_matchAll
-    JSValue O = this_val, regexp = argv[0], args[2];
+    JSValueConst O = this_val, regexp = argv[0], args[2];
     JSValue matcher, S, rx, result, str;
     int args_len;
 
@@ -42161,16 +42116,16 @@ static JSValue js_string_match(JSContext *ctx, JSValue this_val,
         JS_FreeValue(ctx, S);
         return JS_EXCEPTION;
     }
-    result = JS_InvokeFree(ctx, rx, atom, 1, &S);
+    result = JS_InvokeFree(ctx, rx, atom, 1, vc(&S));
     JS_FreeValue(ctx, S);
     return result;
 }
 
-static JSValue js_string___GetSubstitution(JSContext *ctx, JSValue this_val,
-                                           int argc, JSValue *argv)
+static JSValue js_string___GetSubstitution(JSContext *ctx, JSValueConst this_val,
+                                           int argc, JSValueConst *argv)
 {
     // GetSubstitution(matched, str, position, captures, namedCaptures, rep)
-    JSValue matched, str, captures, namedCaptures, rep;
+    JSValueConst matched, str, captures, namedCaptures, rep;
     JSValue capture, name, s;
     uint32_t position, len, matched_len, captures_len;
     int i, j, j0, k, k1;
@@ -42274,18 +42229,18 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_string_replace(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv,
+static JSValue js_string_replace(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv,
                                  int is_replaceAll)
 {
     // replace(rx, rep)
-    JSValue O = this_val, searchValue = argv[0], replaceValue = argv[1];
-    JSValue args[6];
+    JSValueConst O = this_val, searchValue = argv[0], replaceValue = argv[1];
+    JSValueConst args[6];
     JSValue str, search_str, replaceValue_str, repl_str;
     JSString *sp, *searchp;
     StringBuffer b_s, *b = &b_s;
     int pos, functionalReplace, endOfLastMatch;
-    BOOL is_first;
+    bool is_first;
 
     if (JS_IsUndefined(O) || JS_IsNull(O))
         return JS_ThrowTypeError(ctx, "cannot convert to object");
@@ -42327,7 +42282,7 @@ static JSValue js_string_replace(JSContext *ctx, JSValue this_val,
     sp = JS_VALUE_GET_STRING(str);
     searchp = JS_VALUE_GET_STRING(search_str);
     endOfLastMatch = 0;
-    is_first = TRUE;
+    is_first = true;
     for(;;) {
         if (unlikely(searchp->len == 0)) {
             if (is_first)
@@ -42369,7 +42324,7 @@ static JSValue js_string_replace(JSContext *ctx, JSValue this_val,
         string_buffer_concat(b, sp, endOfLastMatch, pos);
         string_buffer_concat_value_free(b, repl_str);
         endOfLastMatch = pos + searchp->len;
-        is_first = FALSE;
+        is_first = false;
         if (!is_replaceAll)
             break;
     }
@@ -42387,12 +42342,12 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_string_split(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_string_split(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     // split(sep, limit)
-    JSValue O = this_val, separator = argv[0], limit = argv[1];
-    JSValue args[2];
+    JSValueConst O = this_val, separator = argv[0], limit = argv[1];
+    JSValueConst args[2];
     JSValue S, A, R, T;
     uint32_t lim, lengthA;
     int64_t p, q, s, r, e;
@@ -42477,8 +42432,8 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_string_substring(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_string_substring(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     JSValue str, ret;
     int a, b, start, end;
@@ -42511,8 +42466,8 @@ static JSValue js_string_substring(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_string_substr(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_string_substr(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSValue str, ret;
     int a, len, n;
@@ -42539,8 +42494,8 @@ static JSValue js_string_substr(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_string_slice(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_string_slice(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     JSValue str, ret;
     int len, start, end;
@@ -42567,8 +42522,8 @@ static JSValue js_string_slice(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_string_pad(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv, int padEnd)
+static JSValue js_string_pad(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv, int padEnd)
 {
     JSValue str, v = JS_UNDEFINED;
     StringBuffer b_s, *b = &b_s;
@@ -42638,8 +42593,8 @@ fail1:
     return JS_EXCEPTION;
 }
 
-static JSValue js_string_repeat(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_string_repeat(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSValue str;
     StringBuffer b_s, *b = &b_s;
@@ -42682,8 +42637,8 @@ fail:
     return JS_EXCEPTION;
 }
 
-static JSValue js_string_trim(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv, int magic)
+static JSValue js_string_trim(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv, int magic)
 {
     JSValue str, ret;
     int a, b, len;
@@ -42718,22 +42673,22 @@ static int string_prevc(JSString *p, int *pidx)
         return 0;
     idx--;
     if (p->is_wide_char) {
-        c = p->u.str16[idx];
+        c = str16(p)[idx];
         if (is_lo_surrogate(c) && idx > 0) {
-            c1 = p->u.str16[idx - 1];
+            c1 = str16(p)[idx - 1];
             if (is_hi_surrogate(c1)) {
                 c = from_surrogate(c1, c);
                 idx--;
             }
         }
     } else {
-        c = p->u.str8[idx];
+        c = str8(p)[idx];
     }
     *pidx = idx;
     return c;
 }
 
-static BOOL test_final_sigma(JSString *p, int sigma_pos)
+static bool test_final_sigma(JSString *p, int sigma_pos)
 {
     int k, c1;
 
@@ -42746,14 +42701,14 @@ static BOOL test_final_sigma(JSString *p, int sigma_pos)
             break;
     }
     if (!lre_is_cased(c1))
-        return FALSE;
+        return false;
 
     /* after C: skip case ignorable chars and check there is
        no cased letter */
     k = sigma_pos + 1;
     for(;;) {
         if (k >= p->len)
-            return TRUE;
+            return true;
         c1 = string_getc(p, &k);
         if (!lre_is_case_ignorable(c1))
             break;
@@ -42776,8 +42731,8 @@ static int to_utf32_buf(JSContext *ctx, JSString *p, uint32_t **pbuf)
     return j;
 }
 
-static JSValue js_string_localeCompare(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_string_localeCompare(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
     int i, n, an, bn, cmp;
     uint32_t *as, *bs, *ts;
@@ -42837,8 +42792,8 @@ exception:
     return ret;
 }
 
-static JSValue js_string_toLowerCase(JSContext *ctx, JSValue this_val,
-                                     int argc, JSValue *argv, int to_lower)
+static JSValue js_string_toLowerCase(JSContext *ctx, JSValueConst this_val,
+                                     int argc, JSValueConst *argv, int to_lower)
 {
     JSValue val;
     StringBuffer b_s, *b = &b_s;
@@ -42905,8 +42860,8 @@ static JSValue JS_NewUTF32String(JSContext *ctx, const uint32_t *buf, int len)
     return JS_EXCEPTION;
 }
 
-static JSValue js_string_normalize(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_string_normalize(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     const char *form, *p;
     size_t form_len;
@@ -42918,6 +42873,7 @@ static JSValue js_string_normalize(JSContext *ctx, JSValue this_val,
     val = JS_ToStringCheckObject(ctx, this_val);
     if (JS_IsException(val))
         return val;
+    buf = NULL; // appease bogus -Wmaybe-uninitialized warning
     buf_len = JS_ToUTF32String(ctx, &buf, val);
     JS_FreeValue(ctx, val);
     if (buf_len < 0)
@@ -42933,9 +42889,9 @@ static JSValue js_string_normalize(JSContext *ctx, JSValue this_val,
         if (p[0] != 'N' || p[1] != 'F')
             goto bad_form;
         p += 2;
-        is_compat = FALSE;
+        is_compat = false;
         if (*p == 'K') {
-            is_compat = TRUE;
+            is_compat = true;
             p++;
         }
         if (*p == 'C' || *p == 'D') {
@@ -42964,17 +42920,17 @@ static JSValue js_string_normalize(JSContext *ctx, JSValue this_val,
 }
 
 /* also used for String.prototype.valueOf */
-static JSValue js_string_toString(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_string_toString(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     return js_thisStringValue(ctx, this_val);
 }
 
 /* String Iterator */
 
-static JSValue js_string_iterator_next(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv,
-                                       BOOL *pdone, int magic)
+static JSValue js_string_iterator_next(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv,
+                                       int *pdone, int magic)
 {
     JSArrayIteratorData *it;
     uint32_t idx, c, start;
@@ -42982,7 +42938,7 @@ static JSValue js_string_iterator_next(JSContext *ctx, JSValue this_val,
 
     it = JS_GetOpaque2(ctx, this_val, JS_CLASS_STRING_ITERATOR);
     if (!it) {
-        *pdone = FALSE;
+        *pdone = false;
         return JS_EXCEPTION;
     }
     if (JS_IsUndefined(it->obj))
@@ -42993,18 +42949,18 @@ static JSValue js_string_iterator_next(JSContext *ctx, JSValue this_val,
         JS_FreeValue(ctx, it->obj);
         it->obj = JS_UNDEFINED;
     done:
-        *pdone = TRUE;
+        *pdone = true;
         return JS_UNDEFINED;
     }
 
     start = idx;
     c = string_getc(p, (int *)&idx);
     it->idx = idx;
-    *pdone = FALSE;
+    *pdone = false;
     if (c <= 0xffff) {
         return js_new_string_char(ctx, c);
     } else {
-        return js_new_string16_len(ctx, p->u.str16 + start, 2);
+        return js_new_string16_len(ctx, str16(p) + start, 2);
     }
 }
 
@@ -43025,11 +42981,11 @@ enum {
     magic_string_sup,
 };
 
-static JSValue js_string_CreateHTML(JSContext *ctx, JSValue this_val,
-                                    int argc, JSValue *argv, int magic)
+static JSValue js_string_CreateHTML(JSContext *ctx, JSValueConst this_val,
+                                    int argc, JSValueConst *argv, int magic)
 {
     JSValue str;
-    const JSString *p;
+    JSString *p;
     StringBuffer b_s, *b = &b_s;
     static struct { const char *tag, *attr; } const defs[] = {
         { "a", "name" }, { "big", NULL }, { "blink", NULL }, { "b", NULL },
@@ -43177,10 +43133,10 @@ static double js_fmax(double a, double b)
     }
 }
 
-static JSValue js_math_min_max(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv, int magic)
+static JSValue js_math_min_max(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv, int magic)
 {
-    BOOL is_max = magic;
+    bool is_max = magic;
     double r, a;
     int i;
     uint32_t tag;
@@ -43268,8 +43224,8 @@ static double js_math_round(double a)
     return u.d;
 }
 
-static JSValue js_math_hypot(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_math_hypot(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     double r, a;
     int i;
@@ -43302,8 +43258,8 @@ static double js_math_fround(double a)
     return (float)a;
 }
 
-static JSValue js_math_imul(JSContext *ctx, JSValue this_val,
-                            int argc, JSValue *argv)
+static JSValue js_math_imul(JSContext *ctx, JSValueConst this_val,
+                            int argc, JSValueConst *argv)
 {
     uint32_t a, b, c;
     int32_t d;
@@ -43317,8 +43273,8 @@ static JSValue js_math_imul(JSContext *ctx, JSValue this_val,
     return js_int32(d);
 }
 
-static JSValue js_math_clz32(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_math_clz32(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     uint32_t a, r;
 
@@ -43331,16 +43287,16 @@ static JSValue js_math_clz32(JSContext *ctx, JSValue this_val,
     return js_int32(r);
 }
 
-static JSValue js_math_sumPrecise(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_math_sumPrecise(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     JSValue iter, next, item, ret;
     bf_t a, b;
-    BOOL done;
+    int done;
     double d;
     int r;
 
-    iter = JS_GetIterator(ctx, argv[0], /*async*/FALSE);
+    iter = JS_GetIterator(ctx, argv[0], /*async*/false);
     if (JS_IsException(iter))
         return JS_EXCEPTION;
     bf_init(ctx->bf_ctx, &a);
@@ -43349,7 +43305,7 @@ static JSValue js_math_sumPrecise(JSContext *ctx, JSValue this_val,
     next = JS_GetProperty(ctx, iter, JS_ATOM_next);
     if (JS_IsException(next))
         goto fail;
-    bf_set_zero(&a, /*is_neg*/TRUE);
+    bf_set_zero(&a, /*is_neg*/true);
     for (;;) {
         item = JS_IteratorNext(ctx, iter, next, 0, NULL, &done);
         if (JS_IsException(item))
@@ -43409,8 +43365,8 @@ static void js_random_init(JSContext *ctx)
         ctx->random_state = 1;
 }
 
-static JSValue js_math_random(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_math_random(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
     JSFloat64Union u;
     uint64_t v;
@@ -43567,7 +43523,7 @@ static int getTimezoneOffset(int64_t time) {
 
 /* RegExp */
 
-static void js_regexp_finalizer(JSRuntime *rt, JSValue val)
+static void js_regexp_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSRegExp *re = &p->u.regexp;
@@ -43576,8 +43532,8 @@ static void js_regexp_finalizer(JSRuntime *rt, JSValue val)
 }
 
 /* create a string containing the RegExp bytecode */
-static JSValue js_compile_regexp(JSContext *ctx, JSValue pattern,
-                                 JSValue flags)
+static JSValue js_compile_regexp(JSContext *ctx, JSValueConst pattern,
+                                 JSValueConst flags)
 {
     const char *str;
     int re_flags, mask;
@@ -43654,7 +43610,7 @@ static JSValue js_compile_regexp(JSContext *ctx, JSValue pattern,
 
 /* create a RegExp object from a string containing the RegExp bytecode
    and the source pattern */
-static JSValue js_regexp_constructor_internal(JSContext *ctx, JSValue ctor,
+static JSValue js_regexp_constructor_internal(JSContext *ctx, JSValueConst ctor,
                                               JSValue pattern, JSValue bc)
 {
     JSValue obj;
@@ -43683,7 +43639,8 @@ static JSValue js_regexp_constructor_internal(JSContext *ctx, JSValue ctor,
     return obj;
 }
 
-static JSRegExp *js_get_regexp(JSContext *ctx, JSValue obj, BOOL throw_error)
+static JSRegExp *js_get_regexp(JSContext *ctx, JSValueConst obj,
+                               bool throw_error)
 {
     if (JS_VALUE_GET_TAG(obj) == JS_TAG_OBJECT) {
         JSObject *p = JS_VALUE_GET_OBJ(obj);
@@ -43696,26 +43653,26 @@ static JSRegExp *js_get_regexp(JSContext *ctx, JSValue obj, BOOL throw_error)
     return NULL;
 }
 
-/* return < 0 if exception or TRUE/FALSE */
-static int js_is_regexp(JSContext *ctx, JSValue obj)
+/* return < 0 if exception or true/false */
+static int js_is_regexp(JSContext *ctx, JSValueConst obj)
 {
     JSValue m;
 
     if (!JS_IsObject(obj))
-        return FALSE;
+        return false;
     m = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_match);
     if (JS_IsException(m))
         return -1;
     if (!JS_IsUndefined(m))
         return JS_ToBoolFree(ctx, m);
-    return js_get_regexp(ctx, obj, FALSE) != NULL;
+    return js_get_regexp(ctx, obj, false) != NULL;
 }
 
-static JSValue js_regexp_constructor(JSContext *ctx, JSValue new_target,
-                                     int argc, JSValue *argv)
+static JSValue js_regexp_constructor(JSContext *ctx, JSValueConst new_target,
+                                     int argc, JSValueConst *argv)
 {
     JSValue pattern, flags, bc, val;
-    JSValue pat, flags1;
+    JSValueConst pat, flags1;
     JSRegExp *re;
     int pat_is_regexp;
 
@@ -43729,7 +43686,7 @@ static JSValue js_regexp_constructor(JSContext *ctx, JSValue new_target,
         new_target = JS_GetActiveFunction(ctx);
         if (pat_is_regexp && JS_IsUndefined(flags1)) {
             JSValue ctor;
-            BOOL res;
+            bool res;
             ctor = JS_GetProperty(ctx, pat, JS_ATOM_constructor);
             if (JS_IsException(ctor))
                 return ctor;
@@ -43739,7 +43696,7 @@ static JSValue js_regexp_constructor(JSContext *ctx, JSValue new_target,
                 return js_dup(pat);
         }
     }
-    re = js_get_regexp(ctx, pat, FALSE);
+    re = js_get_regexp(ctx, pat, false);
     if (re) {
         pattern = js_dup(JS_MKPTR(JS_TAG_STRING, re->pattern));
         if (JS_IsUndefined(flags1)) {
@@ -43789,19 +43746,19 @@ static JSValue js_regexp_constructor(JSContext *ctx, JSValue new_target,
     return JS_EXCEPTION;
 }
 
-static JSValue js_regexp_compile(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_regexp_compile(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSRegExp *re1, *re;
-    JSValue pattern1, flags1;
+    JSValueConst pattern1, flags1;
     JSValue bc, pattern;
 
-    re = js_get_regexp(ctx, this_val, TRUE);
+    re = js_get_regexp(ctx, this_val, true);
     if (!re)
         return JS_EXCEPTION;
     pattern1 = argv[0];
     flags1 = argv[1];
-    re1 = js_get_regexp(ctx, pattern1, FALSE);
+    re1 = js_get_regexp(ctx, pattern1, false);
     if (re1) {
         if (!JS_IsUndefined(flags1))
             return JS_ThrowTypeError(ctx, "flags must be undefined");
@@ -43833,7 +43790,7 @@ static JSValue js_regexp_compile(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_regexp_get_source(JSContext *ctx, JSValue this_val)
+static JSValue js_regexp_get_source(JSContext *ctx, JSValueConst this_val)
 {
     JSRegExp *re;
     JSString *p;
@@ -43846,7 +43803,7 @@ static JSValue js_regexp_get_source(JSContext *ctx, JSValue this_val)
     if (js_same_value(ctx, this_val, ctx->class_proto[JS_CLASS_REGEXP]))
         goto empty_regex;
 
-    re = js_get_regexp(ctx, this_val, TRUE);
+    re = js_get_regexp(ctx, this_val, true);
     if (!re)
         return JS_EXCEPTION;
 
@@ -43899,7 +43856,7 @@ static JSValue js_regexp_get_source(JSContext *ctx, JSValue this_val)
     return string_buffer_end(b);
 }
 
-static JSValue js_regexp_get_flag(JSContext *ctx, JSValue this_val, int mask)
+static JSValue js_regexp_get_flag(JSContext *ctx, JSValueConst this_val, int mask)
 {
     JSRegExp *re;
     int flags;
@@ -43907,7 +43864,7 @@ static JSValue js_regexp_get_flag(JSContext *ctx, JSValue this_val, int mask)
     if (JS_VALUE_GET_TAG(this_val) != JS_TAG_OBJECT)
         return JS_ThrowTypeErrorNotAnObject(ctx);
 
-    re = js_get_regexp(ctx, this_val, FALSE);
+    re = js_get_regexp(ctx, this_val, false);
     if (!re) {
         if (js_same_value(ctx, this_val, ctx->class_proto[JS_CLASS_REGEXP]))
             return JS_UNDEFINED;
@@ -43915,11 +43872,11 @@ static JSValue js_regexp_get_flag(JSContext *ctx, JSValue this_val, int mask)
             return JS_ThrowTypeErrorInvalidClass(ctx, JS_CLASS_REGEXP);
     }
 
-    flags = lre_get_flags(re->bytecode->u.str8);
+    flags = lre_get_flags(str8(re->bytecode));
     return js_bool(flags & mask);
 }
 
-static JSValue js_regexp_get_flags(JSContext *ctx, JSValue this_val)
+static JSValue js_regexp_get_flags(JSContext *ctx, JSValueConst this_val)
 {
     char str[8], *p = str;
     int res;
@@ -43975,8 +43932,8 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_regexp_toString(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_regexp_toString(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     JSValue pattern, flags;
     StringBuffer b_s, *b = &b_s;
@@ -44000,7 +43957,7 @@ fail:
     return JS_EXCEPTION;
 }
 
-BOOL lre_check_stack_overflow(void *opaque, size_t alloca_size)
+bool lre_check_stack_overflow(void *opaque, size_t alloca_size)
 {
     if (!opaque)
         return 0;
@@ -44017,8 +43974,8 @@ void *lre_realloc(void *opaque, void *ptr, size_t size)
 }
 #endif
 
-static JSValue js_regexp_escape(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_regexp_escape(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     StringBuffer b_s, *b = &b_s;
     JSString *p;
@@ -44030,7 +43987,7 @@ static JSValue js_regexp_escape(JSContext *ctx, JSValue this_val,
     p = JS_VALUE_GET_STRING(argv[0]);
     string_buffer_init2(ctx, b, 0, p->is_wide_char);
     for (i = 0; i < p->len; i++) {
-        c = p->is_wide_char ? (uint32_t)p->u.str16[i] : (uint32_t)p->u.str8[i];
+        c = p->is_wide_char ? (uint32_t)str16(p)[i] : (uint32_t)str8(p)[i];
         if (c < 33) {
             if (c >= 9 && c <= 13) {
                 string_buffer_putc8(b, '\\');
@@ -44064,10 +44021,10 @@ static JSValue js_regexp_escape(JSContext *ctx, JSValue this_val,
     return string_buffer_end(b);
 }
 
-static JSValue js_regexp_exec(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_regexp_exec(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
-    JSRegExp *re = js_get_regexp(ctx, this_val, TRUE);
+    JSRegExp *re = js_get_regexp(ctx, this_val, true);
     JSString *str;
     JSValue t, ret, str_val, obj, val, groups;
     JSValue indices, indices_groups;
@@ -44095,7 +44052,7 @@ static JSValue js_regexp_exec(JSContext *ctx, JSValue this_val,
     if (JS_IsException(val) || JS_ToLengthFree(ctx, &last_index, val))
         goto fail;
 
-    re_bytecode = re->bytecode->u.str8;
+    re_bytecode = str8(re->bytecode);
     re_flags = lre_get_flags(re_bytecode);
     if ((re_flags & (LRE_FLAG_GLOBAL | LRE_FLAG_STICKY)) == 0) {
         last_index = 0;
@@ -44108,7 +44065,7 @@ static JSValue js_regexp_exec(JSContext *ctx, JSValue this_val,
             goto fail;
     }
     shift = str->is_wide_char;
-    str_buf = str->u.str8;
+    str_buf = str8(str);
     if (last_index > str->len) {
         rc = 2;
     } else {
@@ -44264,9 +44221,9 @@ fail:
 }
 
 /* delete portions of a string that match a given regex */
-static JSValue JS_RegExpDelete(JSContext *ctx, JSValue this_val, JSValue arg)
+static JSValue JS_RegExpDelete(JSContext *ctx, JSValueConst this_val, JSValue arg)
 {
-    JSRegExp *re = js_get_regexp(ctx, this_val, TRUE);
+    JSRegExp *re = js_get_regexp(ctx, this_val, true);
     JSString *str;
     JSValue str_val, val;
     uint8_t *re_bytecode;
@@ -44287,7 +44244,7 @@ static JSValue JS_RegExpDelete(JSContext *ctx, JSValue this_val, JSValue arg)
     if (JS_IsException(str_val))
         goto fail;
     str = JS_VALUE_GET_STRING(str_val);
-    re_bytecode = re->bytecode->u.str8;
+    re_bytecode = str8(re->bytecode);
     re_flags = lre_get_flags(re_bytecode);
     if ((re_flags & (LRE_FLAG_GLOBAL | LRE_FLAG_STICKY)) == 0) {
         last_index = 0;
@@ -44303,7 +44260,7 @@ static JSValue JS_RegExpDelete(JSContext *ctx, JSValue this_val, JSValue arg)
             goto fail;
     }
     shift = str->is_wide_char;
-    str_buf = str->u.str8;
+    str_buf = str8(str);
     next_src_pos = 0;
     for (;;) {
         if (last_index > str->len)
@@ -44359,7 +44316,7 @@ fail:
     return JS_EXCEPTION;
 }
 
-static JSValue JS_RegExpExec(JSContext *ctx, JSValue r, JSValue s)
+static JSValue JS_RegExpExec(JSContext *ctx, JSValueConst r, JSValueConst s)
 {
     JSValue method, ret;
 
@@ -44380,11 +44337,11 @@ static JSValue JS_RegExpExec(JSContext *ctx, JSValue r, JSValue s)
     return js_regexp_exec(ctx, r, 1, &s);
 }
 
-static JSValue js_regexp_test(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_regexp_test(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
     JSValue val;
-    BOOL ret;
+    bool ret;
 
     val = JS_RegExpExec(ctx, this_val, argv[0]);
     if (JS_IsException(val))
@@ -44394,11 +44351,11 @@ static JSValue js_regexp_test(JSContext *ctx, JSValue this_val,
     return js_bool(ret);
 }
 
-static JSValue js_regexp_Symbol_match(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv)
+static JSValue js_regexp_Symbol_match(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv)
 {
     // [Symbol.match](str)
-    JSValue rx = this_val;
+    JSValueConst rx = this_val;
     JSValue A, S, flags, result, matchStr;
     int global, n, fullUnicode, isEmpty;
     JSString *p;
@@ -44482,12 +44439,13 @@ exception:
 typedef struct JSRegExpStringIteratorData {
     JSValue iterating_regexp;
     JSValue iterated_string;
-    BOOL global;
-    BOOL unicode;
-    BOOL done;
+    bool global;
+    bool unicode;
+    int done;
 } JSRegExpStringIteratorData;
 
-static void js_regexp_string_iterator_finalizer(JSRuntime *rt, JSValue val)
+static void js_regexp_string_iterator_finalizer(JSRuntime *rt,
+                                                JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSRegExpStringIteratorData *it = p->u.regexp_string_iterator_data;
@@ -44498,7 +44456,7 @@ static void js_regexp_string_iterator_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_regexp_string_iterator_mark(JSRuntime *rt, JSValue val,
+static void js_regexp_string_iterator_mark(JSRuntime *rt, JSValueConst val,
                                            JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -44510,9 +44468,9 @@ static void js_regexp_string_iterator_mark(JSRuntime *rt, JSValue val,
 }
 
 static JSValue js_regexp_string_iterator_next(JSContext *ctx,
-                                              JSValue this_val,
-                                              int argc, JSValue *argv,
-                                              BOOL *pdone, int magic)
+                                              JSValueConst this_val,
+                                              int argc, JSValueConst *argv,
+                                              int *pdone, int magic)
 {
     JSRegExpStringIteratorData *it;
     JSValue R, S;
@@ -44523,7 +44481,7 @@ static JSValue js_regexp_string_iterator_next(JSContext *ctx,
     if (!it)
         goto exception;
     if (it->done) {
-        *pdone = TRUE;
+        *pdone = true;
         return JS_UNDEFINED;
     }
     R = it->iterating_regexp;
@@ -44532,8 +44490,8 @@ static JSValue js_regexp_string_iterator_next(JSContext *ctx,
     if (JS_IsException(match))
         goto exception;
     if (JS_IsNull(match)) {
-        it->done = TRUE;
-        *pdone = TRUE;
+        it->done = true;
+        *pdone = true;
         return JS_UNDEFINED;
     } else if (it->global) {
         matchStr = JS_ToStringFree(ctx, JS_GetPropertyInt64(ctx, match, 0));
@@ -44551,24 +44509,24 @@ static JSValue js_regexp_string_iterator_next(JSContext *ctx,
         }
         JS_FreeValue(ctx, matchStr);
     } else {
-        it->done = TRUE;
+        it->done = true;
     }
-    *pdone = FALSE;
+    *pdone = false;
     return match;
  exception:
     JS_FreeValue(ctx, match);
     JS_FreeValue(ctx, matchStr);
-    *pdone = FALSE;
+    *pdone = false;
     return JS_EXCEPTION;
 }
 
-static JSValue js_regexp_Symbol_matchAll(JSContext *ctx, JSValue this_val,
-                                         int argc, JSValue *argv)
+static JSValue js_regexp_Symbol_matchAll(JSContext *ctx, JSValueConst this_val,
+                                         int argc, JSValueConst *argv)
 {
     // [Symbol.matchAll](str)
-    JSValue R = this_val;
+    JSValueConst R = this_val;
     JSValue S, C, flags, matcher, iter;
-    JSValue args[2];
+    JSValueConst args[2];
     JSString *strp;
     int64_t lastIndex;
     JSRegExpStringIteratorData *it;
@@ -44612,7 +44570,7 @@ static JSValue js_regexp_Symbol_matchAll(JSContext *ctx, JSValue this_val,
     strp = JS_VALUE_GET_STRING(flags);
     it->global = string_indexof_char(strp, 'g', 0) >= 0;
     it->unicode = string_indexof_char(strp, 'u', 0) >= 0;
-    it->done = FALSE;
+    it->done = false;
     JS_SetOpaqueInternal(iter, it);
 
     JS_FreeValue(ctx, C);
@@ -44687,7 +44645,7 @@ static int value_buffer_append(ValueBuffer *b, JSValue val)
     return 0;
 }
 
-static int js_is_standard_regexp(JSContext *ctx, JSValue rx)
+static int js_is_standard_regexp(JSContext *ctx, JSValueConst rx)
 {
     JSValue val;
     int res;
@@ -44709,12 +44667,12 @@ static int js_is_standard_regexp(JSContext *ctx, JSValue rx)
     return res;
 }
 
-static JSValue js_regexp_Symbol_replace(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv)
+static JSValue js_regexp_Symbol_replace(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv)
 {
     // [Symbol.replace](str, rep)
-    JSValue rx = this_val, rep = argv[1];
-    JSValue args[6];
+    JSValueConst rx = this_val, rep = argv[1];
+    JSValueConst args[6];
     JSValue flags, str, rep_val, matched, tab, rep_str, namedCaptures, res;
     JSString *p, *sp, *rp;
     StringBuffer b_s, *b = &b_s;
@@ -44902,10 +44860,10 @@ done1:
     return res;
 }
 
-static JSValue js_regexp_Symbol_search(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_regexp_Symbol_search(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
-    JSValue rx = this_val;
+    JSValueConst rx = this_val;
     JSValue str, previousLastIndex, currentLastIndex, result, index;
 
     if (!JS_IsObject(rx))
@@ -44960,12 +44918,12 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_regexp_Symbol_split(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_regexp_Symbol_split(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
     // [Symbol.split](str, limit)
-    JSValue rx = this_val;
-    JSValue args[2];
+    JSValueConst rx = this_val;
+    JSValueConst args[2];
     JSValue str, ctor, splitter, A, flags, z, sub;
     JSString *strp;
     uint32_t lim, size, p, q;
@@ -45288,7 +45246,7 @@ JSValue JS_ParseJSON(JSContext *ctx, const char *buf, size_t buf_len, const char
     JSParseState s1, *s = &s1;
     JSValue val = JS_UNDEFINED;
 
-    js_parse_init(ctx, s, buf, buf_len, filename);
+    js_parse_init(ctx, s, buf, buf_len, filename, 1);
     if (json_next_token(s))
         goto fail;
     val = json_parse_value(s);
@@ -45305,11 +45263,11 @@ JSValue JS_ParseJSON(JSContext *ctx, const char *buf, size_t buf_len, const char
     return JS_EXCEPTION;
 }
 
-static JSValue internalize_json_property(JSContext *ctx, JSValue holder,
-                                         JSAtom name, JSValue reviver)
+static JSValue internalize_json_property(JSContext *ctx, JSValueConst holder,
+                                         JSAtom name, JSValueConst reviver)
 {
     JSValue val, new_el, name_val, res;
-    JSValue args[2];
+    JSValueConst args[2];
     int ret, is_array;
     uint32_t i, len = 0;
     JSAtom prop;
@@ -45323,7 +45281,7 @@ static JSValue internalize_json_property(JSContext *ctx, JSValue holder,
     if (JS_IsException(val))
         return val;
     if (JS_IsObject(val)) {
-        is_array = JS_IsArray(ctx, val);
+        is_array = js_is_array(ctx, val);
         if (is_array < 0)
             goto fail;
         if (is_array) {
@@ -45374,11 +45332,11 @@ static JSValue internalize_json_property(JSContext *ctx, JSValue holder,
     return JS_EXCEPTION;
 }
 
-static JSValue js_json_parse(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_json_parse(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     JSValue obj, root;
-    JSValue reviver;
+    JSValueConst reviver;
     const char *str;
     size_t len;
 
@@ -45409,7 +45367,7 @@ static JSValue js_json_parse(JSContext *ctx, JSValue this_val,
 }
 
 typedef struct JSONStringifyContext {
-    JSValue replacer_func;
+    JSValueConst replacer_func;
     JSValue stack;
     JSValue property_list;
     JSValue gap;
@@ -45424,10 +45382,11 @@ static JSValue JS_ToQuotedStringFree(JSContext *ctx, JSValue val) {
 }
 
 static JSValue js_json_check(JSContext *ctx, JSONStringifyContext *jsc,
-                             JSValue holder, JSValue val, JSValue key)
+                             JSValueConst holder, JSValue val,
+                             JSValueConst key)
 {
     JSValue v;
-    JSValue args[2];
+    JSValueConst args[2];
 
     if (JS_IsObject(val) || JS_IsBigInt(ctx, val)) {
 		JSValue f = JS_GetProperty(ctx, val, JS_ATOM_toJSON);
@@ -45478,14 +45437,14 @@ exception:
 }
 
 static int js_json_to_str(JSContext *ctx, JSONStringifyContext *jsc,
-                          JSValue holder, JSValue val,
-                          JSValue indent)
+                          JSValueConst holder, JSValue val,
+                          JSValueConst indent)
 {
     JSValue indent1, sep, sep1, tab, v, prop;
     JSObject *p;
     int64_t i, len;
     int cl, ret;
-    BOOL has_content;
+    bool has_content;
 
     indent1 = JS_UNDEFINED;
     sep = JS_UNDEFINED;
@@ -45510,7 +45469,7 @@ static int js_json_to_str(JSContext *ctx, JSONStringifyContext *jsc,
             set_value(ctx, &val, js_dup(p->u.object_data));
             goto concat_primitive;
         }
-        v = js_array_includes(ctx, jsc->stack, 1, &val);
+        v = js_array_includes(ctx, jsc->stack, 1, vc(&val));
         if (JS_IsException(v))
             goto exception;
         if (JS_ToBoolFree(ctx, v)) {
@@ -45531,10 +45490,10 @@ static int js_json_to_str(JSContext *ctx, JSONStringifyContext *jsc,
             sep = js_dup(jsc->empty);
             sep1 = js_dup(jsc->empty);
         }
-        v = js_array_push(ctx, jsc->stack, 1, &val, 0);
+        v = js_array_push(ctx, jsc->stack, 1, vc(&val), 0);
         if (check_exception_free(ctx, v))
             goto exception;
-        ret = JS_IsArray(ctx, val);
+        ret = js_is_array(ctx, val);
         if (ret < 0)
             goto exception;
         if (ret) {
@@ -45571,13 +45530,14 @@ static int js_json_to_str(JSContext *ctx, JSONStringifyContext *jsc,
             if (!JS_IsUndefined(jsc->property_list))
                 tab = js_dup(jsc->property_list);
             else
-                tab = js_object_keys(ctx, JS_UNDEFINED, 1, &val, JS_ITERATOR_KIND_KEY);
+                tab = js_object_keys(ctx, JS_UNDEFINED, 1, vc(&val),
+                                     JS_ITERATOR_KIND_KEY);
             if (JS_IsException(tab))
                 goto exception;
             if (js_get_length64(ctx, &len, tab))
                 goto exception;
             string_buffer_putc8(jsc->b, '{');
-            has_content = FALSE;
+            has_content = false;
             for(i = 0; i < len; i++) {
                 JS_FreeValue(ctx, prop);
                 prop = JS_GetPropertyInt64(ctx, tab, i);
@@ -45603,7 +45563,7 @@ static int js_json_to_str(JSContext *ctx, JSONStringifyContext *jsc,
                     string_buffer_concat_value(jsc->b, sep1);
                     if (js_json_to_str(ctx, jsc, val, v, indent1))
                         goto exception;
-                    has_content = TRUE;
+                    has_content = true;
                 }
             }
             if (has_content && JS_VALUE_GET_STRING(jsc->gap)->len != 0) {
@@ -45657,8 +45617,8 @@ exception:
     return -1;
 }
 
-JSValue JS_JSONStringify(JSContext *ctx, JSValue obj,
-                         JSValue replacer, JSValue space0)
+JSValue JS_JSONStringify(JSContext *ctx, JSValueConst obj,
+                         JSValueConst replacer, JSValueConst space0)
 {
     StringBuffer b_s;
     JSONStringifyContext jsc_s, *jsc = &jsc_s;
@@ -45682,7 +45642,7 @@ JSValue JS_JSONStringify(JSContext *ctx, JSValue obj,
     if (JS_IsFunction(ctx, replacer)) {
         jsc->replacer_func = replacer;
     } else {
-        res = JS_IsArray(ctx, replacer);
+        res = js_is_array(ctx, replacer);
         if (res < 0)
             goto exception;
         if (res) {
@@ -45717,7 +45677,7 @@ JSValue JS_JSONStringify(JSContext *ctx, JSValue obj,
                     continue;
                 }
                 present = js_array_includes(ctx, jsc->property_list,
-                                            1, &v);
+                                            1, vc(&v));
                 if (JS_IsException(present)) {
                     JS_FreeValue(ctx, v);
                     goto exception;
@@ -45791,8 +45751,8 @@ done:
     return ret;
 }
 
-static JSValue js_json_stringify(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_json_stringify(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     // stringify(val, replacer, space)
     return JS_JSONStringify(ctx, argv[0], argv[1], argv[2]);
@@ -45816,16 +45776,16 @@ void JS_AddIntrinsicJSON(JSContext *ctx)
 
 /* Reflect */
 
-static JSValue js_reflect_apply(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_reflect_apply(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     return js_function_apply(ctx, argv[0], max_int(0, argc - 1), argv + 1, 2);
 }
 
-static JSValue js_reflect_construct(JSContext *ctx, JSValue this_val,
-                                    int argc, JSValue *argv)
+static JSValue js_reflect_construct(JSContext *ctx, JSValueConst this_val,
+                                    int argc, JSValueConst *argv)
 {
-    JSValue func, array_arg, new_target;
+    JSValueConst func, array_arg, new_target;
     JSValue *tab, ret;
     uint32_t len;
 
@@ -45841,15 +45801,15 @@ static JSValue js_reflect_construct(JSContext *ctx, JSValue this_val,
     tab = build_arg_list(ctx, &len, array_arg);
     if (!tab)
         return JS_EXCEPTION;
-    ret = JS_CallConstructor2(ctx, func, new_target, len, tab);
+    ret = JS_CallConstructor2(ctx, func, new_target, len, vc(tab));
     free_arg_list(ctx, tab, len);
     return ret;
 }
 
-static JSValue js_reflect_deleteProperty(JSContext *ctx, JSValue this_val,
-                                         int argc, JSValue *argv)
+static JSValue js_reflect_deleteProperty(JSContext *ctx, JSValueConst this_val,
+                                         int argc, JSValueConst *argv)
 {
-    JSValue obj;
+    JSValueConst obj;
     JSAtom atom;
     int ret;
 
@@ -45867,10 +45827,10 @@ static JSValue js_reflect_deleteProperty(JSContext *ctx, JSValue this_val,
         return js_bool(ret);
 }
 
-static JSValue js_reflect_get(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_reflect_get(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
-    JSValue obj, prop, receiver;
+    JSValueConst obj, prop, receiver;
     JSAtom atom;
     JSValue ret;
 
@@ -45885,15 +45845,15 @@ static JSValue js_reflect_get(JSContext *ctx, JSValue this_val,
     atom = JS_ValueToAtom(ctx, prop);
     if (unlikely(atom == JS_ATOM_NULL))
         return JS_EXCEPTION;
-    ret = JS_GetPropertyInternal(ctx, obj, atom, receiver, FALSE);
+    ret = JS_GetPropertyInternal(ctx, obj, atom, receiver, false);
     JS_FreeAtom(ctx, atom);
     return ret;
 }
 
-static JSValue js_reflect_has(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_reflect_has(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
-    JSValue obj, prop;
+    JSValueConst obj, prop;
     JSAtom atom;
     int ret;
 
@@ -45912,10 +45872,10 @@ static JSValue js_reflect_has(JSContext *ctx, JSValue this_val,
         return js_bool(ret);
 }
 
-static JSValue js_reflect_set(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_reflect_set(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
-    JSValue obj, prop, val, receiver;
+    JSValueConst obj, prop, val, receiver;
     int ret;
     JSAtom atom;
 
@@ -45931,8 +45891,7 @@ static JSValue js_reflect_set(JSContext *ctx, JSValue this_val,
     atom = JS_ValueToAtom(ctx, prop);
     if (unlikely(atom == JS_ATOM_NULL))
         return JS_EXCEPTION;
-    ret = JS_SetPropertyInternal2(ctx, obj, atom, js_dup(val), receiver,
-                                  0, NULL);
+    ret = JS_SetPropertyInternal2(ctx, obj, atom, js_dup(val), receiver, 0);
     JS_FreeAtom(ctx, atom);
     if (ret < 0)
         return JS_EXCEPTION;
@@ -45940,19 +45899,19 @@ static JSValue js_reflect_set(JSContext *ctx, JSValue this_val,
         return js_bool(ret);
 }
 
-static JSValue js_reflect_setPrototypeOf(JSContext *ctx, JSValue this_val,
-                                         int argc, JSValue *argv)
+static JSValue js_reflect_setPrototypeOf(JSContext *ctx, JSValueConst this_val,
+                                         int argc, JSValueConst *argv)
 {
     int ret;
-    ret = JS_SetPrototypeInternal(ctx, argv[0], argv[1], FALSE);
+    ret = JS_SetPrototypeInternal(ctx, argv[0], argv[1], false);
     if (ret < 0)
         return JS_EXCEPTION;
     else
         return js_bool(ret);
 }
 
-static JSValue js_reflect_ownKeys(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_reflect_ownKeys(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     if (JS_VALUE_GET_TAG(argv[0]) != JS_TAG_OBJECT)
         return JS_ThrowTypeErrorNotAnObject(ctx);
@@ -45984,7 +45943,7 @@ static const JSCFunctionListEntry js_reflect_obj[] = {
 
 /* Proxy */
 
-static void js_proxy_finalizer(JSRuntime *rt, JSValue val)
+static void js_proxy_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSProxyData *s = JS_GetOpaque(val, JS_CLASS_PROXY);
     if (s) {
@@ -45994,7 +45953,7 @@ static void js_proxy_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_proxy_mark(JSRuntime *rt, JSValue val,
+static void js_proxy_mark(JSRuntime *rt, JSValueConst val,
                           JS_MarkFunc *mark_func)
 {
     JSProxyData *s = JS_GetOpaque(val, JS_CLASS_PROXY);
@@ -46010,7 +45969,7 @@ static JSValue JS_ThrowTypeErrorRevokedProxy(JSContext *ctx)
 }
 
 static JSProxyData *get_proxy_method(JSContext *ctx, JSValue *pmethod,
-                                     JSValue obj, JSAtom name)
+                                     JSValueConst obj, JSAtom name)
 {
     JSProxyData *s = JS_GetOpaque(obj, JS_CLASS_PROXY);
     JSValue method;
@@ -46035,7 +45994,7 @@ static JSProxyData *get_proxy_method(JSContext *ctx, JSValue *pmethod,
     return s;
 }
 
-static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValue obj)
+static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValueConst obj)
 {
     JSProxyData *s;
     JSValue method, ret, proto1;
@@ -46046,7 +46005,7 @@ static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValue obj)
         return JS_EXCEPTION;
     if (JS_IsUndefined(method))
         return JS_GetPrototype(ctx, s->target);
-    ret = JS_CallFree(ctx, method, s->handler, 1, &s->target);
+    ret = JS_CallFree(ctx, method, s->handler, 1, vc(&s->target));
     if (JS_IsException(ret))
         return ret;
     if (JS_VALUE_GET_TAG(ret) != JS_TAG_NULL &&
@@ -46076,13 +46035,13 @@ static JSValue js_proxy_getPrototypeOf(JSContext *ctx, JSValue obj)
     return ret;
 }
 
-static int js_proxy_setPrototypeOf(JSContext *ctx, JSValue obj,
-                                   JSValue proto_val, BOOL throw_flag)
+static int js_proxy_setPrototypeOf(JSContext *ctx, JSValueConst obj,
+                                   JSValueConst proto_val, bool throw_flag)
 {
     JSProxyData *s;
     JSValue method, ret, proto1;
-    JSValue args[2];
-    BOOL res;
+    JSValueConst args[2];
+    bool res;
     int res2;
 
     s = get_proxy_method(ctx, &method, obj, JS_ATOM_setPrototypeOf);
@@ -46101,7 +46060,7 @@ static int js_proxy_setPrototypeOf(JSContext *ctx, JSValue obj,
             JS_ThrowTypeError(ctx, "proxy: bad prototype");
             return -1;
         } else {
-            return FALSE;
+            return false;
         }
     }
     res2 = JS_IsExtensible(ctx, s->target);
@@ -46118,14 +46077,14 @@ static int js_proxy_setPrototypeOf(JSContext *ctx, JSValue obj,
         }
         JS_FreeValue(ctx, proto1);
     }
-    return TRUE;
+    return true;
 }
 
-static int js_proxy_isExtensible(JSContext *ctx, JSValue obj)
+static int js_proxy_isExtensible(JSContext *ctx, JSValueConst obj)
 {
     JSProxyData *s;
     JSValue method, ret;
-    BOOL res;
+    bool res;
     int res2;
 
     s = get_proxy_method(ctx, &method, obj, JS_ATOM_isExtensible);
@@ -46133,7 +46092,7 @@ static int js_proxy_isExtensible(JSContext *ctx, JSValue obj)
         return -1;
     if (JS_IsUndefined(method))
         return JS_IsExtensible(ctx, s->target);
-    ret = JS_CallFree(ctx, method, s->handler, 1, &s->target);
+    ret = JS_CallFree(ctx, method, s->handler, 1, vc(&s->target));
     if (JS_IsException(ret))
         return -1;
     res = JS_ToBoolFree(ctx, ret);
@@ -46147,11 +46106,11 @@ static int js_proxy_isExtensible(JSContext *ctx, JSValue obj)
     return res;
 }
 
-static int js_proxy_preventExtensions(JSContext *ctx, JSValue obj)
+static int js_proxy_preventExtensions(JSContext *ctx, JSValueConst obj)
 {
     JSProxyData *s;
     JSValue method, ret;
-    BOOL res;
+    bool res;
     int res2;
 
     s = get_proxy_method(ctx, &method, obj, JS_ATOM_preventExtensions);
@@ -46159,7 +46118,7 @@ static int js_proxy_preventExtensions(JSContext *ctx, JSValue obj)
         return -1;
     if (JS_IsUndefined(method))
         return JS_PreventExtensions(ctx, s->target);
-    ret = JS_CallFree(ctx, method, s->handler, 1, &s->target);
+    ret = JS_CallFree(ctx, method, s->handler, 1, vc(&s->target));
     if (JS_IsException(ret))
         return -1;
     res = JS_ToBoolFree(ctx, ret);
@@ -46175,14 +46134,14 @@ static int js_proxy_preventExtensions(JSContext *ctx, JSValue obj)
     return res;
 }
 
-static int js_proxy_has(JSContext *ctx, JSValue obj, JSAtom atom)
+static int js_proxy_has(JSContext *ctx, JSValueConst obj, JSAtom atom)
 {
     JSProxyData *s;
     JSValue method, ret1, atom_val;
-    int ret, res;
+    int res;
     JSObject *p;
-    JSValue args[2];
-    BOOL res2;
+    JSValueConst args[2];
+    bool ret, res2;
 
     s = get_proxy_method(ctx, &method, obj, JS_ATOM_has);
     if (!s)
@@ -46219,13 +46178,13 @@ static int js_proxy_has(JSContext *ctx, JSValue obj, JSAtom atom)
     return ret;
 }
 
-static JSValue js_proxy_get(JSContext *ctx, JSValue obj, JSAtom atom,
-                            JSValue receiver)
+static JSValue js_proxy_get(JSContext *ctx, JSValueConst obj, JSAtom atom,
+                            JSValueConst receiver)
 {
     JSProxyData *s;
     JSValue method, ret, atom_val;
     int res;
-    JSValue args[3];
+    JSValueConst args[3];
     JSPropertyDescriptor desc;
 
     s = get_proxy_method(ctx, &method, obj, JS_ATOM_get);
@@ -46233,7 +46192,7 @@ static JSValue js_proxy_get(JSContext *ctx, JSValue obj, JSAtom atom,
         return JS_EXCEPTION;
     /* Note: recursion is possible thru the prototype of s->target */
     if (JS_IsUndefined(method))
-        return JS_GetPropertyInternal(ctx, s->target, atom, receiver, FALSE);
+        return JS_GetPropertyInternal(ctx, s->target, atom, receiver, false);
     atom_val = JS_AtomToValue(ctx, atom);
     if (JS_IsException(atom_val)) {
         JS_FreeValue(ctx, method);
@@ -46269,21 +46228,21 @@ static JSValue js_proxy_get(JSContext *ctx, JSValue obj, JSAtom atom,
     return ret;
 }
 
-static int js_proxy_set(JSContext *ctx, JSValue obj, JSAtom atom,
-                        JSValue value, JSValue receiver, int flags)
+static int js_proxy_set(JSContext *ctx, JSValueConst obj, JSAtom atom,
+                        JSValueConst value, JSValueConst receiver, int flags)
 {
     JSProxyData *s;
     JSValue method, ret1, atom_val;
-    int ret, res;
-    JSValue args[4];
+    bool ret;
+    int res;
+    JSValueConst args[4];
 
     s = get_proxy_method(ctx, &method, obj, JS_ATOM_set);
     if (!s)
         return -1;
     if (JS_IsUndefined(method)) {
         return JS_SetPropertyInternal2(ctx, s->target, atom,
-                                       js_dup(value), receiver,
-                                       flags, NULL);
+                                       js_dup(value), receiver, flags);
     }
     atom_val = JS_AtomToValue(ctx, atom);
     if (JS_IsException(atom_val)) {
@@ -46327,8 +46286,8 @@ static int js_proxy_set(JSContext *ctx, JSValue obj, JSAtom atom,
     return ret;
 }
 
-static JSValue js_create_desc(JSContext *ctx, JSValue val,
-                              JSValue getter, JSValue setter,
+static JSValue js_create_desc(JSContext *ctx, JSValueConst val,
+                              JSValueConst getter, JSValueConst setter,
                               int flags)
 {
     JSValue ret;
@@ -46366,13 +46325,13 @@ static JSValue js_create_desc(JSContext *ctx, JSValue val,
 }
 
 static int js_proxy_get_own_property(JSContext *ctx, JSPropertyDescriptor *pdesc,
-                                     JSValue obj, JSAtom prop)
+                                     JSValueConst obj, JSAtom prop)
 {
     JSProxyData *s;
     JSValue method, trap_result_obj, prop_val;
     int res, target_desc_ret, ret;
     JSObject *p;
-    JSValue args[2];
+    JSValueConst args[2];
     JSPropertyDescriptor result_desc, target_desc;
 
     s = get_proxy_method(ctx, &method, obj, JS_ATOM_getOwnPropertyDescriptor);
@@ -46409,7 +46368,7 @@ static int js_proxy_get_own_property(JSContext *ctx, JSPropertyDescriptor *pdesc
             if (!(target_desc.flags & JS_PROP_CONFIGURABLE) || !p->extensible)
                 goto fail;
         }
-        ret = FALSE;
+        ret = false;
     } else {
         int flags1, extensible_target;
         extensible_target = JS_IsExtensible(ctx, s->target);
@@ -46452,7 +46411,7 @@ static int js_proxy_get_own_property(JSContext *ctx, JSPropertyDescriptor *pdesc
                 return -1;
             }
         }
-        ret = TRUE;
+        ret = true;
         if (pdesc) {
             *pdesc = result_desc;
         } else {
@@ -46462,18 +46421,18 @@ static int js_proxy_get_own_property(JSContext *ctx, JSPropertyDescriptor *pdesc
     return ret;
 }
 
-static int js_proxy_define_own_property(JSContext *ctx, JSValue obj,
-                                        JSAtom prop, JSValue val,
-                                        JSValue getter, JSValue setter,
-                                        int flags)
+static int js_proxy_define_own_property(JSContext *ctx, JSValueConst obj,
+                                        JSAtom prop, JSValueConst val,
+                                        JSValueConst getter,
+                                        JSValueConst setter, int flags)
 {
     JSProxyData *s;
     JSValue method, ret1, prop_val, desc_val;
-    int res, ret;
+    int res;
     JSObject *p;
-    JSValue args[3];
+    JSValueConst args[3];
     JSPropertyDescriptor desc;
-    BOOL setting_not_configurable;
+    bool ret, setting_not_configurable;
 
     s = get_proxy_method(ctx, &method, obj, JS_ATOM_defineProperty);
     if (!s)
@@ -46562,13 +46521,14 @@ static int js_proxy_define_own_property(JSContext *ctx, JSValue obj,
     return 1;
 }
 
-static int js_proxy_delete_property(JSContext *ctx, JSValue obj,
+static int js_proxy_delete_property(JSContext *ctx, JSValueConst obj,
                                     JSAtom atom)
 {
     JSProxyData *s;
     JSValue method, ret, atom_val;
-    int res, res2, is_extensible;
-    JSValue args[2];
+    int res2, is_extensible;
+    bool res;
+    JSValueConst args[2];
 
     s = get_proxy_method(ctx, &method, obj, JS_ATOM_deleteProperty);
     if (!s)
@@ -46627,7 +46587,7 @@ static int find_prop_key(const JSPropertyEnum *tab, int n, JSAtom atom)
 static int js_proxy_get_own_property_names(JSContext *ctx,
                                            JSPropertyEnum **ptab,
                                            uint32_t *plen,
-                                           JSValue obj)
+                                           JSValueConst obj)
 {
     JSProxyData *s;
     JSValue method, prop_array, val;
@@ -46645,7 +46605,7 @@ static int js_proxy_get_own_property_names(JSContext *ctx,
                                       JS_VALUE_GET_OBJ(s->target),
                                       JS_GPN_STRING_MASK | JS_GPN_SYMBOL_MASK);
     }
-    prop_array = JS_CallFree(ctx, method, s->handler, 1, &s->target);
+    prop_array = JS_CallFree(ctx, method, s->handler, 1, vc(&s->target));
     if (JS_IsException(prop_array))
         return -1;
     tab = NULL;
@@ -46673,7 +46633,7 @@ static int js_proxy_get_own_property_names(JSContext *ctx,
         if (atom == JS_ATOM_NULL)
             goto fail;
         tab[i].atom = atom;
-        tab[i].is_enumerable = FALSE; /* XXX: redundant? */
+        tab[i].is_enumerable = false; /* XXX: redundant? */
     }
 
     /* check duplicate properties (XXX: inefficient, could store the
@@ -46716,7 +46676,7 @@ static int js_proxy_get_own_property_names(JSContext *ctx,
                 }
                 /* mark the property as found */
                 if (!is_extensible)
-                    tab[idx].is_enumerable = TRUE;
+                    tab[idx].is_enumerable = true;
             }
         }
     }
@@ -46742,13 +46702,13 @@ static int js_proxy_get_own_property_names(JSContext *ctx,
     return -1;
 }
 
-static JSValue js_proxy_call_constructor(JSContext *ctx, JSValue func_obj,
-                                         JSValue new_target,
-                                         int argc, JSValue *argv)
+static JSValue js_proxy_call_constructor(JSContext *ctx, JSValueConst func_obj,
+                                         JSValueConst new_target,
+                                         int argc, JSValueConst *argv)
 {
     JSProxyData *s;
     JSValue method, arg_array, ret;
-    JSValue args[3];
+    JSValueConst args[3];
 
     s = get_proxy_method(ctx, &method, func_obj, JS_ATOM_construct);
     if (!s)
@@ -46776,13 +46736,13 @@ static JSValue js_proxy_call_constructor(JSContext *ctx, JSValue func_obj,
     return ret;
 }
 
-static JSValue js_proxy_call(JSContext *ctx, JSValue func_obj,
-                             JSValue this_obj,
-                             int argc, JSValue *argv, int flags)
+static JSValue js_proxy_call(JSContext *ctx, JSValueConst func_obj,
+                             JSValueConst this_obj,
+                             int argc, JSValueConst *argv, int flags)
 {
     JSProxyData *s;
     JSValue method, arg_array, ret;
-    JSValue args[3];
+    JSValueConst args[3];
 
     if (flags & JS_CALL_FLAG_CONSTRUCTOR)
         return js_proxy_call_constructor(ctx, func_obj, this_obj, argc, argv);
@@ -46792,7 +46752,7 @@ static JSValue js_proxy_call(JSContext *ctx, JSValue func_obj,
         return JS_EXCEPTION;
     if (!s->is_func) {
         JS_FreeValue(ctx, method);
-        return JS_ThrowTypeError(ctx, "not a function");
+        return JS_ThrowTypeErrorNotAFunction(ctx);
     }
     if (JS_IsUndefined(method))
         return JS_Call(ctx, s->target, this_obj, argc, argv);
@@ -46811,11 +46771,11 @@ static JSValue js_proxy_call(JSContext *ctx, JSValue func_obj,
     return ret;
 }
 
-static int js_proxy_isArray(JSContext *ctx, JSValue obj)
+static int js_proxy_isArray(JSContext *ctx, JSValueConst obj)
 {
     JSProxyData *s = JS_GetOpaque(obj, JS_CLASS_PROXY);
     if (!s)
-        return FALSE;
+        return false;
 
     if (js_check_stack_overflow(ctx->rt, 0)) {
         JS_ThrowStackOverflow(ctx);
@@ -46826,7 +46786,7 @@ static int js_proxy_isArray(JSContext *ctx, JSValue obj)
         JS_ThrowTypeErrorRevokedProxy(ctx);
         return -1;
     }
-    return JS_IsArray(ctx, s->target);
+    return js_is_array(ctx, s->target);
 }
 
 static const JSClassExoticMethods js_proxy_exotic_methods = {
@@ -46839,10 +46799,10 @@ static const JSClassExoticMethods js_proxy_exotic_methods = {
     .set_property = js_proxy_set,
 };
 
-static JSValue js_proxy_constructor(JSContext *ctx, JSValue this_val,
-                                    int argc, JSValue *argv)
+static JSValue js_proxy_constructor(JSContext *ctx, JSValueConst this_val,
+                                    int argc, JSValueConst *argv)
 {
-    JSValue target, handler;
+    JSValueConst target, handler;
     JSValue obj;
     JSProxyData *s;
 
@@ -46863,35 +46823,35 @@ static JSValue js_proxy_constructor(JSContext *ctx, JSValue this_val,
     s->target = js_dup(target);
     s->handler = js_dup(handler);
     s->is_func = JS_IsFunction(ctx, target);
-    s->is_revoked = FALSE;
+    s->is_revoked = false;
     JS_SetOpaqueInternal(obj, s);
     JS_SetConstructorBit(ctx, obj, JS_IsConstructor(ctx, target));
     return obj;
 }
 
-static JSValue js_proxy_revoke(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv, int magic,
-                               JSValue *func_data)
+static JSValue js_proxy_revoke(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv, int magic,
+                               JSValueConst *func_data)
 {
     JSProxyData *s = JS_GetOpaque(func_data[0], JS_CLASS_PROXY);
     if (s) {
         /* We do not free the handler and target in case they are
            referenced as constants in the C call stack */
-        s->is_revoked = TRUE;
-        JS_FreeValue(ctx, func_data[0]);
+        s->is_revoked = true;
+        JS_FreeValue(ctx, unsafe_unconst(func_data[0]));
         func_data[0] = JS_NULL;
     }
     return JS_UNDEFINED;
 }
 
 static JSValue js_proxy_revoke_constructor(JSContext *ctx,
-                                           JSValue proxy_obj)
+                                           JSValueConst proxy_obj)
 {
     return JS_NewCFunctionData(ctx, js_proxy_revoke, 0, 0, 1, &proxy_obj);
 }
 
-static JSValue js_proxy_revocable(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_proxy_revocable(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSValue proxy_obj, revoke_obj = JS_UNDEFINED, obj;
 
@@ -46936,17 +46896,51 @@ void JS_AddIntrinsicProxy(JSContext *ctx)
 
     obj1 = JS_NewCFunction2(ctx, js_proxy_constructor, "Proxy", 2,
                             JS_CFUNC_constructor, 0);
-    JS_SetConstructorBit(ctx, obj1, TRUE);
+    JS_SetConstructorBit(ctx, obj1, true);
     JS_SetPropertyFunctionList(ctx, obj1, js_proxy_funcs,
                                countof(js_proxy_funcs));
     JS_DefinePropertyValueStr(ctx, ctx->global_obj, "Proxy",
                               obj1, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
 }
 
+bool JS_IsProxy(JSValueConst val)
+{
+    if (JS_VALUE_GET_TAG(val) == JS_TAG_OBJECT) {
+        JSObject *p = JS_VALUE_GET_OBJ(val);
+        return p->class_id == JS_CLASS_PROXY;
+    }
+    return false;
+}
+
+static JSValue js_get_proxy_field(JSContext *ctx, JSValueConst proxy,
+                                  int offset)
+{
+    if (JS_VALUE_GET_TAG(proxy) == JS_TAG_OBJECT) {
+        JSObject *p = JS_VALUE_GET_OBJ(proxy);
+        if (p->class_id == JS_CLASS_PROXY) {
+            JSProxyData *s = JS_GetOpaque(proxy, JS_CLASS_PROXY);
+            if (s->is_revoked)
+                return JS_ThrowTypeErrorRevokedProxy(ctx);
+            return js_dup(*(JSValue *)((char *)s + offset));
+        }
+    }
+    return JS_ThrowTypeError(ctx, "not a proxy");
+}
+
+JSValue JS_GetProxyTarget(JSContext *ctx, JSValueConst proxy)
+{
+    return js_get_proxy_field(ctx, proxy, offsetof(JSProxyData, target));
+}
+
+JSValue JS_GetProxyHandler(JSContext *ctx, JSValueConst proxy)
+{
+    return js_get_proxy_field(ctx, proxy, offsetof(JSProxyData, handler));
+}
+
 /* Symbol */
 
-static JSValue js_symbol_constructor(JSContext *ctx, JSValue new_target,
-                                     int argc, JSValue *argv)
+static JSValue js_symbol_constructor(JSContext *ctx, JSValueConst new_target,
+                                     int argc, JSValueConst *argv)
 {
     JSValue str;
     JSString *p;
@@ -46964,7 +46958,7 @@ static JSValue js_symbol_constructor(JSContext *ctx, JSValue new_target,
     return JS_NewSymbolInternal(ctx, p, JS_ATOM_TYPE_SYMBOL);
 }
 
-static JSValue js_thisSymbolValue(JSContext *ctx, JSValue this_val)
+static JSValue js_thisSymbolValue(JSContext *ctx, JSValueConst this_val)
 {
     if (JS_VALUE_GET_TAG(this_val) == JS_TAG_SYMBOL)
         return js_dup(this_val);
@@ -46979,26 +46973,26 @@ static JSValue js_thisSymbolValue(JSContext *ctx, JSValue this_val)
     return JS_ThrowTypeError(ctx, "not a symbol");
 }
 
-static JSValue js_symbol_toString(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_symbol_toString(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     JSValue val, ret;
     val = js_thisSymbolValue(ctx, this_val);
     if (JS_IsException(val))
         return val;
     /* XXX: use JS_ToStringInternal() with a flags */
-    ret = js_string_constructor(ctx, JS_UNDEFINED, 1, &val);
+    ret = js_string_constructor(ctx, JS_UNDEFINED, 1, vc(&val));
     JS_FreeValue(ctx, val);
     return ret;
 }
 
-static JSValue js_symbol_valueOf(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_symbol_valueOf(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     return js_thisSymbolValue(ctx, this_val);
 }
 
-static JSValue js_symbol_get_description(JSContext *ctx, JSValue this_val)
+static JSValue js_symbol_get_description(JSContext *ctx, JSValueConst this_val)
 {
     JSValue val, ret;
     JSAtomStruct *p;
@@ -47025,8 +47019,8 @@ static const JSCFunctionListEntry js_symbol_proto_funcs[] = {
     JS_CGETSET_DEF("description", js_symbol_get_description, NULL ),
 };
 
-static JSValue js_symbol_for(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_symbol_for(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     JSValue str;
 
@@ -47036,8 +47030,8 @@ static JSValue js_symbol_for(JSContext *ctx, JSValue this_val,
     return JS_NewSymbolInternal(ctx, JS_VALUE_GET_STRING(str), JS_ATOM_TYPE_GLOBAL_SYMBOL);
 }
 
-static JSValue js_symbol_keyFor(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_symbol_keyFor(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSAtomStruct *p;
 
@@ -47058,7 +47052,7 @@ static const JSCFunctionListEntry js_symbol_funcs[] = {
 
 typedef struct JSMapRecord {
     int ref_count; /* used during enumeration to avoid freeing the record */
-    BOOL empty; /* TRUE if the record is deleted */
+    bool empty; /* true if the record is deleted */
     struct JSMapState *map;
     struct list_head link;
     struct list_head hash_link;
@@ -47067,7 +47061,7 @@ typedef struct JSMapRecord {
 } JSMapRecord;
 
 typedef struct JSMapState {
-    BOOL is_weak; /* TRUE if WeakSet/WeakMap */
+    bool is_weak; /* true if WeakSet/WeakMap */
     struct list_head records; /* list of JSMapRecord.link */
     uint32_t record_count;
     struct list_head *hash_table;
@@ -47079,13 +47073,13 @@ typedef struct JSMapState {
 #define MAGIC_SET (1 << 0)
 #define MAGIC_WEAK (1 << 1)
 
-static JSValue js_map_constructor(JSContext *ctx, JSValue new_target,
-                                  int argc, JSValue *argv, int magic)
+static JSValue js_map_constructor(JSContext *ctx, JSValueConst new_target,
+                                  int argc, JSValueConst *argv, int magic)
 {
     JSMapState *s;
     JSValue obj, adder = JS_UNDEFINED, iter = JS_UNDEFINED, next_method = JS_UNDEFINED;
-    JSValue arr;
-    BOOL is_set, is_weak;
+    JSValueConst arr;
+    bool is_set, is_weak;
 
     is_set = magic & MAGIC_SET;
     is_weak = ((magic & MAGIC_WEAK) != 0);
@@ -47110,7 +47104,7 @@ static JSValue js_map_constructor(JSContext *ctx, JSValue new_target,
         arr = argv[0];
     if (!JS_IsUndefined(arr) && !JS_IsNull(arr)) {
         JSValue item, ret;
-        BOOL done;
+        int done;
 
         adder = JS_GetProperty(ctx, obj, is_set ? JS_ATOM_add : JS_ATOM_set);
         if (JS_IsException(adder))
@@ -47120,7 +47114,7 @@ static JSValue js_map_constructor(JSContext *ctx, JSValue new_target,
             goto fail;
         }
 
-        iter = JS_GetIterator(ctx, arr, FALSE);
+        iter = JS_GetIterator(ctx, arr, false);
         if (JS_IsException(iter))
             goto fail;
         next_method = JS_GetProperty(ctx, iter, JS_ATOM_next);
@@ -47136,14 +47130,14 @@ static JSValue js_map_constructor(JSContext *ctx, JSValue new_target,
                 break;
             }
             if (is_set) {
-                ret = JS_Call(ctx, adder, obj, 1, &item);
+                ret = JS_Call(ctx, adder, obj, 1, vc(&item));
                 if (JS_IsException(ret)) {
                     JS_FreeValue(ctx, item);
                     goto fail;
                 }
             } else {
                 JSValue key, value;
-                JSValue args[2];
+                JSValueConst args[2];
                 key = JS_UNDEFINED;
                 value = JS_UNDEFINED;
                 if (!JS_IsObject(item)) {
@@ -47180,7 +47174,7 @@ static JSValue js_map_constructor(JSContext *ctx, JSValue new_target,
  fail:
     if (JS_IsObject(iter)) {
         /* close the iterator object, preserving pending exception */
-        JS_IteratorClose(ctx, iter, TRUE);
+        JS_IteratorClose(ctx, iter, true);
     }
     JS_FreeValue(ctx, next_method);
     JS_FreeValue(ctx, iter);
@@ -47193,15 +47187,20 @@ static JSValue js_map_constructor(JSContext *ctx, JSValue new_target,
 static JSValue map_normalize_key(JSContext *ctx, JSValue key)
 {
     uint32_t tag = JS_VALUE_GET_TAG(key);
-    /* convert -0.0 to +0.0 */
-    if (JS_TAG_IS_FLOAT64(tag) && JS_VALUE_GET_FLOAT64(key) == 0.0) {
-        key = js_int32(0);
-    }
+    // convert -0.0 to +0.0
+    // not a leak; |key| and return value are not heap-allocated
+    if (JS_TAG_IS_FLOAT64(tag) && JS_VALUE_GET_FLOAT64(key) == 0.0)
+        return js_int32(0);
     return key;
 }
 
+static JSValueConst map_normalize_key_const(JSContext *ctx, JSValueConst key)
+{
+    return safe_const(map_normalize_key(ctx, unsafe_unconst(key)));
+}
+
 /* XXX: better hash ? */
-static uint32_t map_hash_key(JSContext *ctx, JSValue key)
+static uint32_t map_hash_key(JSContext *ctx, JSValueConst key)
 {
     uint32_t tag = JS_VALUE_GET_NORM_TAG(key);
     uint32_t h;
@@ -47231,7 +47230,7 @@ static uint32_t map_hash_key(JSContext *ctx, JSValue key)
         d = JS_VALUE_GET_FLOAT64(key);
         /* normalize the NaN */
         if (isnan(d))
-            d = JS_FLOAT64_NAN;
+            d = NAN;
     hash_float64:
         u.d = d;
         h = (u.u32[0] ^ u.u32[1]) * 3163;
@@ -47245,7 +47244,7 @@ static uint32_t map_hash_key(JSContext *ctx, JSValue key)
 }
 
 static JSMapRecord *map_find_record(JSContext *ctx, JSMapState *s,
-                                    JSValue key)
+                                    JSValueConst key)
 {
     struct list_head *el;
     JSMapRecord *mr;
@@ -47292,7 +47291,7 @@ static void map_hash_resize(JSContext *ctx, JSMapState *s)
     s->record_count_threshold = new_hash_size * 2;
 }
 
-static JSWeakRefRecord **get_first_weak_ref(JSValue key)
+static JSWeakRefRecord **get_first_weak_ref(JSValueConst key)
 {
         switch (JS_VALUE_GET_TAG(key)) {
         case JS_TAG_OBJECT:
@@ -47314,7 +47313,7 @@ static JSWeakRefRecord **get_first_weak_ref(JSValue key)
 }
 
 static JSMapRecord *map_add_record(JSContext *ctx, JSMapState *s,
-                                   JSValue key)
+                                   JSValueConst key)
 {
     uint32_t h;
     JSMapRecord *mr;
@@ -47324,7 +47323,7 @@ static JSMapRecord *map_add_record(JSContext *ctx, JSMapState *s,
         return NULL;
     mr->ref_count = 1;
     mr->map = s;
-    mr->empty = FALSE;
+    mr->empty = false;
     if (s->is_weak) {
         JSWeakRefRecord *wr = js_malloc(ctx, sizeof(*wr));
         if (!wr) {
@@ -47334,10 +47333,10 @@ static JSMapRecord *map_add_record(JSContext *ctx, JSMapState *s,
         wr->kind = JS_WEAK_REF_KIND_MAP;
         wr->u.map_record = mr;
         insert_weakref_record(key, wr);
+        mr->key = unsafe_unconst(key);
     } else {
-        js_dup(key);
+        mr->key = js_dup(key);
     }
-    mr->key = key;
     h = map_hash_key(ctx, key) & (s->hash_size - 1);
     list_add_tail(&mr->hash_link, &s->hash_table[h]);
     list_add_tail(&mr->link, &s->records);
@@ -47384,7 +47383,7 @@ static void map_delete_record(JSRuntime *rt, JSMapState *s, JSMapRecord *mr)
         js_free_rt(rt, mr);
     } else {
         /* keep a zombie record for iterators */
-        mr->empty = TRUE;
+        mr->empty = true;
         mr->key = JS_UNDEFINED;
         mr->value = JS_UNDEFINED;
     }
@@ -47401,18 +47400,18 @@ static void map_decref_record(JSRuntime *rt, JSMapRecord *mr)
     }
 }
 
-static JSValue js_map_set(JSContext *ctx, JSValue this_val,
-                          int argc, JSValue *argv, int magic)
+static JSValue js_map_set(JSContext *ctx, JSValueConst this_val,
+                          int argc, JSValueConst *argv, int magic)
 {
     JSMapState *s = JS_GetOpaque2(ctx, this_val, JS_CLASS_MAP + magic);
     JSMapRecord *mr;
-    JSValue key, value;
+    JSValueConst key, value;
     int is_set;
 
     if (!s)
         return JS_EXCEPTION;
     is_set = (magic & MAGIC_SET);
-    key = map_normalize_key(ctx, argv[0]);
+    key = map_normalize_key_const(ctx, argv[0]);
     if (s->is_weak && !is_valid_weakref_target(key))
         return JS_ThrowTypeError(ctx, "invalid value used as %s key", is_set ? "WeakSet" : "WeakMap");
     if (is_set)
@@ -47431,16 +47430,16 @@ static JSValue js_map_set(JSContext *ctx, JSValue this_val,
     return js_dup(this_val);
 }
 
-static JSValue js_map_get(JSContext *ctx, JSValue this_val,
-                          int argc, JSValue *argv, int magic)
+static JSValue js_map_get(JSContext *ctx, JSValueConst this_val,
+                          int argc, JSValueConst *argv, int magic)
 {
     JSMapState *s = JS_GetOpaque2(ctx, this_val, JS_CLASS_MAP + magic);
     JSMapRecord *mr;
-    JSValue key;
+    JSValueConst key;
 
     if (!s)
         return JS_EXCEPTION;
-    key = map_normalize_key(ctx, argv[0]);
+    key = map_normalize_key_const(ctx, argv[0]);
     mr = map_find_record(ctx, s, key);
     if (!mr)
         return JS_UNDEFINED;
@@ -47448,30 +47447,30 @@ static JSValue js_map_get(JSContext *ctx, JSValue this_val,
         return js_dup(mr->value);
 }
 
-static JSValue js_map_has(JSContext *ctx, JSValue this_val,
-                          int argc, JSValue *argv, int magic)
+static JSValue js_map_has(JSContext *ctx, JSValueConst this_val,
+                          int argc, JSValueConst *argv, int magic)
 {
     JSMapState *s = JS_GetOpaque2(ctx, this_val, JS_CLASS_MAP + magic);
     JSMapRecord *mr;
-    JSValue key;
+    JSValueConst key;
 
     if (!s)
         return JS_EXCEPTION;
-    key = map_normalize_key(ctx, argv[0]);
+    key = map_normalize_key_const(ctx, argv[0]);
     mr = map_find_record(ctx, s, key);
     return js_bool(mr != NULL);
 }
 
-static JSValue js_map_delete(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv, int magic)
+static JSValue js_map_delete(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv, int magic)
 {
     JSMapState *s = JS_GetOpaque2(ctx, this_val, JS_CLASS_MAP + magic);
     JSMapRecord *mr;
-    JSValue key;
+    JSValueConst key;
 
     if (!s)
         return JS_EXCEPTION;
-    key = map_normalize_key(ctx, argv[0]);
+    key = map_normalize_key_const(ctx, argv[0]);
     mr = map_find_record(ctx, s, key);
     if (!mr)
         return JS_FALSE;
@@ -47479,8 +47478,8 @@ static JSValue js_map_delete(JSContext *ctx, JSValue this_val,
     return JS_TRUE;
 }
 
-static JSValue js_map_clear(JSContext *ctx, JSValue this_val,
-                            int argc, JSValue *argv, int magic)
+static JSValue js_map_clear(JSContext *ctx, JSValueConst this_val,
+                            int argc, JSValueConst *argv, int magic)
 {
     JSMapState *s = JS_GetOpaque2(ctx, this_val, JS_CLASS_MAP + magic);
     struct list_head *el, *el1;
@@ -47495,7 +47494,7 @@ static JSValue js_map_clear(JSContext *ctx, JSValue this_val,
     return JS_UNDEFINED;
 }
 
-static JSValue js_map_get_size(JSContext *ctx, JSValue this_val, int magic)
+static JSValue js_map_get_size(JSContext *ctx, JSValueConst this_val, int magic)
 {
     JSMapState *s = JS_GetOpaque2(ctx, this_val, JS_CLASS_MAP + magic);
     if (!s)
@@ -47503,11 +47502,11 @@ static JSValue js_map_get_size(JSContext *ctx, JSValue this_val, int magic)
     return js_uint32(s->record_count);
 }
 
-static JSValue js_map_forEach(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv, int magic)
+static JSValue js_map_forEach(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv, int magic)
 {
     JSMapState *s = JS_GetOpaque2(ctx, this_val, JS_CLASS_MAP + magic);
-    JSValue func, this_arg;
+    JSValueConst func, this_arg;
     JSValue ret, args[3];
     struct list_head *el;
     JSMapRecord *mr;
@@ -47534,8 +47533,8 @@ static JSValue js_map_forEach(JSContext *ctx, JSValue this_val,
                 args[0] = args[1];
             else
                 args[0] = js_dup(mr->value);
-            args[2] = this_val;
-            ret = JS_Call(ctx, func, this_arg, 3, args);
+            args[2] = unsafe_unconst(this_val);
+            ret = JS_Call(ctx, func, this_arg, 3, vc(args));
             JS_FreeValue(ctx, args[0]);
             if (!magic)
                 JS_FreeValue(ctx, args[1]);
@@ -47551,20 +47550,20 @@ static JSValue js_map_forEach(JSContext *ctx, JSValue this_val,
     return JS_UNDEFINED;
 }
 
-static JSValue js_map_groupBy(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_map_groupBy(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
-    JSValue cb, res, iter, next, groups, k, v, prop;
-    JSValue args[2];
+    JSValue res, iter, next, groups, k, v, prop;
+    JSValueConst cb, args[2];
     int64_t idx;
-    BOOL done;
+    int done;
 
     // "is function?" check must be observed before argv[0] is accessed
     cb = argv[1];
     if (check_function(ctx, cb))
         return JS_EXCEPTION;
 
-    iter = JS_GetIterator(ctx, argv[0], /*is_async*/FALSE);
+    iter = JS_GetIterator(ctx, argv[0], /*is_async*/false);
     if (JS_IsException(iter))
         return JS_EXCEPTION;
 
@@ -47594,7 +47593,7 @@ static JSValue js_map_groupBy(JSContext *ctx, JSValue this_val,
         if (JS_IsException(k))
             goto exception;
 
-        prop = js_map_get(ctx, groups, 1, &k, 0);
+        prop = js_map_get(ctx, groups, 1, vc(&k), 0);
         if (JS_IsException(prop))
             goto exception;
 
@@ -47610,7 +47609,7 @@ static JSValue js_map_groupBy(JSContext *ctx, JSValue this_val,
             JS_FreeValue(ctx, res);
         }
 
-        res = js_array_push(ctx, prop, 1, &v, /*unshift*/0);
+        res = js_array_push(ctx, prop, 1, vc(&v), /*unshift*/0);
         if (JS_IsException(res))
             goto exception;
         // res is an int64
@@ -47637,7 +47636,7 @@ exception:
     return JS_EXCEPTION;
 }
 
-static void js_map_finalizer(JSRuntime *rt, JSValue val)
+static void js_map_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p;
     JSMapState *s;
@@ -47665,7 +47664,8 @@ static void js_map_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_map_mark(JSRuntime *rt, JSValue val, JS_MarkFunc *mark_func)
+static void js_map_mark(JSRuntime *rt, JSValueConst val,
+                        JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSMapState *s;
@@ -47691,7 +47691,7 @@ typedef struct JSMapIteratorData {
     JSMapRecord *cur_record;
 } JSMapIteratorData;
 
-static void js_map_iterator_finalizer(JSRuntime *rt, JSValue val)
+static void js_map_iterator_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p;
     JSMapIteratorData *it;
@@ -47709,7 +47709,7 @@ static void js_map_iterator_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_map_iterator_mark(JSRuntime *rt, JSValue val,
+static void js_map_iterator_mark(JSRuntime *rt, JSValueConst val,
                                  JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -47721,8 +47721,8 @@ static void js_map_iterator_mark(JSRuntime *rt, JSValue val,
     }
 }
 
-static JSValue js_create_map_iterator(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv, int magic)
+static JSValue js_create_map_iterator(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv, int magic)
 {
     JSIteratorKindEnum kind;
     JSMapState *s;
@@ -47751,9 +47751,9 @@ static JSValue js_create_map_iterator(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_map_iterator_next(JSContext *ctx, JSValue this_val,
-                                    int argc, JSValue *argv,
-                                    BOOL *pdone, int magic)
+static JSValue js_map_iterator_next(JSContext *ctx, JSValueConst this_val,
+                                    int argc, JSValueConst *argv,
+                                    int *pdone, int magic)
 {
     JSMapIteratorData *it;
     JSMapState *s;
@@ -47762,7 +47762,7 @@ static JSValue js_map_iterator_next(JSContext *ctx, JSValue this_val,
 
     it = JS_GetOpaque2(ctx, this_val, JS_CLASS_MAP_ITERATOR + magic);
     if (!it) {
-        *pdone = FALSE;
+        *pdone = false;
         return JS_EXCEPTION;
     }
     if (JS_IsUndefined(it->obj))
@@ -47784,7 +47784,7 @@ static JSValue js_map_iterator_next(JSContext *ctx, JSValue this_val,
             it->obj = JS_UNDEFINED;
         done:
             /* end of enumeration */
-            *pdone = TRUE;
+            *pdone = true;
             return JS_UNDEFINED;
         }
         mr = list_entry(el, JSMapRecord, link);
@@ -47797,12 +47797,12 @@ static JSValue js_map_iterator_next(JSContext *ctx, JSValue this_val,
     /* lock the record so that it won't be freed */
     mr->ref_count++;
     it->cur_record = mr;
-    *pdone = FALSE;
+    *pdone = false;
 
     if (it->kind == JS_ITERATOR_KIND_KEY) {
         return js_dup(mr->key);
     } else {
-        JSValue args[2];
+        JSValueConst args[2];
         args[0] = mr->key;
         if (magic)
             args[1] = mr->key;
@@ -47840,7 +47840,7 @@ static JSValue js_map_read(BCReaderState *s, int magic)
             if (JS_IsException(argv[1]))
                 goto fail;
         }
-        rv = js_map_set(ctx, obj, countof(argv), argv, magic);
+        rv = js_map_set(ctx, obj, countof(argv), vc(argv), magic);
         if (JS_IsException(rv))
             goto fail;
         JS_FreeValue(ctx, rv);
@@ -47899,7 +47899,8 @@ static int JS_WriteSet(BCWriterState *s, struct JSMapState *map_state)
     return js_map_write(s, map_state, MAGIC_SET);
 }
 
-static int js_setlike_get_size(JSContext *ctx, JSValue setlike, int64_t *pout)
+static int js_setlike_get_size(JSContext *ctx, JSValueConst setlike,
+                               int64_t *pout)
 {
     JSMapState *s;
     JSValue v;
@@ -47927,7 +47928,8 @@ static int js_setlike_get_size(JSContext *ctx, JSValue setlike, int64_t *pout)
     return 0;
 }
 
-static int js_setlike_get_has(JSContext *ctx, JSValue setlike, JSValue *pout)
+static int js_setlike_get_has(JSContext *ctx, JSValueConst setlike,
+                              JSValue *pout)
 {
     JSValue v;
 
@@ -47947,7 +47949,8 @@ static int js_setlike_get_has(JSContext *ctx, JSValue setlike, JSValue *pout)
     return 0;
 }
 
-static int js_setlike_get_keys(JSContext *ctx, JSValue setlike, JSValue *pout)
+static int js_setlike_get_keys(JSContext *ctx, JSValueConst setlike,
+                               JSValue *pout)
 {
     JSValue v;
 
@@ -47967,11 +47970,12 @@ static int js_setlike_get_keys(JSContext *ctx, JSValue setlike, JSValue *pout)
     return 0;
 }
 
-static JSValue js_set_isDisjointFrom(JSContext *ctx, JSValue this_val,
-                                     int argc, JSValue *argv)
+static JSValue js_set_isDisjointFrom(JSContext *ctx, JSValueConst this_val,
+                                     int argc, JSValueConst *argv)
 {
     JSValue item, iter, keys, has, next, rv, rval;
-    BOOL done, found;
+    int done;
+    bool found;
     JSMapState *s;
     int64_t size;
     int ok;
@@ -47998,7 +48002,7 @@ static JSValue js_set_isDisjointFrom(JSContext *ctx, JSValue this_val,
         next = JS_GetProperty(ctx, iter, JS_ATOM_next);
         if (JS_IsException(next))
             goto exception;
-        found = FALSE;
+        found = false;
         do {
             item = JS_IteratorNext(ctx, iter, next, 0, NULL, &done);
             if (JS_IsException(item))
@@ -48013,14 +48017,14 @@ static JSValue js_set_isDisjointFrom(JSContext *ctx, JSValue this_val,
         iter = js_create_map_iterator(ctx, this_val, 0, NULL, MAGIC_SET);
         if (JS_IsException(iter))
             goto exception;
-        found = FALSE;
+        found = false;
         do {
             item = js_map_iterator_next(ctx, iter, 0, NULL, &done, MAGIC_SET);
             if (JS_IsException(item))
                 goto exception;
             if (done) // item is JS_UNDEFINED
                 break;
-            rv = JS_Call(ctx, has, argv[0], 1, &item);
+            rv = JS_Call(ctx, has, argv[0], 1, vc(&item));
             JS_FreeValue(ctx, item);
             ok = JS_ToBoolFree(ctx, rv); // returns -1 if rv is JS_EXCEPTION
             if (ok < 0)
@@ -48037,14 +48041,14 @@ exception:
     return rval;
 }
 
-static JSValue js_set_isSubsetOf(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_set_isSubsetOf(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSValue item, iter, keys, has, next, rv, rval;
-    BOOL done, found;
+    bool found;
     JSMapState *s;
     int64_t size;
-    int ok;
+    int done, ok;
 
     has = JS_UNDEFINED;
     iter = JS_UNDEFINED;
@@ -48061,20 +48065,20 @@ static JSValue js_set_isSubsetOf(JSContext *ctx, JSValue this_val,
         goto exception;
     if (js_setlike_get_keys(ctx, argv[0], &keys) < 0)
         goto exception;
-    found = FALSE;
+    found = false;
     if (s->record_count > size)
         goto fini;
     iter = js_create_map_iterator(ctx, this_val, 0, NULL, MAGIC_SET);
     if (JS_IsException(iter))
         goto exception;
-    found = TRUE;
+    found = true;
     do {
         item = js_map_iterator_next(ctx, iter, 0, NULL, &done, MAGIC_SET);
         if (JS_IsException(item))
             goto exception;
         if (done) // item is JS_UNDEFINED
             break;
-        rv = JS_Call(ctx, has, argv[0], 1, &item);
+        rv = JS_Call(ctx, has, argv[0], 1, vc(&item));
         JS_FreeValue(ctx, item);
         ok = JS_ToBoolFree(ctx, rv); // returns -1 if rv is JS_EXCEPTION
         if (ok < 0)
@@ -48091,11 +48095,12 @@ exception:
     return rval;
 }
 
-static JSValue js_set_isSupersetOf(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_set_isSupersetOf(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     JSValue item, iter, keys, has, next, rval;
-    BOOL done, found;
+    int done;
+    bool found;
     JSMapState *s;
     int64_t size;
 
@@ -48114,7 +48119,7 @@ static JSValue js_set_isSupersetOf(JSContext *ctx, JSValue this_val,
         goto exception;
     if (js_setlike_get_keys(ctx, argv[0], &keys) < 0)
         goto exception;
-    found = FALSE;
+    found = false;
     if (s->record_count < size)
         goto fini;
     iter = JS_Call(ctx, keys, argv[0], 0, NULL);
@@ -48123,7 +48128,7 @@ static JSValue js_set_isSupersetOf(JSContext *ctx, JSValue this_val,
     next = JS_GetProperty(ctx, iter, JS_ATOM_next);
     if (JS_IsException(next))
         goto exception;
-    found = TRUE;
+    found = true;
     do {
         item = JS_IteratorNext(ctx, iter, next, 0, NULL, &done);
         if (JS_IsException(item))
@@ -48144,15 +48149,14 @@ exception:
     return rval;
 }
 
-static JSValue js_set_intersection(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_set_intersection(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     JSValue newset, item, iter, keys, has, next, rv;
     JSMapState *s, *t;
     JSMapRecord *mr;
     int64_t size;
-    BOOL done;
-    int ok;
+    int done, ok;
 
     has = JS_UNDEFINED;
     iter = JS_UNDEFINED;
@@ -48212,7 +48216,7 @@ static JSValue js_set_intersection(JSContext *ctx, JSValue this_val,
                 goto exception;
             if (done) // item is JS_UNDEFINED
                 break;
-            rv = JS_Call(ctx, has, argv[0], 1, &item);
+            rv = JS_Call(ctx, has, argv[0], 1, vc(&item));
             ok = JS_ToBoolFree(ctx, rv); // returns -1 if rv is JS_EXCEPTION
             if (ok > 0) {
                 item = map_normalize_key(ctx, item);
@@ -48243,14 +48247,14 @@ fini:
     return newset;
 }
 
-static JSValue js_set_difference(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_set_difference(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSValue newset, item, iter, keys, has, next, rv;
     JSMapState *s, *t;
     JSMapRecord *mr;
     int64_t size;
-    BOOL done;
+    int done;
     int ok;
 
     has = JS_UNDEFINED;
@@ -48305,7 +48309,7 @@ static JSValue js_set_difference(JSContext *ctx, JSValue this_val,
                 goto exception;
             if (done) // item is JS_UNDEFINED
                 break;
-            rv = JS_Call(ctx, has, argv[0], 1, &item);
+            rv = JS_Call(ctx, has, argv[0], 1, vc(&item));
             ok = JS_ToBoolFree(ctx, rv); // returns -1 if rv is JS_EXCEPTION
             if (ok == 0) {
                 item = map_normalize_key(ctx, item);
@@ -48336,15 +48340,16 @@ fini:
     return newset;
 }
 
-static JSValue js_set_symmetricDifference(JSContext *ctx, JSValue this_val,
-                                          int argc, JSValue *argv)
+static JSValue js_set_symmetricDifference(JSContext *ctx, JSValueConst this_val,
+                                          int argc, JSValueConst *argv)
 {
     JSValue newset, item, iter, next, rv;
     struct list_head *el;
     JSMapState *s, *t;
     JSMapRecord *mr;
     int64_t size;
-    BOOL done, present;
+    int done;
+    bool present;
 
     s = JS_GetOpaque2(ctx, this_val, JS_CLASS_SET);
     if (!s)
@@ -48423,15 +48428,15 @@ fini:
     return newset;
 }
 
-static JSValue js_set_union(JSContext *ctx, JSValue this_val,
-                            int argc, JSValue *argv)
+static JSValue js_set_union(JSContext *ctx, JSValueConst this_val,
+                            int argc, JSValueConst *argv)
 {
     JSValue newset, item, iter, next, rv;
     struct list_head *el;
     JSMapState *s, *t;
     JSMapRecord *mr;
     int64_t size;
-    BOOL done;
+    int done;
 
     s = JS_GetOpaque2(ctx, this_val, JS_CLASS_SET);
     if (!s)
@@ -48472,7 +48477,7 @@ static JSValue js_set_union(JSContext *ctx, JSValue this_val,
             goto exception;
         if (done) // item is JS_UNDEFINED
             break;
-        rv = js_map_set(ctx, newset, 1, &item, MAGIC_SET);
+        rv = js_map_set(ctx, newset, 1, vc(&item), MAGIC_SET);
         JS_FreeValue(ctx, item);
         if (JS_IsException(rv))
             goto exception;
@@ -48627,13 +48632,13 @@ typedef struct JSPromiseData {
     JSPromiseStateEnum promise_state;
     /* 0=fulfill, 1=reject, list of JSPromiseReactionData.link */
     struct list_head promise_reactions[2];
-    BOOL is_handled; /* Note: only useful to debug */
+    bool is_handled; /* Note: only useful to debug */
     JSValue promise_result;
 } JSPromiseData;
 
 typedef struct JSPromiseFunctionDataResolved {
     int ref_count;
-    BOOL already_resolved;
+    bool already_resolved;
 } JSPromiseFunctionDataResolved;
 
 typedef struct JSPromiseFunctionData {
@@ -48647,7 +48652,7 @@ typedef struct JSPromiseReactionData {
     JSValue handler;
 } JSPromiseReactionData;
 
-  JSPromiseStateEnum JS_PromiseState(JSContext *ctx, JSValue promise)
+JSPromiseStateEnum JS_PromiseState(JSContext *ctx, JSValueConst promise)
 {
     JSPromiseData *s = JS_GetOpaque(promise, JS_CLASS_PROMISE);
     if (!s)
@@ -48655,16 +48660,23 @@ typedef struct JSPromiseReactionData {
     return s->promise_state;
 }
 
-JSValue JS_PromiseResult(JSContext *ctx, JSValue promise)
+JSValue JS_PromiseResult(JSContext *ctx, JSValueConst promise)
 {
     JSPromiseData *s = JS_GetOpaque(promise, JS_CLASS_PROMISE);
     if (!s)
         return JS_UNDEFINED;
-    return JS_DupValue(ctx, s->promise_result);
+    return js_dup(s->promise_result);
+}
+
+bool JS_IsPromise(JSValueConst val)
+{
+    if (JS_VALUE_GET_TAG(val) != JS_TAG_OBJECT)
+        return false;
+    return JS_VALUE_GET_OBJ(val)->class_id == JS_CLASS_PROMISE;
 }
 
 static int js_create_resolving_functions(JSContext *ctx, JSValue *args,
-                                         JSValue promise);
+                                         JSValueConst promise);
 
 static void promise_reaction_data_free(JSRuntime *rt,
                                        JSPromiseReactionData *rd)
@@ -48675,10 +48687,10 @@ static void promise_reaction_data_free(JSRuntime *rt,
     js_free_rt(rt, rd);
 }
 
-#ifdef DUMP_PROMISE
+#ifdef ENABLE_DUMPS // JS_DUMP_PROMISE
 #define promise_trace(ctx, ...) \
    do { \
-     if (check_dump_flag(ctx->rt, DUMP_PROMISE)) \
+     if (check_dump_flag(ctx->rt, JS_DUMP_PROMISE)) \
        printf(__VA_ARGS__); \
    } while (0)
 #else
@@ -48686,11 +48698,12 @@ static void promise_reaction_data_free(JSRuntime *rt,
 #endif
 
 static JSValue promise_reaction_job(JSContext *ctx, int argc,
-                                    JSValue *argv)
+                                    JSValueConst *argv)
 {
-    JSValue handler, arg, func;
+    JSValueConst handler, func;
     JSValue res, res2;
-    BOOL is_reject;
+    JSValueConst arg;
+    bool is_reject;
 
     assert(argc == 5);
     handler = argv[2];
@@ -48709,15 +48722,17 @@ static JSValue promise_reaction_job(JSContext *ctx, int argc,
         res = JS_Call(ctx, handler, JS_UNDEFINED, 1, &arg);
     }
     is_reject = JS_IsException(res);
-    if (is_reject)
+    if (is_reject) {
+        if (unlikely(JS_IsUncatchableError(ctx, ctx->rt->current_exception)))
+            return JS_EXCEPTION;
         res = JS_GetException(ctx);
+    }
     func = argv[is_reject];
     /* as an extension, we support undefined as value to avoid
        creating a dummy promise in the 'await' implementation of async
        functions */
     if (!JS_IsUndefined(func)) {
-        res2 = JS_Call(ctx, func, JS_UNDEFINED,
-                       1, &res);
+        res2 = JS_Call(ctx, func, JS_UNDEFINED, 1, vc(&res));
     } else {
         res2 = JS_UNDEFINED;
     }
@@ -48734,13 +48749,13 @@ void JS_SetHostPromiseRejectionTracker(JSRuntime *rt,
     rt->host_promise_rejection_tracker_opaque = opaque;
 }
 
-static void fulfill_or_reject_promise(JSContext *ctx, JSValue promise,
-                                      JSValue value, BOOL is_reject)
+static void fulfill_or_reject_promise(JSContext *ctx, JSValueConst promise,
+                                      JSValueConst value, bool is_reject)
 {
     JSPromiseData *s = JS_GetOpaque(promise, JS_CLASS_PROMISE);
     struct list_head *el, *el1;
     JSPromiseReactionData *rd;
-    JSValue args[5];
+    JSValueConst args[5];
 
     if (!s || s->promise_state != JS_PROMISE_PENDING)
         return; /* should never happen */
@@ -48752,7 +48767,7 @@ static void fulfill_or_reject_promise(JSContext *ctx, JSValue promise,
     if (s->promise_state == JS_PROMISE_REJECTED && !s->is_handled) {
         JSRuntime *rt = ctx->rt;
         if (rt->host_promise_rejection_tracker) {
-            rt->host_promise_rejection_tracker(ctx, promise, value, FALSE,
+            rt->host_promise_rejection_tracker(ctx, promise, value, false,
                                                rt->host_promise_rejection_tracker_opaque);
         }
     }
@@ -48776,16 +48791,16 @@ static void fulfill_or_reject_promise(JSContext *ctx, JSValue promise,
     }
 }
 
-static void reject_promise(JSContext *ctx, JSValue promise,
-                           JSValue value)
+static void reject_promise(JSContext *ctx, JSValueConst promise,
+                           JSValueConst value)
 {
-    fulfill_or_reject_promise(ctx, promise, value, TRUE);
+    fulfill_or_reject_promise(ctx, promise, value, true);
 }
 
 static JSValue js_promise_resolve_thenable_job(JSContext *ctx,
-                                               int argc, JSValue *argv)
+                                               int argc, JSValueConst *argv)
 {
-    JSValue promise, thenable, then;
+    JSValueConst promise, thenable, then;
     JSValue args[2], res;
 
     promise_trace(ctx, "js_promise_resolve_thenable_job\n");
@@ -48796,10 +48811,10 @@ static JSValue js_promise_resolve_thenable_job(JSContext *ctx,
     then = argv[2];
     if (js_create_resolving_functions(ctx, args, promise) < 0)
         return JS_EXCEPTION;
-    res = JS_Call(ctx, then, thenable, 2, args);
+    res = JS_Call(ctx, then, thenable, 2, vc(args));
     if (JS_IsException(res)) {
         JSValue error = JS_GetException(ctx);
-        res = JS_Call(ctx, args[1], JS_UNDEFINED, 1, &error);
+        res = JS_Call(ctx, args[1], JS_UNDEFINED, 1, vc(&error));
         JS_FreeValue(ctx, error);
     }
     JS_FreeValue(ctx, args[0]);
@@ -48817,7 +48832,7 @@ static void js_promise_resolve_function_free_resolved(JSRuntime *rt,
 
 static int js_create_resolving_functions(JSContext *ctx,
                                          JSValue *resolving_funcs,
-                                         JSValue promise)
+                                         JSValueConst promise)
 
 {
     JSValue obj;
@@ -48829,7 +48844,7 @@ static int js_create_resolving_functions(JSContext *ctx,
     if (!sr)
         return -1;
     sr->ref_count = 1;
-    sr->already_resolved = FALSE; /* must be shared between the two functions */
+    sr->already_resolved = false; /* must be shared between the two functions */
     ret = 0;
     for(i = 0; i < 2; i++) {
         obj = JS_NewObjectProtoClass(ctx, ctx->function_proto,
@@ -48857,7 +48872,8 @@ static int js_create_resolving_functions(JSContext *ctx,
     return ret;
 }
 
-static void js_promise_resolve_function_finalizer(JSRuntime *rt, JSValue val)
+static void js_promise_resolve_function_finalizer(JSRuntime *rt,
+                                                  JSValueConst val)
 {
     JSPromiseFunctionData *s = JS_VALUE_GET_OBJ(val)->u.promise_function_data;
     if (s) {
@@ -48867,7 +48883,7 @@ static void js_promise_resolve_function_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_promise_resolve_function_mark(JSRuntime *rt, JSValue val,
+static void js_promise_resolve_function_mark(JSRuntime *rt, JSValueConst val,
                                              JS_MarkFunc *mark_func)
 {
     JSPromiseFunctionData *s = JS_VALUE_GET_OBJ(val)->u.promise_function_data;
@@ -48877,28 +48893,29 @@ static void js_promise_resolve_function_mark(JSRuntime *rt, JSValue val,
 }
 
 static JSValue js_promise_resolve_function_call(JSContext *ctx,
-                                                JSValue func_obj,
-                                                JSValue this_val,
-                                                int argc, JSValue *argv,
+                                                JSValueConst func_obj,
+                                                JSValueConst this_val,
+                                                int argc, JSValueConst *argv,
                                                 int flags)
 {
     JSObject *p = JS_VALUE_GET_OBJ(func_obj);
     JSPromiseFunctionData *s;
-    JSValue resolution, args[3];
+    JSValueConst args[3];
+    JSValueConst resolution;
     JSValue then;
-    BOOL is_reject;
+    bool is_reject;
 
     s = p->u.promise_function_data;
     if (!s || s->presolved->already_resolved)
         return JS_UNDEFINED;
-    s->presolved->already_resolved = TRUE;
+    s->presolved->already_resolved = true;
     is_reject = p->class_id - JS_CLASS_PROMISE_RESOLVE_FUNCTION;
     if (argc > 0)
         resolution = argv[0];
     else
         resolution = JS_UNDEFINED;
-#ifdef DUMP_PROMISE
-    if (check_dump_flag(ctx->rt, DUMP_PROMISE)) {
+#ifdef ENABLE_DUMPS // JS_DUMP_PROMISE
+    if (check_dump_flag(ctx->rt, JS_DUMP_PROMISE)) {
         printf("js_promise_resolving_function_call: is_reject=%d resolution=", is_reject);
         JS_DumpValue(ctx->rt, resolution);
         printf("\n");
@@ -48931,7 +48948,7 @@ static JSValue js_promise_resolve_function_call(JSContext *ctx,
     return JS_UNDEFINED;
 }
 
-static void js_promise_finalizer(JSRuntime *rt, JSValue val)
+static void js_promise_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSPromiseData *s = JS_GetOpaque(val, JS_CLASS_PROMISE);
     struct list_head *el, *el1;
@@ -48950,7 +48967,7 @@ static void js_promise_finalizer(JSRuntime *rt, JSValue val)
     js_free_rt(rt, s);
 }
 
-static void js_promise_mark(JSRuntime *rt, JSValue val,
+static void js_promise_mark(JSRuntime *rt, JSValueConst val,
                             JS_MarkFunc *mark_func)
 {
     JSPromiseData *s = JS_GetOpaque(val, JS_CLASS_PROMISE);
@@ -48971,10 +48988,10 @@ static void js_promise_mark(JSRuntime *rt, JSValue val,
     JS_MarkValue(rt, s->promise_result, mark_func);
 }
 
-static JSValue js_promise_constructor(JSContext *ctx, JSValue new_target,
-                                      int argc, JSValue *argv)
+static JSValue js_promise_constructor(JSContext *ctx, JSValueConst new_target,
+                                      int argc, JSValueConst *argv)
 {
-    JSValue executor;
+    JSValueConst executor;
     JSValue obj;
     JSPromiseData *s;
     JSValue args[2], ret;
@@ -48990,18 +49007,18 @@ static JSValue js_promise_constructor(JSContext *ctx, JSValue new_target,
     if (!s)
         goto fail;
     s->promise_state = JS_PROMISE_PENDING;
-    s->is_handled = FALSE;
+    s->is_handled = false;
     for(i = 0; i < 2; i++)
         init_list_head(&s->promise_reactions[i]);
     s->promise_result = JS_UNDEFINED;
     JS_SetOpaqueInternal(obj, s);
     if (js_create_resolving_functions(ctx, args, obj))
         goto fail;
-    ret = JS_Call(ctx, executor, JS_UNDEFINED, 2, args);
+    ret = JS_Call(ctx, executor, JS_UNDEFINED, 2, vc(args));
     if (JS_IsException(ret)) {
         JSValue ret2, error;
         error = JS_GetException(ctx);
-        ret2 = JS_Call(ctx, args[1], JS_UNDEFINED, 1, &error);
+        ret2 = JS_Call(ctx, args[1], JS_UNDEFINED, 1, vc(&error));
         JS_FreeValue(ctx, error);
         if (JS_IsException(ret2))
             goto fail1;
@@ -49020,9 +49037,9 @@ static JSValue js_promise_constructor(JSContext *ctx, JSValue new_target,
 }
 
 static JSValue js_promise_executor(JSContext *ctx,
-                                   JSValue this_val,
-                                   int argc, JSValue *argv,
-                                   int magic, JSValue *func_data)
+                                   JSValueConst this_val,
+                                   int argc, JSValueConst *argv,
+                                   int magic, JSValueConst *func_data)
 {
     int i;
 
@@ -49036,7 +49053,7 @@ static JSValue js_promise_executor(JSContext *ctx,
 
 static JSValue js_promise_executor_new(JSContext *ctx)
 {
-    JSValue func_data[2];
+    JSValueConst func_data[2];
 
     func_data[0] = JS_UNDEFINED;
     func_data[1] = JS_UNDEFINED;
@@ -49046,7 +49063,7 @@ static JSValue js_promise_executor_new(JSContext *ctx)
 
 static JSValue js_new_promise_capability(JSContext *ctx,
                                          JSValue *resolving_funcs,
-                                         JSValue ctor)
+                                         JSValueConst ctor)
 {
     JSValue executor, result_promise;
     JSCFunctionDataRecord *s;
@@ -49057,11 +49074,9 @@ static JSValue js_new_promise_capability(JSContext *ctx,
         return executor;
 
     if (JS_IsUndefined(ctor)) {
-        result_promise = js_promise_constructor(ctx, ctor, 1,
-                                                &executor);
+        result_promise = js_promise_constructor(ctx, ctor, 1, vc(&executor));
     } else {
-        result_promise = JS_CallConstructor(ctx, ctor, 1,
-                                            &executor);
+        result_promise = JS_CallConstructor(ctx, ctor, 1, vc(&executor));
     }
     if (JS_IsException(result_promise))
         goto fail;
@@ -49085,17 +49100,17 @@ JSValue JS_NewPromiseCapability(JSContext *ctx, JSValue *resolving_funcs)
     return js_new_promise_capability(ctx, resolving_funcs, JS_UNDEFINED);
 }
 
-static JSValue js_promise_resolve(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv, int magic)
+static JSValue js_promise_resolve(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv, int magic)
 {
     JSValue result_promise, resolving_funcs[2], ret;
-    BOOL is_reject = magic;
+    bool is_reject = magic;
 
     if (!JS_IsObject(this_val))
         return JS_ThrowTypeErrorNotAnObject(ctx);
     if (!is_reject && JS_GetOpaque(argv[0], JS_CLASS_PROMISE)) {
         JSValue ctor;
-        BOOL is_same;
+        bool is_same;
         ctor = JS_GetProperty(ctx, argv[0], JS_ATOM_constructor);
         if (JS_IsException(ctor))
             return ctor;
@@ -49118,8 +49133,8 @@ static JSValue js_promise_resolve(JSContext *ctx, JSValue this_val,
     return result_promise;
 }
 
-static JSValue js_promise_withResolvers(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv)
+static JSValue js_promise_withResolvers(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv)
 {
     JSValue result_promise, resolving_funcs[2], obj;
     if (!JS_IsObject(this_val))
@@ -49140,11 +49155,11 @@ static JSValue js_promise_withResolvers(JSContext *ctx, JSValue this_val,
     return obj;
 }
 
-static JSValue js_promise_try(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_promise_try(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
     JSValue result_promise, resolving_funcs[2], ret, ret2;
-    BOOL is_reject = 0;
+    bool is_reject = 0;
 
     if (!JS_IsObject(this_val))
         return JS_ThrowTypeErrorNotAnObject(ctx);
@@ -49156,7 +49171,7 @@ static JSValue js_promise_try(JSContext *ctx, JSValue this_val,
         is_reject = 1;
         ret = JS_GetException(ctx);
     }
-    ret2 = JS_Call(ctx, resolving_funcs[is_reject], JS_UNDEFINED, 1, &ret);
+    ret2 = JS_Call(ctx, resolving_funcs[is_reject], JS_UNDEFINED, 1, vc(&ret));
     JS_FreeValue(ctx, resolving_funcs[0]);
     JS_FreeValue(ctx, resolving_funcs[1]);
     JS_FreeValue(ctx, ret);
@@ -49169,7 +49184,7 @@ static JSValue js_promise_try(JSContext *ctx, JSValue this_val,
 }
 
 static __exception int remainingElementsCount_add(JSContext *ctx,
-                                                  JSValue resolve_element_env,
+                                                  JSValueConst resolve_element_env,
                                                   int addend)
 {
     JSValue val;
@@ -49192,17 +49207,17 @@ static __exception int remainingElementsCount_add(JSContext *ctx,
 #define PROMISE_MAGIC_any        2
 
 static JSValue js_promise_all_resolve_element(JSContext *ctx,
-                                              JSValue this_val,
-                                              int argc, JSValue *argv,
+                                              JSValueConst this_val,
+                                              int argc, JSValueConst *argv,
                                               int magic,
-                                              JSValue *func_data)
+                                              JSValueConst *func_data)
 {
     int resolve_type = magic & 3;
     int is_reject = magic & 4;
-    BOOL alreadyCalled = JS_ToBool(ctx, func_data[0]);
-    JSValue values = func_data[2];
-    JSValue resolve = func_data[3];
-    JSValue resolve_element_env = func_data[4];
+    bool alreadyCalled = JS_ToBool(ctx, func_data[0]);
+    JSValueConst values = func_data[2];
+    JSValueConst resolve = func_data[3];
+    JSValueConst resolve_element_env = func_data[4];
     JSValue ret, obj;
     int is_zero, index;
 
@@ -49210,7 +49225,7 @@ static JSValue js_promise_all_resolve_element(JSContext *ctx,
         return JS_EXCEPTION;
     if (alreadyCalled)
         return JS_UNDEFINED;
-    func_data[0] = js_bool(TRUE);
+    func_data[0] = JS_TRUE;
 
     if (resolve_type == PROMISE_MAGIC_allSettled) {
         JSValue str;
@@ -49249,7 +49264,7 @@ static JSValue js_promise_all_resolve_element(JSContext *ctx,
             error = js_aggregate_error_constructor(ctx, values);
             if (JS_IsException(error))
                 return JS_EXCEPTION;
-            ret = JS_Call(ctx, resolve, JS_UNDEFINED, 1, &error);
+            ret = JS_Call(ctx, resolve, JS_UNDEFINED, 1, vc(&error));
             JS_FreeValue(ctx, error);
         } else {
             ret = JS_Call(ctx, resolve, JS_UNDEFINED, 1, &values);
@@ -49262,16 +49277,15 @@ static JSValue js_promise_all_resolve_element(JSContext *ctx,
 }
 
 /* magic = 0: Promise.all 1: Promise.allSettled */
-static JSValue js_promise_all(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv, int magic)
+static JSValue js_promise_all(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv, int magic)
 {
     JSValue result_promise, resolving_funcs[2], item, next_promise, ret;
     JSValue next_method = JS_UNDEFINED, values = JS_UNDEFINED;
     JSValue resolve_element_env = JS_UNDEFINED, resolve_element, reject_element;
     JSValue promise_resolve = JS_UNDEFINED, iter = JS_UNDEFINED;
-    JSValue then_args[2], resolve_element_data[5];
-    BOOL done;
-    int index, is_zero, is_promise_any = (magic == PROMISE_MAGIC_any);
+    JSValueConst then_args[2], resolve_element_data[5];
+    int done, index, is_zero, is_promise_any = (magic == PROMISE_MAGIC_any);
 
     if (!JS_IsObject(this_val))
         return JS_ThrowTypeErrorNotAnObject(ctx);
@@ -49282,13 +49296,12 @@ static JSValue js_promise_all(JSContext *ctx, JSValue this_val,
     if (JS_IsException(promise_resolve) ||
         check_function(ctx, promise_resolve))
         goto fail_reject;
-    iter = JS_GetIterator(ctx, argv[0], FALSE);
+    iter = JS_GetIterator(ctx, argv[0], false);
     if (JS_IsException(iter)) {
         JSValue error;
     fail_reject:
         error = JS_GetException(ctx);
-        ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED, 1,
-                       &error);
+        ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED, 1, vc(&error));
         JS_FreeValue(ctx, error);
         if (JS_IsException(ret))
             goto fail;
@@ -49319,14 +49332,14 @@ static JSValue js_promise_all(JSContext *ctx, JSValue this_val,
             if (done)
                 break;
             next_promise = JS_Call(ctx, promise_resolve,
-                                   this_val, 1, &item);
+                                   this_val, 1, vc(&item));
             JS_FreeValue(ctx, item);
             if (JS_IsException(next_promise)) {
             fail_reject1:
-                JS_IteratorClose(ctx, iter, TRUE);
+                JS_IteratorClose(ctx, iter, true);
                 goto fail_reject;
             }
-            resolve_element_data[0] = js_bool(FALSE);
+            resolve_element_data[0] = JS_FALSE;
             resolve_element_data[1] = js_int32(index);
             resolve_element_data[2] = values;
             resolve_element_data[3] = resolving_funcs[is_promise_any];
@@ -49387,7 +49400,7 @@ static JSValue js_promise_all(JSContext *ctx, JSValue this_val,
                 values = error;
             }
             ret = JS_Call(ctx, resolving_funcs[is_promise_any], JS_UNDEFINED,
-                          1, &values);
+                          1, vc(&values));
             if (check_exception_free(ctx, ret))
                 goto fail_reject;
         }
@@ -49407,13 +49420,13 @@ static JSValue js_promise_all(JSContext *ctx, JSValue this_val,
     goto done;
 }
 
-static JSValue js_promise_race(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_promise_race(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     JSValue result_promise, resolving_funcs[2], item, next_promise, ret;
     JSValue next_method = JS_UNDEFINED, iter = JS_UNDEFINED;
     JSValue promise_resolve = JS_UNDEFINED;
-    BOOL done;
+    int done;
 
     if (!JS_IsObject(this_val))
         return JS_ThrowTypeErrorNotAnObject(ctx);
@@ -49424,13 +49437,12 @@ static JSValue js_promise_race(JSContext *ctx, JSValue this_val,
     if (JS_IsException(promise_resolve) ||
         check_function(ctx, promise_resolve))
         goto fail_reject;
-    iter = JS_GetIterator(ctx, argv[0], FALSE);
+    iter = JS_GetIterator(ctx, argv[0], false);
     if (JS_IsException(iter)) {
         JSValue error;
     fail_reject:
         error = JS_GetException(ctx);
-        ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED, 1,
-                       &error);
+        ret = JS_Call(ctx, resolving_funcs[1], JS_UNDEFINED, 1, vc(&error));
         JS_FreeValue(ctx, error);
         if (JS_IsException(ret))
             goto fail;
@@ -49449,15 +49461,15 @@ static JSValue js_promise_race(JSContext *ctx, JSValue this_val,
             if (done)
                 break;
             next_promise = JS_Call(ctx, promise_resolve,
-                                   this_val, 1, &item);
+                                   this_val, 1, vc(&item));
             JS_FreeValue(ctx, item);
             if (JS_IsException(next_promise)) {
             fail_reject1:
-                JS_IteratorClose(ctx, iter, TRUE);
+                JS_IteratorClose(ctx, iter, true);
                 goto fail_reject;
             }
             ret = JS_InvokeFree(ctx, next_promise, JS_ATOM_then, 2,
-                                resolving_funcs);
+                                vc(resolving_funcs));
             if (check_exception_free(ctx, ret))
                 goto fail_reject1;
         }
@@ -49477,9 +49489,9 @@ static JSValue js_promise_race(JSContext *ctx, JSValue this_val,
 }
 
 static __exception int perform_promise_then(JSContext *ctx,
-                                            JSValue promise,
-                                            JSValue *resolve_reject,
-                                            JSValue *cap_resolving_funcs)
+                                            JSValueConst promise,
+                                            JSValueConst *resolve_reject,
+                                            JSValueConst *cap_resolving_funcs)
 {
     JSPromiseData *s = JS_GetOpaque(promise, JS_CLASS_PROMISE);
     JSPromiseReactionData *rd_array[2], *rd;
@@ -49488,7 +49500,7 @@ static __exception int perform_promise_then(JSContext *ctx,
     rd_array[0] = NULL;
     rd_array[1] = NULL;
     for(i = 0; i < 2; i++) {
-        JSValue handler;
+        JSValueConst handler;
         rd = js_mallocz(ctx, sizeof(*rd));
         if (!rd) {
             if (i == 1)
@@ -49508,12 +49520,12 @@ static __exception int perform_promise_then(JSContext *ctx,
         for(i = 0; i < 2; i++)
             list_add_tail(&rd_array[i]->link, &s->promise_reactions[i]);
     } else {
-        JSValue args[5];
+        JSValueConst args[5];
         if (s->promise_state == JS_PROMISE_REJECTED && !s->is_handled) {
             JSRuntime *rt = ctx->rt;
             if (rt->host_promise_rejection_tracker) {
                 rt->host_promise_rejection_tracker(ctx, promise, s->promise_result,
-                                                   TRUE, rt->host_promise_rejection_tracker_opaque);
+                                                   true, rt->host_promise_rejection_tracker_opaque);
             }
         }
         i = s->promise_state - JS_PROMISE_FULFILLED;
@@ -49527,12 +49539,12 @@ static __exception int perform_promise_then(JSContext *ctx,
         for(i = 0; i < 2; i++)
             promise_reaction_data_free(ctx->rt, rd_array[i]);
     }
-    s->is_handled = TRUE;
+    s->is_handled = true;
     return 0;
 }
 
-static JSValue js_promise_then(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_promise_then(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     JSValue ctor, result_promise, resolving_funcs[2];
     JSPromiseData *s;
@@ -49549,8 +49561,7 @@ static JSValue js_promise_then(JSContext *ctx, JSValue this_val,
     JS_FreeValue(ctx, ctor);
     if (JS_IsException(result_promise))
         return result_promise;
-    ret = perform_promise_then(ctx, this_val, argv,
-                               resolving_funcs);
+    ret = perform_promise_then(ctx, this_val, argv, vc(resolving_funcs));
     for(i = 0; i < 2; i++)
         JS_FreeValue(ctx, resolving_funcs[i]);
     if (ret) {
@@ -49560,41 +49571,41 @@ static JSValue js_promise_then(JSContext *ctx, JSValue this_val,
     return result_promise;
 }
 
-static JSValue js_promise_catch(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_promise_catch(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
-    JSValue args[2];
+    JSValueConst args[2];
     args[0] = JS_UNDEFINED;
     args[1] = argv[0];
     return JS_Invoke(ctx, this_val, JS_ATOM_then, 2, args);
 }
 
-static JSValue js_promise_finally_value_thunk(JSContext *ctx, JSValue this_val,
-                                              int argc, JSValue *argv,
-                                              int magic, JSValue *func_data)
+static JSValue js_promise_finally_value_thunk(JSContext *ctx, JSValueConst this_val,
+                                              int argc, JSValueConst *argv,
+                                              int magic, JSValueConst *func_data)
 {
     return js_dup(func_data[0]);
 }
 
-static JSValue js_promise_finally_thrower(JSContext *ctx, JSValue this_val,
-                                          int argc, JSValue *argv,
-                                          int magic, JSValue *func_data)
+static JSValue js_promise_finally_thrower(JSContext *ctx, JSValueConst this_val,
+                                          int argc, JSValueConst *argv,
+                                          int magic, JSValueConst *func_data)
 {
     return JS_Throw(ctx, js_dup(func_data[0]));
 }
 
-static JSValue js_promise_then_finally_func(JSContext *ctx, JSValue this_val,
-                                            int argc, JSValue *argv,
-                                            int magic, JSValue *func_data)
+static JSValue js_promise_then_finally_func(JSContext *ctx, JSValueConst this_val,
+                                            int argc, JSValueConst *argv,
+                                            int magic, JSValueConst *func_data)
 {
-    JSValue ctor = func_data[0];
-    JSValue onFinally = func_data[1];
+    JSValueConst ctor = func_data[0];
+    JSValueConst onFinally = func_data[1];
     JSValue res, promise, ret, then_func;
 
     res = JS_Call(ctx, onFinally, JS_UNDEFINED, 0, NULL);
     if (JS_IsException(res))
         return res;
-    promise = js_promise_resolve(ctx, ctor, 1, &res, 0);
+    promise = js_promise_resolve(ctx, ctor, 1, vc(&res), 0);
     JS_FreeValue(ctx, res);
     if (JS_IsException(promise))
         return promise;
@@ -49609,18 +49620,18 @@ static JSValue js_promise_then_finally_func(JSContext *ctx, JSValue this_val,
         JS_FreeValue(ctx, promise);
         return then_func;
     }
-    ret = JS_InvokeFree(ctx, promise, JS_ATOM_then, 1, &then_func);
+    ret = JS_InvokeFree(ctx, promise, JS_ATOM_then, 1, vc(&then_func));
     JS_FreeValue(ctx, then_func);
     return ret;
 }
 
-static JSValue js_promise_finally(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_promise_finally(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
-    JSValue onFinally = argv[0];
+    JSValueConst onFinally = argv[0];
     JSValue ctor, ret;
     JSValue then_funcs[2];
-    JSValue func_data[2];
+    JSValueConst func_data[2];
     int i;
 
     ctor = JS_SpeciesConstructor(ctx, this_val, JS_UNDEFINED);
@@ -49643,7 +49654,7 @@ static JSValue js_promise_finally(JSContext *ctx, JSValue this_val,
         }
     }
     JS_FreeValue(ctx, ctor);
-    ret = JS_Invoke(ctx, this_val, JS_ATOM_then, 2, then_funcs);
+    ret = JS_Invoke(ctx, this_val, JS_ATOM_then, 2, vc(then_funcs));
     JS_FreeValue(ctx, then_funcs[0]);
     JS_FreeValue(ctx, then_funcs[1]);
     return ret;
@@ -49674,18 +49685,18 @@ static const JSCFunctionListEntry js_async_function_proto_funcs[] = {
 };
 
 static JSValue js_async_from_sync_iterator_unwrap(JSContext *ctx,
-                                                  JSValue this_val,
-                                                  int argc, JSValue *argv,
-                                                  int magic, JSValue *func_data)
+                                                  JSValueConst this_val,
+                                                  int argc, JSValueConst *argv,
+                                                  int magic, JSValueConst *func_data)
 {
     return js_create_iterator_result(ctx, js_dup(argv[0]),
                                      JS_ToBool(ctx, func_data[0]));
 }
 
 static JSValue js_async_from_sync_iterator_unwrap_func_create(JSContext *ctx,
-                                                              BOOL done)
+                                                              bool done)
 {
-    JSValue func_data[1];
+    JSValueConst func_data[1];
 
     func_data[0] = js_bool(done);
     return JS_NewCFunctionData(ctx, js_async_from_sync_iterator_unwrap,
@@ -49705,7 +49716,8 @@ typedef struct JSAsyncFromSyncIteratorData {
     JSValue next_method;
 } JSAsyncFromSyncIteratorData;
 
-static void js_async_from_sync_iterator_finalizer(JSRuntime *rt, JSValue val)
+static void js_async_from_sync_iterator_finalizer(JSRuntime *rt,
+                                                  JSValueConst val)
 {
     JSAsyncFromSyncIteratorData *s =
         JS_GetOpaque(val, JS_CLASS_ASYNC_FROM_SYNC_ITERATOR);
@@ -49716,7 +49728,7 @@ static void js_async_from_sync_iterator_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_async_from_sync_iterator_mark(JSRuntime *rt, JSValue val,
+static void js_async_from_sync_iterator_mark(JSRuntime *rt, JSValueConst val,
                                              JS_MarkFunc *mark_func)
 {
     JSAsyncFromSyncIteratorData *s =
@@ -49753,8 +49765,8 @@ static JSValue JS_CreateAsyncFromSyncIterator(JSContext *ctx,
     return async_iter;
 }
 
-static JSValue js_async_from_sync_iterator_next(JSContext *ctx, JSValue this_val,
-                                                int argc, JSValue *argv,
+static JSValue js_async_from_sync_iterator_next(JSContext *ctx, JSValueConst this_val,
+                                                int argc, JSValueConst *argv,
                                                 int magic)
 {
     JSValue promise, resolving_funcs[2], value, err, method;
@@ -49781,11 +49793,11 @@ static JSValue js_async_from_sync_iterator_next(JSContext *ctx, JSValue this_val
             goto reject;
         if (JS_IsUndefined(method) || JS_IsNull(method)) {
             if (magic == GEN_MAGIC_RETURN) {
-                err = js_create_iterator_result(ctx, js_dup(argv[0]), TRUE);
+                err = js_create_iterator_result(ctx, js_dup(argv[0]), true);
                 is_reject = 0;
             } else {
                 err = JS_MakeError(ctx, JS_TYPE_ERROR, "throw is not a method",
-                                   TRUE);
+                                   true);
                 is_reject = 1;
             }
             goto done_resolve;
@@ -49811,7 +49823,7 @@ static JSValue js_async_from_sync_iterator_next(JSContext *ctx, JSValue this_val
         is_reject = 1;
     done_resolve:
         res2 = JS_Call(ctx, resolving_funcs[is_reject], JS_UNDEFINED,
-                       1, &err);
+                       1, vc(&err));
         JS_FreeValue(ctx, err);
         JS_FreeValue(ctx, res2);
         JS_FreeValue(ctx, resolving_funcs[0]);
@@ -49823,7 +49835,7 @@ static JSValue js_async_from_sync_iterator_next(JSContext *ctx, JSValue this_val
         int res;
 
         value_wrapper_promise = js_promise_resolve(ctx, ctx->promise_ctor,
-                                                   1, &value, 0);
+                                                   1, vc(&value), 0);
         if (JS_IsException(value_wrapper_promise)) {
             JS_FreeValue(ctx, value);
             goto reject;
@@ -49839,8 +49851,8 @@ static JSValue js_async_from_sync_iterator_next(JSContext *ctx, JSValue this_val
         resolve_reject[1] = JS_UNDEFINED;
 
         res = perform_promise_then(ctx, value_wrapper_promise,
-                                   resolve_reject,
-                                   resolving_funcs);
+                                   vc(resolve_reject),
+                                   vc(resolving_funcs));
         JS_FreeValue(ctx, resolve_reject[0]);
         JS_FreeValue(ctx, value_wrapper_promise);
         JS_FreeValue(ctx, resolving_funcs[0]);
@@ -49998,7 +50010,7 @@ static int isURIReserved(int c) {
     return c < 0x100 && memchr(";/?:@&=+$,#", c, sizeof(";/?:@&=+$,#") - 1) != NULL;
 }
 
-static int __attribute__((format(printf, 2, 3))) js_throw_URIError(JSContext *ctx, const char *fmt, ...)
+static int JS_PRINTF_FORMAT_ATTR(2, 3) js_throw_URIError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...)
 {
     va_list ap;
 
@@ -50019,8 +50031,8 @@ static int hex_decode(JSContext *ctx, JSString *p, int k) {
     return c;
 }
 
-static JSValue js_global_decodeURI(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv, int isComponent)
+static JSValue js_global_decodeURI(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv, int isComponent)
 {
     JSValue str;
     StringBuffer b_s, *b = &b_s;
@@ -50130,8 +50142,8 @@ static int encodeURI_hex(StringBuffer *b, int c) {
     return string_buffer_write8(b, buf, n);
 }
 
-static JSValue js_global_encodeURI(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv,
+static JSValue js_global_encodeURI(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv,
                                    int isComponent)
 {
     JSValue str;
@@ -50195,8 +50207,8 @@ fail:
     return JS_EXCEPTION;
 }
 
-static JSValue js_global_escape(JSContext *ctx, JSValue this_val,
-                                int argc, JSValue *argv)
+static JSValue js_global_escape(JSContext *ctx, JSValueConst this_val,
+                                int argc, JSValueConst *argv)
 {
     JSValue str;
     StringBuffer b_s, *b = &b_s;
@@ -50221,8 +50233,8 @@ static JSValue js_global_escape(JSContext *ctx, JSValue this_val,
     return string_buffer_end(b);
 }
 
-static JSValue js_global_unescape(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_global_unescape(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     JSValue str;
     StringBuffer b_s, *b = &b_s;
@@ -50291,10 +50303,11 @@ static int64_t floor_div_int64(int64_t a, int64_t b) {
     return (a - (m + (m < 0) * b)) / b;
 }
 
-static JSValue js_Date_parse(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv);
+static JSValue js_Date_parse(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv);
 
-static __exception int JS_ThisTimeValue(JSContext *ctx, double *valp, JSValue this_val)
+static __exception int JS_ThisTimeValue(JSContext *ctx, double *valp,
+                                        JSValueConst this_val)
 {
     if (JS_VALUE_GET_TAG(this_val) == JS_TAG_OBJECT) {
         JSObject *p = JS_VALUE_GET_OBJ(this_val);
@@ -50305,7 +50318,7 @@ static __exception int JS_ThisTimeValue(JSContext *ctx, double *valp, JSValue th
     return -1;
 }
 
-static JSValue JS_SetThisTimeValue(JSContext *ctx, JSValue this_val, double v)
+static JSValue JS_SetThisTimeValue(JSContext *ctx, JSValueConst this_val, double v)
 {
     if (JS_VALUE_GET_TAG(this_val) == JS_TAG_OBJECT) {
         JSObject *p = JS_VALUE_GET_OBJ(this_val);
@@ -50354,7 +50367,7 @@ static int const month_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
 static char const month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
 static char const day_names[] = "SunMonTueWedThuFriSat";
 
-static __exception int get_date_fields(JSContext *ctx, JSValue obj,
+static __exception int get_date_fields(JSContext *ctx, JSValueConst obj,
                                        double fields[minimum_length(9)],
                                        int is_local, int force)
 {
@@ -50366,7 +50379,7 @@ static __exception int get_date_fields(JSContext *ctx, JSValue obj,
 
     if (isnan(dval)) {
         if (!force)
-            return FALSE; /* NaN */
+            return false; /* NaN */
         d = 0;        /* initialize all fields to 0 */
     } else {
         d = dval;     /* assuming -8.64e15 <= dval <= -8.64e15 */
@@ -50405,7 +50418,7 @@ static __exception int get_date_fields(JSContext *ctx, JSValue obj,
     fields[6] = ms;
     fields[7] = wd;
     fields[8] = tz;
-    return TRUE;
+    return true;
 }
 
 static double time_clip(double t) {
@@ -50474,8 +50487,8 @@ static double set_date_fields(double fields[minimum_length(7)], int is_local) {
     return time_clip(tv);
 }
 
-static JSValue get_date_field(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv, int magic)
+static JSValue get_date_field(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv, int magic)
 {
     // get_date_field(obj, n, is_local)
     double fields[9];
@@ -50495,8 +50508,8 @@ static JSValue get_date_field(JSContext *ctx, JSValue this_val,
     return js_number(fields[n]);
 }
 
-static JSValue set_date_field(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv, int magic)
+static JSValue set_date_field(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv, int magic)
 {
     // _field(obj, first_field, end_field, args, is_local)
     double fields[9];
@@ -50518,7 +50531,7 @@ static JSValue set_date_field(JSContext *ctx, JSValue this_val,
         if (JS_ToFloat64(ctx, &a, argv[i]))
             return JS_EXCEPTION;
         if (!isfinite(a))
-            res = FALSE;
+            res = false;
         fields[first_field + i] = trunc(a);
     }
 
@@ -50539,8 +50552,8 @@ static JSValue set_date_field(JSContext *ctx, JSValue this_val,
    part: 1=date, 2=time 3=all
    XXX: should use a variant of strftime().
  */
-static JSValue get_date_string(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv, int magic)
+static JSValue get_date_string(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv, int magic)
 {
     // _string(obj, fmt, part)
     char buf[64];
@@ -50654,8 +50667,8 @@ static int64_t date_now(void) {
     return js__gettimeofday_us() / 1000;
 }
 
-static JSValue js_date_constructor(JSContext *ctx, JSValue new_target,
-                                   int argc, JSValue *argv)
+static JSValue js_date_constructor(JSContext *ctx, JSValueConst new_target,
+                                   int argc, JSValueConst *argv)
 {
     // Date(y, mon, d, h, m, s, ms)
     JSValue rv;
@@ -50682,7 +50695,7 @@ static JSValue js_date_constructor(JSContext *ctx, JSValue new_target,
         }
         v = JS_ToPrimitive(ctx, argv[0], HINT_NONE);
         if (JS_IsString(v)) {
-            dv = js_Date_parse(ctx, JS_UNDEFINED, 1, &v);
+            dv = js_Date_parse(ctx, JS_UNDEFINED, 1, vc(&v));
             JS_FreeValue(ctx, v);
             if (JS_IsException(dv))
                 return JS_EXCEPTION;
@@ -50722,8 +50735,8 @@ has_val:
     return rv;
 }
 
-static JSValue js_Date_UTC(JSContext *ctx, JSValue this_val,
-                           int argc, JSValue *argv)
+static JSValue js_Date_UTC(JSContext *ctx, JSValueConst this_val,
+                           int argc, JSValueConst *argv)
 {
     // UTC(y, mon, d, h, m, s, ms)
     double fields[] = { 0, 0, 1, 0, 0, 0, 0 };
@@ -50749,12 +50762,12 @@ static JSValue js_Date_UTC(JSContext *ctx, JSValue this_val,
 
 /* Date string parsing */
 
-static BOOL string_skip_char(const uint8_t *sp, int *pp, int c) {
+static bool string_skip_char(const uint8_t *sp, int *pp, int c) {
     if (sp[*pp] == c) {
         *pp += 1;
-        return TRUE;
+        return true;
     } else {
-        return FALSE;
+        return false;
     }
 }
 
@@ -50783,7 +50796,7 @@ static int string_skip_until(const uint8_t *sp, int *pp, const char *stoplist) {
 }
 
 /* parse a numeric field (max_digits = 0 -> no maximum) */
-static BOOL string_get_digits(const uint8_t *sp, int *pp, int *pval,
+static bool string_get_digits(const uint8_t *sp, int *pp, int *pval,
                               int min_digits, int max_digits)
 {
     int v = 0;
@@ -50797,13 +50810,13 @@ static BOOL string_get_digits(const uint8_t *sp, int *pp, int *pval,
             break;
     }
     if (p - p_start < min_digits)
-        return FALSE;
+        return false;
     *pval = v;
     *pp = p;
-    return TRUE;
+    return true;
 }
 
-static BOOL string_get_milliseconds(const uint8_t *sp, int *pp, int *pval) {
+static bool string_get_milliseconds(const uint8_t *sp, int *pp, int *pval) {
     /* parse optional fractional part as milliseconds and truncate. */
     /* spec does not indicate which rounding should be used */
     int mul = 100, ms = 0, c, p_start, p = *pp;
@@ -50825,20 +50838,20 @@ static BOOL string_get_milliseconds(const uint8_t *sp, int *pp, int *pval) {
             *pp = p;
         }
     }
-    return TRUE;
+    return true;
 }
 
-static BOOL string_get_tzoffset(const uint8_t *sp, int *pp, int *tzp, BOOL strict) {
+static bool string_get_tzoffset(const uint8_t *sp, int *pp, int *tzp, bool strict) {
     int tz = 0, sgn, hh, mm, p = *pp;
 
     sgn = sp[p++];
     if (sgn == '+' || sgn == '-') {
         int n = p;
         if (!string_get_digits(sp, &p, &hh, 1, 9))
-            return FALSE;
+            return false;
         n = p - n;
         if (strict && n != 2 && n != 4)
-            return FALSE;
+            return false;
         while (n > 4) {
             n -= 2;
             hh /= 100;
@@ -50850,31 +50863,31 @@ static BOOL string_get_tzoffset(const uint8_t *sp, int *pp, int *tzp, BOOL stric
             mm = 0;
             if (string_skip_char(sp, &p, ':')  /* optional separator */
             &&  !string_get_digits(sp, &p, &mm, 2, 2))
-                return FALSE;
+                return false;
         }
         if (hh > 23 || mm > 59)
-            return FALSE;
+            return false;
         tz = hh * 60 + mm;
         if (sgn != '+')
             tz = -tz;
     } else
     if (sgn != 'Z') {
-        return FALSE;
+        return false;
     }
     *pp = p;
     *tzp = tz;
-    return TRUE;
+    return true;
 }
 
-static BOOL string_match(const uint8_t *sp, int *pp, const char *s) {
+static bool string_match(const uint8_t *sp, int *pp, const char *s) {
     int p = *pp;
     while (*s != '\0') {
         if (to_upper_ascii(sp[p]) != to_upper_ascii(*s++))
-            return FALSE;
+            return false;
         p++;
     }
     *pp = p;
-    return TRUE;
+    return true;
 }
 
 static int find_abbrev(const uint8_t *sp, int p, const char *list, int count) {
@@ -50891,75 +50904,75 @@ static int find_abbrev(const uint8_t *sp, int p, const char *list, int count) {
     return -1;
 }
 
-static BOOL string_get_month(const uint8_t *sp, int *pp, int *pval) {
+static bool string_get_month(const uint8_t *sp, int *pp, int *pval) {
     int n;
 
     n = find_abbrev(sp, *pp, month_names, 12);
     if (n < 0)
-        return FALSE;
+        return false;
 
     *pval = n + 1;
     *pp += 3;
-    return TRUE;
+    return true;
 }
 
 /* parse toISOString format */
-static BOOL js_date_parse_isostring(const uint8_t *sp, int fields[9], BOOL *is_local) {
+static bool js_date_parse_isostring(const uint8_t *sp, int fields[9], bool *is_local) {
     int sgn, i, p = 0;
 
     /* initialize fields to the beginning of the Epoch */
     for (i = 0; i < 9; i++) {
         fields[i] = (i == 2);
     }
-    *is_local = FALSE;
+    *is_local = false;
 
     /* year is either yyyy digits or [+-]yyyyyy */
     sgn = sp[p];
     if (sgn == '-' || sgn == '+') {
         p++;
         if (!string_get_digits(sp, &p, &fields[0], 6, 6))
-            return FALSE;
+            return false;
         if (sgn == '-') {
             if (fields[0] == 0)
-                return FALSE; // reject -000000
+                return false; // reject -000000
             fields[0] = -fields[0];
         }
     } else {
         if (!string_get_digits(sp, &p, &fields[0], 4, 4))
-            return FALSE;
+            return false;
     }
     if (string_skip_char(sp, &p, '-')) {
         if (!string_get_digits(sp, &p, &fields[1], 2, 2))  /* month */
-            return FALSE;
+            return false;
         if (fields[1] < 1)
-            return FALSE;
+            return false;
         fields[1] -= 1;
         if (string_skip_char(sp, &p, '-')) {
             if (!string_get_digits(sp, &p, &fields[2], 2, 2))  /* day */
-                return FALSE;
+                return false;
             if (fields[2] < 1)
-                return FALSE;
+                return false;
         }
     }
     if (string_skip_char(sp, &p, 'T')) {
-        *is_local = TRUE;
+        *is_local = true;
         if (!string_get_digits(sp, &p, &fields[3], 2, 2)  /* hour */
         ||  !string_skip_char(sp, &p, ':')
         ||  !string_get_digits(sp, &p, &fields[4], 2, 2)) {  /* minute */
             fields[3] = 100;  // reject unconditionally
-            return TRUE;
+            return true;
         }
         if (string_skip_char(sp, &p, ':')) {
             if (!string_get_digits(sp, &p, &fields[5], 2, 2))  /* second */
-                return FALSE;
+                return false;
             string_get_milliseconds(sp, &p, &fields[6]);
         }
     }
     /* parse the time zone offset if present: [+-]HH:mm or [+-]HHmm */
     if (sp[p]) {
-        *is_local = FALSE;
-        if (!string_get_tzoffset(sp, &p, &fields[8], TRUE))
-            return FALSE;
+        *is_local = false;
+        if (!string_get_tzoffset(sp, &p, &fields[8], true))
+            return false;
     }
     /* error if extraneous characters */
     return sp[p] == '\0';
@@ -50989,27 +51002,27 @@ static struct {
     { "EEST", +3 * 60 },    // Eastern European Summer Time
 };
 
-static BOOL string_get_tzabbr(const uint8_t *sp, int *pp, int *offset) {
+static bool string_get_tzabbr(const uint8_t *sp, int *pp, int *offset) {
     size_t i;
 
     for (i = 0; i < countof(js_tzabbr); i++) {
         if (string_match(sp, pp, js_tzabbr[i].name)) {
             *offset = js_tzabbr[i].offset;
-            return TRUE;
+            return true;
         }
     }
-    return FALSE;
+    return false;
 }
 
 /* parse toString, toUTCString and other formats */
-static BOOL js_date_parse_otherstring(const uint8_t *sp,
+static bool js_date_parse_otherstring(const uint8_t *sp,
                                       int fields[minimum_length(9)],
-                                      BOOL *is_local) {
+                                      bool *is_local) {
     int c, i, val, p = 0, p_start;
     int num[3];
-    BOOL has_year = FALSE;
-    BOOL has_mon = FALSE;
-    BOOL has_time = FALSE;
+    bool has_year = false;
+    bool has_mon = false;
+    bool has_time = false;
     int num_index = 0;
 
     /* initialize fields to the beginning of 2001-01-01 */
@@ -51019,23 +51032,23 @@ static BOOL js_date_parse_otherstring(const uint8_t *sp,
     for (i = 3; i < 9; i++) {
         fields[i] = 0;
     }
-    *is_local = TRUE;
+    *is_local = true;
 
     while (string_skip_spaces(sp, &p)) {
         p_start = p;
         if ((c = sp[p]) == '+' || c == '-') {
-            if (has_time && string_get_tzoffset(sp, &p, &fields[8], FALSE)) {
-                *is_local = FALSE;
+            if (has_time && string_get_tzoffset(sp, &p, &fields[8], false)) {
+                *is_local = false;
             } else {
                 p++;
                 if (string_get_digits(sp, &p, &val, 1, 9)) {
                     if (c == '-') {
                         if (val == 0)
-                            return FALSE;
+                            return false;
                         val = -val;
                     }
                     fields[0] = val;
-                    has_year = TRUE;
+                    has_year = true;
                 }
             }
         } else
@@ -51044,32 +51057,32 @@ static BOOL js_date_parse_otherstring(const uint8_t *sp,
                 /* time part */
                 fields[3] = val;
                 if (!string_get_digits(sp, &p, &fields[4], 1, 2))
-                    return FALSE;
+                    return false;
                 if (string_skip_char(sp, &p, ':')) {
                     if (!string_get_digits(sp, &p, &fields[5], 1, 2))
-                        return FALSE;
+                        return false;
                     string_get_milliseconds(sp, &p, &fields[6]);
                 } else
                 if (sp[p] != '\0' && sp[p] != ' ')
-                    return FALSE;
-                has_time = TRUE;
+                    return false;
+                has_time = true;
             } else {
                 if (p - p_start > 2) {
                     fields[0] = val;
-                    has_year = TRUE;
+                    has_year = true;
                 } else
                 if (val < 1 || val > 31) {
                     fields[0] = val + (val < 100) * 1900 + (val < 50) * 100;
-                    has_year = TRUE;
+                    has_year = true;
                 } else {
                     if (num_index == 3)
-                        return FALSE;
+                        return false;
                     num[num_index++] = val;
                 }
             }
         } else
         if (string_get_month(sp, &p, &fields[1])) {
-            has_mon = TRUE;
+            has_mon = true;
             string_skip_until(sp, &p, "0123456789 -/(");
         } else
         if (has_time && string_match(sp, &p, "PM")) {
@@ -51083,13 +51096,13 @@ static BOOL js_date_parse_otherstring(const uint8_t *sp,
         if (has_time && string_match(sp, &p, "AM")) {
             /* 00:00 AM will be silently accepted */
             if (fields[3] > 12)
-                return FALSE;
+                return false;
             if (fields[3] == 12)
                 fields[3] -= 12;
             continue;
         } else
         if (string_get_tzabbr(sp, &p, &fields[8])) {
-            *is_local = FALSE;
+            *is_local = false;
             continue;
         } else
         if (c == '(') {  /* skip parenthesized phrase */
@@ -51102,25 +51115,25 @@ static BOOL js_date_parse_otherstring(const uint8_t *sp,
                     break;
             }
             if (level > 0)
-                return FALSE;
+                return false;
         } else
         if (c == ')') {
-            return FALSE;
+            return false;
         } else {
             if (has_year + has_mon + has_time + num_index)
-                return FALSE;
+                return false;
             /* skip a word */
             string_skip_until(sp, &p, " -/(");
         }
         string_skip_separators(sp, &p);
     }
     if (num_index + has_year + has_mon > 3)
-        return FALSE;
+        return false;
 
     switch (num_index) {
     case 0:
         if (!has_year)
-            return FALSE;
+            return false;
         break;
     case 1:
         if (has_mon)
@@ -51147,16 +51160,16 @@ static BOOL js_date_parse_otherstring(const uint8_t *sp,
         fields[2] = num[1];
         break;
     default:
-        return FALSE;
+        return false;
     }
     if (fields[1] < 1 || fields[2] < 1)
-        return FALSE;
+        return false;
     fields[1] -= 1;
-    return TRUE;
+    return true;
 }
 
-static JSValue js_Date_parse(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv)
+static JSValue js_Date_parse(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv)
 {
     JSValue s, rv;
     int fields[9];
@@ -51165,7 +51178,7 @@ static JSValue js_Date_parse(JSContext *ctx, JSValue this_val,
     int i, c;
     JSString *sp;
     uint8_t buf[128];
-    BOOL is_local;
+    bool is_local;
 
     rv = JS_NAN;
 
@@ -51185,15 +51198,15 @@ static JSValue js_Date_parse(JSContext *ctx, JSValue this_val,
     if (js_date_parse_isostring(buf, fields, &is_local)
     ||  js_date_parse_otherstring(buf, fields, &is_local)) {
         static int const field_max[6] = { 0, 11, 31, 24, 59, 59 };
-        BOOL valid = TRUE;
+        bool valid = true;
         /* check field maximum values */
         for (i = 1; i < 6; i++) {
             if (fields[i] > field_max[i])
-                valid = FALSE;
+                valid = false;
         }
         /* special case 24:00:00.000 */
         if (fields[3] == 24 && (fields[4] | fields[5] | fields[6]))
-            valid = FALSE;
+            valid = false;
         if (valid) {
             for(i = 0; i < 7; i++)
                 fields1[i] = fields[i];
@@ -51205,18 +51218,18 @@ static JSValue js_Date_parse(JSContext *ctx, JSValue this_val,
     return rv;
 }
 
-static JSValue js_Date_now(JSContext *ctx, JSValue this_val,
-                           int argc, JSValue *argv)
+static JSValue js_Date_now(JSContext *ctx, JSValueConst this_val,
+                           int argc, JSValueConst *argv)
 {
     // now()
     return js_int64(date_now());
 }
 
-static JSValue js_date_Symbol_toPrimitive(JSContext *ctx, JSValue this_val,
-                                          int argc, JSValue *argv)
+static JSValue js_date_Symbol_toPrimitive(JSContext *ctx, JSValueConst this_val,
+                                          int argc, JSValueConst *argv)
 {
     // Symbol_toPrimitive(hint)
-    JSValue obj = this_val;
+    JSValueConst obj = this_val;
     JSAtom hint = JS_ATOM_NULL;
     int hint_num;
 
@@ -51244,8 +51257,8 @@ static JSValue js_date_Symbol_toPrimitive(JSContext *ctx, JSValue this_val,
     return JS_ToPrimitive(ctx, obj, hint_num | HINT_FORCE_ORDINARY);
 }
 
-static JSValue js_date_getTimezoneOffset(JSContext *ctx, JSValue this_val,
-                                         int argc, JSValue *argv)
+static JSValue js_date_getTimezoneOffset(JSContext *ctx, JSValueConst this_val,
+                                         int argc, JSValueConst *argv)
 {
     // getTimezoneOffset()
     double v;
@@ -51259,8 +51272,8 @@ static JSValue js_date_getTimezoneOffset(JSContext *ctx, JSValue this_val,
         return js_int64(getTimezoneOffset((int64_t)trunc(v)));
 }
 
-static JSValue js_date_getTime(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_date_getTime(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     // getTime()
     double v;
@@ -51270,8 +51283,8 @@ static JSValue js_date_getTime(JSContext *ctx, JSValue this_val,
     return js_float64(v);
 }
 
-static JSValue js_date_setTime(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_date_setTime(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     // setTime(v)
     double v;
@@ -51281,12 +51294,12 @@ static JSValue js_date_setTime(JSContext *ctx, JSValue this_val,
     return JS_SetThisTimeValue(ctx, this_val, time_clip(v));
 }
 
-static JSValue js_date_setYear(JSContext *ctx, JSValue this_val,
-                               int argc, JSValue *argv)
+static JSValue js_date_setYear(JSContext *ctx, JSValueConst this_val,
+                               int argc, JSValueConst *argv)
 {
     // setYear(y)
     double y;
-    JSValue args[1];
+    JSValue d, ret;
 
     if (JS_ThisTimeValue(ctx, &y, this_val) || JS_ToFloat64(ctx, &y, argv[0]))
         return JS_EXCEPTION;
@@ -51298,12 +51311,14 @@ static JSValue js_date_setYear(JSContext *ctx, JSValue this_val,
         if (y >= 0 && y < 100)
             y += 1900;
     }
-    args[0] = js_float64(y);
-    return set_date_field(ctx, this_val, 1, args, 0x011);
+    d = js_float64(y);
+    ret = set_date_field(ctx, this_val, 1, vc(&d), 0x011);
+    JS_FreeValue(ctx, d);
+    return ret;
 }
 
-static JSValue js_date_toJSON(JSContext *ctx, JSValue this_val,
-                              int argc, JSValue *argv)
+static JSValue js_date_toJSON(JSContext *ctx, JSValueConst this_val,
+                              int argc, JSValueConst *argv)
 {
     // toJSON(key)
     JSValue obj, tv, method, rv;
@@ -51405,6 +51420,13 @@ JSValue JS_NewDate(JSContext *ctx, double epoch_ms)
     return obj;
 }
 
+bool JS_IsDate(JSValueConst v)
+{
+    if (JS_VALUE_GET_TAG(v) != JS_TAG_OBJECT)
+        return false;
+    return JS_VALUE_GET_OBJ(v)->class_id == JS_CLASS_DATE;
+}
+
 void JS_AddIntrinsicDate(JSContext *ctx)
 {
     JSValue obj;
@@ -51492,15 +51514,15 @@ static JSValue JS_ToBigIntCtorFree(JSContext *ctx, JSValue val)
 }
 
 static JSValue js_bigint_constructor(JSContext *ctx,
-                                     JSValue new_target,
-                                     int argc, JSValue *argv)
+                                     JSValueConst new_target,
+                                     int argc, JSValueConst *argv)
 {
     if (!JS_IsUndefined(new_target))
         return JS_ThrowTypeError(ctx, "not a constructor");
     return JS_ToBigIntCtorFree(ctx, js_dup(argv[0]));
 }
 
-static JSValue js_thisBigIntValue(JSContext *ctx, JSValue this_val)
+static JSValue js_thisBigIntValue(JSContext *ctx, JSValueConst this_val)
 {
     if (JS_IsBigInt(ctx, this_val))
         return js_dup(this_val);
@@ -51515,8 +51537,8 @@ static JSValue js_thisBigIntValue(JSContext *ctx, JSValue this_val)
     return JS_ThrowTypeError(ctx, "not a BigInt");
 }
 
-static JSValue js_bigint_toString(JSContext *ctx, JSValue this_val,
-                                  int argc, JSValue *argv)
+static JSValue js_bigint_toString(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     JSValue val;
     int base;
@@ -51540,15 +51562,15 @@ static JSValue js_bigint_toString(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_bigint_valueOf(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_bigint_valueOf(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     return js_thisBigIntValue(ctx, this_val);
 }
 
 static JSValue js_bigint_asUintN(JSContext *ctx,
-                                  JSValue this_val,
-                                  int argc, JSValue *argv, int asIntN)
+                                  JSValueConst this_val,
+                                  int argc, JSValueConst *argv, int asIntN)
 {
     uint64_t bits;
     bf_t a_s, *a = &a_s, *r, mask_s, *mask = &mask_s;
@@ -51624,6 +51646,8 @@ static void JS_AddIntrinsicBasicObjects(JSContext *ctx)
     int i;
 
     ctx->class_proto[JS_CLASS_OBJECT] = JS_NewObjectProto(ctx, JS_NULL);
+    ctx->global_obj = JS_NewObject(ctx);
+    ctx->global_var_obj = JS_NewObjectProto(ctx, JS_NULL);
     ctx->function_proto = JS_NewCFunction3(ctx, js_function_proto, "", 0,
                                            JS_CFUNC_generic, 0,
                                            ctx->class_proto[JS_CLASS_OBJECT]);
@@ -51681,10 +51705,7 @@ void JS_AddIntrinsicBaseObjects(JSContext *ctx)
                       JS_PROP_HAS_GET | JS_PROP_HAS_SET |
                       JS_PROP_HAS_CONFIGURABLE | JS_PROP_CONFIGURABLE);
     JS_FreeValue(ctx, obj1);
-    JS_FreeValue(ctx, js_object_seal(ctx, JS_UNDEFINED, 1, &ctx->throw_type_error, 1));
-
-    ctx->global_obj = JS_NewObject(ctx);
-    ctx->global_var_obj = JS_NewObjectProto(ctx, JS_NULL);
+    JS_FreeValue(ctx, js_object_seal(ctx, JS_UNDEFINED, 1, vc(&ctx->throw_type_error), 1));
 
     /* Object */
     obj = JS_NewGlobalCConstructor(ctx, "Object", js_object_constructor, 1,
@@ -51816,7 +51837,7 @@ void JS_AddIntrinsicBaseObjects(JSContext *ctx)
     /* Boolean */
     ctx->class_proto[JS_CLASS_BOOLEAN] = JS_NewObjectProtoClass(ctx, ctx->class_proto[JS_CLASS_OBJECT],
                                                                 JS_CLASS_BOOLEAN);
-    JS_SetObjectData(ctx, ctx->class_proto[JS_CLASS_BOOLEAN], js_bool(FALSE));
+    JS_SetObjectData(ctx, ctx->class_proto[JS_CLASS_BOOLEAN], JS_FALSE);
     JS_SetPropertyFunctionList(ctx, ctx->class_proto[JS_CLASS_BOOLEAN], js_boolean_proto_funcs,
                                countof(js_boolean_proto_funcs));
     JS_NewGlobalCConstructor(ctx, "Boolean", js_boolean_constructor, 1,
@@ -51905,12 +51926,12 @@ static uint8_t const typed_array_size_log2[JS_TYPED_ARRAY_COUNT] = {
 };
 
 static JSValue js_array_buffer_constructor3(JSContext *ctx,
-                                            JSValue new_target,
+                                            JSValueConst new_target,
                                             uint64_t len, uint64_t *max_len,
                                             JSClassID class_id,
                                             uint8_t *buf,
                                             JSFreeArrayBufferDataFunc *free_func,
-                                            void *opaque, BOOL alloc_flag)
+                                            void *opaque, bool alloc_flag)
 {
     JSRuntime *rt = ctx->rt;
     JSValue obj;
@@ -51966,7 +51987,7 @@ static JSValue js_array_buffer_constructor3(JSContext *ctx,
         abuf->data = buf;
     }
     init_list_head(&abuf->array_list);
-    abuf->detached = FALSE;
+    abuf->detached = false;
     abuf->shared = (class_id == JS_CLASS_SHARED_ARRAY_BUFFER);
     abuf->opaque = opaque;
     abuf->free_func = free_func;
@@ -51986,17 +52007,17 @@ static void js_array_buffer_free(JSRuntime *rt, void *opaque, void *ptr)
 }
 
 static JSValue js_array_buffer_constructor2(JSContext *ctx,
-                                            JSValue new_target,
+                                            JSValueConst new_target,
                                             uint64_t len, uint64_t *max_len,
                                             JSClassID class_id)
 {
     return js_array_buffer_constructor3(ctx, new_target, len, max_len,
                                         class_id, NULL, js_array_buffer_free,
-                                        NULL, TRUE);
+                                        NULL, true);
 }
 
 static JSValue js_array_buffer_constructor1(JSContext *ctx,
-                                            JSValue new_target,
+                                            JSValueConst new_target,
                                             uint64_t len, uint64_t *max_len)
 {
     return js_array_buffer_constructor2(ctx, new_target, len, max_len,
@@ -52005,15 +52026,15 @@ static JSValue js_array_buffer_constructor1(JSContext *ctx,
 
 JSValue JS_NewArrayBuffer(JSContext *ctx, uint8_t *buf, size_t len,
                           JSFreeArrayBufferDataFunc *free_func, void *opaque,
-                          BOOL is_shared)
+                          bool is_shared)
 {
     JSClassID class_id =
         is_shared ? JS_CLASS_SHARED_ARRAY_BUFFER : JS_CLASS_ARRAY_BUFFER;
     return js_array_buffer_constructor3(ctx, JS_UNDEFINED, len, NULL, class_id,
-                                        buf, free_func, opaque, FALSE);
+                                        buf, free_func, opaque, false);
 }
 
-JS_BOOL JS_IsArrayBuffer(JSValue obj) {
+bool JS_IsArrayBuffer(JSValueConst obj) {
     return JS_GetClassID(obj) == JS_CLASS_ARRAY_BUFFER;
 }
 
@@ -52024,11 +52045,11 @@ JSValue JS_NewArrayBufferCopy(JSContext *ctx, const uint8_t *buf, size_t len)
                                         JS_CLASS_ARRAY_BUFFER,
                                         (uint8_t *)buf,
                                         js_array_buffer_free, NULL,
-                                        TRUE);
+                                        true);
 }
 
-static JSValue js_array_buffer_constructor0(JSContext *ctx, JSValue new_target,
-                                            int argc, JSValue *argv,
+static JSValue js_array_buffer_constructor0(JSContext *ctx, JSValueConst new_target,
+                                            int argc, JSValueConst *argv,
                                             JSClassID class_id)
 {
     uint64_t len, max_len, *pmax_len = NULL;
@@ -52062,23 +52083,23 @@ next:
                                         class_id);
 }
 
-static JSValue js_array_buffer_constructor(JSContext *ctx, JSValue new_target,
-                                           int argc, JSValue *argv)
+static JSValue js_array_buffer_constructor(JSContext *ctx, JSValueConst new_target,
+                                           int argc, JSValueConst *argv)
 {
     return js_array_buffer_constructor0(ctx, new_target, argc, argv,
                                         JS_CLASS_ARRAY_BUFFER);
 }
 
 static JSValue js_shared_array_buffer_constructor(JSContext *ctx,
-                                                  JSValue new_target,
-                                                  int argc, JSValue *argv)
+                                                  JSValueConst new_target,
+                                                  int argc, JSValueConst *argv)
 {
     return js_array_buffer_constructor0(ctx, new_target, argc, argv,
                                         JS_CLASS_SHARED_ARRAY_BUFFER);
 }
 
 /* also used for SharedArrayBuffer */
-static void js_array_buffer_finalizer(JSRuntime *rt, JSValue val)
+static void js_array_buffer_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSArrayBuffer *abuf = p->u.array_buffer;
@@ -52113,20 +52134,17 @@ static void js_array_buffer_finalizer(JSRuntime *rt, JSValue val)
 }
 
 static JSValue js_array_buffer_isView(JSContext *ctx,
-                                      JSValue this_val,
-                                      int argc, JSValue *argv)
+                                      JSValueConst this_val,
+                                      int argc, JSValueConst *argv)
 {
     JSObject *p;
-    BOOL res;
-    res = FALSE;
+
     if (JS_VALUE_GET_TAG(argv[0]) == JS_TAG_OBJECT) {
         p = JS_VALUE_GET_OBJ(argv[0]);
-        if (p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-            p->class_id <= JS_CLASS_DATAVIEW) {
-            res = TRUE;
-        }
+        return js_bool(is_typed_array(p->class_id) ||
+                       p->class_id == JS_CLASS_DATAVIEW);
     }
-    return js_bool(res);
+    return JS_FALSE;
 }
 
 static const JSCFunctionListEntry js_array_buffer_funcs[] = {
@@ -52146,7 +52164,7 @@ static JSValue JS_ThrowTypeErrorArrayBufferOOB(JSContext *ctx)
 
 // #sec-get-arraybuffer.prototype.detached
 static JSValue js_array_buffer_get_detached(JSContext *ctx,
-                                                 JSValue this_val)
+                                            JSValueConst this_val)
 {
     JSArrayBuffer *abuf = JS_GetOpaque2(ctx, this_val, JS_CLASS_ARRAY_BUFFER);
     if (!abuf)
@@ -52157,7 +52175,7 @@ static JSValue js_array_buffer_get_detached(JSContext *ctx,
 }
 
 static JSValue js_array_buffer_get_byteLength(JSContext *ctx,
-                                              JSValue this_val,
+                                              JSValueConst this_val,
                                               int class_id)
 {
     JSArrayBuffer *abuf = JS_GetOpaque2(ctx, this_val, class_id);
@@ -52168,7 +52186,7 @@ static JSValue js_array_buffer_get_byteLength(JSContext *ctx,
 }
 
 static JSValue js_array_buffer_get_maxByteLength(JSContext *ctx,
-                                                 JSValue this_val,
+                                                 JSValueConst this_val,
                                                  int class_id)
 {
     JSArrayBuffer *abuf = JS_GetOpaque2(ctx, this_val, class_id);
@@ -52179,7 +52197,8 @@ static JSValue js_array_buffer_get_maxByteLength(JSContext *ctx,
     return js_uint32(abuf->byte_length);
 }
 
-static JSValue js_array_buffer_get_resizable(JSContext *ctx, JSValue this_val,
+static JSValue js_array_buffer_get_resizable(JSContext *ctx,
+                                             JSValueConst this_val,
                                              int class_id)
 {
     JSArrayBuffer *abuf = JS_GetOpaque2(ctx, this_val, class_id);
@@ -52188,7 +52207,7 @@ static JSValue js_array_buffer_get_resizable(JSContext *ctx, JSValue this_val,
     return js_bool(array_buffer_is_resizable(abuf));
 }
 
-void JS_DetachArrayBuffer(JSContext *ctx, JSValue obj)
+void JS_DetachArrayBuffer(JSContext *ctx, JSValueConst obj)
 {
     JSArrayBuffer *abuf = JS_GetOpaque(obj, JS_CLASS_ARRAY_BUFFER);
     struct list_head *el;
@@ -52199,7 +52218,7 @@ void JS_DetachArrayBuffer(JSContext *ctx, JSValue obj)
         abuf->free_func(ctx->rt, abuf->opaque, abuf->data);
     abuf->data = NULL;
     abuf->byte_length = 0;
-    abuf->detached = TRUE;
+    abuf->detached = true;
 
     list_for_each(el, &abuf->array_list) {
         JSTypedArray *ta;
@@ -52216,7 +52235,7 @@ void JS_DetachArrayBuffer(JSContext *ctx, JSValue obj)
 }
 
 /* get an ArrayBuffer or SharedArrayBuffer */
-static JSArrayBuffer *js_get_array_buffer(JSContext *ctx, JSValue obj)
+static JSArrayBuffer *js_get_array_buffer(JSContext *ctx, JSValueConst obj)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)
@@ -52233,7 +52252,7 @@ static JSArrayBuffer *js_get_array_buffer(JSContext *ctx, JSValue obj)
 
 /* return NULL if exception. WARNING: any JS call can detach the
    buffer and render the returned pointer invalid */
-uint8_t *JS_GetArrayBuffer(JSContext *ctx, size_t *psize, JSValue obj)
+uint8_t *JS_GetArrayBuffer(JSContext *ctx, size_t *psize, JSValueConst obj)
 {
     JSArrayBuffer *abuf = js_get_array_buffer(ctx, obj);
     if (!abuf)
@@ -52249,16 +52268,16 @@ uint8_t *JS_GetArrayBuffer(JSContext *ctx, size_t *psize, JSValue obj)
     return NULL;
 }
 
-static BOOL array_buffer_is_resizable(const JSArrayBuffer *abuf)
+static bool array_buffer_is_resizable(const JSArrayBuffer *abuf)
 {
     return abuf->max_byte_length >= 0;
 }
 
 // ES #sec-arraybuffer.prototype.transfer
-static JSValue js_array_buffer_transfer(JSContext *ctx, JSValue this_val,
-                                        int argc, JSValue *argv, int magic)
+static JSValue js_array_buffer_transfer(JSContext *ctx, JSValueConst this_val,
+                                        int argc, JSValueConst *argv, int magic)
 {
-    BOOL transfer_to_fixed_length = magic & 1;
+    bool transfer_to_fixed_length = magic & 1;
     JSArrayBuffer *abuf;
     uint64_t new_len, old_len, max_len, *pmax_len;
     uint8_t *bs, *new_bs;
@@ -52305,15 +52324,15 @@ static JSValue js_array_buffer_transfer(JSContext *ctx, JSValue this_val,
     /* neuter the backing buffer */
     abuf->data = NULL;
     abuf->byte_length = 0;
-    abuf->detached = TRUE;
+    abuf->detached = true;
     return js_array_buffer_constructor3(ctx, JS_UNDEFINED, new_len, pmax_len,
                                         JS_CLASS_ARRAY_BUFFER,
                                         bs, abuf->free_func,
-                                        NULL, FALSE);
+                                        NULL, false);
 }
 
-static JSValue js_array_buffer_resize(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv, int class_id)
+static JSValue js_array_buffer_resize(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv, int class_id)
 {
     uint32_t size_log2, size_elem;
     struct list_head *el;
@@ -52389,8 +52408,8 @@ static JSValue js_array_buffer_resize(JSContext *ctx, JSValue this_val,
 }
 
 static JSValue js_array_buffer_slice(JSContext *ctx,
-                                     JSValue this_val,
-                                     int argc, JSValue *argv, int class_id)
+                                     JSValueConst this_val,
+                                     int argc, JSValueConst *argv, int class_id)
 {
     JSArrayBuffer *abuf, *new_abuf;
     int64_t len, start, end, new_len;
@@ -52421,7 +52440,7 @@ static JSValue js_array_buffer_slice(JSContext *ctx,
     } else {
         JSValue args[1];
         args[0] = js_int64(new_len);
-        new_obj = JS_CallConstructor(ctx, ctor, 1, args);
+        new_obj = JS_CallConstructor(ctx, ctor, 1, vc(args));
         JS_FreeValue(ctx, ctor);
         JS_FreeValue(ctx, args[0]);
     }
@@ -52481,29 +52500,33 @@ static const JSCFunctionListEntry js_shared_array_buffer_proto_funcs[] = {
     JS_PROP_STRING_DEF("[Symbol.toStringTag]", "SharedArrayBuffer", JS_PROP_CONFIGURABLE ),
 };
 
+static bool is_typed_array(JSClassID class_id)
+{
+    return class_id >= JS_CLASS_UINT8C_ARRAY && class_id <= JS_CLASS_FLOAT64_ARRAY;
+}
+
 // is the typed array detached or out of bounds relative to its RAB?
 // |p| must be a typed array, *not* a DataView
-static BOOL typed_array_is_oob(JSObject *p)
+static bool typed_array_is_oob(JSObject *p)
 {
     JSArrayBuffer *abuf;
     JSTypedArray *ta;
     int len, size_elem;
     int64_t end;
 
-    assert(p->class_id >= JS_CLASS_UINT8C_ARRAY);
-    assert(p->class_id <= JS_CLASS_FLOAT64_ARRAY);
+    assert(is_typed_array(p->class_id));
 
     ta = p->u.typed_array;
     abuf = ta->buffer->u.array_buffer;
     if (abuf->detached)
-        return TRUE;
+        return true;
     len = abuf->byte_length;
     if (ta->offset > len)
-        return TRUE;
+        return true;
     if (ta->track_rab)
-        return FALSE;
+        return false;
     if (len < (int64_t)ta->offset + ta->length)
-        return TRUE;
+        return true;
     size_elem = 1 << typed_array_size_log2(p->class_id);
     end = (int64_t)ta->offset + (int64_t)p->u.array.count * size_elem;
     return end > len;
@@ -52518,7 +52541,7 @@ static uint32_t typed_array_get_length(JSContext *ctx, JSObject *p)
     return ta->length >> size_log2;
 }
 
-static int validate_typed_array(JSContext *ctx, JSValue this_val)
+static int validate_typed_array(JSContext *ctx, JSValueConst this_val)
 {
     JSObject *p;
     p = get_typed_array(ctx, this_val);
@@ -52531,7 +52554,7 @@ static int validate_typed_array(JSContext *ctx, JSValue this_val)
     return 0;
 }
 
-static JSValue js_typed_array_get_length(JSContext *ctx, JSValue this_val)
+static JSValue js_typed_array_get_length(JSContext *ctx, JSValueConst this_val)
 {
     JSObject *p;
     p = get_typed_array(ctx, this_val);
@@ -52540,7 +52563,7 @@ static JSValue js_typed_array_get_length(JSContext *ctx, JSValue this_val)
     return js_int32(p->u.array.count);
 }
 
-static JSValue js_typed_array_get_buffer(JSContext *ctx, JSValue this_val)
+static JSValue js_typed_array_get_buffer(JSContext *ctx, JSValueConst this_val)
 {
     JSObject *p;
     JSTypedArray *ta;
@@ -52551,7 +52574,7 @@ static JSValue js_typed_array_get_buffer(JSContext *ctx, JSValue this_val)
     return js_dup(JS_MKPTR(JS_TAG_OBJECT, ta->buffer));
 }
 
-static JSValue js_typed_array_get_byteLength(JSContext *ctx, JSValue this_val)
+static JSValue js_typed_array_get_byteLength(JSContext *ctx, JSValueConst this_val)
 {
     uint32_t size_log2;
     JSTypedArray *ta;
@@ -52569,7 +52592,7 @@ static JSValue js_typed_array_get_byteLength(JSContext *ctx, JSValue this_val)
     return js_int64((int64_t)p->u.array.count << size_log2);
 }
 
-static JSValue js_typed_array_get_byteOffset(JSContext *ctx, JSValue this_val)
+static JSValue js_typed_array_get_byteOffset(JSContext *ctx, JSValueConst this_val)
 {
     JSObject *p;
     JSTypedArray *ta;
@@ -52582,7 +52605,7 @@ static JSValue js_typed_array_get_byteOffset(JSContext *ctx, JSValue this_val)
     return js_uint32(ta->offset);
 }
 
-JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValue *argv,
+JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValueConst *argv,
                          JSTypedArrayEnum type)
 {
     if (type < JS_TYPED_ARRAY_UINT8C || type > JS_TYPED_ARRAY_FLOAT64)
@@ -52595,7 +52618,7 @@ JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValue *argv,
 /* Return the buffer associated to the typed array or an exception if
    it is not a typed array or if the buffer is detached. pbyte_offset,
    pbyte_length or pbytes_per_element can be NULL. */
-JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValue obj,
+JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValueConst obj,
                                size_t *pbyte_offset,
                                size_t *pbyte_length,
                                size_t *pbytes_per_element)
@@ -52620,7 +52643,7 @@ JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValue obj,
 
 /* return NULL if exception. WARNING: any JS call can detach the
    buffer and render the returned pointer invalid */
-uint8_t *JS_GetUint8Array(JSContext *ctx, size_t *psize, JSValue obj)
+uint8_t *JS_GetUint8Array(JSContext *ctx, size_t *psize, JSValueConst obj)
 {
     JSObject *p;
     JSTypedArray *ta;
@@ -52647,22 +52670,21 @@ uint8_t *JS_GetUint8Array(JSContext *ctx, size_t *psize, JSValue obj)
 }
 
 static JSValue js_typed_array_get_toStringTag(JSContext *ctx,
-                                              JSValue this_val)
+                                              JSValueConst this_val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(this_val) != JS_TAG_OBJECT)
         return JS_UNDEFINED;
     p = JS_VALUE_GET_OBJ(this_val);
-    if (!(p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-          p->class_id <= JS_CLASS_FLOAT64_ARRAY))
+    if (!is_typed_array(p->class_id))
         return JS_UNDEFINED;
     return JS_AtomToString(ctx, ctx->rt->class_array[p->class_id].class_name);
 }
 
 static JSValue js_typed_array_set_internal(JSContext *ctx,
-                                           JSValue dst,
-                                           JSValue src,
-                                           JSValue off)
+                                           JSValueConst dst,
+                                           JSValueConst src,
+                                           JSValueConst off)
 {
     JSObject *p;
     JSObject *src_p;
@@ -52687,8 +52709,7 @@ static JSValue js_typed_array_set_internal(JSContext *ctx,
     if (JS_IsException(src_obj))
         goto fail;
     src_p = JS_VALUE_GET_OBJ(src_obj);
-    if (src_p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-        src_p->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+    if (is_typed_array(src_p->class_id)) {
         JSTypedArray *dest_ta = p->u.typed_array;
         JSArrayBuffer *dest_abuf = dest_ta->buffer->u.array_buffer;
         JSTypedArray *src_ta = src_p->u.typed_array;
@@ -52746,8 +52767,8 @@ fail:
     return JS_EXCEPTION;
 }
 
-static JSValue js_typed_array_at(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_typed_array_at(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
     JSObject *p;
     int64_t idx, len;
@@ -52799,8 +52820,8 @@ static JSValue js_typed_array_at(JSContext *ctx, JSValue this_val,
     return JS_UNDEFINED;
 }
 
-static JSValue js_typed_array_with(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_typed_array_with(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     JSValue arr, val;
     JSObject *p;
@@ -52842,26 +52863,26 @@ static JSValue js_typed_array_with(JSContext *ctx, JSValue this_val,
 }
 
 static JSValue js_typed_array_set(JSContext *ctx,
-                                  JSValue this_val,
-                                  int argc, JSValue *argv)
+                                  JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
-    JSValue offset = JS_UNDEFINED;
+    JSValueConst offset = JS_UNDEFINED;
     if (argc > 1) {
         offset = argv[1];
     }
     return js_typed_array_set_internal(ctx, this_val, argv[0], offset);
 }
 
-static JSValue js_create_typed_array_iterator(JSContext *ctx, JSValue this_val,
-                                              int argc, JSValue *argv, int magic)
+static JSValue js_create_typed_array_iterator(JSContext *ctx, JSValueConst this_val,
+                                              int argc, JSValueConst *argv, int magic)
 {
     if (validate_typed_array(ctx, this_val))
         return JS_EXCEPTION;
     return js_create_array_iterator(ctx, this_val, argc, argv, magic);
 }
 
-static JSValue js_typed_array_create(JSContext *ctx, JSValue ctor,
-                                     int argc, JSValue *argv)
+static JSValue js_typed_array_create(JSContext *ctx, JSValueConst ctor,
+                                     int argc, JSValueConst *argv)
 {
     JSValue ret;
     int new_len;
@@ -52889,10 +52910,10 @@ static JSValue js_typed_array_create(JSContext *ctx, JSValue ctor,
 }
 
 static JSValue js_typed_array___speciesCreate(JSContext *ctx,
-                                              JSValue this_val,
-                                              int argc, JSValue *argv)
+                                              JSValueConst this_val,
+                                              int argc, JSValueConst *argv)
 {
-    JSValue obj;
+    JSValueConst obj;
     JSObject *p;
     JSValue ctor, ret;
     int argc1;
@@ -52915,18 +52936,18 @@ static JSValue js_typed_array___speciesCreate(JSContext *ctx,
     return ret;
 }
 
-static JSValue js_typed_array_from(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_typed_array_from(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     // from(items, mapfn = void 0, this_arg = void 0)
-    JSValue items = argv[0], mapfn, this_arg;
-    JSValue args[2];
+    JSValueConst items = argv[0], mapfn, this_arg;
+    JSValueConst args[2];
     JSValue stack[2];
     JSValue iter, arr, r, v, v2;
     int64_t k, len;
     int done, mapping;
 
-    mapping = FALSE;
+    mapping = false;
     mapfn = JS_UNDEFINED;
     this_arg = JS_UNDEFINED;
     r = JS_UNDEFINED;
@@ -52953,7 +52974,7 @@ static JSValue js_typed_array_from(JSContext *ctx, JSValue this_val,
         if (JS_IsException(arr))
             goto exception;
         stack[0] = js_dup(items);
-        if (js_for_of_start(ctx, &stack[1], FALSE))
+        if (js_for_of_start(ctx, &stack[1], false))
             goto exception;
         for (k = 0;; k++) {
             v = JS_IteratorNext(ctx, stack[0], stack[1], 0, NULL, &done);
@@ -52972,8 +52993,7 @@ static JSValue js_typed_array_from(JSContext *ctx, JSValue this_val,
     if (js_get_length64(ctx, &len, arr) < 0)
         goto exception;
     v = js_int64(len);
-    args[0] = v;
-    r = js_typed_array_create(ctx, this_val, 1, args);
+    r = js_typed_array_create(ctx, this_val, 1, vc(&v));
     JS_FreeValue(ctx, v);
     if (JS_IsException(r))
         goto exception;
@@ -52997,7 +53017,7 @@ static JSValue js_typed_array_from(JSContext *ctx, JSValue this_val,
 
  exception_close:
     if (!JS_IsUndefined(stack[0]))
-        JS_IteratorClose(ctx, stack[0], TRUE);
+        JS_IteratorClose(ctx, stack[0], true);
  exception:
     JS_FreeValue(ctx, r);
     r = JS_EXCEPTION;
@@ -53008,15 +53028,14 @@ static JSValue js_typed_array_from(JSContext *ctx, JSValue this_val,
     return r;
 }
 
-static JSValue js_typed_array_of(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv)
+static JSValue js_typed_array_of(JSContext *ctx, JSValueConst this_val,
+                                 int argc, JSValueConst *argv)
 {
-    JSValue obj;
-    JSValue args[1];
+    JSValue v, obj;
     int i;
 
-    args[0] = js_int32(argc);
-    obj = js_typed_array_create(ctx, this_val, 1, args);
+    v = js_int32(argc);
+    obj = js_typed_array_create(ctx, this_val, 1, vc(&v));
     if (JS_IsException(obj))
         return obj;
 
@@ -53029,8 +53048,8 @@ static JSValue js_typed_array_of(JSContext *ctx, JSValue this_val,
     return obj;
 }
 
-static JSValue js_typed_array_copyWithin(JSContext *ctx, JSValue this_val,
-                                         int argc, JSValue *argv)
+static JSValue js_typed_array_copyWithin(JSContext *ctx, JSValueConst this_val,
+                                         int argc, JSValueConst *argv)
 {
     JSObject *p;
     int len, to, from, final, count, shift, space;
@@ -53070,8 +53089,8 @@ static JSValue js_typed_array_copyWithin(JSContext *ctx, JSValue this_val,
     return js_dup(this_val);
 }
 
-static JSValue js_typed_array_fill(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_typed_array_fill(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     JSObject *p;
     int len, k, final, shift;
@@ -53163,11 +53182,10 @@ static JSValue js_typed_array_fill(JSContext *ctx, JSValue this_val,
     return js_dup(this_val);
 }
 
-static JSValue js_typed_array_find(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv, int mode)
+static JSValue js_typed_array_find(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv, int mode)
 {
-    JSValue func, this_arg;
-    JSValue args[3];
+    JSValueConst func, this_arg, args[3];
     JSValue val, index_val, res;
     int len, k, end;
     int dir;
@@ -53229,8 +53247,8 @@ exception:
 #define special_lastIndexOf 1
 #define special_includes -1
 
-static JSValue js_typed_array_indexOf(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv, int special)
+static JSValue js_typed_array_indexOf(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv, int special)
 {
     JSObject *p;
     int len, tag, is_int, is_bigint, k, stop, inc, res = -1;
@@ -53238,7 +53256,7 @@ static JSValue js_typed_array_indexOf(JSContext *ctx, JSValue this_val,
     double d;
     float f;
     uint16_t hf;
-    BOOL oob;
+    bool oob;
 
     p = get_typed_array(ctx, this_val);
     if (!p)
@@ -53250,7 +53268,7 @@ static JSValue js_typed_array_indexOf(JSContext *ctx, JSValue this_val,
     if (len == 0)
         goto done;
 
-    oob = FALSE;
+    oob = false;
     if (special == special_lastIndexOf) {
         k = len - 1;
         if (argc > 1) {
@@ -53284,7 +53302,7 @@ static JSValue js_typed_array_indexOf(JSContext *ctx, JSValue this_val,
                     k = 0;
             } else if (k > len) {
                 k = len;
-                oob = TRUE;
+                oob = true;
             }
         }
         stop = len;
@@ -53521,8 +53539,8 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_typed_array_join(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv, int toLocaleString)
+static JSValue js_typed_array_join(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv, int toLocaleString)
 {
     JSValue sep = JS_UNDEFINED, el;
     StringBuffer b_s, *b = &b_s;
@@ -53545,7 +53563,7 @@ static JSValue js_typed_array_join(JSContext *ctx, JSValue this_val,
             goto exception;
         s = JS_VALUE_GET_STRING(sep);
         if (s->len == 1 && !s->is_wide_char)
-            c = s->u.str8[0];
+            c = str8(s)[0];
         else
             c = -1;
         // ToString(sep) can detach or resize the arraybuffer as a side effect
@@ -53600,8 +53618,8 @@ exception:
     return JS_EXCEPTION;
 }
 
-static JSValue js_typed_array_reverse(JSContext *ctx, JSValue this_val,
-                                      int argc, JSValue *argv)
+static JSValue js_typed_array_reverse(JSContext *ctx, JSValueConst this_val,
+                                      int argc, JSValueConst *argv)
 {
     JSObject *p;
     int len;
@@ -53663,8 +53681,8 @@ static JSValue js_typed_array_reverse(JSContext *ctx, JSValue this_val,
     return js_dup(this_val);
 }
 
-static JSValue js_typed_array_toReversed(JSContext *ctx, JSValue this_val,
-                                         int argc, JSValue *argv)
+static JSValue js_typed_array_toReversed(JSContext *ctx, JSValueConst this_val,
+                                         int argc, JSValueConst *argv)
 {
     JSValue arr, ret;
     JSObject *p;
@@ -53681,10 +53699,10 @@ static JSValue js_typed_array_toReversed(JSContext *ctx, JSValue this_val,
     return ret;
 }
 
-static JSValue js_typed_array_slice(JSContext *ctx, JSValue this_val,
-                                    int argc, JSValue *argv)
+static JSValue js_typed_array_slice(JSContext *ctx, JSValueConst this_val,
+                                    int argc, JSValueConst *argv)
 {
-    JSValue args[2];
+    JSValueConst args[2];
     JSValue arr, val;
     JSObject *p, *p1;
     int n, len, start, final, count, shift, space;
@@ -53749,12 +53767,12 @@ static JSValue js_typed_array_slice(JSContext *ctx, JSValue this_val,
     return JS_EXCEPTION;
 }
 
-static JSValue js_typed_array_subarray(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_typed_array_subarray(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
     JSArrayBuffer *abuf;
     JSTypedArray *ta;
-    JSValue args[4];
+    JSValueConst args[4];
     JSValue arr, byteOffset, ta_buffer;
     JSObject *p;
     int len, start, final, count, shift, offset;
@@ -53790,9 +53808,9 @@ static JSValue js_typed_array_subarray(JSContext *ctx, JSValue this_val,
     if (JS_IsException(ta_buffer))
         goto exception;
     args[0] = this_val;
-    args[1] = ta_buffer;
-    args[2] = js_int32(offset);
-    args[3] = js_int32(count);
+    args[1] = safe_const(ta_buffer);
+    args[2] = safe_const(js_int32(offset));
+    args[3] = safe_const(js_int32(count));
     // result is length-tracking if source TA is and no explicit count is given
     if (ta->track_rab && JS_IsUndefined(argv[1]))
         args[3] = JS_UNDEFINED;
@@ -53916,8 +53934,8 @@ static JSValue js_TA_get_float64(JSContext *ctx, const void *a) {
 struct TA_sort_context {
     JSContext *ctx;
     int exception;
-    JSValue arr;
-    JSValue cmp;
+    JSValueConst arr;
+    JSValueConst cmp;
     JSValue (*getfun)(JSContext *ctx, const void *a);
     int elt_size;
 };
@@ -53945,7 +53963,7 @@ static int js_TA_cmp_generic(const void *a, const void *b, void *opaque) {
                               a_idx * (size_t)psc->elt_size);
         argv[1] = psc->getfun(ctx, (char *)p->u.array.u.ptr +
                               b_idx * (size_t)(psc->elt_size));
-        res = JS_Call(ctx, psc->cmp, JS_UNDEFINED, 2, argv);
+        res = JS_Call(ctx, psc->cmp, JS_UNDEFINED, 2, vc(argv));
         if (JS_IsException(res)) {
             psc->exception = 1;
             goto done;
@@ -53973,8 +53991,8 @@ static int js_TA_cmp_generic(const void *a, const void *b, void *opaque) {
     return cmp;
 }
 
-static JSValue js_typed_array_sort(JSContext *ctx, JSValue this_val,
-                                   int argc, JSValue *argv)
+static JSValue js_typed_array_sort(JSContext *ctx, JSValueConst this_val,
+                                   int argc, JSValueConst *argv)
 {
     JSObject *p;
     int len;
@@ -54117,8 +54135,8 @@ static JSValue js_typed_array_sort(JSContext *ctx, JSValue this_val,
     return js_dup(this_val);
 }
 
-static JSValue js_typed_array_toSorted(JSContext *ctx, JSValue this_val,
-                                       int argc, JSValue *argv)
+static JSValue js_typed_array_toSorted(JSContext *ctx, JSValueConst this_val,
+                                       int argc, JSValueConst *argv)
 {
     JSValue arr, ret;
     JSObject *p;
@@ -54182,15 +54200,15 @@ static const JSCFunctionListEntry js_typed_array_base_proto_funcs[] = {
 };
 
 static JSValue js_typed_array_base_constructor(JSContext *ctx,
-                                               JSValue this_val,
-                                               int argc, JSValue *argv)
+                                               JSValueConst this_val,
+                                               int argc, JSValueConst *argv)
 {
     return JS_ThrowTypeError(ctx, "cannot be called");
 }
 
 /* 'obj' must be an allocated typed array object */
 static int typed_array_init(JSContext *ctx, JSValue obj, JSValue buffer,
-                            uint64_t offset, uint64_t len, BOOL track_rab)
+                            uint64_t offset, uint64_t len, bool track_rab)
 {
     JSTypedArray *ta;
     JSObject *p, *pbuffer;
@@ -54220,10 +54238,10 @@ static int typed_array_init(JSContext *ctx, JSValue obj, JSValue buffer,
 
 
 static JSValue js_array_from_iterator(JSContext *ctx, uint32_t *plen,
-                                      JSValue obj, JSValue method)
+                                      JSValueConst obj, JSValueConst method)
 {
     JSValue arr, iter, next_method = JS_UNDEFINED, val;
-    BOOL done;
+    int done;
     uint32_t k;
 
     *plen = 0;
@@ -54261,8 +54279,8 @@ static JSValue js_array_from_iterator(JSContext *ctx, uint32_t *plen,
 }
 
 static JSValue js_typed_array_constructor_obj(JSContext *ctx,
-                                              JSValue new_target,
-                                              JSValue obj,
+                                              JSValueConst new_target,
+                                              JSValueConst obj,
                                               int classid)
 {
     JSValue iter, ret, arr = JS_UNDEFINED, val, buffer;
@@ -54296,7 +54314,7 @@ static JSValue js_typed_array_constructor_obj(JSContext *ctx,
                                           NULL);
     if (JS_IsException(buffer))
         goto fail;
-    if (typed_array_init(ctx, ret, buffer, 0, len, /*track_rab*/FALSE))
+    if (typed_array_init(ctx, ret, buffer, 0, len, /*track_rab*/false))
         goto fail;
 
     for(i = 0; i < len; i++) {
@@ -54315,8 +54333,8 @@ static JSValue js_typed_array_constructor_obj(JSContext *ctx,
 }
 
 static JSValue js_typed_array_constructor_ta(JSContext *ctx,
-                                             JSValue new_target,
-                                             JSValue src_obj,
+                                             JSValueConst new_target,
+                                             JSValueConst src_obj,
                                              int classid, uint32_t len)
 {
     JSObject *p, *src_buffer;
@@ -54350,7 +54368,7 @@ static JSValue js_typed_array_constructor_ta(JSContext *ctx,
         goto fail;
     }
     abuf = JS_GetOpaque(buffer, JS_CLASS_ARRAY_BUFFER);
-    if (typed_array_init(ctx, obj, buffer, 0, len, /*track_rab*/FALSE))
+    if (typed_array_init(ctx, obj, buffer, 0, len, /*track_rab*/false))
         goto fail;
     if (p->class_id == classid) {
         /* same type: copy the content */
@@ -54372,11 +54390,11 @@ static JSValue js_typed_array_constructor_ta(JSContext *ctx,
 }
 
 static JSValue js_typed_array_constructor(JSContext *ctx,
-                                          JSValue new_target,
-                                          int argc, JSValue *argv,
+                                          JSValueConst new_target,
+                                          int argc, JSValueConst *argv,
                                           int classid)
 {
-    BOOL track_rab = FALSE;
+    bool track_rab = false;
     JSValue buffer, obj;
     JSArrayBuffer *abuf;
     int size_log2;
@@ -54422,8 +54440,7 @@ static JSValue js_typed_array_constructor(JSContext *ctx,
             }
             buffer = js_dup(argv[0]);
         } else {
-            if (p->class_id >= JS_CLASS_UINT8C_ARRAY &&
-                p->class_id <= JS_CLASS_FLOAT64_ARRAY) {
+            if (is_typed_array(p->class_id)) {
                 return js_typed_array_constructor_ta(ctx, new_target, argv[0],
                                                      classid, p->u.array.count);
             } else {
@@ -54444,7 +54461,7 @@ static JSValue js_typed_array_constructor(JSContext *ctx,
     return obj;
 }
 
-static void js_typed_array_finalizer(JSRuntime *rt, JSValue val)
+static void js_typed_array_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
     JSTypedArray *ta = p->u.typed_array;
@@ -54459,7 +54476,7 @@ static void js_typed_array_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_typed_array_mark(JSRuntime *rt, JSValue val,
+static void js_typed_array_mark(JSRuntime *rt, JSValueConst val,
                                 JS_MarkFunc *mark_func)
 {
     JSObject *p = JS_VALUE_GET_OBJ(val);
@@ -54470,15 +54487,15 @@ static void js_typed_array_mark(JSRuntime *rt, JSValue val,
 }
 
 static JSValue js_dataview_constructor(JSContext *ctx,
-                                       JSValue new_target,
-                                       int argc, JSValue *argv)
+                                       JSValueConst new_target,
+                                       int argc, JSValueConst *argv)
 {
-    BOOL recompute_len = FALSE;
-    BOOL track_rab = FALSE;
+    bool recompute_len = false;
+    bool track_rab = false;
     JSArrayBuffer *abuf;
     uint64_t offset;
     uint32_t len;
-    JSValue buffer;
+    JSValueConst buffer;
     JSValue obj;
     JSTypedArray *ta;
     JSObject *p;
@@ -54505,7 +54522,7 @@ static JSValue js_dataview_constructor(JSContext *ctx,
             return JS_ThrowRangeError(ctx, "invalid byteLength");
         len = l;
     } else {
-        recompute_len = TRUE;
+        recompute_len = true;
         track_rab = array_buffer_is_resizable(abuf);
     }
 
@@ -54545,7 +54562,7 @@ static JSValue js_dataview_constructor(JSContext *ctx,
 }
 
 // is the DataView out of bounds relative to its parent arraybuffer?
-static BOOL dataview_is_oob(JSObject *p)
+static bool dataview_is_oob(JSObject *p)
 {
     JSArrayBuffer *abuf;
     JSTypedArray *ta;
@@ -54554,15 +54571,15 @@ static BOOL dataview_is_oob(JSObject *p)
     ta = p->u.typed_array;
     abuf = ta->buffer->u.array_buffer;
     if (abuf->detached)
-        return TRUE;
+        return true;
     if (ta->offset > abuf->byte_length)
-        return TRUE;
+        return true;
     if (ta->track_rab)
-        return FALSE;
+        return false;
     return (int64_t)ta->offset + ta->length > abuf->byte_length;
 }
 
-static JSObject *get_dataview(JSContext *ctx, JSValue this_val)
+static JSObject *get_dataview(JSContext *ctx, JSValueConst this_val)
 {
     JSObject *p;
     if (JS_VALUE_GET_TAG(this_val) != JS_TAG_OBJECT)
@@ -54576,7 +54593,7 @@ static JSObject *get_dataview(JSContext *ctx, JSValue this_val)
     return p;
 }
 
-static JSValue js_dataview_get_buffer(JSContext *ctx, JSValue this_val)
+static JSValue js_dataview_get_buffer(JSContext *ctx, JSValueConst this_val)
 {
     JSObject *p;
     JSTypedArray *ta;
@@ -54587,7 +54604,7 @@ static JSValue js_dataview_get_buffer(JSContext *ctx, JSValue this_val)
     return js_dup(JS_MKPTR(JS_TAG_OBJECT, ta->buffer));
 }
 
-static JSValue js_dataview_get_byteLength(JSContext *ctx, JSValue this_val)
+static JSValue js_dataview_get_byteLength(JSContext *ctx, JSValueConst this_val)
 {
     JSArrayBuffer *abuf;
     JSTypedArray *ta;
@@ -54606,7 +54623,7 @@ static JSValue js_dataview_get_byteLength(JSContext *ctx, JSValue this_val)
     return js_uint32(ta->length);
 }
 
-static JSValue js_dataview_get_byteOffset(JSContext *ctx, JSValue this_val)
+static JSValue js_dataview_get_byteOffset(JSContext *ctx, JSValueConst this_val)
 {
     JSTypedArray *ta;
     JSObject *p;
@@ -54621,12 +54638,12 @@ static JSValue js_dataview_get_byteOffset(JSContext *ctx, JSValue this_val)
 }
 
 static JSValue js_dataview_getValue(JSContext *ctx,
-                                    JSValue this_obj,
-                                    int argc, JSValue *argv, int class_id)
+                                    JSValueConst this_obj,
+                                    int argc, JSValueConst *argv, int class_id)
 {
     JSTypedArray *ta;
     JSArrayBuffer *abuf;
-    BOOL littleEndian, is_swap;
+    bool littleEndian, is_swap;
     int size;
     uint8_t *ptr;
     uint32_t v;
@@ -54734,18 +54751,18 @@ static JSValue js_dataview_getValue(JSContext *ctx,
 }
 
 static JSValue js_dataview_setValue(JSContext *ctx,
-                                    JSValue this_obj,
-                                    int argc, JSValue *argv, int class_id)
+                                    JSValueConst this_obj,
+                                    int argc, JSValueConst *argv, int class_id)
 {
     JSTypedArray *ta;
     JSArrayBuffer *abuf;
-    BOOL littleEndian, is_swap;
+    bool littleEndian, is_swap;
     int size;
     uint8_t *ptr;
     uint64_t v64;
     uint32_t v;
     uint64_t pos;
-    JSValue val;
+    JSValueConst val;
 
     ta = JS_GetOpaque2(ctx, this_obj, JS_CLASS_DATAVIEW);
     if (!ta)
@@ -54869,7 +54886,7 @@ static JSValue js_new_uint8array(JSContext *ctx, JSValue buffer)
     }
     JSArrayBuffer *abuf = js_get_array_buffer(ctx, buffer);
     assert(abuf != NULL);
-    if (typed_array_init(ctx, obj, buffer, 0, abuf->byte_length, /*track_rab*/FALSE)) {
+    if (typed_array_init(ctx, obj, buffer, 0, abuf->byte_length, /*track_rab*/false)) {
         // 'buffer' is freed on error above.
         JS_FreeValue(ctx, obj);
         return JS_EXCEPTION;
@@ -54879,13 +54896,13 @@ static JSValue js_new_uint8array(JSContext *ctx, JSValue buffer)
 
 JSValue JS_NewUint8Array(JSContext *ctx, uint8_t *buf, size_t len,
                          JSFreeArrayBufferDataFunc *free_func, void *opaque,
-                         JS_BOOL is_shared)
+                         bool is_shared)
 {
     JSClassID class_id =
         is_shared ? JS_CLASS_SHARED_ARRAY_BUFFER : JS_CLASS_ARRAY_BUFFER;
     JSValue buffer = js_array_buffer_constructor3(ctx, JS_UNDEFINED, len, NULL,
                                                   class_id, buf, free_func,
-                                                  opaque, FALSE);
+                                                  opaque, false);
     return js_new_uint8array(ctx, buffer);
 }
 
@@ -54895,14 +54912,14 @@ JSValue JS_NewUint8ArrayCopy(JSContext *ctx, const uint8_t *buf, size_t len)
                                                   JS_CLASS_ARRAY_BUFFER,
                                                   (uint8_t *)buf,
                                                   js_array_buffer_free, NULL,
-                                                  TRUE);
+                                                  true);
     return js_new_uint8array(ctx, buffer);
 }
 
-int JS_GetTypedArrayType(JSValue obj)
+int JS_GetTypedArrayType(JSValueConst obj)
 {
     JSClassID class_id = JS_GetClassID(obj);
-    if (class_id >= JS_CLASS_UINT8C_ARRAY && class_id <= JS_CLASS_FLOAT64_ARRAY)
+    if (is_typed_array(class_id))
         return class_id - JS_CLASS_UINT8C_ARRAY;
     else
         return -1;
@@ -54925,7 +54942,7 @@ typedef enum AtomicsOpEnum {
 static void *js_atomics_get_ptr(JSContext *ctx,
                                 JSArrayBuffer **pabuf,
                                 int *psize_log2, JSClassID *pclass_id,
-                                JSValue obj, JSValue idx_val,
+                                JSValueConst obj, JSValueConst idx_val,
                                 int is_waitable)
 {
     JSObject *p;
@@ -54933,7 +54950,7 @@ static void *js_atomics_get_ptr(JSContext *ctx,
     JSArrayBuffer *abuf;
     void *ptr;
     uint64_t idx;
-    BOOL err;
+    bool err;
     int size_log2;
 
     if (JS_VALUE_GET_TAG(obj) != JS_TAG_OBJECT)
@@ -54982,8 +54999,8 @@ static void *js_atomics_get_ptr(JSContext *ctx,
 }
 
 static JSValue js_atomics_op(JSContext *ctx,
-                             JSValue this_obj,
-                             int argc, JSValue *argv, int op)
+                             JSValueConst this_obj,
+                             int argc, JSValueConst *argv, int op)
 {
     int size_log2;
     uint64_t v, a, rep_val;
@@ -55125,8 +55142,8 @@ static JSValue js_atomics_op(JSContext *ctx,
 }
 
 static JSValue js_atomics_store(JSContext *ctx,
-                                JSValue this_obj,
-                                int argc, JSValue *argv)
+                                JSValueConst this_obj,
+                                int argc, JSValueConst *argv)
 {
     int size_log2;
     void *ptr;
@@ -55179,8 +55196,8 @@ static JSValue js_atomics_store(JSContext *ctx,
 }
 
 static JSValue js_atomics_isLockFree(JSContext *ctx,
-                                     JSValue this_obj,
-                                     int argc, JSValue *argv)
+                                     JSValueConst this_obj,
+                                     int argc, JSValueConst *argv)
 {
     int v, ret;
     if (JS_ToInt32Sat(ctx, &v, argv[0]))
@@ -55191,7 +55208,7 @@ static JSValue js_atomics_isLockFree(JSContext *ctx,
 
 typedef struct JSAtomicsWaiter {
     struct list_head link;
-    BOOL linked;
+    bool linked;
     js_cond_t cond;
     int32_t *ptr;
 } JSAtomicsWaiter;
@@ -55204,8 +55221,8 @@ static struct list_head js_atomics_waiter_list =
 // no-op: Atomics.pause() is not allowed to block or yield to another
 // thread, only to hint the CPU that it should back off for a bit;
 // the amount of work we do here is a good enough substitute
-static JSValue js_atomics_pause(JSContext *ctx, JSValue this_obj,
-                                int argc, JSValue *argv)
+static JSValue js_atomics_pause(JSContext *ctx, JSValueConst this_obj,
+                                int argc, JSValueConst *argv)
 {
     double d;
 
@@ -55228,8 +55245,8 @@ static JSValue js_atomics_pause(JSContext *ctx, JSValue this_obj,
 }
 
 static JSValue js_atomics_wait(JSContext *ctx,
-                               JSValue this_obj,
-                               int argc, JSValue *argv)
+                               JSValueConst this_obj,
+                               int argc, JSValueConst *argv)
 {
     int64_t v;
     int32_t v32;
@@ -55278,7 +55295,7 @@ static JSValue js_atomics_wait(JSContext *ctx,
     waiter = &waiter_s;
     waiter->ptr = ptr;
     js_cond_init(&waiter->cond);
-    waiter->linked = TRUE;
+    waiter->linked = true;
     list_add_tail(&waiter->link, &js_atomics_waiter_list);
 
     if (timeout == INT64_MAX) {
@@ -55299,8 +55316,8 @@ static JSValue js_atomics_wait(JSContext *ctx,
 }
 
 static JSValue js_atomics_notify(JSContext *ctx,
-                                 JSValue this_obj,
-                                 int argc, JSValue *argv)
+                                 JSValueConst this_obj,
+                                 int argc, JSValueConst *argv)
 {
     struct list_head *el, *el1, waiter_list;
     int32_t count, n;
@@ -55329,7 +55346,7 @@ static JSValue js_atomics_notify(JSContext *ctx,
             waiter = list_entry(el, JSAtomicsWaiter, link);
             if (waiter->ptr == ptr) {
                 list_del(&waiter->link);
-                waiter->linked = FALSE;
+                waiter->linked = false;
                 list_add_tail(&waiter->link, &waiter_list);
                 n++;
                 if (n >= count)
@@ -55476,7 +55493,7 @@ static double js__now_ms(void)
     return js__hrtime_ns() / 1e6;
 }
 
-static JSValue js_perf_now(JSContext *ctx, JSValue this_val, int argc, JSValue *argv)
+static JSValue js_perf_now(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
 {
     return js_float64(js__now_ms() - ctx->time_origin);
 }
@@ -55501,7 +55518,7 @@ void JS_AddPerformance(JSContext *ctx)
 }
 
 /* Equality comparisons and sameness */
-int JS_IsEqual(JSContext *ctx, JSValue op1, JSValue op2)
+int JS_IsEqual(JSContext *ctx, JSValueConst op1, JSValueConst op2)
 {
     JSValue sp[2] = { js_dup(op1), js_dup(op2) };
     if (js_eq_slow(ctx, endof(sp), 0))
@@ -55509,17 +55526,17 @@ int JS_IsEqual(JSContext *ctx, JSValue op1, JSValue op2)
     return JS_VALUE_GET_BOOL(sp[0]);
 }
 
-JS_BOOL JS_IsStrictEqual(JSContext *ctx, JSValue op1, JSValue op2)
+bool JS_IsStrictEqual(JSContext *ctx, JSValueConst op1, JSValueConst op2)
 {
     return js_strict_eq2(ctx, js_dup(op1), js_dup(op2), JS_EQ_STRICT);
 }
 
-JS_BOOL JS_IsSameValue(JSContext *ctx, JSValue op1, JSValue op2)
+bool JS_IsSameValue(JSContext *ctx, JSValueConst op1, JSValueConst op2)
 {
     return js_same_value(ctx, op1, op2);
 }
 
-JS_BOOL JS_IsSameValueZero(JSContext *ctx, JSValue op1, JSValue op2)
+bool JS_IsSameValueZero(JSContext *ctx, JSValueConst op1, JSValueConst op2)
 {
     return js_same_value_zero(ctx, op1, op2);
 }
@@ -55527,13 +55544,13 @@ JS_BOOL JS_IsSameValueZero(JSContext *ctx, JSValue op1, JSValue op2)
 /* WeakRef */
 
 typedef struct JSWeakRefData {
-    JSValue target;
+    JSValueConst target;
     JSValue obj;
 } JSWeakRefData;
 
 static JSWeakRefData js_weakref_sentinel;
 
-static void js_weakref_finalizer(JSRuntime *rt, JSValue val)
+static void js_weakref_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSWeakRefData *wrd = JS_GetOpaque(val, JS_CLASS_WEAK_REF);
     if (!wrd || wrd == &js_weakref_sentinel)
@@ -55555,11 +55572,12 @@ static void js_weakref_finalizer(JSRuntime *rt, JSValue val)
     js_free_rt(rt, wr);
 }
 
-static JSValue js_weakref_constructor(JSContext *ctx, JSValue new_target, int argc, JSValue *argv)
+static JSValue js_weakref_constructor(JSContext *ctx, JSValueConst new_target,
+                                      int argc, JSValueConst *argv)
 {
     if (JS_IsUndefined(new_target))
         return JS_ThrowTypeError(ctx, "constructor requires 'new'");
-    JSValue arg = argv[0];
+    JSValueConst arg = argv[0];
     if (!is_valid_weakref_target(arg))
         return JS_ThrowTypeError(ctx, "invalid target");
     // TODO(saghul): short-circuit if the refcount is 1?
@@ -55587,7 +55605,7 @@ static JSValue js_weakref_constructor(JSContext *ctx, JSValue new_target, int ar
     return obj;
 }
 
-static JSValue js_weakref_deref(JSContext *ctx, JSValue this_val, int argc, JSValue *argv)
+static JSValue js_weakref_deref(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
 {
     JSWeakRefData *wrd = JS_GetOpaque2(ctx, this_val, JS_CLASS_WEAK_REF);
     if (!wrd)
@@ -55608,8 +55626,8 @@ static const JSClassShortDef js_weakref_class_def[] = {
 
 typedef struct JSFinRecEntry {
     struct list_head link;
-    JSValue obj;
-    JSValue target;
+    JSValueConst obj;
+    JSValueConst target;
     JSValue held_val;
     JSValue token;
 } JSFinRecEntry;
@@ -55636,7 +55654,7 @@ static void delete_finrec_weakref(JSRuntime *rt, JSFinRecEntry *fre)
     js_free_rt(rt, wr);
 }
 
-static void js_finrec_finalizer(JSRuntime *rt, JSValue val)
+static void js_finrec_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSFinalizationRegistryData *frd = JS_GetOpaque(val, JS_CLASS_FINALIZATION_REGISTRY);
     if (frd) {
@@ -55660,7 +55678,8 @@ static void js_finrec_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_finrec_mark(JSRuntime *rt, JSValue val, JS_MarkFunc *mark_func)
+static void js_finrec_mark(JSRuntime *rt, JSValueConst val,
+                           JS_MarkFunc *mark_func)
 {
     JSFinalizationRegistryData *frd = JS_GetOpaque(val, JS_CLASS_FINALIZATION_REGISTRY);
     if (frd) {
@@ -55674,11 +55693,12 @@ static void js_finrec_mark(JSRuntime *rt, JSValue val, JS_MarkFunc *mark_func)
     }
 }
 
-static JSValue js_finrec_constructor(JSContext *ctx, JSValue new_target, int argc, JSValue *argv)
+static JSValue js_finrec_constructor(JSContext *ctx, JSValueConst new_target,
+                                     int argc, JSValueConst *argv)
 {
     if (JS_IsUndefined(new_target))
         return JS_ThrowTypeError(ctx, "constructor requires 'new'");
-    JSValue cb = argv[0];
+    JSValueConst cb = argv[0];
     if (!JS_IsFunction(ctx, cb))
         return JS_ThrowTypeError(ctx, "argument must be a function");
 
@@ -55697,16 +55717,17 @@ static JSValue js_finrec_constructor(JSContext *ctx, JSValue new_target, int arg
     return obj;
 }
 
-static JSValue js_finrec_register(JSContext *ctx, JSValue this_val, int argc, JSValue *argv)
+static JSValue js_finrec_register(JSContext *ctx, JSValueConst this_val,
+                                  int argc, JSValueConst *argv)
 {
     JSFinalizationRegistryData *frd = JS_GetOpaque2(ctx, this_val, JS_CLASS_FINALIZATION_REGISTRY);
     if (!frd)
         return JS_EXCEPTION;
 
-    JSValue target = argv[0];
-    JSValue held_val = argv[1];
+    JSValueConst target = argv[0];
+    JSValueConst held_val = argv[1];
     // The function length needs to return 2, so the 3rd argument won't be initialized.
-    JSValue token = argc > 2 ? argv[2] : JS_UNDEFINED;
+    JSValueConst token = argc > 2 ? argv[2] : JS_UNDEFINED;
 
     if (!is_valid_weakref_target(target))
         return JS_ThrowTypeError(ctx, "invalid target");
@@ -55737,18 +55758,18 @@ static JSValue js_finrec_register(JSContext *ctx, JSValue this_val, int argc, JS
     return JS_UNDEFINED;
 }
 
-static JSValue js_finrec_unregister(JSContext *ctx, JSValue this_val, int argc, JSValue *argv)
+static JSValue js_finrec_unregister(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
 {
     JSFinalizationRegistryData *frd = JS_GetOpaque2(ctx, this_val, JS_CLASS_FINALIZATION_REGISTRY);
     if (!frd)
         return JS_EXCEPTION;
 
-    JSValue token = argv[0];
+    JSValueConst token = argv[0];
     if (!is_valid_weakref_target(token))
         return JS_ThrowTypeError(ctx, "invalid unregister token");
 
     struct list_head *el, *el1;
-    BOOL removed = FALSE;
+    bool removed = false;
     list_for_each_safe(el, el1, &frd->entries) {
         JSFinRecEntry *fre = list_entry(el, JSFinRecEntry, link);
         if (js_same_value(ctx, fre->token, token)) {
@@ -55757,7 +55778,7 @@ static JSValue js_finrec_unregister(JSContext *ctx, JSValue this_val, int argc,
             JS_FreeValue(ctx, fre->held_val);
             JS_FreeValue(ctx, fre->token);
             js_free(ctx, fre);
-            removed = TRUE;
+            removed = true;
         }
     }
 
@@ -55774,7 +55795,7 @@ static const JSClassShortDef js_finrec_class_def[] = {
     { JS_ATOM_FinalizationRegistry, js_finrec_finalizer, js_finrec_mark }, /* JS_CLASS_FINALIZATION_REGISTRY */
 };
 
-static JSValue js_finrec_job(JSContext *ctx, int argc, JSValue *argv)
+static JSValue js_finrec_job(JSContext *ctx, int argc, JSValueConst *argv)
 {
     return JS_Call(ctx, argv[0], JS_UNDEFINED, 1, &argv[1]);
 }
@@ -55862,7 +55883,7 @@ static void reset_weak_ref(JSRuntime *rt, JSWeakRefRecord **first_weak_ref)
              * During the GC sweep phase the held object might be collected first.
              */
             if (!rt->in_free && (!JS_IsObject(fre->held_val) || JS_IsLiveObject(rt, fre->held_val))) {
-                JSValue args[2];
+                JSValueConst args[2];
                 args[0] = frd->cb;
                 args[1] = fre->held_val;
                 JS_EnqueueJob(frd->ctx, js_finrec_job, 2, args);
@@ -55881,7 +55902,7 @@ static void reset_weak_ref(JSRuntime *rt, JSWeakRefRecord **first_weak_ref)
     *first_weak_ref = NULL; /* fail safe */
 }
 
-static BOOL is_valid_weakref_target(JSValue val)
+static bool is_valid_weakref_target(JSValueConst val)
 {
     switch (JS_VALUE_GET_TAG(val)) {
     case JS_TAG_OBJECT:
@@ -55894,13 +55915,14 @@ static BOOL is_valid_weakref_target(JSValue val)
         // fallthru
     }
     default:
-        return FALSE;
+        return false;
     }
 
-    return TRUE;
+    return true;
 }
 
-static void insert_weakref_record(JSValue target, struct JSWeakRefRecord *wr)
+static void insert_weakref_record(JSValueConst target,
+                                  struct JSWeakRefRecord *wr)
 {
     JSWeakRefRecord **pwr = get_first_weak_ref(target);
     /* Add the weak reference */
@@ -55908,148 +55930,9 @@ static void insert_weakref_record(JSValue target, struct JSWeakRefRecord *wr)
     *pwr = wr;
 }
 
-/* Poly IC */
-
-JSInlineCache *init_ic(JSContext *ctx)
-{
-    JSInlineCache *ic;
-    ic = js_malloc(ctx, sizeof(JSInlineCache));
-    if (unlikely(!ic))
-        goto fail;
-    ic->count = 0;
-    ic->hash_bits = 2;
-    ic->capacity = 1 << ic->hash_bits;
-    ic->hash = js_mallocz(ctx, sizeof(ic->hash[0]) * ic->capacity);
-    if (unlikely(!ic->hash))
-        goto fail;
-    ic->cache = NULL;
-    return ic;
-fail:
-    js_free(ctx, ic);
-    return NULL;
-}
-
-int rebuild_ic(JSContext *ctx, JSInlineCache *ic)
-{
-    uint32_t i, count;
-    JSInlineCacheHashSlot *ch;
-    if (ic->count == 0)
-        goto end;
-    count = 0;
-    ic->cache = js_mallocz(ctx, sizeof(JSInlineCacheRingSlot) * ic->count);
-    if (unlikely(!ic->cache))
-        goto fail;
-    for (i = 0; i < ic->capacity; i++) {
-        for (ch = ic->hash[i]; ch != NULL; ch = ch->next) {
-            ch->index = count++;
-            ic->cache[ch->index].atom = JS_DupAtom(ctx, ch->atom);
-            ic->cache[ch->index].index = 0;
-        }
-    }
-end:
-    return 0;
-fail:
-    return -1;
-}
-
-int resize_ic_hash(JSContext *ctx, JSInlineCache *ic)
-{
-    uint32_t new_capacity, i, h;
-    JSInlineCacheHashSlot *ch, *ch_next;
-    JSInlineCacheHashSlot **new_hash;
-    new_capacity = 1 << (ic->hash_bits + 1);
-    new_hash = js_mallocz(ctx, sizeof(ic->hash[0]) * new_capacity);
-    if (unlikely(!new_hash))
-        goto fail;
-    ic->hash_bits += 1;
-    for (i = 0; i < ic->capacity; i++) {
-        for (ch = ic->hash[i]; ch != NULL; ch = ch_next) {
-            h = get_index_hash(ch->atom, ic->hash_bits);
-            ch_next = ch->next;
-            ch->next = new_hash[h];
-            new_hash[h] = ch;
-        }
-    }
-    js_free(ctx, ic->hash);
-    ic->hash = new_hash;
-    ic->capacity = new_capacity;
-    return 0;
-fail:
-    return -1;
-}
-
-int free_ic(JSRuntime* rt, JSInlineCache *ic)
-{
-    uint32_t i;
-    JSInlineCacheHashSlot *ch, *ch_next;
-    JSShape **shape, *(*shapes)[IC_CACHE_ITEM_CAPACITY];
-    if (ic->cache) {
-        for (i = 0; i < ic->count; i++) {
-            shapes = &ic->cache[i].shape;
-            JS_FreeAtomRT(rt, ic->cache[i].atom);
-            for (shape = *shapes; shape != endof(*shapes); shape++)
-                js_free_shape_null(rt, *shape);
-        }
-    }
-    for (i = 0; i < ic->capacity; i++) {
-        for (ch = ic->hash[i]; ch != NULL; ch = ch_next) {
-            ch_next = ch->next;
-            JS_FreeAtomRT(rt, ch->atom);
-            js_free_rt(rt, ch);
-        }
-    }
-    if (ic->count > 0)
-        js_free_rt(rt, ic->cache);
-    js_free_rt(rt, ic->hash);
-    js_free_rt(rt, ic);
-    return 0;
-}
-
-static void add_ic_slot(JSContext *ctx, JSInlineCacheUpdate *icu,
-                        JSAtom atom, JSObject *object, uint32_t prop_offset)
-{
-    int32_t i;
-    uint32_t h;
-    JSInlineCacheHashSlot *ch;
-    JSInlineCacheRingSlot *cr;
-    JSInlineCache *ic;
-    JSShape *sh;
-
-    if (!icu)
-        return;
-    ic = icu->ic;
-    if (!ic)
-        return;
-    sh = object->shape;
-    if (!sh->is_hashed)
-        return;
-    cr = NULL;
-    h = get_index_hash(atom, ic->hash_bits);
-    for (ch = ic->hash[h]; ch != NULL; ch = ch->next) {
-        if (ch->atom == atom) {
-            cr = ic->cache + ch->index;
-            break;
-        }
-    }
-    assert(cr != NULL);
-    i = cr->index;
-    do {
-        if (sh == cr->shape[i]) {
-            cr->prop_offset[i] = prop_offset;
-            goto end;
-        }
-        i = (i + 1) % countof(cr->shape);
-    } while (i != cr->index);
-    js_free_shape_null(ctx->rt, cr->shape[i]);
-    cr->shape[i] = js_dup_shape(sh);
-    cr->prop_offset[i] = prop_offset;
-end:
-    icu->offset = ch->index;
-}
-
 /* CallSite */
 
-static void js_callsite_finalizer(JSRuntime *rt, JSValue val)
+static void js_callsite_finalizer(JSRuntime *rt, JSValueConst val)
 {
     JSCallSiteData *csd = JS_GetOpaque(val, JS_CLASS_CALL_SITE);
     if (csd) {
@@ -56060,7 +55943,8 @@ static void js_callsite_finalizer(JSRuntime *rt, JSValue val)
     }
 }
 
-static void js_callsite_mark(JSRuntime *rt, JSValue val, JS_MarkFunc *mark_func)
+static void js_callsite_mark(JSRuntime *rt, JSValueConst val,
+                             JS_MarkFunc *mark_func)
 {
     JSCallSiteData *csd = JS_GetOpaque(val, JS_CLASS_CALL_SITE);
     if (csd) {
@@ -56111,7 +55995,7 @@ static void js_new_callsite_data(JSContext *ctx, JSCallSiteData *csd, JSStackFra
         line_num1 = find_line_num(ctx, b,
                                   sf->cur_pc - b->byte_code_buf - 1,
                                   &col_num1);
-        csd->native = FALSE;
+        csd->native = false;
         csd->line_num = line_num1;
         csd->col_num = col_num1;
         csd->filename = JS_AtomToString(ctx, b->filename);
@@ -56120,7 +56004,7 @@ static void js_new_callsite_data(JSContext *ctx, JSCallSiteData *csd, JSStackFra
             JS_FreeValue(ctx, JS_GetException(ctx)); // Clear exception.
         }
     } else {
-        csd->native = TRUE;
+        csd->native = true;
         csd->line_num = -1;
         csd->col_num = -1;
         csd->filename = JS_NULL;
@@ -56131,7 +56015,7 @@ static void js_new_callsite_data2(JSContext *ctx, JSCallSiteData *csd, const cha
 {
     csd->func = JS_NULL;
     csd->func_name = JS_NULL;
-    csd->native = FALSE;
+    csd->native = false;
     csd->line_num = line_num;
     csd->col_num = col_num;
     /* filename is UTF-8 encoded if needed (original argument to __JS_EvalInternal()) */
@@ -56142,7 +56026,7 @@ static void js_new_callsite_data2(JSContext *ctx, JSCallSiteData *csd, const cha
     }
 }
 
-static JSValue js_callsite_getfield(JSContext *ctx, JSValue this_val, int argc, JSValue *argv, int magic)
+static JSValue js_callsite_getfield(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv, int magic)
 {
     JSCallSiteData *csd = JS_GetOpaque2(ctx, this_val, JS_CLASS_CALL_SITE);
     if (!csd)
@@ -56151,7 +56035,7 @@ static JSValue js_callsite_getfield(JSContext *ctx, JSValue this_val, int argc,
     return js_dup(*field);
 }
 
-static JSValue js_callsite_isnative(JSContext *ctx, JSValue this_val, int argc, JSValue *argv)
+static JSValue js_callsite_isnative(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv)
 {
     JSCallSiteData *csd = JS_GetOpaque2(ctx, this_val, JS_CLASS_CALL_SITE);
     if (!csd)
@@ -56159,7 +56043,7 @@ static JSValue js_callsite_isnative(JSContext *ctx, JSValue this_val, int argc,
     return JS_NewBool(ctx, csd->native);
 }
 
-static JSValue js_callsite_getnumber(JSContext *ctx, JSValue this_val, int argc, JSValue *argv, int magic)
+static JSValue js_callsite_getnumber(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv, int magic)
 {
     JSCallSiteData *csd = JS_GetOpaque2(ctx, this_val, JS_CLASS_CALL_SITE);
     if (!csd)
@@ -56196,24 +56080,24 @@ static void _JS_AddIntrinsicCallSite(JSContext *ctx)
                                countof(js_callsite_proto_funcs));
 }
 
-BOOL JS_DetectModule(const char *input, size_t input_len)
+bool JS_DetectModule(const char *input, size_t input_len)
 {
     JSRuntime *rt;
     JSContext *ctx;
     JSValue val;
-    BOOL is_module;
+    bool is_module;
 
-    is_module = TRUE;
+    is_module = true;
     rt = JS_NewRuntime();
     if (!rt)
-        return FALSE;
+        return false;
     ctx = JS_NewContextRaw(rt);
     if (!ctx) {
         JS_FreeRuntime(rt);
-        return FALSE;
+        return false;
     }
-    JS_AddIntrinsicRegExp(ctx); // otherwise regexp literals don't parse
-    val = __JS_EvalInternal(ctx, JS_UNDEFINED, input, input_len, "<unnamed>",
+    JS_AddIntrinsicRegExpCompiler(ctx); // otherwise regexp literals don't parse
+    val = __JS_EvalInternal(ctx, JS_UNDEFINED, input, input_len, "<unnamed>", 1,
                             JS_EVAL_TYPE_MODULE|JS_EVAL_FLAG_COMPILE_ONLY, -1);
     if (JS_IsException(val)) {
         const char *msg = JS_ToCString(ctx, rt->current_exception);
@@ -56229,7 +56113,9 @@ BOOL JS_DetectModule(const char *input, size_t input_len)
 }
 
 uintptr_t js_std_cmd(int cmd, ...) {
+    JSContext *ctx;
     JSRuntime *rt;
+    JSValue *pv;
     uintptr_t rv;
     va_list ap;
 
@@ -56244,6 +56130,12 @@ uintptr_t js_std_cmd(int cmd, ...) {
         rt = va_arg(ap, JSRuntime *);
         rt->libc_opaque = va_arg(ap, void *);
         break;
+    case 2: // ErrorBackTrace
+        ctx = va_arg(ap, JSContext *);
+        pv = va_arg(ap, JSValue *);
+        *pv = ctx->error_back_trace;
+        ctx->error_back_trace = JS_UNDEFINED;
+        break;
     default:
         rv = -1;
     }
diff --git a/lib/monoucha0/monoucha/qjs/quickjs.h b/lib/monoucha0/monoucha/qjs/quickjs.h
index ad1cfa40..5e2db75f 100644
--- a/lib/monoucha0/monoucha/qjs/quickjs.h
+++ b/lib/monoucha0/monoucha/qjs/quickjs.h
@@ -1,10 +1,10 @@
 /*
  * QuickJS Javascript Engine
  *
- * Copyright (c) 2017-2021 Fabrice Bellard
- * Copyright (c) 2017-2021 Charlie Gordon
- * Copyright (c) 2023 Ben Noordhuis
- * Copyright (c) 2023 Saúl Ibarra Corretgé
+ * Copyright (c) 2017-2024 Fabrice Bellard
+ * Copyright (c) 2017-2024 Charlie Gordon
+ * Copyright (c) 2023-2025 Ben Noordhuis
+ * Copyright (c) 2023-2025 Saúl Ibarra Corretgé
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -27,6 +27,7 @@
 #ifndef QUICKJS_H
 #define QUICKJS_H
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
@@ -36,17 +37,33 @@
 extern "C" {
 #endif
 
+#define QUICKJS_NG 1
+
 #if defined(__GNUC__) || defined(__clang__)
 #define js_force_inline       inline __attribute__((always_inline))
-#define __js_printf_like(f, a)   __attribute__((format(printf, f, a)))
 #define JS_EXTERN __attribute__((visibility("default")))
 #else
 #define js_force_inline  inline
-#define __js_printf_like(a, b)
 #define JS_EXTERN /* nothing */
 #endif
 
-#define JS_BOOL int
+/* Borrowed from Folly */
+#ifndef JS_PRINTF_FORMAT
+#ifdef _MSC_VER
+#include <sal.h>
+#define JS_PRINTF_FORMAT _Printf_format_string_
+#define JS_PRINTF_FORMAT_ATTR(format_param, dots_param)
+#else
+#define JS_PRINTF_FORMAT
+#if !defined(__clang__) && defined(__GNUC__)
+#define JS_PRINTF_FORMAT_ATTR(format_param, dots_param) \
+  __attribute__((format(gnu_printf, format_param, dots_param)))
+#else
+#define JS_PRINTF_FORMAT_ATTR(format_param, dots_param) \
+  __attribute__((format(printf, format_param, dots_param)))
+#endif
+#endif
+#endif
 
 typedef struct JSRuntime JSRuntime;
 typedef struct JSContext JSContext;
@@ -89,10 +106,55 @@ enum {
     /* any larger tag is FLOAT64 if JS_NAN_BOXING */
 };
 
-#define JS_FLOAT64_NAN NAN
-#define JSValueConst JSValue /* For backwards compatibility. */
+#if !defined(JS_CHECK_JSVALUE)
+#define JSValueConst JSValue
+#endif
 
-#if defined(JS_NAN_BOXING) && JS_NAN_BOXING
+// JS_CHECK_JSVALUE build mode does not produce working code but is here to
+// help catch reference counting bugs at compile time, by making it harder
+// to mix up JSValue and JSValueConst
+//
+// rules:
+//
+// - a function with a JSValue parameter takes ownership;
+//   caller must *not* call JS_FreeValue
+//
+// - a function with a JSValueConst parameter does not take ownership;
+//   caller *must* call JS_FreeValue
+//
+// - a function returning a JSValue transfers ownership to caller;
+//   caller *must* call JS_FreeValue
+//
+// - a function returning a JSValueConst does *not* transfer ownership;
+//   caller must *not* call JS_FreeValue
+#if defined(JS_CHECK_JSVALUE)
+
+typedef struct JSValue *JSValue;
+typedef const struct JSValue *JSValueConst;
+
+#define JS_MKVAL(tag, val)       ((JSValue)((tag) | (intptr_t)(val) << 4))
+#define JS_MKPTR(tag, ptr)       ((JSValue)((tag) | (intptr_t)(ptr)))
+#define JS_VALUE_GET_NORM_TAG(v) ((int)((intptr_t)(v) & 15))
+#define JS_VALUE_GET_TAG(v)      ((int)((intptr_t)(v) & 15))
+#define JS_VALUE_GET_PTR(v)      ((void *)((intptr_t)(v) & ~15))
+#define JS_VALUE_GET_INT(v)      ((int)((intptr_t)(v) >> 4))
+#define JS_VALUE_GET_BOOL(v)     ((int)((intptr_t)(v) >> 4))
+#define JS_VALUE_GET_FLOAT64(v)  ((double)((intptr_t)(v) >> 4))
+#define JS_TAG_IS_FLOAT64(tag)   ((int)(tag) == JS_TAG_FLOAT64)
+#define JS_NAN                   JS_MKVAL(JS_TAG_FLOAT64, 0)
+
+static inline JSValue __JS_NewFloat64(double d)
+{
+    return JS_MKVAL(JS_TAG_FLOAT64, (int)d);
+}
+
+static inline bool JS_VALUE_IS_NAN(JSValue v)
+{
+    (void)&v;
+    return false;
+}
+
+#elif defined(JS_NAN_BOXING) && JS_NAN_BOXING
 
 typedef uint64_t JSValue;
 
@@ -148,7 +210,7 @@ static inline int JS_VALUE_GET_NORM_TAG(JSValue v)
         return tag;
 }
 
-static inline JS_BOOL JS_VALUE_IS_NAN(JSValue v)
+static inline bool JS_VALUE_IS_NAN(JSValue v)
 {
     uint32_t tag;
     tag = JS_VALUE_GET_TAG(v);
@@ -195,7 +257,7 @@ static inline JSValue JS_MKVAL(int64_t tag, int32_t int32)
 static inline JSValue JS_MKNAN(void)
 {
     JSValue v;
-    v.u.float64 = JS_FLOAT64_NAN;
+    v.u.float64 = NAN;
     v.tag = JS_TAG_FLOAT64;
     return v;
 }
@@ -206,7 +268,7 @@ static inline JSValue JS_MKNAN(void)
 #else
 #define JS_MKPTR(tag, p)   (JSValue){ (JSValueUnion){ .ptr = p }, tag }
 #define JS_MKVAL(tag, val) (JSValue){ (JSValueUnion){ .int32 = val }, tag }
-#define JS_NAN             (JSValue){ (JSValueUnion){ .float64 = JS_FLOAT64_NAN }, JS_TAG_FLOAT64 }
+#define JS_NAN             (JSValue){ (JSValueUnion){ .float64 = NAN }, JS_TAG_FLOAT64 }
 #endif
 
 #define JS_TAG_IS_FLOAT64(tag) ((unsigned)(tag) == JS_TAG_FLOAT64)
@@ -219,7 +281,7 @@ static inline JSValue __JS_NewFloat64(double d)
     return v;
 }
 
-static inline JS_BOOL JS_VALUE_IS_NAN(JSValue v)
+static inline bool JS_VALUE_IS_NAN(JSValue v)
 {
     union {
         double d;
@@ -303,9 +365,9 @@ static inline JS_BOOL JS_VALUE_IS_NAN(JSValue v)
    promise. Only allowed with JS_EVAL_TYPE_GLOBAL */
 #define JS_EVAL_FLAG_ASYNC (1 << 7)
 
-typedef JSValue JSCFunction(JSContext *ctx, JSValue this_val, int argc, JSValue *argv);
-typedef JSValue JSCFunctionMagic(JSContext *ctx, JSValue this_val, int argc, JSValue *argv, int magic);
-typedef JSValue JSCFunctionData(JSContext *ctx, JSValue this_val, int argc, JSValue *argv, int magic, JSValue *func_data);
+typedef JSValue JSCFunction(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv);
+typedef JSValue JSCFunctionMagic(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv, int magic);
+typedef JSValue JSCFunctionData(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv, int magic, JSValueConst *func_data);
 
 typedef struct JSMallocFunctions {
     void *(*js_calloc)(void *opaque, size_t count, size_t size);
@@ -315,6 +377,29 @@ typedef struct JSMallocFunctions {
     size_t (*js_malloc_usable_size)(const void *ptr);
 } JSMallocFunctions;
 
+// Debug trace system: the debug output will be produced to the dump stream (currently
+// stdout) if dumps are enabled and JS_SetDumpFlags is invoked with the corresponding
+// bit set.
+#define JS_DUMP_BYTECODE_FINAL   0x01  /* dump pass 3 final byte code */
+#define JS_DUMP_BYTECODE_PASS2   0x02  /* dump pass 2 code */
+#define JS_DUMP_BYTECODE_PASS1   0x04  /* dump pass 1 code */
+#define JS_DUMP_BYTECODE_HEX     0x10  /* dump bytecode in hex */
+#define JS_DUMP_BYTECODE_PC2LINE 0x20  /* dump line number table */
+#define JS_DUMP_BYTECODE_STACK   0x40  /* dump compute_stack_size */
+#define JS_DUMP_BYTECODE_STEP    0x80  /* dump executed bytecode */
+#define JS_DUMP_READ_OBJECT     0x100  /* dump the marshalled objects at load time */
+#define JS_DUMP_FREE            0x200  /* dump every object free */
+#define JS_DUMP_GC              0x400  /* dump the occurrence of the automatic GC */
+#define JS_DUMP_GC_FREE         0x800  /* dump objects freed by the GC */
+#define JS_DUMP_MODULE_RESOLVE 0x1000  /* dump module resolution steps */
+#define JS_DUMP_PROMISE        0x2000  /* dump promise steps */
+#define JS_DUMP_LEAKS          0x4000  /* dump leaked objects and strings in JS_FreeRuntime */
+#define JS_DUMP_ATOM_LEAKS     0x8000  /* dump leaked atoms in JS_FreeRuntime */
+#define JS_DUMP_MEM           0x10000  /* dump memory usage in JS_FreeRuntime */
+#define JS_DUMP_OBJECTS       0x20000  /* dump objects in JS_FreeRuntime */
+#define JS_DUMP_ATOMS         0x40000  /* dump atoms in JS_FreeRuntime */
+#define JS_DUMP_SHAPES        0x80000  /* dump shapes in JS_FreeRuntime */
+
 // Finalizers run in LIFO order at the very end of JS_FreeRuntime.
 // Intended for cleanup of associated resources; the runtime itself
 // is no longer usable.
@@ -330,6 +415,7 @@ JS_EXTERN void JS_SetRuntimeInfo(JSRuntime *rt, const char *info);
 /* use 0 to disable memory limit */
 JS_EXTERN void JS_SetMemoryLimit(JSRuntime *rt, size_t limit);
 JS_EXTERN void JS_SetDumpFlags(JSRuntime *rt, uint64_t flags);
+JS_EXTERN uint64_t JS_GetDumpFlags(JSRuntime *rt);
 JS_EXTERN size_t JS_GetGCThreshold(JSRuntime *rt);
 JS_EXTERN void JS_SetGCThreshold(JSRuntime *rt, size_t gc_threshold);
 /* use 0 to disable maximum stack size check */
@@ -346,9 +432,10 @@ JS_EXTERN int JS_AddRuntimeFinalizer(JSRuntime *rt,
 JS_EXTERN void JS_SetRuntimeCleanUpFunc(JSRuntime *rt,
                                         JSRuntimeCleanUpFunc cleanup_func);
 typedef void JS_MarkFunc(JSRuntime *rt, JSGCObjectHeader *gp);
-JS_EXTERN void JS_MarkValue(JSRuntime *rt, JSValue val, JS_MarkFunc *mark_func);
+JS_EXTERN void JS_MarkValue(JSRuntime *rt, JSValueConst val,
+                            JS_MarkFunc *mark_func);
 JS_EXTERN void JS_RunGC(JSRuntime *rt);
-JS_EXTERN JS_BOOL JS_IsLiveObject(JSRuntime *rt, JSValue obj);
+JS_EXTERN bool JS_IsLiveObject(JSRuntime *rt, JSValueConst obj);
 
 JS_EXTERN JSContext *JS_NewContext(JSRuntime *rt);
 JS_EXTERN void JS_FreeContext(JSContext *s);
@@ -378,15 +465,15 @@ JS_EXTERN void JS_AddIntrinsicWeakRef(JSContext *ctx);
 JS_EXTERN void JS_AddPerformance(JSContext *ctx);
 
 /* for equality comparisons and sameness */
-JS_EXTERN int JS_IsEqual(JSContext *ctx, JSValue op1, JSValue op2);
-JS_EXTERN JS_BOOL JS_IsStrictEqual(JSContext *ctx, JSValue op1, JSValue op2);
-JS_EXTERN JS_BOOL JS_IsSameValue(JSContext *ctx, JSValue op1, JSValue op2);
+JS_EXTERN int JS_IsEqual(JSContext *ctx, JSValueConst op1, JSValueConst op2);
+JS_EXTERN bool JS_IsStrictEqual(JSContext *ctx, JSValueConst op1, JSValueConst op2);
+JS_EXTERN bool JS_IsSameValue(JSContext *ctx, JSValueConst op1, JSValueConst op2);
 /* Similar to same-value equality, but +0 and -0 are considered equal. */
-JS_EXTERN JS_BOOL JS_IsSameValueZero(JSContext *ctx, JSValue op1, JSValue op2);
+JS_EXTERN bool JS_IsSameValueZero(JSContext *ctx, JSValueConst op1, JSValueConst op2);
 
 /* Only used for running 262 tests. TODO(saghul) add build time flag. */
-JS_EXTERN JSValue js_string_codePointRange(JSContext *ctx, JSValue this_val,
-                                 int argc, JSValue *argv);
+JS_EXTERN JSValue js_string_codePointRange(JSContext *ctx, JSValueConst this_val,
+                                           int argc, JSValueConst *argv);
 
 JS_EXTERN void *js_calloc_rt(JSRuntime *rt, size_t count, size_t size);
 JS_EXTERN void *js_malloc_rt(JSRuntime *rt, size_t size);
@@ -436,12 +523,12 @@ JS_EXTERN void JS_FreeAtomRT(JSRuntime *rt, JSAtom v);
 JS_EXTERN JSValue JS_AtomToValue(JSContext *ctx, JSAtom atom);
 JS_EXTERN JSValue JS_AtomToString(JSContext *ctx, JSAtom atom);
 JS_EXTERN const char *JS_AtomToCString(JSContext *ctx, JSAtom atom);
-JS_EXTERN JSAtom JS_ValueToAtom(JSContext *ctx, JSValue val);
+JS_EXTERN JSAtom JS_ValueToAtom(JSContext *ctx, JSValueConst val);
 
 /* object class support */
 
 typedef struct JSPropertyEnum {
-    JS_BOOL is_enumerable;
+    bool is_enumerable;
     JSAtom atom;
 } JSPropertyEnum;
 
@@ -454,42 +541,41 @@ typedef struct JSPropertyDescriptor {
 
 typedef struct JSClassExoticMethods {
     /* Return -1 if exception (can only happen in case of Proxy object),
-       FALSE if the property does not exists, TRUE if it exists. If 1 is
+       false if the property does not exists, true if it exists. If 1 is
        returned, the property descriptor 'desc' is filled if != NULL. */
     int (*get_own_property)(JSContext *ctx, JSPropertyDescriptor *desc,
-                             JSValue obj, JSAtom prop);
+                             JSValueConst obj, JSAtom prop);
     /* '*ptab' should hold the '*plen' property keys. Return 0 if OK,
        -1 if exception. The 'is_enumerable' field is ignored.
     */
     int (*get_own_property_names)(JSContext *ctx, JSPropertyEnum **ptab,
-                                  uint32_t *plen,
-                                  JSValue obj);
-    /* return < 0 if exception, or TRUE/FALSE */
-    int (*delete_property)(JSContext *ctx, JSValue obj, JSAtom prop);
-    /* return < 0 if exception or TRUE/FALSE */
-    int (*define_own_property)(JSContext *ctx, JSValue this_obj,
-                               JSAtom prop, JSValue val,
-                               JSValue getter, JSValue setter,
+                                  uint32_t *plen, JSValueConst obj);
+    /* return < 0 if exception, or true/false */
+    int (*delete_property)(JSContext *ctx, JSValueConst obj, JSAtom prop);
+    /* return < 0 if exception or true/false */
+    int (*define_own_property)(JSContext *ctx, JSValueConst this_obj,
+                               JSAtom prop, JSValueConst val,
+                               JSValueConst getter, JSValueConst setter,
                                int flags);
     /* The following methods can be emulated with the previous ones,
        so they are usually not needed */
-    /* return < 0 if exception or TRUE/FALSE */
-    int (*has_property)(JSContext *ctx, JSValue obj, JSAtom atom);
-    JSValue (*get_property)(JSContext *ctx, JSValue obj, JSAtom atom,
-                            JSValue receiver);
-    /* return < 0 if exception or TRUE/FALSE */
-    int (*set_property)(JSContext *ctx, JSValue obj, JSAtom atom,
-                        JSValue value, JSValue receiver, int flags);
+    /* return < 0 if exception or true/false */
+    int (*has_property)(JSContext *ctx, JSValueConst obj, JSAtom atom);
+    JSValue (*get_property)(JSContext *ctx, JSValueConst obj, JSAtom atom,
+                            JSValueConst receiver);
+    /* return < 0 if exception or true/false */
+    int (*set_property)(JSContext *ctx, JSValueConst obj, JSAtom atom,
+                        JSValueConst value, JSValueConst receiver, int flags);
 } JSClassExoticMethods;
 
-typedef void JSClassFinalizer(JSRuntime *rt, JSValue val);
-typedef void JSClassGCMark(JSRuntime *rt, JSValue val,
+typedef void JSClassFinalizer(JSRuntime *rt, JSValueConst val);
+typedef void JSClassGCMark(JSRuntime *rt, JSValueConst val,
                            JS_MarkFunc *mark_func);
 #define JS_CALL_FLAG_CONSTRUCTOR (1 << 0)
-typedef JSValue JSClassCall(JSContext *ctx, JSValue func_obj,
-                            JSValue this_val, int argc, JSValue *argv,
-                            int flags);
-typedef JS_BOOL JSClassCanDestroy(JSRuntime *rt, JSValue val);
+typedef JSValue JSClassCall(JSContext *ctx, JSValueConst func_obj,
+                            JSValueConst this_val, int argc,
+                            JSValueConst *argv, int flags);
+typedef bool JSClassCanDestroy(JSRuntime *rt, JSValue val);
 
 typedef struct JSClassDef {
     const char *class_name; /* pure ASCII only! */
@@ -507,16 +593,26 @@ typedef struct JSClassDef {
     JSClassCanDestroy *can_destroy;
 } JSClassDef;
 
+#define JS_EVAL_OPTIONS_VERSION 1
+
+typedef struct JSEvalOptions {
+  int version;
+  int eval_flags;
+  const char *filename;
+  int line_num;
+  // can add new fields in ABI-compatible manner by incrementing JS_EVAL_OPTIONS_VERSION
+} JSEvalOptions;
+
 #define JS_INVALID_CLASS_ID 0
 JS_EXTERN JSClassID JS_NewClassID(JSRuntime *rt, JSClassID *pclass_id);
 /* Returns the class ID if `v` is an object, otherwise returns JS_INVALID_CLASS_ID. */
-JS_EXTERN JSClassID JS_GetClassID(JSValue v);
+JS_EXTERN JSClassID JS_GetClassID(JSValueConst v);
 JS_EXTERN int JS_NewClass(JSRuntime *rt, JSClassID class_id, const JSClassDef *class_def);
-JS_EXTERN int JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id);
+JS_EXTERN bool JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id);
 
 /* value handling */
 
-static js_force_inline JSValue JS_NewBool(JSContext *ctx, JS_BOOL val)
+static js_force_inline JSValue JS_NewBool(JSContext *ctx, bool val)
 {
     (void)&ctx;
     return JS_MKVAL(JS_TAG_BOOL, (val != 0));
@@ -566,106 +662,120 @@ JS_EXTERN JSValue JS_NewNumber(JSContext *ctx, double d);
 JS_EXTERN JSValue JS_NewBigInt64(JSContext *ctx, int64_t v);
 JS_EXTERN JSValue JS_NewBigUint64(JSContext *ctx, uint64_t v);
 
-static inline JS_BOOL JS_IsNumber(JSValue v)
+static inline bool JS_IsNumber(JSValueConst v)
 {
     int tag = JS_VALUE_GET_TAG(v);
     return tag == JS_TAG_INT || JS_TAG_IS_FLOAT64(tag);
 }
 
-static inline JS_BOOL JS_IsBigInt(JSContext *ctx, JSValue v)
+static inline bool JS_IsBigInt(JSContext *ctx, JSValueConst v)
 {
     (void)&ctx;
     return JS_VALUE_GET_TAG(v) == JS_TAG_BIG_INT;
 }
 
-static inline JS_BOOL JS_IsBool(JSValue v)
+static inline bool JS_IsBool(JSValueConst v)
 {
     return JS_VALUE_GET_TAG(v) == JS_TAG_BOOL;
 }
 
-static inline JS_BOOL JS_IsNull(JSValue v)
+static inline bool JS_IsNull(JSValueConst v)
 {
     return JS_VALUE_GET_TAG(v) == JS_TAG_NULL;
 }
 
-static inline JS_BOOL JS_IsUndefined(JSValue v)
+static inline bool JS_IsUndefined(JSValueConst v)
 {
     return JS_VALUE_GET_TAG(v) == JS_TAG_UNDEFINED;
 }
 
-static inline JS_BOOL JS_IsException(JSValue v)
+static inline bool JS_IsException(JSValueConst v)
 {
     return JS_VALUE_GET_TAG(v) == JS_TAG_EXCEPTION;
 }
 
-static inline JS_BOOL JS_IsUninitialized(JSValue v)
+static inline bool JS_IsUninitialized(JSValueConst v)
 {
     return JS_VALUE_GET_TAG(v) == JS_TAG_UNINITIALIZED;
 }
 
-static inline JS_BOOL JS_IsString(JSValue v)
+static inline bool JS_IsString(JSValueConst v)
 {
     return JS_VALUE_GET_TAG(v) == JS_TAG_STRING;
 }
 
-static inline JS_BOOL JS_IsSymbol(JSValue v)
+static inline bool JS_IsSymbol(JSValueConst v)
 {
     return JS_VALUE_GET_TAG(v) == JS_TAG_SYMBOL;
 }
 
-static inline JS_BOOL JS_IsObject(JSValue v)
+static inline bool JS_IsObject(JSValueConst v)
 {
     return JS_VALUE_GET_TAG(v) == JS_TAG_OBJECT;
 }
 
+static inline bool JS_IsModule(JSValueConst v)
+{
+    return JS_VALUE_GET_TAG(v) == JS_TAG_MODULE;
+}
+
 JS_EXTERN JSValue JS_Throw(JSContext *ctx, JSValue obj);
 JS_EXTERN JSValue JS_GetException(JSContext *ctx);
-JS_BOOL JS_HasException(JSContext *ctx);
-JS_EXTERN JS_BOOL JS_IsError(JSContext *ctx, JSValue val);
-JS_EXTERN JS_BOOL JS_IsUncatchableError(JSContext* ctx, JSValue val);
-JS_EXTERN void JS_SetUncatchableError(JSContext *ctx, JSValue val,
-                                      JS_BOOL flag);
+JS_EXTERN bool JS_HasException(JSContext *ctx);
+JS_EXTERN bool JS_IsError(JSContext *ctx, JSValueConst val);
+JS_EXTERN bool JS_IsUncatchableError(JSContext* ctx, JSValueConst val);
+JS_EXTERN void JS_SetUncatchableError(JSContext *ctx, JSValueConst val);
+JS_EXTERN void JS_ClearUncatchableError(JSContext *ctx, JSValueConst val);
+// Shorthand for:
+//  JSValue exc = JS_GetException(ctx);
+//  JS_ClearUncatchableError(ctx, exc);
+//  JS_Throw(ctx, exc);
 JS_EXTERN void JS_ResetUncatchableError(JSContext *ctx);
 JS_EXTERN JSValue JS_NewError(JSContext *ctx);
-JS_EXTERN JSValue __js_printf_like(2, 3) JS_ThrowPlainError(JSContext *ctx, const char *fmt, ...);
-JS_EXTERN JSValue __js_printf_like(2, 3) JS_ThrowSyntaxError(JSContext *ctx, const char *fmt, ...);
-JS_EXTERN JSValue __js_printf_like(2, 3) JS_ThrowTypeError(JSContext *ctx, const char *fmt, ...);
-JS_EXTERN JSValue __js_printf_like(2, 3) JS_ThrowReferenceError(JSContext *ctx, const char *fmt, ...);
-JS_EXTERN JSValue __js_printf_like(2, 3) JS_ThrowRangeError(JSContext *ctx, const char *fmt, ...);
-JS_EXTERN JSValue __js_printf_like(2, 3) JS_ThrowInternalError(JSContext *ctx, const char *fmt, ...);
+JS_EXTERN JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowPlainError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...);
+JS_EXTERN JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowSyntaxError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...);
+JS_EXTERN JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowTypeError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...);
+JS_EXTERN JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowReferenceError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...);
+JS_EXTERN JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowRangeError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...);
+JS_EXTERN JSValue JS_PRINTF_FORMAT_ATTR(2, 3) JS_ThrowInternalError(JSContext *ctx, JS_PRINTF_FORMAT const char *fmt, ...);
 JS_EXTERN JSValue JS_ThrowOutOfMemory(JSContext *ctx);
 JS_EXTERN void JS_FreeValue(JSContext *ctx, JSValue v);
 JS_EXTERN void JS_FreeValueRT(JSRuntime *rt, JSValue v);
-JS_EXTERN JSValue JS_DupValue(JSContext *ctx, JSValue v);
-JS_EXTERN JSValue JS_DupValueRT(JSRuntime *rt, JSValue v);
-JS_EXTERN int JS_ToBool(JSContext *ctx, JSValue val); /* return -1 for JS_EXCEPTION */
-JS_EXTERN int JS_ToInt32(JSContext *ctx, int32_t *pres, JSValue val);
-static inline int JS_ToUint32(JSContext *ctx, uint32_t *pres, JSValue val)
+JS_EXTERN JSValue JS_DupValue(JSContext *ctx, JSValueConst v);
+JS_EXTERN JSValue JS_DupValueRT(JSRuntime *rt, JSValueConst v);
+JS_EXTERN int JS_ToBool(JSContext *ctx, JSValueConst val); /* return -1 for JS_EXCEPTION */
+static inline JSValue JS_ToBoolean(JSContext *ctx, JSValueConst val)
+{
+    return JS_NewBool(ctx, JS_ToBool(ctx, val));
+}
+JS_EXTERN JSValue JS_ToNumber(JSContext *ctx, JSValueConst val);
+JS_EXTERN int JS_ToInt32(JSContext *ctx, int32_t *pres, JSValueConst val);
+static inline int JS_ToUint32(JSContext *ctx, uint32_t *pres, JSValueConst val)
 {
     return JS_ToInt32(ctx, (int32_t*)pres, val);
 }
-JS_EXTERN int JS_ToInt64(JSContext *ctx, int64_t *pres, JSValue val);
-JS_EXTERN int JS_ToIndex(JSContext *ctx, uint64_t *plen, JSValue val);
-JS_EXTERN int JS_ToFloat64(JSContext *ctx, double *pres, JSValue val);
+JS_EXTERN int JS_ToInt64(JSContext *ctx, int64_t *pres, JSValueConst val);
+JS_EXTERN int JS_ToIndex(JSContext *ctx, uint64_t *plen, JSValueConst val);
+JS_EXTERN int JS_ToFloat64(JSContext *ctx, double *pres, JSValueConst val);
 /* return an exception if 'val' is a Number */
-JS_EXTERN int JS_ToBigInt64(JSContext *ctx, int64_t *pres, JSValue val);
-JS_EXTERN int JS_ToBigUint64(JSContext *ctx, uint64_t *pres, JSValue val);
+JS_EXTERN int JS_ToBigInt64(JSContext *ctx, int64_t *pres, JSValueConst val);
+JS_EXTERN int JS_ToBigUint64(JSContext *ctx, uint64_t *pres, JSValueConst val);
 /* same as JS_ToInt64() but allow BigInt */
-JS_EXTERN int JS_ToInt64Ext(JSContext *ctx, int64_t *pres, JSValue val);
+JS_EXTERN int JS_ToInt64Ext(JSContext *ctx, int64_t *pres, JSValueConst val);
 
 JS_EXTERN JSValue JS_NewStringLen(JSContext *ctx, const char *str1, size_t len1);
 static inline JSValue JS_NewString(JSContext *ctx, const char *str) {
     return JS_NewStringLen(ctx, str, strlen(str));
 }
 JS_EXTERN JSValue JS_NewAtomString(JSContext *ctx, const char *str);
-JS_EXTERN JSValue JS_ToString(JSContext *ctx, JSValue val);
-JS_EXTERN JSValue JS_ToPropertyKey(JSContext *ctx, JSValue val);
-JS_EXTERN const char *JS_ToCStringLen2(JSContext *ctx, size_t *plen, JSValue val1, JS_BOOL cesu8);
-static inline const char *JS_ToCStringLen(JSContext *ctx, size_t *plen, JSValue val1)
+JS_EXTERN JSValue JS_ToString(JSContext *ctx, JSValueConst val);
+JS_EXTERN JSValue JS_ToPropertyKey(JSContext *ctx, JSValueConst val);
+JS_EXTERN const char *JS_ToCStringLen2(JSContext *ctx, size_t *plen, JSValueConst val1, bool cesu8);
+static inline const char *JS_ToCStringLen(JSContext *ctx, size_t *plen, JSValueConst val1)
 {
     return JS_ToCStringLen2(ctx, plen, val1, 0);
 }
-static inline const char *JS_ToCString(JSContext *ctx, JSValue val1)
+static inline const char *JS_ToCString(JSContext *ctx, JSValueConst val1)
 {
     return JS_ToCStringLen2(ctx, NULL, val1, 0);
 }
@@ -673,48 +783,76 @@ JS_EXTERN void JS_FreeCString(JSContext *ctx, const char *ptr);
 
 JS_EXTERN JSValue JS_NewNarrowStringLen(JSContext *ctx, const char *str,
                                         size_t len);
-JS_EXTERN JS_BOOL JS_IsStringWideChar(JSValue value);
-JS_EXTERN uint8_t *JS_GetNarrowStringBuffer(JSValue value);
-JS_EXTERN uint32_t JS_GetStringLength(JSValue value);
+JS_EXTERN bool JS_IsStringWideChar(JSValueConst value);
+JS_EXTERN uint8_t *JS_GetNarrowStringBuffer(JSValueConst value);
+JS_EXTERN uint32_t JS_GetStringLength(JSValueConst value);
 
-JS_EXTERN JSValue JS_NewObjectProtoClass(JSContext *ctx, JSValue proto, JSClassID class_id);
+JS_EXTERN JSValue JS_NewObjectProtoClass(JSContext *ctx, JSValueConst proto,
+                                         JSClassID class_id);
 JS_EXTERN JSValue JS_NewObjectClass(JSContext *ctx, int class_id);
-JS_EXTERN JSValue JS_NewObjectProto(JSContext *ctx, JSValue proto);
+JS_EXTERN JSValue JS_NewObjectProto(JSContext *ctx, JSValueConst proto);
 JS_EXTERN JSValue JS_NewObject(JSContext *ctx);
-
-JS_EXTERN JS_BOOL JS_IsFunction(JSContext* ctx, JSValue val);
-JS_EXTERN JS_BOOL JS_IsConstructor(JSContext* ctx, JSValue val);
-JS_EXTERN JS_BOOL JS_SetConstructorBit(JSContext *ctx, JSValue func_obj, JS_BOOL val);
+// takes ownership of the values
+JS_EXTERN JSValue JS_NewObjectFrom(JSContext *ctx, int count,
+                                   const JSAtom *props,
+                                   const JSValue *values);
+// takes ownership of the values
+JS_EXTERN JSValue JS_NewObjectFromStr(JSContext *ctx, int count,
+                                      const char **props,
+                                      const JSValue *values);
+JS_EXTERN JSValue JS_ToObject(JSContext *ctx, JSValueConst val);
+JS_EXTERN JSValue JS_ToObjectString(JSContext *ctx, JSValueConst val);
+
+JS_EXTERN bool JS_IsFunction(JSContext* ctx, JSValueConst val);
+JS_EXTERN bool JS_IsConstructor(JSContext* ctx, JSValueConst val);
+JS_EXTERN bool JS_SetConstructorBit(JSContext *ctx, JSValueConst func_obj, bool val);
+
+JS_EXTERN bool JS_IsRegExp(JSValueConst val);
+JS_EXTERN bool JS_IsMap(JSValueConst val);
 
 JS_EXTERN JSValue JS_NewArray(JSContext *ctx);
-JS_EXTERN int JS_IsArray(JSContext *ctx, JSValue val);
+// takes ownership of the values
+JS_EXTERN JSValue JS_NewArrayFrom(JSContext *ctx, int count,
+                                  const JSValue *values);
+// reader beware: JS_IsArray used to "punch" through proxies and check
+// if the target object is an array but it no longer does; use JS_IsProxy
+// and JS_GetProxyTarget instead, and remember that the target itself can
+// also be a proxy, ad infinitum
+JS_EXTERN bool JS_IsArray(JSValueConst val);
+
+JS_EXTERN bool JS_IsProxy(JSValueConst val);
+JS_EXTERN JSValue JS_GetProxyTarget(JSContext *ctx, JSValueConst proxy);
+JS_EXTERN JSValue JS_GetProxyHandler(JSContext *ctx, JSValueConst proxy);
 
 JS_EXTERN JSValue JS_NewDate(JSContext *ctx, double epoch_ms);
+JS_EXTERN bool JS_IsDate(JSValueConst v);
 
-JS_EXTERN JSValue JS_GetProperty(JSContext *ctx, JSValue this_obj, JSAtom prop);
-JS_EXTERN JSValue JS_GetPropertyUint32(JSContext *ctx, JSValue this_obj,
+JS_EXTERN JSValue JS_GetProperty(JSContext *ctx, JSValueConst this_obj, JSAtom prop);
+JS_EXTERN JSValue JS_GetPropertyUint32(JSContext *ctx, JSValueConst this_obj,
                                        uint32_t idx);
-JS_EXTERN JSValue JS_GetPropertyInt64(JSContext *ctx, JSValue this_obj,
+JS_EXTERN JSValue JS_GetPropertyInt64(JSContext *ctx, JSValueConst this_obj,
                                       int64_t idx);
-JS_EXTERN JSValue JS_GetPropertyStr(JSContext *ctx, JSValue this_obj,
+JS_EXTERN JSValue JS_GetPropertyStr(JSContext *ctx, JSValueConst this_obj,
                                     const char *prop);
 
-JS_EXTERN int JS_SetProperty(JSContext *ctx, JSValue this_obj,
+JS_EXTERN int JS_SetProperty(JSContext *ctx, JSValueConst this_obj,
                              JSAtom prop, JSValue val);
-JS_EXTERN int JS_SetPropertyUint32(JSContext *ctx, JSValue this_obj,
+JS_EXTERN int JS_SetPropertyUint32(JSContext *ctx, JSValueConst this_obj,
                                    uint32_t idx, JSValue val);
-JS_EXTERN int JS_SetPropertyInt64(JSContext *ctx, JSValue this_obj,
+JS_EXTERN int JS_SetPropertyInt64(JSContext *ctx, JSValueConst this_obj,
                                   int64_t idx, JSValue val);
-JS_EXTERN int JS_SetPropertyStr(JSContext *ctx, JSValue this_obj,
+JS_EXTERN int JS_SetPropertyStr(JSContext *ctx, JSValueConst this_obj,
                                 const char *prop, JSValue val);
-JS_EXTERN int JS_HasProperty(JSContext *ctx, JSValue this_obj, JSAtom prop);
-JS_EXTERN int JS_IsExtensible(JSContext *ctx, JSValue obj);
-JS_EXTERN int JS_PreventExtensions(JSContext *ctx, JSValue obj);
-JS_EXTERN int JS_DeleteProperty(JSContext *ctx, JSValue obj, JSAtom prop, int flags);
-JS_EXTERN int JS_SetPrototype(JSContext *ctx, JSValue obj, JSValue proto_val);
-JS_EXTERN JSValue JS_GetPrototype(JSContext *ctx, JSValue val);
-JS_EXTERN int JS_GetLength(JSContext *ctx, JSValue obj, int64_t *pres);
-JS_EXTERN int JS_SetLength(JSContext *ctx, JSValue obj, int64_t len);
+JS_EXTERN int JS_HasProperty(JSContext *ctx, JSValueConst this_obj, JSAtom prop);
+JS_EXTERN int JS_IsExtensible(JSContext *ctx, JSValueConst obj);
+JS_EXTERN int JS_PreventExtensions(JSContext *ctx, JSValueConst obj);
+JS_EXTERN int JS_DeleteProperty(JSContext *ctx, JSValueConst obj, JSAtom prop, int flags);
+JS_EXTERN int JS_SetPrototype(JSContext *ctx, JSValueConst obj, JSValue proto_val);
+JS_EXTERN JSValue JS_GetPrototype(JSContext *ctx, JSValueConst val);
+JS_EXTERN int JS_GetLength(JSContext *ctx, JSValueConst obj, int64_t *pres);
+JS_EXTERN int JS_SetLength(JSContext *ctx, JSValueConst obj, int64_t len);
+JS_EXTERN int JS_SealObject(JSContext *ctx, JSValueConst obj);
+JS_EXTERN int JS_FreezeObject(JSContext *ctx, JSValueConst obj);
 
 #define JS_GPN_STRING_MASK  (1 << 0)
 #define JS_GPN_SYMBOL_MASK  (1 << 1)
@@ -725,72 +863,78 @@ JS_EXTERN int JS_SetLength(JSContext *ctx, JSValue obj, int64_t len);
 #define JS_GPN_SET_ENUM     (1 << 5)
 
 JS_EXTERN int JS_GetOwnPropertyNames(JSContext *ctx, JSPropertyEnum **ptab,
-                                     uint32_t *plen, JSValue obj, int flags);
+                                     uint32_t *plen, JSValueConst obj,
+                                     int flags);
 JS_EXTERN int JS_GetOwnProperty(JSContext *ctx, JSPropertyDescriptor *desc,
-                                JSValue obj, JSAtom prop);
+                                JSValueConst obj, JSAtom prop);
 JS_EXTERN void JS_FreePropertyEnum(JSContext *ctx, JSPropertyEnum *tab,
                                    uint32_t len);
 
-JS_EXTERN JSValue JS_Call(JSContext *ctx, JSValue func_obj, JSValue this_obj,
-                          int argc, JSValue *argv);
+JS_EXTERN JSValue JS_Call(JSContext *ctx, JSValueConst func_obj,
+                          JSValueConst this_obj, int argc, JSValueConst *argv);
 JSValue JS_NewObjectFromCtor(JSContext *ctx, JSValueConst ctor,
                              JSClassID class_id);
-JS_EXTERN JSValue JS_Invoke(JSContext *ctx, JSValue this_val, JSAtom atom,
-                            int argc, JSValue *argv);
-JS_EXTERN JSValue JS_CallConstructor(JSContext *ctx, JSValue func_obj,
-                                     int argc, JSValue *argv);
-JS_EXTERN JSValue JS_CallConstructor2(JSContext *ctx, JSValue func_obj,
-                                      JSValue new_target,
-                                      int argc, JSValue *argv);
-/* Try to detect if the input is a module. Returns TRUE if parsing the input
+JS_EXTERN JSValue JS_Invoke(JSContext *ctx, JSValueConst this_val, JSAtom atom,
+                            int argc, JSValueConst *argv);
+JS_EXTERN JSValue JS_CallConstructor(JSContext *ctx, JSValueConst func_obj,
+                                     int argc, JSValueConst *argv);
+JS_EXTERN JSValue JS_CallConstructor2(JSContext *ctx, JSValueConst func_obj,
+                                      JSValueConst new_target,
+                                      int argc, JSValueConst *argv);
+/* Try to detect if the input is a module. Returns true if parsing the input
  * as a module produces no syntax errors. It's a naive approach that is not
  * wholly infallible: non-strict classic scripts may _parse_ okay as a module
  * but not _execute_ as one (different runtime semantics.) Use with caution.
  * |input| can be either ASCII or UTF-8 encoded source code.
  */
-JS_EXTERN JS_BOOL JS_DetectModule(const char *input, size_t input_len);
+JS_EXTERN bool JS_DetectModule(const char *input, size_t input_len);
 /* 'input' must be zero terminated i.e. input[input_len] = '\0'. */
 JS_EXTERN JSValue JS_Eval(JSContext *ctx, const char *input, size_t input_len,
                           const char *filename, int eval_flags);
-/* same as JS_Eval() but with an explicit 'this_obj' parameter */
-JS_EXTERN JSValue JS_EvalThis(JSContext *ctx, JSValue this_obj,
+JS_EXTERN JSValue JS_Eval2(JSContext *ctx, const char *input, size_t input_len,
+                           JSEvalOptions *options);
+JS_EXTERN JSValue JS_EvalThis(JSContext *ctx, JSValueConst this_obj,
                               const char *input, size_t input_len,
                               const char *filename, int eval_flags);
+JS_EXTERN JSValue JS_EvalThis2(JSContext *ctx, JSValueConst this_obj,
+                              const char *input, size_t input_len,
+                              JSEvalOptions *options);
 JS_EXTERN JSValue JS_GetGlobalObject(JSContext *ctx);
-JS_EXTERN int JS_IsInstanceOf(JSContext *ctx, JSValue val, JSValue obj);
-JS_EXTERN int JS_DefineProperty(JSContext *ctx, JSValue this_obj,
-                                JSAtom prop, JSValue val,
-                                JSValue getter, JSValue setter, int flags);
-JS_EXTERN int JS_DefinePropertyValue(JSContext *ctx, JSValue this_obj,
+JS_EXTERN int JS_IsInstanceOf(JSContext *ctx, JSValueConst val, JSValueConst obj);
+JS_EXTERN int JS_DefineProperty(JSContext *ctx, JSValueConst this_obj,
+                                JSAtom prop, JSValueConst val,
+                                JSValueConst getter, JSValueConst setter,
+                                int flags);
+JS_EXTERN int JS_DefinePropertyValue(JSContext *ctx, JSValueConst this_obj,
                                      JSAtom prop, JSValue val, int flags);
-JS_EXTERN int JS_DefinePropertyValueUint32(JSContext *ctx, JSValue this_obj,
+JS_EXTERN int JS_DefinePropertyValueUint32(JSContext *ctx, JSValueConst this_obj,
                                            uint32_t idx, JSValue val, int flags);
-JS_EXTERN int JS_DefinePropertyValueStr(JSContext *ctx, JSValue this_obj,
+JS_EXTERN int JS_DefinePropertyValueStr(JSContext *ctx, JSValueConst this_obj,
                                         const char *prop, JSValue val, int flags);
-JS_EXTERN int JS_DefinePropertyGetSet(JSContext *ctx, JSValue this_obj,
+JS_EXTERN int JS_DefinePropertyGetSet(JSContext *ctx, JSValueConst this_obj,
                                       JSAtom prop, JSValue getter, JSValue setter,
                                       int flags);
 /* Only supported for custom classes, returns 0 on success < 0 otherwise. */
-JS_EXTERN int JS_SetOpaque(JSValue obj, void *opaque);
-JS_EXTERN void *JS_GetOpaque(JSValue obj, JSClassID class_id);
-JS_EXTERN void *JS_GetOpaque2(JSContext *ctx, JSValue obj, JSClassID class_id);
-JS_EXTERN void *JS_GetAnyOpaque(JSValue obj, JSClassID *class_id);
+JS_EXTERN int JS_SetOpaque(JSValueConst obj, void *opaque);
+JS_EXTERN void *JS_GetOpaque(JSValueConst obj, JSClassID class_id);
+JS_EXTERN void *JS_GetOpaque2(JSContext *ctx, JSValueConst obj, JSClassID class_id);
+JS_EXTERN void *JS_GetAnyOpaque(JSValueConst obj, JSClassID *class_id);
 
 /* 'buf' must be zero terminated i.e. buf[buf_len] = '\0'. */
 JS_EXTERN JSValue JS_ParseJSON(JSContext *ctx, const char *buf, size_t buf_len,
                                const char *filename);
-JS_EXTERN JSValue JS_JSONStringify(JSContext *ctx, JSValue obj,
-                                   JSValue replacer, JSValue space0);
+JS_EXTERN JSValue JS_JSONStringify(JSContext *ctx, JSValueConst obj,
+                                   JSValueConst replacer, JSValueConst space0);
 
 typedef void JSFreeArrayBufferDataFunc(JSRuntime *rt, void *opaque, void *ptr);
 JS_EXTERN JSValue JS_NewArrayBuffer(JSContext *ctx, uint8_t *buf, size_t len,
                                     JSFreeArrayBufferDataFunc *free_func, void *opaque,
-                                    JS_BOOL is_shared);
+                                    bool is_shared);
 JS_EXTERN JSValue JS_NewArrayBufferCopy(JSContext *ctx, const uint8_t *buf, size_t len);
-JS_EXTERN void JS_DetachArrayBuffer(JSContext *ctx, JSValue obj);
-JS_EXTERN uint8_t *JS_GetArrayBuffer(JSContext *ctx, size_t *psize, JSValue obj);
-JS_EXTERN JS_BOOL JS_IsArrayBuffer(JSValue obj);
-JS_EXTERN uint8_t *JS_GetUint8Array(JSContext *ctx, size_t *psize, JSValue obj);
+JS_EXTERN void JS_DetachArrayBuffer(JSContext *ctx, JSValueConst obj);
+JS_EXTERN uint8_t *JS_GetArrayBuffer(JSContext *ctx, size_t *psize, JSValueConst obj);
+JS_EXTERN bool JS_IsArrayBuffer(JSValueConst obj);
+JS_EXTERN uint8_t *JS_GetUint8Array(JSContext *ctx, size_t *psize, JSValueConst obj);
 
 typedef enum JSTypedArrayEnum {
     JS_TYPED_ARRAY_UINT8C = 0,
@@ -807,17 +951,17 @@ typedef enum JSTypedArrayEnum {
     JS_TYPED_ARRAY_FLOAT64,
 } JSTypedArrayEnum;
 
-JS_EXTERN JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValue *argv,
-                         JSTypedArrayEnum array_type);
-JS_EXTERN JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValue obj,
+JS_EXTERN JSValue JS_NewTypedArray(JSContext *ctx, int argc, JSValueConst *argv,
+                                   JSTypedArrayEnum array_type);
+JS_EXTERN JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValueConst obj,
                                          size_t *pbyte_offset,
                                          size_t *pbyte_length,
                                          size_t *pbytes_per_element);
 JS_EXTERN JSValue JS_NewUint8Array(JSContext *ctx, uint8_t *buf, size_t len,
                                    JSFreeArrayBufferDataFunc *free_func, void *opaque,
-                                   JS_BOOL is_shared);
+                                   bool is_shared);
 /* returns -1 if not a typed array otherwise return a JSTypedArrayEnum value */
-JS_EXTERN int JS_GetTypedArrayType(JSValue obj);
+JS_EXTERN int JS_GetTypedArrayType(JSValueConst obj);
 JS_EXTERN JSValue JS_NewUint8ArrayCopy(JSContext *ctx, const uint8_t *buf, size_t len);
 typedef struct {
     void *(*sab_alloc)(void *opaque, size_t size);
@@ -834,24 +978,26 @@ typedef enum JSPromiseStateEnum {
 } JSPromiseStateEnum;
 
 JS_EXTERN JSValue JS_NewPromiseCapability(JSContext *ctx, JSValue *resolving_funcs);
-JS_EXTERN JSPromiseStateEnum JS_PromiseState(JSContext *ctx, JSValue promise);
-JS_EXTERN JSValue JS_PromiseResult(JSContext *ctx, JSValue promise);
+JS_EXTERN JSPromiseStateEnum JS_PromiseState(JSContext *ctx,
+                                             JSValueConst promise);
+JS_EXTERN JSValue JS_PromiseResult(JSContext *ctx, JSValueConst promise);
+JS_EXTERN bool JS_IsPromise(JSValueConst val);
 
-JS_EXTERN JSValue JS_NewSymbol(JSContext *ctx, const char *description, JS_BOOL is_global);
+JS_EXTERN JSValue JS_NewSymbol(JSContext *ctx, const char *description, bool is_global);
 
-/* is_handled = TRUE means that the rejection is handled */
-typedef void JSHostPromiseRejectionTracker(JSContext *ctx, JSValue promise,
-                                           JSValue reason,
-                                           JS_BOOL is_handled, void *opaque);
+/* is_handled = true means that the rejection is handled */
+typedef void JSHostPromiseRejectionTracker(JSContext *ctx, JSValueConst promise,
+                                           JSValueConst reason,
+                                           bool is_handled, void *opaque);
 JS_EXTERN void JS_SetHostPromiseRejectionTracker(JSRuntime *rt, JSHostPromiseRejectionTracker *cb, void *opaque);
 
 /* return != 0 if the JS code needs to be interrupted */
 typedef int JSInterruptHandler(JSRuntime *rt, void *opaque);
 JS_EXTERN void JS_SetInterruptHandler(JSRuntime *rt, JSInterruptHandler *cb, void *opaque);
-/* if can_block is TRUE, Atomics.wait() can be used */
-JS_EXTERN void JS_SetCanBlock(JSRuntime *rt, JS_BOOL can_block);
+/* if can_block is true, Atomics.wait() can be used */
+JS_EXTERN void JS_SetCanBlock(JSRuntime *rt, bool can_block);
 /* set the [IsHTMLDDA] internal slot */
-JS_EXTERN void JS_SetIsHTMLDDA(JSContext *ctx, JSValue obj);
+JS_EXTERN void JS_SetIsHTMLDDA(JSContext *ctx, JSValueConst obj);
 
 typedef struct JSModuleDef JSModuleDef;
 
@@ -875,10 +1021,11 @@ JS_EXTERN JSValue JS_GetModuleNamespace(JSContext *ctx, JSModuleDef *m);
 
 /* JS Job support */
 
-typedef JSValue JSJobFunc(JSContext *ctx, int argc, JSValue *argv);
-JS_EXTERN int JS_EnqueueJob(JSContext *ctx, JSJobFunc *job_func, int argc, JSValue *argv);
+typedef JSValue JSJobFunc(JSContext *ctx, int argc, JSValueConst *argv);
+JS_EXTERN int JS_EnqueueJob(JSContext *ctx, JSJobFunc *job_func,
+                            int argc, JSValueConst *argv);
 
-JS_EXTERN JS_BOOL JS_IsJobPending(JSRuntime *rt);
+JS_EXTERN bool JS_IsJobPending(JSRuntime *rt);
 JS_EXTERN int JS_ExecutePendingJob(JSRuntime *rt, JSContext **pctx);
 
 /* Structure to retrieve (de)serialized SharedArrayBuffer objects. */
@@ -894,8 +1041,8 @@ typedef struct JSSABTab {
 #define JS_WRITE_OBJ_REFERENCE (1 << 3) /* allow object references to encode arbitrary object graph */
 #define JS_WRITE_OBJ_STRIP_SOURCE  (1 << 4) /* do not write source code information */
 #define JS_WRITE_OBJ_STRIP_DEBUG   (1 << 5) /* do not write debug information */
-JS_EXTERN uint8_t *JS_WriteObject(JSContext *ctx, size_t *psize, JSValue obj, int flags);
-JS_EXTERN uint8_t *JS_WriteObject2(JSContext *ctx, size_t *psize, JSValue obj,
+JS_EXTERN uint8_t *JS_WriteObject(JSContext *ctx, size_t *psize, JSValueConst obj, int flags);
+JS_EXTERN uint8_t *JS_WriteObject2(JSContext *ctx, size_t *psize, JSValueConst obj,
                                    int flags, JSSABTab *psab_tab);
 
 #define JS_READ_OBJ_BYTECODE  (1 << 0) /* allow function/module */
@@ -910,13 +1057,13 @@ JS_EXTERN JSValue JS_ReadObject2(JSContext *ctx, const uint8_t *buf, size_t buf_
 JS_EXTERN JSValue JS_EvalFunction(JSContext *ctx, JSValue fun_obj);
 /* load the dependencies of the module 'obj'. Useful when JS_ReadObject()
    returns a module. */
-JS_EXTERN int JS_ResolveModule(JSContext *ctx, JSValue obj);
+JS_EXTERN int JS_ResolveModule(JSContext *ctx, JSValueConst obj);
 
 /* only exported for os.Worker() */
 JS_EXTERN JSAtom JS_GetScriptOrModuleName(JSContext *ctx, int n_stack_levels);
 /* only exported for os.Worker() */
 JS_EXTERN JSValue JS_LoadModule(JSContext *ctx, const char *basename,
-                      const char *filename);
+                                const char *filename);
 
 /* C function definition */
 typedef enum JSCFunctionEnum {  /* XXX: should rename for namespace isolation */
@@ -937,18 +1084,18 @@ typedef enum JSCFunctionEnum {  /* XXX: should rename for namespace isolation */
 
 typedef union JSCFunctionType {
     JSCFunction *generic;
-    JSValue (*generic_magic)(JSContext *ctx, JSValue this_val, int argc, JSValue *argv, int magic);
+    JSValue (*generic_magic)(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv, int magic);
     JSCFunction *constructor;
-    JSValue (*constructor_magic)(JSContext *ctx, JSValue new_target, int argc, JSValue *argv, int magic);
+    JSValue (*constructor_magic)(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv, int magic);
     JSCFunction *constructor_or_func;
     double (*f_f)(double);
     double (*f_f_f)(double, double);
-    JSValue (*getter)(JSContext *ctx, JSValue this_val);
-    JSValue (*setter)(JSContext *ctx, JSValue this_val, JSValue val);
-    JSValue (*getter_magic)(JSContext *ctx, JSValue this_val, int magic);
-    JSValue (*setter_magic)(JSContext *ctx, JSValue this_val, JSValue val, int magic);
-    JSValue (*iterator_next)(JSContext *ctx, JSValue this_val,
-                             int argc, JSValue *argv, int *pdone, int magic);
+    JSValue (*getter)(JSContext *ctx, JSValueConst this_val);
+    JSValue (*setter)(JSContext *ctx, JSValueConst this_val, JSValueConst val);
+    JSValue (*getter_magic)(JSContext *ctx, JSValueConst this_val, int magic);
+    JSValue (*setter_magic)(JSContext *ctx, JSValueConst this_val, JSValueConst val, int magic);
+    JSValue (*iterator_next)(JSContext *ctx, JSValueConst this_val,
+                             int argc, JSValueConst *argv, int *pdone, int magic);
 } JSCFunctionType;
 
 JS_EXTERN JSValue JS_NewCFunction2(JSContext *ctx, JSCFunction *func,
@@ -960,25 +1107,25 @@ JS_EXTERN JSValue JS_NewCFunction3(JSContext *ctx, JSCFunction *func,
                                    JSValue proto_val);
 JS_EXTERN JSValue JS_NewCFunctionData(JSContext *ctx, JSCFunctionData *func,
                                       int length, int magic, int data_len,
-                                      JSValue *data);
+                                      JSValueConst *data);
 
-static inline JSValue JS_NewCFunction(JSContext *ctx, JSCFunction *func, const char *name,
-                                      int length)
+static inline JSValue JS_NewCFunction(JSContext *ctx, JSCFunction *func,
+                                      const char *name, int length)
 {
     return JS_NewCFunction2(ctx, func, name, length, JS_CFUNC_generic, 0);
 }
 
 static inline JSValue JS_NewCFunctionMagic(JSContext *ctx, JSCFunctionMagic *func,
-                                           const char *name,
-                                           int length, JSCFunctionEnum cproto, int magic)
+                                           const char *name, int length,
+                                           JSCFunctionEnum cproto, int magic)
 {
     /* Used to squelch a -Wcast-function-type warning. */
     JSCFunctionType ft;
     ft.generic_magic = func;
     return JS_NewCFunction2(ctx, ft.generic, name, length, cproto, magic);
 }
-JS_EXTERN void JS_SetConstructor(JSContext *ctx, JSValue func_obj,
-                                 JSValue proto);
+JS_EXTERN void JS_SetConstructor(JSContext *ctx, JSValueConst func_obj,
+                                 JSValueConst proto);
 
 /* C property definition */
 
@@ -1066,7 +1213,7 @@ JS_EXTERN int JS_SetModuleExportList(JSContext *ctx, JSModuleDef *m,
 /* Version */
 
 #define QJS_VERSION_MAJOR 0
-#define QJS_VERSION_MINOR 8
+#define QJS_VERSION_MINOR 9
 #define QJS_VERSION_PATCH 0
 #define QJS_VERSION_SUFFIX ""
 
@@ -1077,7 +1224,6 @@ JS_EXTERN uintptr_t js_std_cmd(int cmd, ...);
 
 #undef JS_EXTERN
 #undef js_force_inline
-#undef __js_printf_like
 
 #ifdef __cplusplus
 } /* extern "C" { */
diff --git a/lib/monoucha0/monoucha/quickjs.nim b/lib/monoucha0/monoucha/quickjs.nim
index 1ec0f2f0..f4d7fab2 100644
--- a/lib/monoucha0/monoucha/quickjs.nim
+++ b/lib/monoucha0/monoucha/quickjs.nim
@@ -245,7 +245,7 @@ type
     magic*: int16
     u* {.importc.}: JSCFunctionListEntryU
 
-  JS_BOOL* = distinct cint
+  JS_BOOL* {.importc: "bool".} = bool
 
   JSPropertyEnum* {.importc.} = object
     is_enumerable*: JS_BOOL
@@ -277,12 +277,6 @@ type
 
 func `==`*(a, b: JSAtom): bool {.borrow.}
 
-converter toBool*(js: JS_BOOL): bool {.inline.} =
-  cast[cint](js) != 0
-
-converter toJSBool*(b: bool): JS_BOOL {.inline.} =
-  cast[JS_BOOL](cint(b))
-
 converter toJSClassID*(e: JSClassEnum): JSClassID {.inline.} =
   JSClassID(e)
 
@@ -524,7 +518,7 @@ proc JS_Throw*(ctx: JSContext; obj: JSValue): JSValue
 proc JS_GetException*(ctx: JSContext): JSValue
 proc JS_IsError*(ctx: JSContext; v: JSValue): JS_BOOL
 proc JS_IsUncatchableError*(ctx: JSContext; val: JSValue): JS_BOOL
-proc JS_SetUncatchableError*(ctx: JSContext; val: JSValue; flag: JS_BOOL)
+proc JS_SetUncatchableError*(ctx: JSContext; val: JSValue)
 proc JS_ResetUncatchableError*(ctx: JSContext)
 proc JS_NewError*(ctx: JSContext): JSValue
 proc JS_ThrowPlainError*(ctx: JSContext; fmt: cstring): JSValue {.varargs,