| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_CODE_STUB_ASSEMBLER_H_ | 5 #ifndef V8_CODE_STUB_ASSEMBLER_H_ |
| 6 #define V8_CODE_STUB_ASSEMBLER_H_ | 6 #define V8_CODE_STUB_ASSEMBLER_H_ |
| 7 | 7 |
| 8 #include <functional> | 8 #include <functional> |
| 9 | 9 |
| 10 #include "src/compiler/code-assembler.h" | 10 #include "src/compiler/code-assembler.h" |
| 11 #include "src/globals.h" | 11 #include "src/globals.h" |
| 12 #include "src/objects.h" | 12 #include "src/objects.h" |
| 13 | 13 |
| 14 namespace v8 { | 14 namespace v8 { |
| 15 namespace internal { | 15 namespace internal { |
| 16 | 16 |
| 17 class CallInterfaceDescriptor; | 17 class CallInterfaceDescriptor; |
| 18 class CodeStubArguments; | 18 class CodeStubArguments; |
| 19 class StatsCounter; | 19 class StatsCounter; |
| 20 class StubCache; | 20 class StubCache; |
| 21 | 21 |
| 22 #if defined(DEBUG) || defined(ENABLE_SLOW_DCHECKS) |
| 23 #define CSA_ASSERT(csa, x) \ |
| 24 (csa)->Assert([&] { return (x); }, #x, __FILE__, __LINE__) |
| 25 #define CSA_ASSERT_JS_ARGC_OP(csa, Op, op, expected) \ |
| 26 (csa)->Assert( \ |
| 27 [&] { \ |
| 28 compiler::Node* const argc = \ |
| 29 (csa)->Parameter(Descriptor::kActualArgumentsCount); \ |
| 30 return (csa)->Op(argc, (csa)->Int32Constant(expected)); \ |
| 31 }, \ |
| 32 "argc " #op " " #expected, __FILE__, __LINE__) |
| 33 |
| 34 #define CSA_ASSERT_JS_ARGC_EQ(csa, expected) \ |
| 35 CSA_ASSERT_JS_ARGC_OP(csa, Word32Equal, ==, expected) |
| 36 |
| 37 #define BIND(label) Bind(label, {#label, __FILE__, __LINE__}) |
| 38 #define VARIABLE(name, ...) \ |
| 39 Variable name(this, {#name, __FILE__, __LINE__}, __VA_ARGS__); |
| 40 |
| 41 #else // DEBUG |
| 42 #define CSA_ASSERT(csa, x) ((void)0) |
| 43 #define CSA_ASSERT_JS_ARGC_EQ(csa, expected) ((void)0) |
| 44 #define BIND(label) Bind(label); |
| 45 #define VARIABLE(name, ...) Variable name(this, __VA_ARGS__); |
| 46 #endif // DEBUG |
| 47 |
| 48 #ifdef ENABLE_SLOW_DCHECKS |
| 49 #define CSA_SLOW_ASSERT(csa, x) \ |
| 50 if (FLAG_enable_slow_asserts) { \ |
| 51 (csa)->Assert([&] { return (x); }, #x, __FILE__, __LINE__); \ |
| 52 } |
| 53 #else |
| 54 #define CSA_SLOW_ASSERT(csa, x) ((void)0) |
| 55 #endif |
| 56 |
| 22 enum class PrimitiveType { kBoolean, kNumber, kString, kSymbol }; | 57 enum class PrimitiveType { kBoolean, kNumber, kString, kSymbol }; |
| 23 | 58 |
| 24 #define HEAP_CONSTANT_LIST(V) \ | 59 #define HEAP_CONSTANT_LIST(V) \ |
| 25 V(AccessorInfoMap, AccessorInfoMap) \ | 60 V(AccessorInfoMap, AccessorInfoMap) \ |
| 26 V(AccessorPairMap, AccessorPairMap) \ | 61 V(AccessorPairMap, AccessorPairMap) \ |
| 27 V(AllocationSiteMap, AllocationSiteMap) \ | 62 V(AllocationSiteMap, AllocationSiteMap) \ |
| 28 V(BooleanMap, BooleanMap) \ | 63 V(BooleanMap, BooleanMap) \ |
| 29 V(CodeMap, CodeMap) \ | 64 V(CodeMap, CodeMap) \ |
| 65 V(EmptyFixedArray, EmptyFixedArray) \ |
| 30 V(empty_string, EmptyString) \ | 66 V(empty_string, EmptyString) \ |
| 31 V(length_string, LengthString) \ | |
| 32 V(prototype_string, PrototypeString) \ | |
| 33 V(EmptyFixedArray, EmptyFixedArray) \ | |
| 34 V(FalseValue, False) \ | 67 V(FalseValue, False) \ |
| 35 V(FixedArrayMap, FixedArrayMap) \ | 68 V(FixedArrayMap, FixedArrayMap) \ |
| 36 V(FixedCOWArrayMap, FixedCOWArrayMap) \ | 69 V(FixedCOWArrayMap, FixedCOWArrayMap) \ |
| 37 V(FixedDoubleArrayMap, FixedDoubleArrayMap) \ | 70 V(FixedDoubleArrayMap, FixedDoubleArrayMap) \ |
| 38 V(FunctionTemplateInfoMap, FunctionTemplateInfoMap) \ | 71 V(FunctionTemplateInfoMap, FunctionTemplateInfoMap) \ |
| 72 V(GlobalPropertyCellMap, PropertyCellMap) \ |
| 39 V(has_instance_symbol, HasInstanceSymbol) \ | 73 V(has_instance_symbol, HasInstanceSymbol) \ |
| 40 V(HeapNumberMap, HeapNumberMap) \ | 74 V(HeapNumberMap, HeapNumberMap) \ |
| 41 V(NoClosuresCellMap, NoClosuresCellMap) \ | 75 V(length_string, LengthString) \ |
| 42 V(OneClosureCellMap, OneClosureCellMap) \ | |
| 43 V(ManyClosuresCellMap, ManyClosuresCellMap) \ | 76 V(ManyClosuresCellMap, ManyClosuresCellMap) \ |
| 77 V(MetaMap, MetaMap) \ |
| 44 V(MinusZeroValue, MinusZero) \ | 78 V(MinusZeroValue, MinusZero) \ |
| 45 V(NanValue, Nan) \ | 79 V(NanValue, Nan) \ |
| 80 V(NoClosuresCellMap, NoClosuresCellMap) \ |
| 46 V(NullValue, Null) \ | 81 V(NullValue, Null) \ |
| 47 V(GlobalPropertyCellMap, PropertyCellMap) \ | 82 V(OneClosureCellMap, OneClosureCellMap) \ |
| 83 V(prototype_string, PrototypeString) \ |
| 48 V(SymbolMap, SymbolMap) \ | 84 V(SymbolMap, SymbolMap) \ |
| 49 V(TheHoleValue, TheHole) \ | 85 V(TheHoleValue, TheHole) \ |
| 50 V(TrueValue, True) \ | 86 V(TrueValue, True) \ |
| 51 V(Tuple2Map, Tuple2Map) \ | 87 V(Tuple2Map, Tuple2Map) \ |
| 52 V(Tuple3Map, Tuple3Map) \ | 88 V(Tuple3Map, Tuple3Map) \ |
| 53 V(UndefinedValue, Undefined) \ | 89 V(UndefinedValue, Undefined) \ |
| 54 V(WeakCellMap, WeakCellMap) | 90 V(WeakCellMap, WeakCellMap) |
| 55 | 91 |
| 56 // Provides JavaScript-specific "macro-assembler" functionality on top of the | 92 // Provides JavaScript-specific "macro-assembler" functionality on top of the |
| 57 // CodeAssembler. By factoring the JavaScript-isms out of the CodeAssembler, | 93 // CodeAssembler. By factoring the JavaScript-isms out of the CodeAssembler, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 Node* ParameterToTagged(Node* value, ParameterMode mode) { | 143 Node* ParameterToTagged(Node* value, ParameterMode mode) { |
| 108 if (mode != SMI_PARAMETERS) value = SmiTag(value); | 144 if (mode != SMI_PARAMETERS) value = SmiTag(value); |
| 109 return value; | 145 return value; |
| 110 } | 146 } |
| 111 | 147 |
| 112 Node* TaggedToParameter(Node* value, ParameterMode mode) { | 148 Node* TaggedToParameter(Node* value, ParameterMode mode) { |
| 113 if (mode != SMI_PARAMETERS) value = SmiUntag(value); | 149 if (mode != SMI_PARAMETERS) value = SmiUntag(value); |
| 114 return value; | 150 return value; |
| 115 } | 151 } |
| 116 | 152 |
| 153 Node* MatchesParameterMode(Node* value, ParameterMode mode); |
| 154 |
| 117 #define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName) \ | 155 #define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName) \ |
| 118 Node* OpName(Node* a, Node* b, ParameterMode mode) { \ | 156 Node* OpName(Node* a, Node* b, ParameterMode mode) { \ |
| 119 if (mode == SMI_PARAMETERS) { \ | 157 if (mode == SMI_PARAMETERS) { \ |
| 120 return SmiOpName(a, b); \ | 158 return SmiOpName(a, b); \ |
| 121 } else { \ | 159 } else { \ |
| 122 DCHECK_EQ(INTPTR_PARAMETERS, mode); \ | 160 DCHECK_EQ(INTPTR_PARAMETERS, mode); \ |
| 123 return IntPtrOpName(a, b); \ | 161 return IntPtrOpName(a, b); \ |
| 124 } \ | 162 } \ |
| 125 } | 163 } |
| 126 PARAMETER_BINOP(IntPtrOrSmiMin, IntPtrMin, SmiMin) | 164 PARAMETER_BINOP(IntPtrOrSmiMin, IntPtrMin, SmiMin) |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 // Smi conversions. | 213 // Smi conversions. |
| 176 Node* SmiToFloat64(Node* value); | 214 Node* SmiToFloat64(Node* value); |
| 177 Node* SmiFromWord(Node* value) { return SmiTag(value); } | 215 Node* SmiFromWord(Node* value) { return SmiTag(value); } |
| 178 Node* SmiFromWord32(Node* value); | 216 Node* SmiFromWord32(Node* value); |
| 179 Node* SmiToWord(Node* value) { return SmiUntag(value); } | 217 Node* SmiToWord(Node* value) { return SmiUntag(value); } |
| 180 Node* SmiToWord32(Node* value); | 218 Node* SmiToWord32(Node* value); |
| 181 | 219 |
| 182 // Smi operations. | 220 // Smi operations. |
| 183 #define SMI_ARITHMETIC_BINOP(SmiOpName, IntPtrOpName) \ | 221 #define SMI_ARITHMETIC_BINOP(SmiOpName, IntPtrOpName) \ |
| 184 Node* SmiOpName(Node* a, Node* b) { \ | 222 Node* SmiOpName(Node* a, Node* b) { \ |
| 223 CSA_SLOW_ASSERT(this, TaggedIsSmi(a)); \ |
| 224 CSA_SLOW_ASSERT(this, TaggedIsSmi(b)); \ |
| 185 return BitcastWordToTaggedSigned( \ | 225 return BitcastWordToTaggedSigned( \ |
| 186 IntPtrOpName(BitcastTaggedToWord(a), BitcastTaggedToWord(b))); \ | 226 IntPtrOpName(BitcastTaggedToWord(a), BitcastTaggedToWord(b))); \ |
| 187 } | 227 } |
| 188 SMI_ARITHMETIC_BINOP(SmiAdd, IntPtrAdd) | 228 SMI_ARITHMETIC_BINOP(SmiAdd, IntPtrAdd) |
| 189 SMI_ARITHMETIC_BINOP(SmiSub, IntPtrSub) | 229 SMI_ARITHMETIC_BINOP(SmiSub, IntPtrSub) |
| 190 SMI_ARITHMETIC_BINOP(SmiAnd, WordAnd) | 230 SMI_ARITHMETIC_BINOP(SmiAnd, WordAnd) |
| 191 SMI_ARITHMETIC_BINOP(SmiOr, WordOr) | 231 SMI_ARITHMETIC_BINOP(SmiOr, WordOr) |
| 192 #undef SMI_ARITHMETIC_BINOP | 232 #undef SMI_ARITHMETIC_BINOP |
| 193 | 233 |
| 194 Node* SmiShl(Node* a, int shift) { | 234 Node* SmiShl(Node* a, int shift) { |
| 235 CSA_SLOW_ASSERT(this, TaggedIsSmi(a)); |
| 195 return BitcastWordToTaggedSigned(WordShl(BitcastTaggedToWord(a), shift)); | 236 return BitcastWordToTaggedSigned(WordShl(BitcastTaggedToWord(a), shift)); |
| 196 } | 237 } |
| 197 | 238 |
| 198 Node* SmiShr(Node* a, int shift) { | 239 Node* SmiShr(Node* a, int shift) { |
| 240 CSA_SLOW_ASSERT(this, TaggedIsSmi(a)); |
| 199 return BitcastWordToTaggedSigned( | 241 return BitcastWordToTaggedSigned( |
| 200 WordAnd(WordShr(BitcastTaggedToWord(a), shift), | 242 WordAnd(WordShr(BitcastTaggedToWord(a), shift), |
| 201 BitcastTaggedToWord(SmiConstant(-1)))); | 243 BitcastTaggedToWord(SmiConstant(-1)))); |
| 202 } | 244 } |
| 203 | 245 |
| 204 Node* WordOrSmiShl(Node* a, int shift, ParameterMode mode) { | 246 Node* WordOrSmiShl(Node* a, int shift, ParameterMode mode) { |
| 205 if (mode == SMI_PARAMETERS) { | 247 if (mode == SMI_PARAMETERS) { |
| 206 return SmiShl(a, shift); | 248 return SmiShl(a, shift); |
| 207 } else { | 249 } else { |
| 208 DCHECK_EQ(INTPTR_PARAMETERS, mode); | 250 DCHECK_EQ(INTPTR_PARAMETERS, mode); |
| 209 return WordShl(a, shift); | 251 return WordShl(a, shift); |
| 210 } | 252 } |
| 211 } | 253 } |
| 212 | 254 |
| 213 Node* WordOrSmiShr(Node* a, int shift, ParameterMode mode) { | 255 Node* WordOrSmiShr(Node* a, int shift, ParameterMode mode) { |
| 214 if (mode == SMI_PARAMETERS) { | 256 if (mode == SMI_PARAMETERS) { |
| 215 return SmiShr(a, shift); | 257 return SmiShr(a, shift); |
| 216 } else { | 258 } else { |
| 217 DCHECK_EQ(INTPTR_PARAMETERS, mode); | 259 DCHECK_EQ(INTPTR_PARAMETERS, mode); |
| 218 return WordShr(a, shift); | 260 return WordShr(a, shift); |
| 219 } | 261 } |
| 220 } | 262 } |
| 221 | 263 |
| 222 #define SMI_COMPARISON_OP(SmiOpName, IntPtrOpName) \ | 264 #define SMI_COMPARISON_OP(SmiOpName, IntPtrOpName) \ |
| 223 Node* SmiOpName(Node* a, Node* b) { \ | 265 Node* SmiOpName(Node* a, Node* b) { \ |
| 266 CSA_SLOW_ASSERT(this, TaggedIsSmi(a)); \ |
| 267 CSA_SLOW_ASSERT(this, TaggedIsSmi(b)); \ |
| 224 return IntPtrOpName(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); \ | 268 return IntPtrOpName(BitcastTaggedToWord(a), BitcastTaggedToWord(b)); \ |
| 225 } | 269 } |
| 226 SMI_COMPARISON_OP(SmiEqual, WordEqual) | 270 SMI_COMPARISON_OP(SmiEqual, WordEqual) |
| 227 SMI_COMPARISON_OP(SmiNotEqual, WordNotEqual) | 271 SMI_COMPARISON_OP(SmiNotEqual, WordNotEqual) |
| 228 SMI_COMPARISON_OP(SmiAbove, UintPtrGreaterThan) | 272 SMI_COMPARISON_OP(SmiAbove, UintPtrGreaterThan) |
| 229 SMI_COMPARISON_OP(SmiAboveOrEqual, UintPtrGreaterThanOrEqual) | 273 SMI_COMPARISON_OP(SmiAboveOrEqual, UintPtrGreaterThanOrEqual) |
| 230 SMI_COMPARISON_OP(SmiBelow, UintPtrLessThan) | 274 SMI_COMPARISON_OP(SmiBelow, UintPtrLessThan) |
| 231 SMI_COMPARISON_OP(SmiLessThan, IntPtrLessThan) | 275 SMI_COMPARISON_OP(SmiLessThan, IntPtrLessThan) |
| 232 SMI_COMPARISON_OP(SmiLessThanOrEqual, IntPtrLessThanOrEqual) | 276 SMI_COMPARISON_OP(SmiLessThanOrEqual, IntPtrLessThanOrEqual) |
| 233 SMI_COMPARISON_OP(SmiGreaterThan, IntPtrGreaterThan) | 277 SMI_COMPARISON_OP(SmiGreaterThan, IntPtrGreaterThan) |
| (...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 Node* IsHeapNumber(Node* object); | 798 Node* IsHeapNumber(Node* object); |
| 755 Node* IsName(Node* object); | 799 Node* IsName(Node* object); |
| 756 Node* IsSymbol(Node* object); | 800 Node* IsSymbol(Node* object); |
| 757 Node* IsPrivateSymbol(Node* object); | 801 Node* IsPrivateSymbol(Node* object); |
| 758 Node* IsJSValueInstanceType(Node* instance_type); | 802 Node* IsJSValueInstanceType(Node* instance_type); |
| 759 Node* IsJSValue(Node* object); | 803 Node* IsJSValue(Node* object); |
| 760 Node* IsJSValueMap(Node* map); | 804 Node* IsJSValueMap(Node* map); |
| 761 Node* IsJSArrayInstanceType(Node* instance_type); | 805 Node* IsJSArrayInstanceType(Node* instance_type); |
| 762 Node* IsJSArray(Node* object); | 806 Node* IsJSArray(Node* object); |
| 763 Node* IsJSArrayMap(Node* object); | 807 Node* IsJSArrayMap(Node* object); |
| 808 Node* IsFixedArray(Node* object); |
| 809 Node* IsFixedArrayWithKind(Node* object, ElementsKind kind); |
| 764 Node* IsNativeContext(Node* object); | 810 Node* IsNativeContext(Node* object); |
| 765 Node* IsWeakCell(Node* object); | 811 Node* IsWeakCell(Node* object); |
| 766 Node* IsFixedDoubleArray(Node* object); | 812 Node* IsFixedDoubleArray(Node* object); |
| 767 Node* IsHashTable(Node* object); | 813 Node* IsHashTable(Node* object); |
| 768 Node* IsDictionary(Node* object); | 814 Node* IsDictionary(Node* object); |
| 769 Node* IsUnseededNumberDictionary(Node* object); | 815 Node* IsUnseededNumberDictionary(Node* object); |
| 770 Node* IsConstructorMap(Node* map); | 816 Node* IsConstructorMap(Node* map); |
| 771 Node* IsJSFunctionInstanceType(Node* instance_type); | 817 Node* IsJSFunctionInstanceType(Node* instance_type); |
| 772 Node* IsJSFunction(Node* object); | 818 Node* IsJSFunction(Node* object); |
| 773 Node* IsJSFunctionMap(Node* object); | 819 Node* IsJSFunctionMap(Node* object); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 796 // Return the single character string with only {code}. | 842 // Return the single character string with only {code}. |
| 797 Node* StringFromCharCode(Node* code); | 843 Node* StringFromCharCode(Node* code); |
| 798 // Return a new string object which holds a substring containing the range | 844 // Return a new string object which holds a substring containing the range |
| 799 // [from,to[ of string. |from| and |to| are expected to be tagged. | 845 // [from,to[ of string. |from| and |to| are expected to be tagged. |
| 800 Node* SubString(Node* context, Node* string, Node* from, Node* to); | 846 Node* SubString(Node* context, Node* string, Node* from, Node* to); |
| 801 | 847 |
| 802 // Return a new string object produced by concatenating |first| with |second|. | 848 // Return a new string object produced by concatenating |first| with |second|. |
| 803 Node* StringAdd(Node* context, Node* first, Node* second, | 849 Node* StringAdd(Node* context, Node* first, Node* second, |
| 804 AllocationFlags flags = kNone); | 850 AllocationFlags flags = kNone); |
| 805 | 851 |
| 806 // Unpack the external string, returning a pointer that (offset-wise) looks | |
| 807 // like a sequential string. | |
| 808 // Note that this pointer is not tagged and does not point to a real | |
| 809 // sequential string instance, and may only be used to access the string | |
| 810 // data. The pointer is GC-safe as long as a reference to the container | |
| 811 // ExternalString is live. | |
| 812 // |string| must be an external string. Bailout for short external strings. | |
| 813 Node* TryDerefExternalString(Node* const string, Node* const instance_type, | |
| 814 Label* if_bailout); | |
| 815 | |
| 816 // Check if |var_string| has an indirect (thin or flat cons) string type, | 852 // Check if |var_string| has an indirect (thin or flat cons) string type, |
| 817 // and unpack it if so. | 853 // and unpack it if so. |
| 818 void MaybeDerefIndirectString(Variable* var_string, Node* instance_type, | 854 void MaybeDerefIndirectString(Variable* var_string, Node* instance_type, |
| 819 Variable* var_did_something); | 855 Variable* var_did_something); |
| 820 // Check if |var_left| or |var_right| has an indirect (thin or flat cons) | 856 // Check if |var_left| or |var_right| has an indirect (thin or flat cons) |
| 821 // string type, and unpack it/them if so. Fall through if nothing was done. | 857 // string type, and unpack it/them if so. Fall through if nothing was done. |
| 822 void MaybeDerefIndirectStrings(Variable* var_left, Node* left_instance_type, | 858 void MaybeDerefIndirectStrings(Variable* var_left, Node* left_instance_type, |
| 823 Variable* var_right, Node* right_instance_type, | 859 Variable* var_right, Node* right_instance_type, |
| 824 Label* did_something); | 860 Label* did_something); |
| 825 | 861 |
| (...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1549 | 1585 |
| 1550 private: | 1586 private: |
| 1551 Node* TryToSequential(StringPointerKind ptr_kind, Label* if_bailout); | 1587 Node* TryToSequential(StringPointerKind ptr_kind, Label* if_bailout); |
| 1552 | 1588 |
| 1553 Variable var_string_; | 1589 Variable var_string_; |
| 1554 Variable var_instance_type_; | 1590 Variable var_instance_type_; |
| 1555 Variable var_offset_; | 1591 Variable var_offset_; |
| 1556 Variable var_is_external_; | 1592 Variable var_is_external_; |
| 1557 }; | 1593 }; |
| 1558 | 1594 |
| 1559 #ifdef DEBUG | |
| 1560 #define CSA_ASSERT(csa, x) \ | |
| 1561 (csa)->Assert([&] { return (x); }, #x, __FILE__, __LINE__) | |
| 1562 #define CSA_ASSERT_JS_ARGC_OP(csa, Op, op, expected) \ | |
| 1563 (csa)->Assert( \ | |
| 1564 [&] { \ | |
| 1565 compiler::Node* const argc = \ | |
| 1566 (csa)->Parameter(Descriptor::kActualArgumentsCount); \ | |
| 1567 return (csa)->Op(argc, (csa)->Int32Constant(expected)); \ | |
| 1568 }, \ | |
| 1569 "argc " #op " " #expected, __FILE__, __LINE__) | |
| 1570 | |
| 1571 #define CSA_ASSERT_JS_ARGC_EQ(csa, expected) \ | |
| 1572 CSA_ASSERT_JS_ARGC_OP(csa, Word32Equal, ==, expected) | |
| 1573 | |
| 1574 #define BIND(label) Bind(label, {#label, __FILE__, __LINE__}) | |
| 1575 #define VARIABLE(name, ...) \ | |
| 1576 Variable name(this, {#name, __FILE__, __LINE__}, __VA_ARGS__); | |
| 1577 | |
| 1578 #else // DEBUG | |
| 1579 #define CSA_ASSERT(csa, x) ((void)0) | |
| 1580 #define CSA_ASSERT_JS_ARGC_EQ(csa, expected) ((void)0) | |
| 1581 #define BIND(label) Bind(label); | |
| 1582 #define VARIABLE(name, ...) Variable name(this, __VA_ARGS__); | |
| 1583 #endif // DEBUG | |
| 1584 | |
| 1585 #ifdef ENABLE_SLOW_DCHECKS | |
| 1586 #define CSA_SLOW_ASSERT(csa, x) \ | |
| 1587 if (FLAG_enable_slow_asserts) { \ | |
| 1588 (csa)->Assert([&] { return (x); }, #x, __FILE__, __LINE__); \ | |
| 1589 } | |
| 1590 #else | |
| 1591 #define CSA_SLOW_ASSERT(csa, x) ((void)0) | |
| 1592 #endif | |
| 1593 | |
| 1594 DEFINE_OPERATORS_FOR_FLAGS(CodeStubAssembler::AllocationFlags); | 1595 DEFINE_OPERATORS_FOR_FLAGS(CodeStubAssembler::AllocationFlags); |
| 1595 | 1596 |
| 1596 } // namespace internal | 1597 } // namespace internal |
| 1597 } // namespace v8 | 1598 } // namespace v8 |
| 1598 #endif // V8_CODE_STUB_ASSEMBLER_H_ | 1599 #endif // V8_CODE_STUB_ASSEMBLER_H_ |
| OLD | NEW |