1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- 2 * vim: set ts=8 sts=4 et sw=4 tw=99: 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_NUMERIC_INDEX 0x1fffffffffffff // == Math.pow(2, 53) - 1 17 18 // Unforgeable version of Function.prototype.apply. 19 #define FUN_APPLY(FUN, RECEIVER, ARGS) \ 20 callFunction(std_Function_apply, FUN, RECEIVER, ARGS) 21 22 // NB: keep this in sync with the copy in vm/ArgumentsObject.h. 23 #define MAX_ARGS_LENGTH (500 * 1000) 24 25 // Spread non-empty argument list of up to 15 elements. 26 #define SPREAD(v, n) SPREAD_##n(v) 27 #define SPREAD_1(v) v[0] 28 #define SPREAD_2(v) SPREAD_1(v), v[1] 29 #define SPREAD_3(v) SPREAD_2(v), v[2] 30 #define SPREAD_4(v) SPREAD_3(v), v[3] 31 #define SPREAD_5(v) SPREAD_4(v), v[4] 32 #define SPREAD_6(v) SPREAD_5(v), v[5] 33 #define SPREAD_7(v) SPREAD_6(v), v[6] 34 #define SPREAD_8(v) SPREAD_7(v), v[7] 35 #define SPREAD_9(v) SPREAD_8(v), v[8] 36 #define SPREAD_10(v) SPREAD_9(v), v[9] 37 #define SPREAD_11(v) SPREAD_10(v), v[10] 38 #define SPREAD_12(v) SPREAD_11(v), v[11] 39 #define SPREAD_13(v) SPREAD_12(v), v[12] 40 #define SPREAD_14(v) SPREAD_13(v), v[13] 41 #define SPREAD_15(v) SPREAD_14(v), v[14] 42 43 // Property descriptor attributes. 44 #define ATTR_ENUMERABLE 0x01 45 #define ATTR_CONFIGURABLE 0x02 46 #define ATTR_WRITABLE 0x04 47 48 #define ATTR_NONENUMERABLE 0x08 49 #define ATTR_NONCONFIGURABLE 0x10 50 #define ATTR_NONWRITABLE 0x20 51 52 // The extended slot in which the self-hosted name for self-hosted builtins is 53 // stored. 54 #define LAZY_FUNCTION_NAME_SLOT 0 55 56 // The extended slot which contains a boolean value that indicates whether 57 // that the canonical name of the self-hosted builtins is set in self-hosted 58 // global. This slot is used only in debug build. 59 #define HAS_SELFHOSTED_CANONICAL_NAME_SLOT 0 60 61 // Stores the length for bound functions, so the .length property doesn't need 62 // to be resolved eagerly. 63 #define BOUND_FUN_LENGTH_SLOT 1 64 65 // Stores the private WeakMap slot used for WeakSets 66 #define WEAKSET_MAP_SLOT 0 67 68 #define ITERATOR_SLOT_TARGET 0 69 // Used for collection iterators. 70 #define ITERATOR_SLOT_RANGE 1 71 // Used for list, i.e. Array and String, iterators. 72 #define ITERATOR_SLOT_NEXT_INDEX 1 73 #define ITERATOR_SLOT_ITEM_KIND 2 74 // Used for ListIterator. 75 #define ITERATOR_SLOT_NEXT_METHOD 2 76 77 #define ITEM_KIND_KEY 0 78 #define ITEM_KIND_VALUE 1 79 #define ITEM_KIND_KEY_AND_VALUE 2 80 81 // NB: keep these in sync with the copy in jsfriendapi.h. 82 #define JSITER_OWNONLY 0x8 /* iterate over obj's own properties only */ 83 #define JSITER_HIDDEN 0x10 /* also enumerate non-enumerable properties */ 84 #define JSITER_SYMBOLS 0x20 /* also include symbol property keys */ 85 #define JSITER_SYMBOLSONLY 0x40 /* exclude string property keys */ 86 87 88 #define REGEXP_FLAGS_SLOT 2 89 90 #define REGEXP_IGNORECASE_FLAG 0x01 91 #define REGEXP_GLOBAL_FLAG 0x02 92 #define REGEXP_MULTILINE_FLAG 0x04 93 #define REGEXP_STICKY_FLAG 0x08 94 #define REGEXP_UNICODE_FLAG 0x10 95 96 #define MODULE_OBJECT_ENVIRONMENT_SLOT 2 97 98 #define MODULE_STATE_FAILED 0 99 #define MODULE_STATE_PARSED 1 100 #define MODULE_STATE_INSTANTIATED 2 101 #define MODULE_STATE_EVALUATED 3 102 103 #endif 104