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