OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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_CCTEST_COMPILER_CALL_TESTER_H_ | 5 #ifndef V8_CCTEST_COMPILER_CALL_TESTER_H_ |
6 #define V8_CCTEST_COMPILER_CALL_TESTER_H_ | 6 #define V8_CCTEST_COMPILER_CALL_TESTER_H_ |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/simulator.h" | 10 #include "src/simulator.h" |
11 | 11 |
| 12 #include "test/cctest/compiler/c-signature.h" |
| 13 |
12 #if V8_TARGET_ARCH_IA32 | 14 #if V8_TARGET_ARCH_IA32 |
13 #if __GNUC__ | 15 #if __GNUC__ |
14 #define V8_CDECL __attribute__((cdecl)) | 16 #define V8_CDECL __attribute__((cdecl)) |
15 #else | 17 #else |
16 #define V8_CDECL __cdecl | 18 #define V8_CDECL __cdecl |
17 #endif | 19 #endif |
18 #else | 20 #else |
19 #define V8_CDECL | 21 #define V8_CDECL |
20 #endif | 22 #endif |
21 | 23 |
22 namespace v8 { | 24 namespace v8 { |
23 namespace internal { | 25 namespace internal { |
24 namespace compiler { | 26 namespace compiler { |
25 | 27 |
26 // TODO(titzer): use c-signature.h instead of ReturnValueTraits | |
27 template <typename R> | 28 template <typename R> |
28 struct ReturnValueTraits { | 29 inline R CastReturnValue(uintptr_t r) { |
29 static R Cast(uintptr_t r) { return reinterpret_cast<R>(r); } | 30 return reinterpret_cast<R>(r); |
30 static MachineType Representation() { | 31 } |
31 // TODO(dcarney): detect when R is of a subclass of Object* instead of this | |
32 // type check. | |
33 while (false) { | |
34 *(static_cast<Object* volatile*>(0)) = static_cast<R>(0); | |
35 } | |
36 return kMachAnyTagged; | |
37 } | |
38 }; | |
39 | 32 |
40 template <> | 33 template <> |
41 struct ReturnValueTraits<int32_t*> { | 34 inline void CastReturnValue(uintptr_t r) {} |
42 static int32_t* Cast(uintptr_t r) { return reinterpret_cast<int32_t*>(r); } | |
43 static MachineType Representation() { return kMachPtr; } | |
44 }; | |
45 | 35 |
46 template <> | 36 template <> |
47 struct ReturnValueTraits<void> { | 37 inline bool CastReturnValue(uintptr_t r) { |
48 static void Cast(uintptr_t r) {} | 38 return static_cast<bool>(r); |
49 static MachineType Representation() { return kMachPtr; } | 39 } |
50 }; | |
51 | 40 |
52 template <> | 41 template <> |
53 struct ReturnValueTraits<bool> { | 42 inline int32_t CastReturnValue(uintptr_t r) { |
54 static bool Cast(uintptr_t r) { return static_cast<bool>(r); } | 43 return static_cast<int32_t>(r); |
55 static MachineType Representation() { return kRepBit; } | 44 } |
56 }; | |
57 | 45 |
58 template <> | 46 template <> |
59 struct ReturnValueTraits<int32_t> { | 47 inline uint32_t CastReturnValue(uintptr_t r) { |
60 static int32_t Cast(uintptr_t r) { return static_cast<int32_t>(r); } | 48 return static_cast<uint32_t>(r); |
61 static MachineType Representation() { return kMachInt32; } | 49 } |
62 }; | |
63 | 50 |
64 template <> | 51 template <> |
65 struct ReturnValueTraits<uint32_t> { | 52 inline int64_t CastReturnValue(uintptr_t r) { |
66 static uint32_t Cast(uintptr_t r) { return static_cast<uint32_t>(r); } | 53 return static_cast<int64_t>(r); |
67 static MachineType Representation() { return kMachUint32; } | 54 } |
68 }; | |
69 | 55 |
70 template <> | 56 template <> |
71 struct ReturnValueTraits<int64_t> { | 57 inline uint64_t CastReturnValue(uintptr_t r) { |
72 static int64_t Cast(uintptr_t r) { return static_cast<int64_t>(r); } | 58 return static_cast<uint64_t>(r); |
73 static MachineType Representation() { return kMachInt64; } | 59 } |
74 }; | |
75 | 60 |
76 template <> | 61 template <> |
77 struct ReturnValueTraits<uint64_t> { | 62 inline int16_t CastReturnValue(uintptr_t r) { |
78 static uint64_t Cast(uintptr_t r) { return static_cast<uint64_t>(r); } | 63 return static_cast<int16_t>(r); |
79 static MachineType Representation() { return kMachUint64; } | 64 } |
80 }; | |
81 | 65 |
82 template <> | 66 template <> |
83 struct ReturnValueTraits<int16_t> { | 67 inline uint16_t CastReturnValue(uintptr_t r) { |
84 static int16_t Cast(uintptr_t r) { return static_cast<int16_t>(r); } | 68 return static_cast<uint16_t>(r); |
85 static MachineType Representation() { return kMachInt16; } | 69 } |
86 }; | |
87 | 70 |
88 template <> | 71 template <> |
89 struct ReturnValueTraits<uint16_t> { | 72 inline int8_t CastReturnValue(uintptr_t r) { |
90 static uint16_t Cast(uintptr_t r) { return static_cast<uint16_t>(r); } | 73 return static_cast<int8_t>(r); |
91 static MachineType Representation() { return kMachUint16; } | 74 } |
92 }; | |
93 | 75 |
94 template <> | 76 template <> |
95 struct ReturnValueTraits<int8_t> { | 77 inline uint8_t CastReturnValue(uintptr_t r) { |
96 static int8_t Cast(uintptr_t r) { return static_cast<int8_t>(r); } | 78 return static_cast<uint8_t>(r); |
97 static MachineType Representation() { return kMachInt8; } | 79 } |
98 }; | |
99 | 80 |
100 template <> | 81 template <> |
101 struct ReturnValueTraits<uint8_t> { | 82 inline double CastReturnValue(uintptr_t r) { |
102 static uint8_t Cast(uintptr_t r) { return static_cast<uint8_t>(r); } | 83 UNREACHABLE(); |
103 static MachineType Representation() { return kMachUint8; } | 84 return 0.0; |
104 }; | 85 } |
105 | |
106 template <> | |
107 struct ReturnValueTraits<double> { | |
108 static double Cast(uintptr_t r) { | |
109 UNREACHABLE(); | |
110 return 0.0; | |
111 } | |
112 static MachineType Representation() { return kMachFloat64; } | |
113 }; | |
114 | |
115 | 86 |
116 template <typename R> | 87 template <typename R> |
117 struct ParameterTraits { | 88 struct ParameterTraits { |
118 static uintptr_t Cast(R r) { return static_cast<uintptr_t>(r); } | 89 static uintptr_t Cast(R r) { return static_cast<uintptr_t>(r); } |
119 }; | 90 }; |
120 | 91 |
121 template <> | 92 template <> |
122 struct ParameterTraits<int*> { | 93 struct ParameterTraits<int*> { |
123 static uintptr_t Cast(int* r) { return reinterpret_cast<uintptr_t>(r); } | 94 static uintptr_t Cast(int* r) { return reinterpret_cast<uintptr_t>(r); } |
124 }; | 95 }; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 private: | 177 private: |
207 #if USE_SIMULATOR && V8_TARGET_ARCH_ARM64 | 178 #if USE_SIMULATOR && V8_TARGET_ARCH_ARM64 |
208 uintptr_t CallSimulator(byte* f, Simulator::CallArgument* args) { | 179 uintptr_t CallSimulator(byte* f, Simulator::CallArgument* args) { |
209 Simulator* simulator = Simulator::current(isolate_); | 180 Simulator* simulator = Simulator::current(isolate_); |
210 return static_cast<uintptr_t>(simulator->CallInt64(f, args)); | 181 return static_cast<uintptr_t>(simulator->CallInt64(f, args)); |
211 } | 182 } |
212 | 183 |
213 template <typename F> | 184 template <typename F> |
214 R DoCall(F* f) { | 185 R DoCall(F* f) { |
215 Simulator::CallArgument args[] = {Simulator::CallArgument::End()}; | 186 Simulator::CallArgument args[] = {Simulator::CallArgument::End()}; |
216 return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f), args)); | 187 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args)); |
217 } | 188 } |
218 template <typename F, typename P1> | 189 template <typename F, typename P1> |
219 R DoCall(F* f, P1 p1) { | 190 R DoCall(F* f, P1 p1) { |
220 Simulator::CallArgument args[] = {Simulator::CallArgument(p1), | 191 Simulator::CallArgument args[] = {Simulator::CallArgument(p1), |
221 Simulator::CallArgument::End()}; | 192 Simulator::CallArgument::End()}; |
222 return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f), args)); | 193 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args)); |
223 } | 194 } |
224 template <typename F, typename P1, typename P2> | 195 template <typename F, typename P1, typename P2> |
225 R DoCall(F* f, P1 p1, P2 p2) { | 196 R DoCall(F* f, P1 p1, P2 p2) { |
226 Simulator::CallArgument args[] = {Simulator::CallArgument(p1), | 197 Simulator::CallArgument args[] = {Simulator::CallArgument(p1), |
227 Simulator::CallArgument(p2), | 198 Simulator::CallArgument(p2), |
228 Simulator::CallArgument::End()}; | 199 Simulator::CallArgument::End()}; |
229 return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f), args)); | 200 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args)); |
230 } | 201 } |
231 template <typename F, typename P1, typename P2, typename P3> | 202 template <typename F, typename P1, typename P2, typename P3> |
232 R DoCall(F* f, P1 p1, P2 p2, P3 p3) { | 203 R DoCall(F* f, P1 p1, P2 p2, P3 p3) { |
233 Simulator::CallArgument args[] = { | 204 Simulator::CallArgument args[] = { |
234 Simulator::CallArgument(p1), Simulator::CallArgument(p2), | 205 Simulator::CallArgument(p1), Simulator::CallArgument(p2), |
235 Simulator::CallArgument(p3), Simulator::CallArgument::End()}; | 206 Simulator::CallArgument(p3), Simulator::CallArgument::End()}; |
236 return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f), args)); | 207 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args)); |
237 } | 208 } |
238 template <typename F, typename P1, typename P2, typename P3, typename P4> | 209 template <typename F, typename P1, typename P2, typename P3, typename P4> |
239 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { | 210 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { |
240 Simulator::CallArgument args[] = { | 211 Simulator::CallArgument args[] = { |
241 Simulator::CallArgument(p1), Simulator::CallArgument(p2), | 212 Simulator::CallArgument(p1), Simulator::CallArgument(p2), |
242 Simulator::CallArgument(p3), Simulator::CallArgument(p4), | 213 Simulator::CallArgument(p3), Simulator::CallArgument(p4), |
243 Simulator::CallArgument::End()}; | 214 Simulator::CallArgument::End()}; |
244 return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f), args)); | 215 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), args)); |
245 } | 216 } |
246 #elif USE_SIMULATOR && (V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC64) | 217 #elif USE_SIMULATOR && (V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC64) |
247 uintptr_t CallSimulator(byte* f, int64_t p1 = 0, int64_t p2 = 0, | 218 uintptr_t CallSimulator(byte* f, int64_t p1 = 0, int64_t p2 = 0, |
248 int64_t p3 = 0, int64_t p4 = 0) { | 219 int64_t p3 = 0, int64_t p4 = 0) { |
249 Simulator* simulator = Simulator::current(isolate_); | 220 Simulator* simulator = Simulator::current(isolate_); |
250 return static_cast<uintptr_t>(simulator->Call(f, 4, p1, p2, p3, p4)); | 221 return static_cast<uintptr_t>(simulator->Call(f, 4, p1, p2, p3, p4)); |
251 } | 222 } |
252 | 223 |
253 | 224 |
254 template <typename F> | 225 template <typename F> |
255 R DoCall(F* f) { | 226 R DoCall(F* f) { |
256 return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f))); | 227 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f))); |
257 } | 228 } |
258 template <typename F, typename P1> | 229 template <typename F, typename P1> |
259 R DoCall(F* f, P1 p1) { | 230 R DoCall(F* f, P1 p1) { |
260 return ReturnValueTraits<R>::Cast( | 231 return CastReturnValue<R>( |
261 CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1))); | 232 CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1))); |
262 } | 233 } |
263 template <typename F, typename P1, typename P2> | 234 template <typename F, typename P1, typename P2> |
264 R DoCall(F* f, P1 p1, P2 p2) { | 235 R DoCall(F* f, P1 p1, P2 p2) { |
265 return ReturnValueTraits<R>::Cast( | 236 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), |
266 CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), | 237 ParameterTraits<P1>::Cast(p1), |
267 ParameterTraits<P2>::Cast(p2))); | 238 ParameterTraits<P2>::Cast(p2))); |
268 } | 239 } |
269 template <typename F, typename P1, typename P2, typename P3> | 240 template <typename F, typename P1, typename P2, typename P3> |
270 R DoCall(F* f, P1 p1, P2 p2, P3 p3) { | 241 R DoCall(F* f, P1 p1, P2 p2, P3 p3) { |
271 return ReturnValueTraits<R>::Cast(CallSimulator( | 242 return CastReturnValue<R>(CallSimulator( |
272 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), | 243 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
273 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3))); | 244 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3))); |
274 } | 245 } |
275 template <typename F, typename P1, typename P2, typename P3, typename P4> | 246 template <typename F, typename P1, typename P2, typename P3, typename P4> |
276 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { | 247 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { |
277 return ReturnValueTraits<R>::Cast(CallSimulator( | 248 return CastReturnValue<R>(CallSimulator( |
278 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), | 249 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
279 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3), | 250 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3), |
280 ParameterTraits<P4>::Cast(p4))); | 251 ParameterTraits<P4>::Cast(p4))); |
281 } | 252 } |
282 #elif USE_SIMULATOR && \ | 253 #elif USE_SIMULATOR && \ |
283 (V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_PPC) | 254 (V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_PPC) |
284 uintptr_t CallSimulator(byte* f, int32_t p1 = 0, int32_t p2 = 0, | 255 uintptr_t CallSimulator(byte* f, int32_t p1 = 0, int32_t p2 = 0, |
285 int32_t p3 = 0, int32_t p4 = 0) { | 256 int32_t p3 = 0, int32_t p4 = 0) { |
286 Simulator* simulator = Simulator::current(isolate_); | 257 Simulator* simulator = Simulator::current(isolate_); |
287 return static_cast<uintptr_t>(simulator->Call(f, 4, p1, p2, p3, p4)); | 258 return static_cast<uintptr_t>(simulator->Call(f, 4, p1, p2, p3, p4)); |
288 } | 259 } |
289 template <typename F> | 260 template <typename F> |
290 R DoCall(F* f) { | 261 R DoCall(F* f) { |
291 return ReturnValueTraits<R>::Cast(CallSimulator(FUNCTION_ADDR(f))); | 262 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f))); |
292 } | 263 } |
293 template <typename F, typename P1> | 264 template <typename F, typename P1> |
294 R DoCall(F* f, P1 p1) { | 265 R DoCall(F* f, P1 p1) { |
295 return ReturnValueTraits<R>::Cast( | 266 return CastReturnValue<R>( |
296 CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1))); | 267 CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1))); |
297 } | 268 } |
298 template <typename F, typename P1, typename P2> | 269 template <typename F, typename P1, typename P2> |
299 R DoCall(F* f, P1 p1, P2 p2) { | 270 R DoCall(F* f, P1 p1, P2 p2) { |
300 return ReturnValueTraits<R>::Cast( | 271 return CastReturnValue<R>(CallSimulator(FUNCTION_ADDR(f), |
301 CallSimulator(FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), | 272 ParameterTraits<P1>::Cast(p1), |
302 ParameterTraits<P2>::Cast(p2))); | 273 ParameterTraits<P2>::Cast(p2))); |
303 } | 274 } |
304 template <typename F, typename P1, typename P2, typename P3> | 275 template <typename F, typename P1, typename P2, typename P3> |
305 R DoCall(F* f, P1 p1, P2 p2, P3 p3) { | 276 R DoCall(F* f, P1 p1, P2 p2, P3 p3) { |
306 return ReturnValueTraits<R>::Cast(CallSimulator( | 277 return CastReturnValue<R>(CallSimulator( |
307 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), | 278 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
308 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3))); | 279 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3))); |
309 } | 280 } |
310 template <typename F, typename P1, typename P2, typename P3, typename P4> | 281 template <typename F, typename P1, typename P2, typename P3, typename P4> |
311 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { | 282 R DoCall(F* f, P1 p1, P2 p2, P3 p3, P4 p4) { |
312 return ReturnValueTraits<R>::Cast(CallSimulator( | 283 return CastReturnValue<R>(CallSimulator( |
313 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), | 284 FUNCTION_ADDR(f), ParameterTraits<P1>::Cast(p1), |
314 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3), | 285 ParameterTraits<P2>::Cast(p2), ParameterTraits<P3>::Cast(p3), |
315 ParameterTraits<P4>::Cast(p4))); | 286 ParameterTraits<P4>::Cast(p4))); |
316 } | 287 } |
317 #else | 288 #else |
318 template <typename F> | 289 template <typename F> |
319 R DoCall(F* f) { | 290 R DoCall(F* f) { |
320 return f(); | 291 return f(); |
321 } | 292 } |
322 template <typename F, typename P1> | 293 template <typename F, typename P1> |
(...skipping 26 matching lines...) Expand all Loading... |
349 template <typename P1, typename P2, typename P3> | 320 template <typename P1, typename P2, typename P3> |
350 void VerifyParameters3() {} | 321 void VerifyParameters3() {} |
351 | 322 |
352 template <typename P1, typename P2, typename P3, typename P4> | 323 template <typename P1, typename P2, typename P3, typename P4> |
353 void VerifyParameters4() {} | 324 void VerifyParameters4() {} |
354 #else | 325 #else |
355 void VerifyParameters0() { VerifyParameters(0, NULL); } | 326 void VerifyParameters0() { VerifyParameters(0, NULL); } |
356 | 327 |
357 template <typename P1> | 328 template <typename P1> |
358 void VerifyParameters1() { | 329 void VerifyParameters1() { |
359 MachineType parameters[] = {ReturnValueTraits<P1>::Representation()}; | 330 MachineType parameters[] = {MachineTypeForC<P1>()}; |
360 VerifyParameters(arraysize(parameters), parameters); | 331 VerifyParameters(arraysize(parameters), parameters); |
361 } | 332 } |
362 | 333 |
363 template <typename P1, typename P2> | 334 template <typename P1, typename P2> |
364 void VerifyParameters2() { | 335 void VerifyParameters2() { |
365 MachineType parameters[] = {ReturnValueTraits<P1>::Representation(), | 336 MachineType parameters[] = {MachineTypeForC<P1>(), MachineTypeForC<P2>()}; |
366 ReturnValueTraits<P2>::Representation()}; | |
367 VerifyParameters(arraysize(parameters), parameters); | 337 VerifyParameters(arraysize(parameters), parameters); |
368 } | 338 } |
369 | 339 |
370 template <typename P1, typename P2, typename P3> | 340 template <typename P1, typename P2, typename P3> |
371 void VerifyParameters3() { | 341 void VerifyParameters3() { |
372 MachineType parameters[] = {ReturnValueTraits<P1>::Representation(), | 342 MachineType parameters[] = {MachineTypeForC<P1>(), MachineTypeForC<P2>(), |
373 ReturnValueTraits<P2>::Representation(), | 343 MachineTypeForC<P3>()}; |
374 ReturnValueTraits<P3>::Representation()}; | |
375 VerifyParameters(arraysize(parameters), parameters); | 344 VerifyParameters(arraysize(parameters), parameters); |
376 } | 345 } |
377 | 346 |
378 template <typename P1, typename P2, typename P3, typename P4> | 347 template <typename P1, typename P2, typename P3, typename P4> |
379 void VerifyParameters4() { | 348 void VerifyParameters4() { |
380 MachineType parameters[] = {ReturnValueTraits<P1>::Representation(), | 349 MachineType parameters[] = {MachineTypeForC<P1>(), MachineTypeForC<P2>(), |
381 ReturnValueTraits<P2>::Representation(), | 350 MachineTypeForC<P3>(), MachineTypeForC<P4>()}; |
382 ReturnValueTraits<P3>::Representation(), | |
383 ReturnValueTraits<P4>::Representation()}; | |
384 VerifyParameters(arraysize(parameters), parameters); | 351 VerifyParameters(arraysize(parameters), parameters); |
385 } | 352 } |
386 #endif | 353 #endif |
387 | 354 |
388 Isolate* isolate_; | 355 Isolate* isolate_; |
389 }; | 356 }; |
390 | 357 |
391 } // namespace compiler | 358 } // namespace compiler |
392 } // namespace internal | 359 } // namespace internal |
393 } // namespace v8 | 360 } // namespace v8 |
394 | 361 |
395 #endif // V8_CCTEST_COMPILER_CALL_TESTER_H_ | 362 #endif // V8_CCTEST_COMPILER_CALL_TESTER_H_ |
OLD | NEW |