EnforceRange doesn't enforce range of a short
authorch.dumez@samsung.com <ch.dumez@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Nov 2013 04:13:43 +0000 (04:13 +0000)
committerch.dumez@samsung.com <ch.dumez@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Nov 2013 04:13:43 +0000 (04:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=123661

Reviewed by Alexey Proskuryakov.

Source/WebCore:

Handle Web IDL short / unsigned short types as per the
specification:
- http://www.w3.org/TR/WebIDL/#es-short
- http://www.w3.org/TR/WebIDL/#es-unsigned-short

Specifically, we used to treat short / unsigned short as 32bit
integers, which was wrong. We now properly handle them as 16bit
integers.

No new tests, added test cases to js/dom/webidl-type-mapping.html.

* WebCore.exp.in:
* bindings/js/JSDOMBinding.cpp:
(WebCore::toSmallerInt):
(WebCore::toSmallerUInt):
(WebCore::toInt8):
(WebCore::toUInt8):
(WebCore::toInt16):
(WebCore::toUInt16):
* bindings/js/JSDOMBinding.h:
* bindings/scripts/CodeGeneratorJS.pm:
(JSValueToNative):
* bindings/scripts/test/JS/JSTestObj.cpp:
(WebCore::setJSTestObjShortAttr):
(WebCore::setJSTestObjUnsignedShortAttr):
* testing/TypeConversions.h:
(WebCore::TypeConversions::testShort):
(WebCore::TypeConversions::setTestShort):
(WebCore::TypeConversions::testEnforceRangeShort):
(WebCore::TypeConversions::setTestEnforceRangeShort):
(WebCore::TypeConversions::testUnsignedShort):
(WebCore::TypeConversions::setTestUnsignedShort):
(WebCore::TypeConversions::testEnforceRangeUnsignedShort):
(WebCore::TypeConversions::setTestEnforceRangeUnsignedShort):
* testing/TypeConversions.idl:

Source/WebKit:

Export symbols to fix Windows build.

* WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in:

LayoutTests:

Extend js/dom/webidl-type-mapping.html layout test to validate
Web IDL type mapping for short / unsigned short.

* js/dom/webidl-type-mapping-expected.txt:
* js/dom/webidl-type-mapping.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@158521 268f45cc-cd09-0410-ab3c-d52691b4dbfc

13 files changed:
LayoutTests/ChangeLog
LayoutTests/js/dom/webidl-type-mapping-expected.txt
LayoutTests/js/dom/webidl-type-mapping.html
Source/WebCore/ChangeLog
Source/WebCore/WebCore.exp.in
Source/WebCore/bindings/js/JSDOMBinding.cpp
Source/WebCore/bindings/js/JSDOMBinding.h
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp
Source/WebCore/testing/TypeConversions.h
Source/WebCore/testing/TypeConversions.idl
Source/WebKit/ChangeLog
Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in

index f0d9dc3..da450c4 100644 (file)
@@ -1,3 +1,16 @@
+2013-11-02  Christophe Dumez  <ch.dumez@samsung.com>
+
+        EnforceRange doesn't enforce range of a short
+        https://bugs.webkit.org/show_bug.cgi?id=123661
+
+        Reviewed by Alexey Proskuryakov.
+
+        Extend js/dom/webidl-type-mapping.html layout test to validate
+        Web IDL type mapping for short / unsigned short.
+
+        * js/dom/webidl-type-mapping-expected.txt:
+        * js/dom/webidl-type-mapping.html:
+
 2013-11-02  Andreas Kling  <akling@apple.com>
 
         Optimize baselines: fast/css
index e13d119..51b15f0 100644 (file)
@@ -9,6 +9,8 @@ PASS 'testLong' in converter is true
 PASS typeof converter.testLong === 'number' is true
 converter.testLong = 0
 PASS converter.testLong is 0
+converter.testLong = -0
+PASS converter.testLong is 0
 converter.testLong = -1
 PASS converter.testLong is -1
 converter.testLong = 1
@@ -83,6 +85,8 @@ PASS 'testEnforceRangeLong' in converter is true
 PASS typeof converter.testEnforceRangeLong === 'number' is true
 converter.testEnforceRangeLong = 0
 PASS converter.testEnforceRangeLong is 0
+converter.testEnforceRangeLong = -0
+PASS converter.testEnforceRangeLong is 0
 converter.testEnforceRangeLong = -1
 PASS converter.testEnforceRangeLong is -1
 converter.testEnforceRangeLong = 1
@@ -146,6 +150,8 @@ PASS 'testUnsignedLong' in converter is true
 PASS typeof converter.testUnsignedLong === 'number' is true
 converter.testUnsignedLong = 0
 PASS converter.testUnsignedLong is 0
+converter.testUnsignedLong = -0
+PASS converter.testUnsignedLong is 0
 converter.testUnsignedLong = -1
 PASS converter.testUnsignedLong is 0xFFFFFFFF
 converter.testUnsignedLong = 1
@@ -220,6 +226,8 @@ PASS 'testEnforceRangeUnsignedLong' in converter is true
 PASS typeof converter.testEnforceRangeUnsignedLong === 'number' is true
 converter.testEnforceRangeUnsignedLong = 0
 PASS converter.testEnforceRangeUnsignedLong is 0
+converter.testEnforceRangeUnsignedLong = -0
+PASS converter.testEnforceRangeUnsignedLong is 0
 PASS converter.testEnforceRangeUnsignedLong = -1 threw exception TypeError: Type error.
 converter.testEnforceRangeUnsignedLong = 1
 PASS converter.testEnforceRangeUnsignedLong is 1
@@ -278,6 +286,8 @@ PASS 'testLongLong' in converter is true
 PASS typeof converter.testLongLong === 'number' is true
 converter.testLongLong = 0
 PASS converter.testLongLong is 0
+converter.testLongLong = -0
+PASS converter.testLongLong is 0
 converter.testLongLong = -1
 PASS converter.testLongLong is -1
 converter.testLongLong = 1
@@ -352,6 +362,8 @@ PASS 'testEnforceRangeLongLong' in converter is true
 PASS typeof converter.testEnforceRangeLongLong === 'number' is true
 converter.testEnforceRangeLongLong = 0
 PASS converter.testEnforceRangeLongLong is 0
+converter.testEnforceRangeLongLong = -0
+PASS converter.testEnforceRangeLongLong is 0
 converter.testEnforceRangeLongLong = -1
 PASS converter.testEnforceRangeLongLong is -1
 converter.testEnforceRangeLongLong = 1
@@ -418,6 +430,8 @@ PASS 'testUnsignedLongLong' in converter is true
 PASS typeof converter.testUnsignedLongLong === 'number' is true
 converter.testUnsignedLongLong = 0
 PASS converter.testUnsignedLongLong is 0
+converter.testUnsignedLongLong = -0
+PASS converter.testUnsignedLongLong is 0
 converter.testUnsignedLongLong = -1
 PASS converter.testUnsignedLongLong is 0xFFFFFFFFFFFFFFFF
 converter.testUnsignedLongLong = 1
@@ -492,6 +506,8 @@ PASS 'testEnforceRangeUnsignedLongLong' in converter is true
 PASS typeof converter.testEnforceRangeUnsignedLongLong === 'number' is true
 converter.testEnforceRangeUnsignedLongLong = 0
 PASS converter.testEnforceRangeUnsignedLongLong is 0
+converter.testEnforceRangeUnsignedLongLong = -0
+PASS converter.testEnforceRangeUnsignedLongLong is 0
 PASS converter.testEnforceRangeUnsignedLongLong = -1 threw exception TypeError: Type error.
 converter.testEnforceRangeUnsignedLongLong = 1
 PASS converter.testEnforceRangeUnsignedLongLong is 1
@@ -550,6 +566,8 @@ PASS 'testByte' in converter is true
 PASS typeof converter.testByte === 'number' is true
 converter.testByte = 0
 PASS converter.testByte is 0
+converter.testByte = -0
+PASS converter.testByte is 0
 converter.testByte = -1
 PASS converter.testByte is -1
 converter.testByte = 1
@@ -602,6 +620,8 @@ PASS 'testEnforceRangeByte' in converter is true
 PASS typeof converter.testEnforceRangeByte === 'number' is true
 converter.testEnforceRangeByte = 0
 PASS converter.testEnforceRangeByte is 0
+converter.testEnforceRangeByte = -0
+PASS converter.testEnforceRangeByte is 0
 converter.testEnforceRangeByte = -1
 PASS converter.testEnforceRangeByte is -1
 converter.testEnforceRangeByte = 1
@@ -645,6 +665,8 @@ PASS 'testOctet' in converter is true
 PASS typeof converter.testOctet === 'number' is true
 converter.testOctet = 0
 PASS converter.testOctet is 0
+converter.testOctet = -0
+PASS converter.testOctet is 0
 converter.testOctet = -1
 PASS converter.testOctet is 0xFF
 converter.testOctet = 1
@@ -701,6 +723,8 @@ PASS 'testEnforceRangeOctet' in converter is true
 PASS typeof converter.testEnforceRangeOctet === 'number' is true
 converter.testEnforceRangeOctet = 0
 PASS converter.testEnforceRangeOctet is 0
+converter.testEnforceRangeOctet = -0
+PASS converter.testEnforceRangeOctet is 0
 PASS converter.testEnforceRangeOctet = -1 threw exception TypeError: Type error.
 converter.testEnforceRangeOctet = 1
 PASS converter.testEnforceRangeOctet is 1
@@ -740,6 +764,249 @@ PASS converter.testEnforceRangeOctet is 0
 PASS converter.testEnforceRangeOctet = undefined threw exception TypeError: Type error.
 PASS converter.testEnforceRangeOctet = {valueOf:function(){throw new Error('custom');}} threw exception Error: custom.
 
+PASS 'testShort' in converter is true
+PASS typeof converter.testShort === 'number' is true
+converter.testShort = 0
+PASS converter.testShort is 0
+converter.testShort = -0
+PASS converter.testShort is 0
+converter.testShort = -1
+PASS converter.testShort is -1
+converter.testShort = 1
+PASS converter.testShort is 1
+converter.testShort = 0x7F
+PASS converter.testShort is 0x7F
+converter.testShort = 0x80
+PASS converter.testShort is 0x80
+converter.testShort = 0xFF
+PASS converter.testShort is 0xFF
+converter.testShort = -0x80
+PASS converter.testShort is -0x80
+converter.testShort = -0x81
+PASS converter.testShort is -0x81
+converter.testShort = 0x7FFF
+PASS converter.testShort is 0x7FFF
+converter.testShort = 0x8000
+PASS converter.testShort is -0x8000
+converter.testShort = 0xFFFF
+PASS converter.testShort is -1
+converter.testShort = -0x8000
+PASS converter.testShort is -0x8000
+converter.testShort = -0x8001
+PASS converter.testShort is 0x7FFF
+converter.testShort = 0xDCBA9876543210
+PASS converter.testShort is 0x3210
+converter.testShort = Number.MAX_VALUE
+PASS converter.testShort is 0
+converter.testShort = Number.MIN_VALUE
+PASS converter.testShort is 0
+converter.testShort = -Number.MAX_VALUE
+PASS converter.testShort is 0
+converter.testShort = -Number.MIN_VALUE
+PASS converter.testShort is 0
+converter.testShort = 1.99
+PASS converter.testShort is 1
+converter.testShort = -1.99
+PASS converter.testShort is -1
+converter.testShort = Infinity
+PASS converter.testShort is 0
+converter.testShort = -Infinity
+PASS converter.testShort is 0
+converter.testShort = NaN
+PASS converter.testShort is 0
+converter.testShort = false
+PASS converter.testShort is 0
+converter.testShort = true
+PASS converter.testShort is 1
+converter.testShort = ''
+PASS converter.testShort is 0
+converter.testShort = '1'
+PASS converter.testShort is 1
+converter.testShort = 'abc'
+PASS converter.testShort is 0
+converter.testShort = null
+PASS converter.testShort is 0
+converter.testShort = undefined
+PASS converter.testShort is 0
+PASS converter.testShort = {valueOf:function(){throw new Error('custom');}} threw exception Error: custom.
+
+PASS 'testEnforceRangeShort' in converter is true
+PASS typeof converter.testEnforceRangeShort === 'number' is true
+converter.testEnforceRangeShort = 0
+PASS converter.testEnforceRangeShort is 0
+converter.testEnforceRangeShort = -0
+PASS converter.testEnforceRangeShort is 0
+converter.testEnforceRangeShort = -1
+PASS converter.testEnforceRangeShort is -1
+converter.testEnforceRangeShort = 1
+PASS converter.testEnforceRangeShort is 1
+converter.testEnforceRangeShort = 0x7F
+PASS converter.testEnforceRangeShort is 0x7F
+converter.testEnforceRangeShort = 0x80
+PASS converter.testEnforceRangeShort is 0x80
+converter.testEnforceRangeShort = 0xFF
+PASS converter.testEnforceRangeShort is 0xFF
+converter.testEnforceRangeShort = -0x80
+PASS converter.testEnforceRangeShort is -0x80
+converter.testEnforceRangeShort = -0x81
+PASS converter.testEnforceRangeShort is -0x81
+converter.testEnforceRangeShort = 0x7FFF
+PASS converter.testEnforceRangeShort is 0x7FFF
+PASS converter.testEnforceRangeShort = 0x8000 threw exception TypeError: Type error.
+PASS converter.testEnforceRangeShort = 0xFFFF threw exception TypeError: Type error.
+converter.testEnforceRangeShort = -0x8000
+PASS converter.testEnforceRangeShort is -0x8000
+PASS converter.testEnforceRangeShort = -0x8001 threw exception TypeError: Type error.
+PASS converter.testEnforceRangeShort = 0xDCBA9876543210 threw exception TypeError: Type error.
+PASS converter.testEnforceRangeShort = Number.MAX_VALUE threw exception TypeError: Type error.
+converter.testEnforceRangeShort = Number.MIN_VALUE
+PASS converter.testEnforceRangeShort is 0
+PASS converter.testEnforceRangeShort = -Number.MAX_VALUE threw exception TypeError: Type error.
+converter.testEnforceRangeShort = -Number.MIN_VALUE
+PASS converter.testEnforceRangeShort is 0
+converter.testEnforceRangeShort = 1.99
+PASS converter.testEnforceRangeShort is 1
+converter.testEnforceRangeShort = -1.99
+PASS converter.testEnforceRangeShort is -1
+PASS converter.testEnforceRangeShort = Infinity threw exception TypeError: Type error.
+PASS converter.testEnforceRangeShort = -Infinity threw exception TypeError: Type error.
+PASS converter.testEnforceRangeShort = NaN threw exception TypeError: Type error.
+converter.testEnforceRangeShort = false
+PASS converter.testEnforceRangeShort is 0
+converter.testEnforceRangeShort = true
+PASS converter.testEnforceRangeShort is 1
+converter.testEnforceRangeShort = ''
+PASS converter.testEnforceRangeShort is 0
+converter.testEnforceRangeShort = '1'
+PASS converter.testEnforceRangeShort is 1
+PASS converter.testEnforceRangeShort = 'abc' threw exception TypeError: Type error.
+converter.testEnforceRangeShort = null
+PASS converter.testEnforceRangeShort is 0
+PASS converter.testEnforceRangeShort = undefined threw exception TypeError: Type error.
+PASS converter.testEnforceRangeShort = {valueOf:function(){throw new Error('custom');}} threw exception Error: custom.
+
+PASS 'testUnsignedShort' in converter is true
+PASS typeof converter.testUnsignedShort === 'number' is true
+converter.testUnsignedShort = 0
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = -0
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = -1
+PASS converter.testUnsignedShort is 0xFFFF
+converter.testUnsignedShort = 1
+PASS converter.testUnsignedShort is 1
+converter.testUnsignedShort = 0x7F
+PASS converter.testUnsignedShort is 0x7F
+converter.testUnsignedShort = 0x80
+PASS converter.testUnsignedShort is 0x80
+converter.testUnsignedShort = 0xFF
+PASS converter.testUnsignedShort is 0xFF
+converter.testUnsignedShort = -0x80
+PASS converter.testUnsignedShort is 0xFF80
+converter.testUnsignedShort = -0x81
+PASS converter.testUnsignedShort is 0xFF7F
+converter.testUnsignedShort = 0x7FFF
+PASS converter.testUnsignedShort is 0x7FFF
+converter.testUnsignedShort = 0x8000
+PASS converter.testUnsignedShort is 0x8000
+converter.testUnsignedShort = 0xFFFF
+PASS converter.testUnsignedShort is 0xFFFF
+converter.testUnsignedShort = 0x10000
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = -0x8000
+PASS converter.testUnsignedShort is 0x8000
+converter.testUnsignedShort = -0x8001
+PASS converter.testUnsignedShort is 0x7FFF
+converter.testUnsignedShort = 0xDCBA9876543210
+PASS converter.testUnsignedShort is 0x3210
+converter.testUnsignedShort = Number.MAX_VALUE
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = Number.MIN_VALUE
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = -Number.MAX_VALUE
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = -Number.MIN_VALUE
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = 1.99
+PASS converter.testUnsignedShort is 1
+converter.testUnsignedShort = -1.99
+PASS converter.testUnsignedShort is 0xFFFF
+converter.testUnsignedShort = Infinity
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = -Infinity
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = NaN
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = false
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = true
+PASS converter.testUnsignedShort is 1
+converter.testUnsignedShort = ''
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = '1'
+PASS converter.testUnsignedShort is 1
+converter.testUnsignedShort = 'abc'
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = null
+PASS converter.testUnsignedShort is 0
+converter.testUnsignedShort = undefined
+PASS converter.testUnsignedShort is 0
+PASS converter.testUnsignedShort = {valueOf:function(){throw new Error('custom');}} threw exception Error: custom.
+
+PASS 'testEnforceRangeUnsignedShort' in converter is true
+PASS typeof converter.testEnforceRangeUnsignedShort === 'number' is true
+converter.testEnforceRangeUnsignedShort = 0
+PASS converter.testEnforceRangeUnsignedShort is 0
+converter.testEnforceRangeUnsignedShort = -0
+PASS converter.testEnforceRangeUnsignedShort is 0
+PASS converter.testEnforceRangeUnsignedShort = -1 threw exception TypeError: Type error.
+converter.testEnforceRangeUnsignedShort = 1
+PASS converter.testEnforceRangeUnsignedShort is 1
+converter.testEnforceRangeUnsignedShort = 0x7F
+PASS converter.testEnforceRangeUnsignedShort is 0x7F
+converter.testEnforceRangeUnsignedShort = 0x80
+PASS converter.testEnforceRangeUnsignedShort is 0x80
+converter.testEnforceRangeUnsignedShort = 0xFF
+PASS converter.testEnforceRangeUnsignedShort is 0xFF
+PASS converter.testEnforceRangeUnsignedShort = -0x80 threw exception TypeError: Type error.
+PASS converter.testEnforceRangeUnsignedShort = -0x81 threw exception TypeError: Type error.
+converter.testEnforceRangeUnsignedShort = 0x7FFF
+PASS converter.testEnforceRangeUnsignedShort is 0x7FFF
+converter.testEnforceRangeUnsignedShort = 0x8000
+PASS converter.testEnforceRangeUnsignedShort is 0x8000
+converter.testEnforceRangeUnsignedShort = 0xFFFF
+PASS converter.testEnforceRangeUnsignedShort is 0xFFFF
+PASS converter.testEnforceRangeUnsignedShort = 0x10000 threw exception TypeError: Type error.
+PASS converter.testEnforceRangeUnsignedShort = -0x8000 threw exception TypeError: Type error.
+PASS converter.testEnforceRangeUnsignedShort = -0x8001 threw exception TypeError: Type error.
+converter.testEnforceRangeUnsignedShort = 0x3210
+PASS converter.testEnforceRangeUnsignedShort is 0x3210
+PASS converter.testEnforceRangeUnsignedShort = Number.MAX_VALUE threw exception TypeError: Type error.
+converter.testEnforceRangeUnsignedShort = Number.MIN_VALUE
+PASS converter.testEnforceRangeUnsignedShort is 0
+PASS converter.testEnforceRangeUnsignedShort = -Number.MAX_VALUE threw exception TypeError: Type error.
+converter.testEnforceRangeUnsignedShort = -Number.MIN_VALUE
+PASS converter.testEnforceRangeUnsignedShort is 0
+converter.testEnforceRangeUnsignedShort = 1.99
+PASS converter.testEnforceRangeUnsignedShort is 1
+PASS converter.testEnforceRangeUnsignedShort = -1.99 threw exception TypeError: Type error.
+PASS converter.testEnforceRangeUnsignedShort = Infinity threw exception TypeError: Type error.
+PASS converter.testEnforceRangeUnsignedShort = -Infinity threw exception TypeError: Type error.
+PASS converter.testEnforceRangeUnsignedShort = NaN threw exception TypeError: Type error.
+converter.testEnforceRangeUnsignedShort = false
+PASS converter.testEnforceRangeUnsignedShort is 0
+converter.testEnforceRangeUnsignedShort = true
+PASS converter.testEnforceRangeUnsignedShort is 1
+converter.testEnforceRangeUnsignedShort = ''
+PASS converter.testEnforceRangeUnsignedShort is 0
+converter.testEnforceRangeUnsignedShort = '1'
+PASS converter.testEnforceRangeUnsignedShort is 1
+PASS converter.testEnforceRangeUnsignedShort = 'abc' threw exception TypeError: Type error.
+converter.testEnforceRangeUnsignedShort = null
+PASS converter.testEnforceRangeUnsignedShort is 0
+PASS converter.testEnforceRangeUnsignedShort = undefined threw exception TypeError: Type error.
+PASS converter.testEnforceRangeUnsignedShort = {valueOf:function(){throw new Error('custom');}} threw exception Error: custom.
+
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 60c4b66..026cd52 100644 (file)
@@ -56,6 +56,7 @@ function testNonNumericToNumericEnforceRange(attribute)
 type = "testLong";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convert(type, "-1");
 convert(type, "1");
 convert(type, "0x7F");
@@ -90,6 +91,7 @@ debug("");
 type = "testEnforceRangeLong";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convert(type, "-1");
 convert(type, "1");
 convert(type, "0x7F");
@@ -124,6 +126,7 @@ debug("");
 type = "testUnsignedLong";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convert(type, "-1", "0xFFFFFFFF");
 convert(type, "1");
 convert(type, "0x7F");
@@ -158,6 +161,7 @@ debug("");
 type = "testEnforceRangeUnsignedLong";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convertThrows(type, "-1");
 convert(type, "1");
 convert(type, "0x7F");
@@ -192,6 +196,7 @@ debug("");
 type = "testLongLong";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convert(type, "-1");
 convert(type, "1");
 convert(type, "0x7F");
@@ -226,6 +231,7 @@ debug("");
 type = "testEnforceRangeLongLong";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convert(type, "-1");
 convert(type, "1");
 convert(type, "0x7F");
@@ -260,6 +266,7 @@ debug("");
 type = "testUnsignedLongLong";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convert(type, "-1", "0xFFFFFFFFFFFFFFFF");
 convert(type, "1");
 convert(type, "0x7F");
@@ -294,6 +301,7 @@ debug("");
 type = "testEnforceRangeUnsignedLongLong";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convertThrows(type, "-1");
 convert(type, "1");
 convert(type, "0x7F");
@@ -328,6 +336,7 @@ debug("");
 type = "testByte";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convert(type, "-1");
 convert(type, "1");
 convert(type, "0x7F");
@@ -351,6 +360,7 @@ debug("");
 type = "testEnforceRangeByte";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convert(type, "-1");
 convert(type, "1");
 convert(type, "0x7F");
@@ -374,6 +384,7 @@ debug("");
 type = "testOctet";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convert(type, "-1", "0xFF");
 convert(type, "1");
 convert(type, "0x7F");
@@ -399,6 +410,7 @@ debug("");
 type = "testEnforceRangeOctet";
 verifyAttribute(type);
 convert(type, "0");
+convert(type, "-0", "0");
 convertThrows(type, "-1");
 convert(type, "1");
 convert(type, "0x7F");
@@ -421,5 +433,127 @@ testNonNumericToNumericEnforceRange(type);
 convertThrows(type, "{valueOf:function(){throw new Error('custom');}}");
 debug("");
 
+type = "testShort";
+verifyAttribute(type);
+convert(type, "0");
+convert(type, "-0", "0");
+convert(type, "-1");
+convert(type, "1");
+convert(type, "0x7F");
+convert(type, "0x80");
+convert(type, "0xFF");
+convert(type, "-0x80");
+convert(type, "-0x81");
+convert(type, "0x7FFF");
+convert(type, "0x8000", "-0x8000");
+convert(type, "0xFFFF", "-1");
+convert(type, "-0x8000");
+convert(type, "-0x8001", "0x7FFF");
+convert(type, "0xDCBA9876543210", "0x3210");
+convert(type, "Number.MAX_VALUE", "0");
+convert(type, "Number.MIN_VALUE", "0");
+convert(type, "-Number.MAX_VALUE", "0");
+convert(type, "-Number.MIN_VALUE", "0");
+convert(type, "1.99", "1");
+convert(type, "-1.99", "-1");
+convert(type, "Infinity", "0");
+convert(type, "-Infinity", "0");
+convert(type, "NaN", "0");
+testNonNumericToNumeric(type);
+convertThrows(type, "{valueOf:function(){throw new Error('custom');}}");
+debug("");
+
+type = "testEnforceRangeShort";
+verifyAttribute(type);
+convert(type, "0");
+convert(type, "-0", "0");
+convert(type, "-1");
+convert(type, "1");
+convert(type, "0x7F");
+convert(type, "0x80");
+convert(type, "0xFF");
+convert(type, "-0x80");
+convert(type, "-0x81");
+convert(type, "0x7FFF");
+convertThrows(type, "0x8000");
+convertThrows(type, "0xFFFF");
+convert(type, "-0x8000");
+convertThrows(type, "-0x8001");
+convertThrows(type, "0xDCBA9876543210");
+convertThrows(type, "Number.MAX_VALUE");
+convert(type, "Number.MIN_VALUE", "0");
+convertThrows(type, "-Number.MAX_VALUE");
+convert(type, "-Number.MIN_VALUE", "0");
+convert(type, "1.99", "1");
+convert(type, "-1.99", "-1");
+convertThrows(type, "Infinity");
+convertThrows(type, "-Infinity");
+convertThrows(type, "NaN");
+testNonNumericToNumericEnforceRange(type);
+convertThrows(type, "{valueOf:function(){throw new Error('custom');}}");
+debug("");
+
+type = "testUnsignedShort";
+verifyAttribute(type);
+convert(type, "0");
+convert(type, "-0", "0");
+convert(type, "-1", "0xFFFF");
+convert(type, "1");
+convert(type, "0x7F");
+convert(type, "0x80");
+convert(type, "0xFF");
+convert(type, "-0x80", "0xFF80");
+convert(type, "-0x81", "0xFF7F");
+convert(type, "0x7FFF");
+convert(type, "0x8000");
+convert(type, "0xFFFF");
+convert(type, "0x10000", "0");
+convert(type, "-0x8000", "0x8000");
+convert(type, "-0x8001", "0x7FFF");
+convert(type, "0xDCBA9876543210", "0x3210");
+convert(type, "Number.MAX_VALUE", "0");
+convert(type, "Number.MIN_VALUE", "0");
+convert(type, "-Number.MAX_VALUE", "0");
+convert(type, "-Number.MIN_VALUE", "0");
+convert(type, "1.99", "1");
+convert(type, "-1.99", "0xFFFF");
+convert(type, "Infinity", "0");
+convert(type, "-Infinity", "0");
+convert(type, "NaN", "0");
+testNonNumericToNumeric(type);
+convertThrows(type, "{valueOf:function(){throw new Error('custom');}}");
+debug("");
+
+type = "testEnforceRangeUnsignedShort";
+verifyAttribute(type);
+convert(type, "0");
+convert(type, "-0", "0");
+convertThrows(type, "-1");
+convert(type, "1");
+convert(type, "0x7F");
+convert(type, "0x80");
+convert(type, "0xFF");
+convertThrows(type, "-0x80");
+convertThrows(type, "-0x81");
+convert(type, "0x7FFF");
+convert(type, "0x8000");
+convert(type, "0xFFFF");
+convertThrows(type, "0x10000");
+convertThrows(type, "-0x8000");
+convertThrows(type, "-0x8001");
+convert(type, "0x3210");
+convertThrows(type, "Number.MAX_VALUE");
+convert(type, "Number.MIN_VALUE", "0");
+convertThrows(type, "-Number.MAX_VALUE");
+convert(type, "-Number.MIN_VALUE", "0");
+convert(type, "1.99", "1");
+convertThrows(type, "-1.99");
+convertThrows(type, "Infinity");
+convertThrows(type, "-Infinity");
+convertThrows(type, "NaN");
+testNonNumericToNumericEnforceRange(type);
+convertThrows(type, "{valueOf:function(){throw new Error('custom');}}");
+debug("");
+
 </script>
 <script src="../../resources/js-test-post.js"></script>
index f6ecd62..14d6383 100644 (file)
@@ -1,3 +1,46 @@
+2013-11-02  Christophe Dumez  <ch.dumez@samsung.com>
+
+        EnforceRange doesn't enforce range of a short
+        https://bugs.webkit.org/show_bug.cgi?id=123661
+
+        Reviewed by Alexey Proskuryakov.
+
+        Handle Web IDL short / unsigned short types as per the
+        specification:
+        - http://www.w3.org/TR/WebIDL/#es-short
+        - http://www.w3.org/TR/WebIDL/#es-unsigned-short
+
+        Specifically, we used to treat short / unsigned short as 32bit
+        integers, which was wrong. We now properly handle them as 16bit
+        integers.
+
+        No new tests, added test cases to js/dom/webidl-type-mapping.html.
+
+        * WebCore.exp.in:
+        * bindings/js/JSDOMBinding.cpp:
+        (WebCore::toSmallerInt):
+        (WebCore::toSmallerUInt):
+        (WebCore::toInt8):
+        (WebCore::toUInt8):
+        (WebCore::toInt16):
+        (WebCore::toUInt16):
+        * bindings/js/JSDOMBinding.h:
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (JSValueToNative):
+        * bindings/scripts/test/JS/JSTestObj.cpp:
+        (WebCore::setJSTestObjShortAttr):
+        (WebCore::setJSTestObjUnsignedShortAttr):
+        * testing/TypeConversions.h:
+        (WebCore::TypeConversions::testShort):
+        (WebCore::TypeConversions::setTestShort):
+        (WebCore::TypeConversions::testEnforceRangeShort):
+        (WebCore::TypeConversions::setTestEnforceRangeShort):
+        (WebCore::TypeConversions::testUnsignedShort):
+        (WebCore::TypeConversions::setTestUnsignedShort):
+        (WebCore::TypeConversions::testEnforceRangeUnsignedShort):
+        (WebCore::TypeConversions::setTestEnforceRangeUnsignedShort):
+        * testing/TypeConversions.idl:
+
 2013-11-02  Patrick Gansterer  <paroga@webkit.org>
 
         Cleanup OpenTypeUtilities
index 79ebdf8..ae23da4 100644 (file)
@@ -1096,6 +1096,7 @@ __ZN7WebCore6Widget8setFocusEb
 __ZN7WebCore6Widget9setParentEPNS_10ScrollViewE
 __ZN7WebCore6WidgetD2Ev
 __ZN7WebCore6toInt8EPN3JSC9ExecStateENS0_7JSValueENS_30IntegerConversionConfigurationE
+__ZN7WebCore7toInt16EPN3JSC9ExecStateENS0_7JSValueENS_30IntegerConversionConfigurationE
 __ZN7WebCore6toNodeEN3JSC7JSValueE
 __ZN7WebCore7Element12setAttributeERKN3WTF12AtomicStringES4_Ri
 __ZN7WebCore7Element12setAttributeERKNS_13QualifiedNameERKN3WTF12AtomicStringE
@@ -1131,6 +1132,7 @@ __ZN7WebCore7replaceERN3WTF6StringERKNS_17RegularExpressionERKS1_
 __ZN7WebCore7toInt64EPN3JSC9ExecStateENS0_7JSValueENS_30IntegerConversionConfigurationE
 __ZN7WebCore7toRangeEN3JSC7JSValueE
 __ZN7WebCore7toUInt8EPN3JSC9ExecStateENS0_7JSValueENS_30IntegerConversionConfigurationE
+__ZN7WebCore8toUInt16EPN3JSC9ExecStateENS0_7JSValueENS_30IntegerConversionConfigurationE
 __ZN7WebCore8BlobData10appendBlobERKNS_3URLExx
 __ZN7WebCore8BlobData14setContentTypeERKN3WTF6StringE
 __ZN7WebCore8CSSValue7destroyEv
index 1b0e6e8..7f03352 100644 (file)
@@ -288,9 +288,6 @@ Structure* cacheDOMStructure(JSDOMGlobalObject* globalObject, Structure* structu
     return structures.set(classInfo, WriteBarrier<Structure>(globalObject->vm(), globalObject, structure)).iterator->value.get();
 }
 
-static const int8_t kMaxInt8 = 127;
-static const int8_t kMinInt8 = -128;
-static const uint8_t kMaxUInt8 = 255;
 static const int32_t kMaxInt32 = 0x7fffffff;
 static const int32_t kMinInt32 = -kMaxInt32 - 1;
 static const uint32_t kMaxUInt32 = 0xffffffffU;
@@ -310,20 +307,51 @@ static double enforceRange(ExecState* exec, double x, double minimum, double max
     return x;
 }
 
-// http://www.w3.org/TR/WebIDL/#es-byte
-int8_t toInt8(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
-{
+template <typename T>
+struct IntTypeLimits {
+};
+
+template <>
+struct IntTypeLimits<int8_t> {
+    static const int8_t minValue = -128;
+    static const int8_t maxValue = 127;
+    static const unsigned numberOfValues = 256; // 2^8
+};
+
+template <>
+struct IntTypeLimits<uint8_t> {
+    static const uint8_t maxValue = 255;
+    static const unsigned numberOfValues = 256; // 2^8
+};
+
+template <>
+struct IntTypeLimits<int16_t> {
+    static const short minValue = -32768;
+    static const short maxValue = 32767;
+    static const unsigned numberOfValues = 65536; // 2^16
+};
+
+template <>
+struct IntTypeLimits<uint16_t> {
+    static const unsigned short maxValue = 65535;
+    static const unsigned numberOfValues = 65536; // 2^16
+};
+
+template <typename T>
+static inline T toSmallerInt(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
+{
+    typedef IntTypeLimits<T> LimitsTrait;
     // Fast path if the value is already a 32-bit signed integer in the right range.
     if (value.isInt32()) {
         int32_t d = value.asInt32();
-        if (d >= kMinInt8 && d <= kMaxInt8)
-            return static_cast<int8_t>(d);
+        if (d >= LimitsTrait::minValue && d <= LimitsTrait::maxValue)
+            return static_cast<T>(d);
         if (configuration == EnforceRange) {
             throwTypeError(exec);
             return 0;
         }
-        d %= 256;
-        return static_cast<int8_t>(d > kMaxInt8 ? d - 256 : d);
+        d %= LimitsTrait::numberOfValues;
+        return static_cast<T>(d > LimitsTrait::maxValue ? d - LimitsTrait::numberOfValues : d);
     }
 
     double x = value.toNumber(exec);
@@ -331,30 +359,31 @@ int8_t toInt8(ExecState* exec, JSValue value, IntegerConversionConfiguration con
         return 0;
 
     if (configuration == EnforceRange)
-        return enforceRange(exec, x, kMinInt8, kMaxInt8);
+        return enforceRange(exec, x, LimitsTrait::minValue, LimitsTrait::maxValue);
 
     if (std::isnan(x) || std::isinf(x) || !x)
         return 0;
 
     x = x < 0 ? -floor(fabs(x)) : floor(fabs(x));
-    x = fmod(x, 256); // 2^8.
+    x = fmod(x, LimitsTrait::numberOfValues);
 
-    return static_cast<int8_t>(x > kMaxInt8 ? x - 256 : x);
+    return static_cast<T>(x > LimitsTrait::maxValue ? x - LimitsTrait::numberOfValues : x);
 }
 
-// http://www.w3.org/TR/WebIDL/#es-octet
-uint8_t toUInt8(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
+template <typename T>
+static inline T toSmallerUInt(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
 {
+    typedef IntTypeLimits<T> LimitsTrait;
     // Fast path if the value is already a 32-bit unsigned integer in the right range.
     if (value.isUInt32()) {
         uint32_t d = value.asUInt32();
-        if (d <= kMaxUInt8)
-            return static_cast<uint8_t>(d);
+        if (d <= LimitsTrait::maxValue)
+            return static_cast<T>(d);
         if (configuration == EnforceRange) {
             throwTypeError(exec);
             return 0;
         }
-        return static_cast<uint8_t>(d % 256); // 2^8.
+        return static_cast<T>(d);
     }
 
     double x = value.toNumber(exec);
@@ -362,13 +391,37 @@ uint8_t toUInt8(ExecState* exec, JSValue value, IntegerConversionConfiguration c
         return 0;
 
     if (configuration == EnforceRange)
-        return enforceRange(exec, x, 0, kMaxUInt8);
+        return enforceRange(exec, x, 0, LimitsTrait::maxValue);
 
     if (std::isnan(x) || std::isinf(x) || !x)
         return 0;
 
     x = x < 0 ? -floor(fabs(x)) : floor(fabs(x));
-    return static_cast<uint8_t>(fmod(x, 256)); // 2^8.
+    return static_cast<T>(fmod(x, LimitsTrait::numberOfValues));
+}
+
+// http://www.w3.org/TR/WebIDL/#es-byte
+int8_t toInt8(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
+{
+    return toSmallerInt<int8_t>(exec, value, configuration);
+}
+
+// http://www.w3.org/TR/WebIDL/#es-octet
+uint8_t toUInt8(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
+{
+    return toSmallerUInt<uint8_t>(exec, value, configuration);
+}
+
+// http://www.w3.org/TR/WebIDL/#es-short
+int16_t toInt16(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
+{
+    return toSmallerInt<int16_t>(exec, value, configuration);
+}
+
+// http://www.w3.org/TR/WebIDL/#es-unsigned-short
+uint16_t toUInt16(ExecState* exec, JSValue value, IntegerConversionConfiguration configuration)
+{
+    return toSmallerUInt<uint16_t>(exec, value, configuration);
 }
 
 // http://www.w3.org/TR/WebIDL/#es-long
index 97d6a5e..f8ca414 100644 (file)
@@ -289,6 +289,9 @@ class DOMStringList;
     int8_t toInt8(JSC::ExecState*, JSC::JSValue, IntegerConversionConfiguration);
     uint8_t toUInt8(JSC::ExecState*, JSC::JSValue, IntegerConversionConfiguration);
 
+    int16_t toInt16(JSC::ExecState*, JSC::JSValue, IntegerConversionConfiguration);
+    uint16_t toUInt16(JSC::ExecState*, JSC::JSValue, IntegerConversionConfiguration);
+
     /*
         Convert a value to an integer as per <http://www.w3.org/TR/WebIDL/>.
         The conversion fails if the value cannot be converted to a number or,
index e0da3fc..89e0a23 100644 (file)
@@ -3239,10 +3239,10 @@ my %nativeType = (
     "boolean" => "bool",
     "double" => "double",
     "float" => "float",
-    "short" => "short",
+    "short" => "int16_t",
     "long" => "int",
     "unsigned long" => "unsigned",
-    "unsigned short" => "unsigned short",
+    "unsigned short" => "uint16_t",
     "long long" => "long long",
     "unsigned long long" => "unsigned long long",
     "byte" => "int8_t",
@@ -3353,8 +3353,10 @@ sub JSValueToNative
     my $intConversion = $signature->extendedAttributes->{"EnforceRange"} ? "EnforceRange" : "NormalConversion";
     return "toInt8(exec, $value, $intConversion)" if $type eq "byte";
     return "toUInt8(exec, $value, $intConversion)" if $type eq "octet";
-    return "toInt32(exec, $value, $intConversion)" if $type eq "long" or $type eq "short";
-    return "toUInt32(exec, $value, $intConversion)" if $type eq "unsigned long" or $type eq "unsigned short";
+    return "toInt16(exec, $value, $intConversion)" if $type eq "short";
+    return "toUInt16(exec, $value, $intConversion)" if $type eq "unsigned short";
+    return "toInt32(exec, $value, $intConversion)" if $type eq "long";
+    return "toUInt32(exec, $value, $intConversion)" if $type eq "unsigned long";
     return "toInt64(exec, $value, $intConversion)" if $type eq "long long";
     return "toUInt64(exec, $value, $intConversion)" if $type eq "unsigned long long";
 
index 82bb01e..d36c65c 100644 (file)
@@ -1181,7 +1181,7 @@ void setJSTestObjShortAttr(ExecState* exec, JSObject* thisObject, JSValue value)
     UNUSED_PARAM(exec);
     JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
     TestObj& impl = castedThis->impl();
-    short nativeValue(toInt32(exec, value, NormalConversion));
+    int16_t nativeValue(toInt16(exec, value, NormalConversion));
     if (exec->hadException())
         return;
     impl.setShortAttr(nativeValue);
@@ -1193,7 +1193,7 @@ void setJSTestObjUnsignedShortAttr(ExecState* exec, JSObject* thisObject, JSValu
     UNUSED_PARAM(exec);
     JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
     TestObj& impl = castedThis->impl();
-    unsigned short nativeValue(toUInt32(exec, value, NormalConversion));
+    uint16_t nativeValue(toUInt16(exec, value, NormalConversion));
     if (exec->hadException())
         return;
     impl.setUnsignedShortAttr(nativeValue);
index 340c894..8263875 100644 (file)
@@ -58,11 +58,19 @@ public:
     void setTestByte(int8_t value) { m_byte = value; }
     int8_t testEnforceRangeByte() { return m_byte; }
     void setTestEnforceRangeByte(int8_t value) { m_byte = value; }
-
     uint8_t testOctet() { return m_octet; }
     void setTestOctet(uint8_t value) { m_octet = value; }
     uint8_t testEnforceRangeOctet() { return m_octet; }
     void setTestEnforceRangeOctet(uint8_t value) { m_octet = value; }
+
+    int16_t testShort() { return m_short; }
+    void setTestShort(int16_t value) { m_short = value; }
+    int16_t testEnforceRangeShort() { return m_short; }
+    void setTestEnforceRangeShort(int16_t value) { m_short = value; }
+    uint16_t testUnsignedShort() { return m_UnsignedShort; }
+    void setTestUnsignedShort(uint16_t value) { m_UnsignedShort = value; }
+    uint16_t testEnforceRangeUnsignedShort() { return m_UnsignedShort; }
+    void setTestEnforceRangeUnsignedShort(uint16_t value) { m_UnsignedShort = value; }
 private:
     TypeConversions()
     {
@@ -74,6 +82,8 @@ private:
     unsigned long long m_unsignedLongLong;
     int8_t m_byte;
     uint8_t m_octet;
+    int16_t m_short;
+    uint16_t m_UnsignedShort;
 };
 
 } // namespace WebCore
index cbc9c90..f02d73c 100644 (file)
@@ -41,4 +41,9 @@
     [EnforceRange] attribute byte testEnforceRangeByte;
     attribute octet testOctet;
     [EnforceRange] attribute octet testEnforceRangeOctet;
+
+    attribute short testShort;
+    [EnforceRange] attribute short testEnforceRangeShort;
+    attribute unsigned short testUnsignedShort;
+    [EnforceRange] attribute unsigned short testEnforceRangeUnsignedShort;
 };
index 369c155..c8b927c 100644 (file)
@@ -1,3 +1,14 @@
+2013-11-02  Christophe Dumez  <ch.dumez@samsung.com>
+
+        EnforceRange doesn't enforce range of a short
+        https://bugs.webkit.org/show_bug.cgi?id=123661
+
+        Reviewed by Alexey Proskuryakov.
+
+        Export symbols to fix Windows build.
+
+        * WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in:
+
 2013-11-01  Andy Estes  <aestes@apple.com>
 
         [iOS] Make some headers Private
index c27625a..24a4cf6 100644 (file)
@@ -430,6 +430,8 @@ EXPORTS
         symbolWithPointer(?initGroup@Page@WebCore@@AAEXXZ, ?initGroup@Page@WebCore@@AEAAXXZ)
         symbolWithPointer(?toInt8@WebCore@@YACPAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z, ?toInt8@WebCore@@YACPEAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z)
         symbolWithPointer(?toUInt8@WebCore@@YAEPAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z, ?toUInt8@WebCore@@YAEPEAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z)
+        symbolWithPointer(?toInt16@WebCore@@YAFPAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z, ?toInt16@WebCore@@YAFPAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z)
+        symbolWithPointer(?toUInt16@WebCore@@YAGPAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z, ?toUInt16@WebCore@@YAGPAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z)
         symbolWithPointer(?toInt32EnforceRange@WebCore@@YAHPAVExecState@JSC@@VJSValue@3@@Z, ?toInt32EnforceRange@WebCore@@YAHPEAVExecState@JSC@@VJSValue@3@@Z)
         symbolWithPointer(?toInt64@WebCore@@YA_JPAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z, ?toInt64@WebCore@@YA_JPEAVExecState@JSC@@VJSValue@3@W4IntegerConversionConfiguration@1@@Z)
         symbolWithPointer(?toUInt32EnforceRange@WebCore@@YAIPAVExecState@JSC@@VJSValue@3@@Z, ?toUInt32EnforceRange@WebCore@@YAIPEAVExecState@JSC@@VJSValue@3@@Z)