43c6fa1186e008dd690cb9bf483dbe4f7877b4fa
[WebKit-https.git] / Source / JavaScriptCore / builtins / GlobalOperations.js
1 /*
2  * Copyright (C) 2016 Yusuke Suzuki <utatane.tea@gmail.com>.
3  * Copyright (C) 2017 Caio Lima <ticaiolima@gmail.com>.
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. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 // @internal
28
29 @globalPrivate
30 function toInteger(target)
31 {
32     "use strict";
33
34     var numberValue = +target;
35
36     // isNaN(numberValue)
37     if (numberValue !== numberValue)
38         return 0;
39     return @trunc(numberValue);
40 }
41
42 @globalPrivate
43 function toLength(target)
44 {
45     "use strict";
46
47     var length = @toInteger(target);
48     // originally Math.min(Math.max(length, 0), maxSafeInteger));
49     return +(length > 0 ? (length < @MAX_SAFE_INTEGER ? length : @MAX_SAFE_INTEGER) : 0);
50 }
51
52 @globalPrivate
53 function isDictionary(object)
54 {
55     "use strict";
56
57     return object == null || typeof object === "object";
58 }
59
60 @globalPrivate
61 @getter
62 @overriddenName="get [Symbol.species]"
63 function speciesGetter()
64 {
65     return this;
66 }
67
68 @globalPrivate
69 function speciesConstructor(obj, defaultConstructor)
70 {
71     var constructor = obj.constructor;
72     if (constructor === @undefined)
73         return defaultConstructor;
74     if (!@isObject(constructor))
75         @throwTypeError("|this|.constructor is not an Object or undefined");
76     constructor = constructor.@speciesSymbol;
77     if (constructor == null)
78         return defaultConstructor;
79     if (@isConstructor(constructor))
80         return constructor;
81     @throwTypeError("|this|.constructor[Symbol.species] is not a constructor");
82 }
83
84 @globalPrivate
85 function copyDataProperties(target, source, excludedSet)
86 {
87     if (!@isObject(target))
88         @throwTypeError("target needs to be an object");
89
90     if (source == null) 
91         return target;
92
93     let from = @Object(source); 
94     let keys = @Reflect.@ownKeys(from); 
95     let keysLength = keys.length;
96     for (let i = 0; i < keysLength; i++) {
97         let nextKey = keys[i];
98         if (!excludedSet.@has(nextKey)) {
99             if (@propertyIsEnumerable(from, nextKey)) {
100                 let propValue = from[nextKey];
101                 @defineEnumerableWritableConfigurableDataProperty(target, nextKey, propValue);
102             }
103         }
104     }
105
106     return target;
107 }
108
109 @globalPrivate
110 function copyDataPropertiesNoExclusions(target, source)
111 {
112     if (!@isObject(target))
113         @throwTypeError("target needs to be an object");
114
115     if (source == null) 
116         return target;
117
118     let from = @Object(source); 
119     let keys = @Reflect.@ownKeys(from); 
120     let keysLength = keys.length;
121     for (let i = 0; i < keysLength; i++) {
122         let nextKey = keys[i];
123         if (@propertyIsEnumerable(from, nextKey)) {
124             let propValue = from[nextKey];
125             @defineEnumerableWritableConfigurableDataProperty(target, nextKey, propValue);
126         }
127     }
128
129     return target;
130 }