Web Inspector: Modify the type profiler runtime protocol to transfer some computation...
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Models / TypeSet.js
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  * Copyright (C) Saam Barati.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
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  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 WebInspector.TypeSet = function(runtimeTypeDescriptionPayload)
28 {
29     this._types = runtimeTypeDescriptionPayload;
30
31     var typeSet = this._types.typeSet;
32     var bitString = 0x0;
33     if (typeSet.isFunction)
34         bitString |= WebInspector.TypeSet.TypeBit.Function;
35     if (typeSet.isUndefined)
36         bitString |= WebInspector.TypeSet.TypeBit.Undefined;
37     if (typeSet.isNull)
38         bitString |= WebInspector.TypeSet.TypeBit.Null;
39     if (typeSet.isBoolean)
40         bitString |= WebInspector.TypeSet.TypeBit.Boolean;
41     if (typeSet.isInteger)
42         bitString |= WebInspector.TypeSet.TypeBit.Integer;
43     if (typeSet.isNumber)
44         bitString |= WebInspector.TypeSet.TypeBit.Number;
45     if (typeSet.isString)
46         bitString |= WebInspector.TypeSet.TypeBit.String;
47     if (typeSet.isObject)
48         bitString |= WebInspector.TypeSet.TypeBit.Object;
49
50     this._bitString = bitString;
51 };
52
53 WebInspector.TypeSet.fromPayload = function(payload)
54 {
55     return new WebInspector.TypeSet(payload);
56 };
57
58 WebInspector.TypeSet.TypeBit = {
59     "Function"    :  0x1,
60     "Undefined"   :  0x2,
61     "Null"        :  0x4,
62     "Boolean"     :  0x8,
63     "Integer"     :  0x10,
64     "Number"      :  0x20,
65     "String"      :  0x40,
66     "Object"      :  0x80
67 };
68
69 WebInspector.TypeSet.NullOrUndefinedTypeBits = WebInspector.TypeSet.TypeBit.Null | WebInspector.TypeSet.TypeBit.Undefined;
70
71 WebInspector.TypeSet.prototype = {
72     constructor: WebInspector.TypeSet,
73     __proto__: WebInspector.Object.prototype,
74
75     isContainedIn: function(test)
76     {
77         // This function checks if types in bitString are contained in the types described by the 'test' bitstring. (i.e we haven't seen more types than 'test').
78         // We have seen fewer or equal number of types as 'test' if ANDing bitString with test doesn't zero out any of our bits.
79
80         // For example:
81
82         // 0b0110 (bitString)
83         // 0b1111 (test)
84         // ------ (AND)
85         // 0b0110 == bitString
86
87         // 0b0110 (bitString)
88         // 0b0010 (test)
89         // ------ (AND)
90         // 0b0010 != bitString
91
92         return (this._bitString & test) === this._bitString;
93     }
94 };