Modernize some aspects of text codecs, eliminate WebKit use of strcasecmp
[WebKit-https.git] / Source / JavaScriptCore / runtime / IndexingType.cpp
1 /*
2  * Copyright (C) 2012 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 "IndexingType.h"
28
29 namespace JSC {
30
31 IndexingType leastUpperBoundOfIndexingTypes(IndexingType a, IndexingType b)
32 {
33     // It doesn't make sense to LUB something that is an array with something that isn't.
34     ASSERT((a & IsArray) == (b & IsArray));
35
36     // Boy, this sure is easy right now.
37     return std::max(a, b);
38 }
39
40 IndexingType leastUpperBoundOfIndexingTypeAndType(IndexingType indexingType, SpeculatedType type)
41 {
42     if (!type)
43         return indexingType;
44     switch (indexingType) {
45     case ALL_BLANK_INDEXING_TYPES:
46     case ALL_UNDECIDED_INDEXING_TYPES:
47     case ALL_INT32_INDEXING_TYPES:
48         if (isInt32Speculation(type))
49             return (indexingType & ~IndexingShapeMask) | Int32Shape;
50         if (isFullNumberSpeculation(type))
51             return (indexingType & ~IndexingShapeMask) | DoubleShape;
52         return (indexingType & ~IndexingShapeMask) | ContiguousShape;
53     case ALL_DOUBLE_INDEXING_TYPES:
54         if (isFullNumberSpeculation(type))
55             return indexingType;
56         return (indexingType & ~IndexingShapeMask) | ContiguousShape;
57     case ALL_CONTIGUOUS_INDEXING_TYPES:
58     case ALL_ARRAY_STORAGE_INDEXING_TYPES:
59         return indexingType;
60     default:
61         CRASH();
62         return 0;
63     }
64 }
65
66 IndexingType leastUpperBoundOfIndexingTypeAndValue(IndexingType indexingType, JSValue value)
67 {
68     return leastUpperBoundOfIndexingTypeAndType(indexingType, speculationFromValue(value));
69 }
70
71 void dumpIndexingType(PrintStream& out, IndexingType indexingType)
72 {
73     const char* basicName;
74     switch (indexingType & AllArrayTypes) {
75     case NonArray:
76         basicName = "NonArray";
77         break;
78     case NonArrayWithInt32:
79         basicName = "NonArrayWithInt32";
80         break;
81     case NonArrayWithDouble:
82         basicName = "NonArrayWithDouble";
83         break;
84     case NonArrayWithContiguous:
85         basicName = "NonArrayWithContiguous";
86         break;
87     case NonArrayWithArrayStorage:
88         basicName = "NonArrayWithArrayStorage";
89         break;
90     case NonArrayWithSlowPutArrayStorage:
91         basicName = "NonArrayWithSlowPutArrayStorage";
92         break;
93     case ArrayClass:
94         basicName = "ArrayClass";
95         break;
96     case ArrayWithUndecided:
97         basicName = "ArrayWithUndecided";
98         break;
99     case ArrayWithInt32:
100         basicName = "ArrayWithInt32";
101         break;
102     case ArrayWithDouble:
103         basicName = "ArrayWithDouble";
104         break;
105     case ArrayWithContiguous:
106         basicName = "ArrayWithContiguous";
107         break;
108     case ArrayWithArrayStorage:
109         basicName = "ArrayWithArrayStorage";
110         break;
111     case ArrayWithSlowPutArrayStorage:
112         basicName = "ArrayWithSlowPutArrayStorage";
113         break;
114     default:
115         basicName = "Unknown!";
116         break;
117     }
118     
119     out.printf("%s%s", basicName, (indexingType & MayHaveIndexedAccessors) ? "|MayHaveIndexedAccessors" : "");
120 }
121
122 } // namespace JSC
123