[JSC] Revise typed array implementations to match ECMAScript and WebGL Specification
authorbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 12 Jan 2014 02:51:19 +0000 (02:51 +0000)
committerbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 12 Jan 2014 02:51:19 +0000 (02:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=126754

Patch by Dean Jackson <dino@apple.com> on 2014-01-11
Reviewed by Filip Pizlo.

Source/JavaScriptCore:

The ECMAScript specification forbids calling the typed array
constructors without using "new". Change the call data to return
none so we throw and exception in these cases.

* runtime/JSGenericTypedArrayViewConstructorInlines.h:
(JSC::JSGenericTypedArrayViewConstructor<ViewClass>::getCallData):

LayoutTests:

New test which checks that we throw an exception when calling
any of the typed array constructors without using "new".

* js/script-tests/typedarray-constructors.js: Added.
* js/typedarray-constructors-expected.txt: Added.
* js/typedarray-constructors.html: Added.
* resources/standalone-pre.js: Add missing 'shouldNotThrow'
method (duplicated from resources/js-test-pre.js)

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

LayoutTests/ChangeLog
LayoutTests/fast/canvas/webgl/data-view-test-expected.txt
LayoutTests/js/script-tests/typedarray-constructors.js [new file with mode: 0644]
LayoutTests/js/typedarray-constructors-expected.txt [new file with mode: 0644]
LayoutTests/js/typedarray-constructors.html [new file with mode: 0644]
LayoutTests/resources/standalone-pre.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/JSGenericTypedArrayViewConstructorInlines.h

index 78e7db4..76e1f87 100644 (file)
@@ -1,3 +1,19 @@
+2014-01-11  Dean Jackson  <dino@apple.com>
+
+        [JSC] Revise typed array implementations to match ECMAScript and WebGL Specification
+        https://bugs.webkit.org/show_bug.cgi?id=126754
+
+        Reviewed by Filip Pizlo.
+
+        New test which checks that we throw an exception when calling
+        any of the typed array constructors without using "new".
+
+        * js/script-tests/typedarray-constructors.js: Added.
+        * js/typedarray-constructors-expected.txt: Added.
+        * js/typedarray-constructors.html: Added.
+        * resources/standalone-pre.js: Add missing 'shouldNotThrow'
+        method (duplicated from resources/js-test-pre.js)
+
 2014-01-10  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r161702.
index e06f778..f98b7e1 100644 (file)
@@ -4,7 +4,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 
 Test for constructor not called as a function
-FAIL DataView(new ArrayBuffer) does not throw exception
+PASS DataView(new ArrayBuffer) threw exception
 
 Test for constructor taking 1 argument
 PASS view = new DataView(arayBuffer) is defined.
diff --git a/LayoutTests/js/script-tests/typedarray-constructors.js b/LayoutTests/js/script-tests/typedarray-constructors.js
new file mode 100644 (file)
index 0000000..0b28b8e
--- /dev/null
@@ -0,0 +1,35 @@
+description(
+'This test case tests the various typed array and related constructors. ' +
+'In particular, makes sure that you use the "new" keyword when using the constructors.'
+);
+
+shouldThrow("Int8Array()");
+shouldNotThrow("new Int8Array()");
+
+shouldThrow("Int16Array()");
+shouldNotThrow("new Int16Array()");
+
+shouldThrow("Int32Array()");
+shouldNotThrow("new Int32Array()");
+
+shouldThrow("Uint8Array()");
+shouldNotThrow("new Uint8Array()");
+
+shouldThrow("Uint16Array()");
+shouldNotThrow("new Uint16Array()");
+
+shouldThrow("Uint32Array()");
+shouldNotThrow("new Uint32Array()");
+
+shouldThrow("Uint8ClampedArray()");
+shouldNotThrow("new Uint8ClampedArray()");
+
+shouldThrow("Float32Array()");
+shouldNotThrow("new Float32Array()");
+
+shouldThrow("Float64Array()");
+shouldNotThrow("new Float64Array()");
+
+shouldThrow("DataView(new ArrayBuffer())");
+shouldNotThrow("new DataView(new ArrayBuffer())");
+
diff --git a/LayoutTests/js/typedarray-constructors-expected.txt b/LayoutTests/js/typedarray-constructors-expected.txt
new file mode 100644 (file)
index 0000000..5a552eb
--- /dev/null
@@ -0,0 +1,29 @@
+This test case tests the various typed array and related constructors. In particular, makes sure that you use the "new" keyword when using the constructors.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS Int8Array() threw exception TypeError: Function is not a function (evaluating 'Int8Array()').
+PASS new Int8Array() did not throw exception.
+PASS Int16Array() threw exception TypeError: Function is not a function (evaluating 'Int16Array()').
+PASS new Int16Array() did not throw exception.
+PASS Int32Array() threw exception TypeError: Function is not a function (evaluating 'Int32Array()').
+PASS new Int32Array() did not throw exception.
+PASS Uint8Array() threw exception TypeError: Function is not a function (evaluating 'Uint8Array()').
+PASS new Uint8Array() did not throw exception.
+PASS Uint16Array() threw exception TypeError: Function is not a function (evaluating 'Uint16Array()').
+PASS new Uint16Array() did not throw exception.
+PASS Uint32Array() threw exception TypeError: Function is not a function (evaluating 'Uint32Array()').
+PASS new Uint32Array() did not throw exception.
+PASS Uint8ClampedArray() threw exception TypeError: Function is not a function (evaluating 'Uint8ClampedArray()').
+PASS new Uint8ClampedArray() did not throw exception.
+PASS Float32Array() threw exception TypeError: Function is not a function (evaluating 'Float32Array()').
+PASS new Float32Array() did not throw exception.
+PASS Float64Array() threw exception TypeError: Function is not a function (evaluating 'Float64Array()').
+PASS new Float64Array() did not throw exception.
+PASS DataView(new ArrayBuffer()) threw exception TypeError: Function is not a function (evaluating 'DataView(new ArrayBuffer())').
+PASS new DataView(new ArrayBuffer()) did not throw exception.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/js/typedarray-constructors.html b/LayoutTests/js/typedarray-constructors.html
new file mode 100644 (file)
index 0000000..5bfb39e
--- /dev/null
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../resources/js-test-pre.js"></script>
+</head>
+<body>
+<script src="script-tests/typedarray-constructors.js"></script>
+<script src="../resources/js-test-post.js"></script>
+</body>
+</html>
index 2f30cdd..718e84a 100644 (file)
@@ -206,6 +206,14 @@ function shouldBeUndefined(_a)
     testFailed(_a + " should be undefined. Was " + _av);
 }
 
