tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

SelfHostingDefines.h (5621B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 // Specialized .h file to be used by both JS and C++ code.
      8 
      9 #ifndef builtin_SelfHostingDefines_h
     10 #define builtin_SelfHostingDefines_h
     11 
     12 // Utility macros.
     13 #define TO_INT32(x) ((x) | 0)
     14 #define TO_UINT32(x) ((x) >>> 0)
     15 #define IS_UINT32(x) ((x) >>> 0 == = (x))
     16 #define MAX_UINT32 0xffffffff
     17 #define MAX_NUMERIC_INDEX 0x1fffffffffffff  // == Math.pow(2, 53) - 1
     18 
     19 // Unforgeable version of Function.prototype.apply.
     20 #define FUN_APPLY(FUN, RECEIVER, ARGS) \
     21  callFunction(std_Function_apply, FUN, RECEIVER, ARGS)
     22 
     23 // A "Record" is an internal type used in the ECMAScript spec to define a struct
     24 // made up of key / values. It is never exposed to user script, but we use a
     25 // simple Object (with null prototype) as a convenient implementation.
     26 #define NEW_RECORD() std_Object_create(null)
     27 
     28 /* Spec: ECMAScript Language Specification, 5.1 edition, 9.2 and 11.4.9 */
     29 #define TO_BOOLEAN(v) !!v
     30 
     31 /* Spec: ECMAScript Language Specification, 5.1 edition, 9.3 and 11.4.6 */
     32 #define TO_NUMBER(v) +v
     33 
     34 // NB: keep this in sync with the copy in vm/ArgumentsObject.h.
     35 #define MAX_ARGS_LENGTH (500 * 1000)
     36 
     37 // NB: keep this in sync with JS::MaxStringLength in js/public/String.h.
     38 #define MAX_STRING_LENGTH ((1 << 30) - 2)
     39 
     40 // Spread non-empty argument list of up to 15 elements.
     41 #define SPREAD(v, n) SPREAD_##n(v)
     42 #define SPREAD_1(v) v[0]
     43 #define SPREAD_2(v) SPREAD_1(v), v[1]
     44 #define SPREAD_3(v) SPREAD_2(v), v[2]
     45 #define SPREAD_4(v) SPREAD_3(v), v[3]
     46 #define SPREAD_5(v) SPREAD_4(v), v[4]
     47 #define SPREAD_6(v) SPREAD_5(v), v[5]
     48 #define SPREAD_7(v) SPREAD_6(v), v[6]
     49 #define SPREAD_8(v) SPREAD_7(v), v[7]
     50 #define SPREAD_9(v) SPREAD_8(v), v[8]
     51 #define SPREAD_10(v) SPREAD_9(v), v[9]
     52 #define SPREAD_11(v) SPREAD_10(v), v[10]
     53 #define SPREAD_12(v) SPREAD_11(v), v[11]
     54 #define SPREAD_13(v) SPREAD_12(v), v[12]
     55 #define SPREAD_14(v) SPREAD_13(v), v[13]
     56 #define SPREAD_15(v) SPREAD_14(v), v[14]
     57 
     58 // Property descriptor attributes.
     59 #define ATTR_ENUMERABLE 0x01
     60 #define ATTR_CONFIGURABLE 0x02
     61 #define ATTR_WRITABLE 0x04
     62 
     63 #define ATTR_NONENUMERABLE 0x08
     64 #define ATTR_NONCONFIGURABLE 0x10
     65 #define ATTR_NONWRITABLE 0x20
     66 
     67 // Property descriptor kind, must be different from the descriptor attributes.
     68 #define DATA_DESCRIPTOR_KIND 0x100
     69 #define ACCESSOR_DESCRIPTOR_KIND 0x200
     70 
     71 // Property descriptor array indices.
     72 #define PROP_DESC_ATTRS_AND_KIND_INDEX 0
     73 #define PROP_DESC_VALUE_INDEX 1
     74 #define PROP_DESC_GETTER_INDEX 1
     75 #define PROP_DESC_SETTER_INDEX 2
     76 
     77 // The extended slot of cloned self-hosted function, in which the self-hosted
     78 // name for self-hosted builtins is stored.
     79 #define LAZY_FUNCTION_NAME_SLOT 0
     80 
     81 // The iterated object for Array/String/Map/Set iterators.
     82 #define ITERATOR_SLOT_TARGET 0
     83 // Used for list, i.e. Array and String, iterators.
     84 #define ITERATOR_SLOT_NEXT_INDEX 1
     85 // Item kind for Array iterators.
     86 #define ARRAY_ITERATOR_SLOT_ITEM_KIND 2
     87 // Item kind for Map/Set iterators.
     88 #define MAP_SET_ITERATOR_SLOT_ITEM_KIND 1
     89 
     90 /* Spec: https://tc39.es/ecma262/#sec-createarrayiterator */
     91 #define RETURN_ARRAY_ITERATOR(obj, kind)                                 \
     92  var iteratedObject = ToObject(obj);                                    \
     93  var iterator = NewArrayIterator();                                     \
     94  UnsafeSetReservedSlot(iterator, ITERATOR_SLOT_TARGET, iteratedObject); \
     95  UnsafeSetReservedSlot(iterator, ITERATOR_SLOT_NEXT_INDEX, 0);          \
     96  UnsafeSetReservedSlot(iterator, ARRAY_ITERATOR_SLOT_ITEM_KIND, kind);  \
     97  return iterator
     98 
     99 #define ITEM_KIND_KEY 0
    100 #define ITEM_KIND_VALUE 1
    101 #define ITEM_KIND_KEY_AND_VALUE 2
    102 
    103 #define REGEXP_SOURCE_SLOT 1
    104 #define REGEXP_FLAGS_SLOT 2
    105 
    106 #define REGEXP_IGNORECASE_FLAG 0x01
    107 #define REGEXP_GLOBAL_FLAG 0x02
    108 #define REGEXP_MULTILINE_FLAG 0x04
    109 #define REGEXP_STICKY_FLAG 0x08
    110 #define REGEXP_UNICODE_FLAG 0x10
    111 #define REGEXP_DOTALL_FLAG 0x20
    112 #define REGEXP_HASINDICES_FLAG 0x40
    113 #define REGEXP_UNICODESETS_FLAG 0x80
    114 #define REGEXP_LEGACY_FEATURES_ENABLED_FLAG 0x100
    115 
    116 #define REGEXP_STRING_ITERATOR_REGEXP_SLOT 0
    117 #define REGEXP_STRING_ITERATOR_STRING_SLOT 1
    118 #define REGEXP_STRING_ITERATOR_SOURCE_SLOT 2
    119 #define REGEXP_STRING_ITERATOR_FLAGS_SLOT 3
    120 #define REGEXP_STRING_ITERATOR_LASTINDEX_SLOT 4
    121 
    122 #define REGEXP_STRING_ITERATOR_LASTINDEX_DONE -1
    123 #define REGEXP_STRING_ITERATOR_LASTINDEX_SLOW -2
    124 
    125 #define INTL_INTERNALS_OBJECT_SLOT 0
    126 #define INTL_SEGMENTS_STRING_SLOT 1
    127 #define INTL_SEGMENT_ITERATOR_STRING_SLOT 1
    128 #define INTL_SEGMENT_ITERATOR_INDEX_SLOT 3
    129 
    130 #define WRAP_FOR_VALID_ITERATOR_ITERATOR_SLOT 0
    131 #define WRAP_FOR_VALID_ITERATOR_NEXT_METHOD_SLOT 1
    132 
    133 #define ITERATOR_HELPER_GENERATOR_SLOT 0
    134 #define ITERATOR_HELPER_UNDERLYING_ITERATOR_SLOT 1
    135 
    136 #define ASYNC_ITERATOR_HELPER_GENERATOR_SLOT 0
    137 
    138 #define GENERATOR_RESUME_INDEX_SLOT 4
    139 #define GENERATOR_RESUME_INDEX_INITIAL_YIELD 0
    140 
    141 // Control values for Iterator.range
    142 #define ITERATOR_RANGE_SLOT_START 0
    143 #define ITERATOR_RANGE_SLOT_END 1
    144 #define ITERATOR_RANGE_SLOT_STEP 2
    145 #define ITERATOR_RANGE_SLOT_INCLUSIVE_END 3
    146 #define ITERATOR_RANGE_SLOT_ZERO 4
    147 #define ITERATOR_RANGE_SLOT_ONE 5
    148 #define ITERATOR_RANGE_SLOT_CURRENT_COUNT 6
    149 
    150 // For explicit resource management.
    151 #define USING_HINT_SYNC 0
    152 #define USING_HINT_ASYNC 1
    153 
    154 #define DISPOSABLE_STACK_DISPOSABLE_RESOURCE_STACK_SLOT 0
    155 #define DISPOSABLE_STACK_STATE_SLOT 1
    156 
    157 #define DISPOSABLE_STACK_STATE_PENDING 0
    158 #define DISPOSABLE_STACK_STATE_DISPOSED 1
    159 
    160 #endif