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