+function shouldNotThrow(_a) {
+    try {
+        eval(_a);
+        testPassed(_a + " did not throw exception.");
+    } catch (e) {
+        testFailed(_a + " should not throw exception. Threw exception " + e + ".");
+    }
+}
 
 function shouldThrow(_a, _e)
 {
index 874a4d2..e143bd6 100644 (file)
@@ -1,3 +1,17 @@
+2014-01-11  Dean Jackson  <dino@apple.com>
+
+        [JSC] Revise typed array implementations to match ECMAScript and WebGL Specification
+        https://bugs.webkit.org/show_bug.cgi?id=126754
+
+        Reviewed by Filip Pizlo.
+
+        The ECMAScript specification forbids calling the typed array
+        constructors without using "new". Change the call data to return
+        none so we throw and exception in these cases.
+
+        * runtime/JSGenericTypedArrayViewConstructorInlines.h:
+        (JSC::JSGenericTypedArrayViewConstructor<ViewClass>::getCallData):
+
 2014-01-11  Anders Carlsson  <andersca@apple.com>
 
         Try to fix the build by introducing a constructor.
index 870395a..2ddc29f 100644 (file)
@@ -157,7 +157,7 @@ template<typename ViewClass>
 CallType JSGenericTypedArrayViewConstructor<ViewClass>::getCallData(JSCell*, CallData& callData)
 {
     callData.native.function = constructGenericTypedArrayView<ViewClass>;
-    return CallTypeHost;
+    return CallTypeNone;
 }
 
 } // namespace JSC