It should be easy to determine if a DFG node exits forward or backward when doing...
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGNodeFlags.cpp
1 /*
2  * Copyright (C) 2012, 2013 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 #include "DFGNodeFlags.h"
28
29 #if ENABLE(DFG_JIT)
30
31 #include <wtf/BoundsCheckedPointer.h>
32
33 namespace JSC { namespace DFG {
34
35 const char* nodeFlagsAsString(NodeFlags flags)
36 {
37     if (!(flags ^ NodeDoesNotExit))
38         return "<empty>";
39
40     static const int size = 128;
41     static char description[size];
42     BoundsCheckedPointer<char> ptr(description, size);
43     
44     bool hasPrinted = false;
45     
46     if (flags & NodeResultMask) {
47         switch (flags & NodeResultMask) {
48         case NodeResultJS:
49             ptr.strcat("JS");
50             break;
51         case NodeResultNumber:
52             ptr.strcat("Number");
53             break;
54         case NodeResultInt32:
55             ptr.strcat("Int32");
56             break;
57         case NodeResultBoolean:
58             ptr.strcat("Boolean");
59             break;
60         case NodeResultStorage:
61             ptr.strcat("Storage");
62             break;
63         default:
64             RELEASE_ASSERT_NOT_REACHED();
65             break;
66         }
67         hasPrinted = true;
68     }
69     
70     if (flags & NodeMustGenerate) {
71         if (hasPrinted)
72             ptr.strcat("|");
73         ptr.strcat("MustGen");
74         hasPrinted = true;
75     }
76     
77     if (flags & NodeHasVarArgs) {
78         if (hasPrinted)
79             ptr.strcat("|");
80         ptr.strcat("VarArgs");
81         hasPrinted = true;
82     }
83     
84     if (flags & NodeClobbersWorld) {
85         if (hasPrinted)
86             ptr.strcat("|");
87         ptr.strcat("Clobbers");
88         hasPrinted = true;
89     }
90     
91     if (flags & NodeMightClobber) {
92         if (hasPrinted)
93             ptr.strcat("|");
94         ptr.strcat("MightClobber");
95         hasPrinted = true;
96     }
97     
98     if (flags & NodeResultMask) {
99         if (!(flags & NodeUsedAsNumber) && !(flags & NodeNeedsNegZero)) {
100             if (hasPrinted)
101                 ptr.strcat("|");
102             ptr.strcat("PureInt");
103             hasPrinted = true;
104         } else if (!(flags & NodeUsedAsNumber)) {
105             if (hasPrinted)
106                 ptr.strcat("|");
107             ptr.strcat("PureInt(w/ neg zero)");
108             hasPrinted = true;
109         } else if (!(flags & NodeNeedsNegZero)) {
110             if (hasPrinted)
111                 ptr.strcat("|");
112             ptr.strcat("PureNum");
113             hasPrinted = true;
114         }
115         if (flags & NodeUsedAsOther) {
116             if (hasPrinted)
117                 ptr.strcat("|");
118             ptr.strcat("UseAsOther");
119             hasPrinted = true;
120         }
121     }
122     
123     if (flags & NodeMayOverflow) {
124         if (hasPrinted)
125             ptr.strcat("|");
126         ptr.strcat("MayOverflow");
127         hasPrinted = true;
128     }
129     
130     if (flags & NodeMayNegZero) {
131         if (hasPrinted)
132             ptr.strcat("|");
133         ptr.strcat("MayNegZero");
134         hasPrinted = true;
135     }
136     
137     if (flags & NodeUsedAsInt) {
138         if (hasPrinted)
139             ptr.strcat("|");
140         ptr.strcat("UseAsInt");
141         hasPrinted = true;
142     }
143     
144     if (!(flags & NodeDoesNotExit)) {
145         if (hasPrinted)
146             ptr.strcat("|");
147         ptr.strcat("CanExit");
148         hasPrinted = true;
149     }
150     
151     if (flags & NodeExitsForward) {
152         if (hasPrinted)
153             ptr.strcat("|");
154         ptr.strcat("NodeExitsForward");
155         hasPrinted = true;
156     }
157     
158     *ptr++ = 0;
159     
160     return description;
161 }
162
163
164 } } // namespace JSC::DFG
165
166 #endif // ENABLE(DFG_JIT)
167