ef47950a038546018fa8a9e276d1b63019bd2061
[vuplus_webkit] / Source / JavaScriptCore / bytecode / PredictedType.cpp
1 /*
2  * Copyright (C) 2011 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "config.h"
30 #include "PredictedType.h"
31
32 #include "ValueProfile.h"
33 #include <wtf/BoundsCheckedPointer.h>
34
35 namespace JSC {
36
37 #ifndef NDEBUG
38 const char* predictionToString(PredictedType value)
39 {
40     static const int size = 96;
41     static char description[size];
42     BoundsCheckedPointer<char> ptr(description, size);
43     
44     if (!(value & StrongPredictionTag))
45         ptr.strcat("Weak");
46     
47     if (value & PredictObjectUnknown) {
48         ASSERT(!(value & (PredictObjectMask & ~PredictObjectUnknown)));
49         ptr.strcat("Object");
50     }
51
52     if (value & PredictCellOther)
53         ptr.strcat("Othercell");
54     
55     if (value & PredictObjectOther)
56         ptr.strcat("Otherobj");
57     
58     if (value & PredictFinalObject)
59         ptr.strcat("Final");
60
61     if (value & PredictArray)
62         ptr.strcat("Array");
63     
64     if (value & PredictString)
65         ptr.strcat("String");
66     
67     if (value & PredictInt32)
68         ptr.strcat("Int");
69     
70     if (value & PredictDouble)
71         ptr.strcat("Double");
72     
73     if (value & PredictBoolean)
74         ptr.strcat("Bool");
75     
76     if (value & PredictOther)
77         ptr.strcat("Other");
78     
79     *ptr++ = 0;
80     
81     return description;
82 }
83 #endif
84
85 PredictedType predictionFromCell(JSCell* cell)
86 {
87     const ClassInfo* classInfo = cell->structure()->classInfo();
88     
89     if (classInfo == &JSFinalObject::s_info)
90         return PredictFinalObject;
91     
92     if (classInfo == &JSArray::s_info)
93         return PredictArray;
94     
95     if (classInfo == &JSString::s_info)
96         return PredictString;
97     
98     if (classInfo->isSubClassOf(&JSObject::s_info))
99         return PredictObjectOther;
100     
101     return PredictCellOther;
102 }
103
104 PredictedType predictionFromValue(JSValue value)
105 {
106     if (value.isInt32())
107         return PredictInt32;
108     if (value.isDouble())
109         return PredictDouble;
110     if (value.isCell())
111         return predictionFromCell(value.asCell());
112     if (value.isBoolean())
113         return PredictBoolean;
114     return PredictOther;
115 }
116
117 } // namespace JSC
118