1/*
2 * Copyright (C) 2019 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27
28#include "HeapCellInlines.h"
29#include "JSCJSValueInlines.h"
30// The above are needed before DFGAbstractValue.h
31#include "DFGAbstractValue.h"
32#include "InitializeThreading.h"
33#include <wtf/DataLog.h>
34
35// We don't have a NO_RETURN_DUE_TO_EXIT, nor should we. That's ridiculous.
36static bool hiddenTruthBecauseNoReturnIsStupid() { return true; }
37
38static void usage()
39{
40 dataLog("Usage: testdfg [<filter>]\n");
41 if (hiddenTruthBecauseNoReturnIsStupid())
42 exit(1);
43}
44
45#if ENABLE(DFG_JIT)
46
47using namespace JSC;
48using namespace JSC::DFG;
49
50namespace {
51
52// Nothing fancy for now; we just use the existing WTF assertion machinery.
53#define CHECK(x) do { \
54 if (!!(x)) \
55 break; \
56 WTFReportAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #x); \
57 CRASH(); \
58 } while (false)
59
60
61#define RUN_NOW(test) do { \
62 if (!shouldRun(#test)) \
63 break; \
64 dataLog(#test "...\n"); \
65 test; \
66 dataLog(#test ": OK!\n"); \
67 } while (false)
68
69static void testEmptyValueDoesNotValidateWithHeapTop()
70{
71 AbstractValue value;
72
73 value.makeHeapTop();
74 CHECK(!value.validateOSREntryValue(JSValue(), FlushedJSValue));
75
76 value.makeBytecodeTop();
77 CHECK(value.validateOSREntryValue(JSValue(), FlushedJSValue));
78}
79
80void run(const char* filter)
81{
82 auto shouldRun = [&] (const char* testName) -> bool {
83 return !filter || !!strcasestr(testName, filter);
84 };
85
86 RUN_NOW(testEmptyValueDoesNotValidateWithHeapTop());
87}
88
89} // anonymous namespace
90
91#else // ENABLE(DFG_JIT)
92
93static void run(const char*)
94{
95 dataLog("DFG JIT is not enabled.\n");
96}
97
98#endif // ENABLE(DFG_JIT)
99
100int main(int argc, char** argv)
101{
102 const char* filter = nullptr;
103 switch (argc) {
104 case 1:
105 break;
106 case 2:
107 filter = argv[1];
108 break;
109 default:
110 usage();
111 break;
112 }
113
114 JSC::initializeThreading();
115
116 run(filter);
117
118 return 0;
119}
120