DFG::AbstractValue::validateOSREntry is wrong when isHeapTop and the incoming value...
[WebKit-https.git] / Source / JavaScriptCore / dfg / testdfg.cpp
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.
36 static bool hiddenTruthBecauseNoReturnIsStupid() { return true; }
37
38 static void usage()
39 {
40     dataLog("Usage: testdfg [<filter>]\n");
41     if (hiddenTruthBecauseNoReturnIsStupid())
42         exit(1);
43 }
44
45 #if ENABLE(DFG_JIT)
46
47 using namespace JSC;
48 using namespace JSC::DFG;
49
50 namespace {
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
69 static 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
80 void 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
93 static void run(const char*)
94 {
95     dataLog("DFG JIT is not enabled.\n");
96 }
97
98 #endif // ENABLE(DFG_JIT)
99
100 int 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 }