[JSC] Should check Test262Error correctly
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Aug 2016 00:37:14 +0000 (00:37 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Aug 2016 00:37:14 +0000 (00:37 +0000)
https://bugs.webkit.org/show_bug.cgi?id=159862

Reviewed by Saam Barati.

Test262Error in the harness does not have "name" property.
Rather than checking "name" property, peforming `instanceof` is better to check the class of the exception.

* jsc.cpp:
(checkUncaughtException):
* runtime/JSObject.h:
* tests/test262.yaml:

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/jsc.cpp
Source/JavaScriptCore/runtime/JSObject.h
Source/JavaScriptCore/tests/test262.yaml

index 7aef68a..cd871e8 100644 (file)
@@ -1,5 +1,20 @@
 2016-07-31  Yusuke Suzuki  <utatane.tea@gmail.com>
 
 2016-07-31  Yusuke Suzuki  <utatane.tea@gmail.com>
 
+        [JSC] Should check Test262Error correctly
+        https://bugs.webkit.org/show_bug.cgi?id=159862
+
+        Reviewed by Saam Barati.
+
+        Test262Error in the harness does not have "name" property.
+        Rather than checking "name" property, peforming `instanceof` is better to check the class of the exception.
+
+        * jsc.cpp:
+        (checkUncaughtException):
+        * runtime/JSObject.h:
+        * tests/test262.yaml:
+
+2016-07-31  Yusuke Suzuki  <utatane.tea@gmail.com>
+
         [ES6] Module binding can be exported by multiple names
         https://bugs.webkit.org/show_bug.cgi?id=160343
 
         [ES6] Module binding can be exported by multiple names
         https://bugs.webkit.org/show_bug.cgi?id=160343
 
index 8c6060b..508fa6e 100644 (file)
@@ -2039,22 +2039,28 @@ static void dumpException(GlobalObject* globalObject, JSValue exception)
 
 static bool checkUncaughtException(VM& vm, GlobalObject* globalObject, JSValue exception, const String& expectedExceptionName)
 {
 
 static bool checkUncaughtException(VM& vm, GlobalObject* globalObject, JSValue exception, const String& expectedExceptionName)
 {
+    vm.clearException();
     if (!exception) {
         printf("Expected uncaught exception with name '%s' but none was thrown\n", expectedExceptionName.utf8().data());
         return false;
     }
 
     if (!exception) {
         printf("Expected uncaught exception with name '%s' but none was thrown\n", expectedExceptionName.utf8().data());
         return false;
     }
 
-    JSValue exceptionName = exception.get(globalObject->globalExec(), vm.propertyNames->name);
+    ExecState* exec = globalObject->globalExec();
+    JSValue exceptionClass = globalObject->get(exec, Identifier::fromString(exec, expectedExceptionName));
+    if (!exceptionClass.isObject() || vm.exception()) {
+        printf("Expected uncaught exception with name '%s' but given exception class is not defined\n", expectedExceptionName.utf8().data());
+        return false;
+    }
 
 
-    if (JSString* exceptionNameStr = jsDynamicCast<JSString*>(exceptionName)) {
-        const String& name = exceptionNameStr->value(globalObject->globalExec());
-        if (name == expectedExceptionName)
-            return true;
-        printf("Expected uncaught exception with name '%s' but got one with name '%s'\n", expectedExceptionName.utf8().data(), name.utf8().data());
-        dumpException(globalObject, exception);
+    bool isInstanceOfExpectedException = jsCast<JSObject*>(exceptionClass)->hasInstance(exec, exception);
+    if (vm.exception()) {
+        printf("Expected uncaught exception with name '%s' but given exception class fails performing hasInstance\n", expectedExceptionName.utf8().data());
         return false;
     }
         return false;
     }
-    printf("Expected uncaught exception with name '%s' but exception value did not have a name property\n", expectedExceptionName.utf8().data());
+    if (isInstanceOfExpectedException)
+        return true;
+
+    printf("Expected uncaught exception with name '%s' but exception value is not instance of this exception class\n", expectedExceptionName.utf8().data());
     dumpException(globalObject, exception);
     return false;
 }
     dumpException(globalObject, exception);
     return false;
 }
index f44ba36..21ebf6d 100644 (file)
@@ -529,7 +529,7 @@ public:
     JSValue ordinaryToPrimitive(ExecState*, PreferredPrimitiveType) const;
 
     JS_EXPORT_PRIVATE bool hasInstance(ExecState*, JSValue value, JSValue hasInstanceValue);
     JSValue ordinaryToPrimitive(ExecState*, PreferredPrimitiveType) const;
 
     JS_EXPORT_PRIVATE bool hasInstance(ExecState*, JSValue value, JSValue hasInstanceValue);
-    bool hasInstance(ExecState*, JSValue);
+    JS_EXPORT_PRIVATE bool hasInstance(ExecState*, JSValue);
     static bool defaultHasInstance(ExecState*, JSValue, JSValue prototypeProperty);
 
     JS_EXPORT_PRIVATE static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
     static bool defaultHasInstance(ExecState*, JSValue, JSValue prototypeProperty);
 
     JS_EXPORT_PRIVATE static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
index 8aae131..fc8ae4c 100644 (file)
 - path: test262/test/annexB/language/comments/multi-line-html-close.js
   cmd: runTest262 :fail, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/annexB/language/comments/single-line-html-close-asi.js
 - path: test262/test/annexB/language/comments/multi-line-html-close.js
   cmd: runTest262 :fail, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/annexB/language/comments/single-line-html-close-asi.js
-  cmd: runTest262 :fail, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/annexB/language/comments/single-line-html-close-asi.js
 - path: test262/test/annexB/language/comments/single-line-html-close-asi.js
-  cmd: runTest262 :fail, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/annexB/language/comments/single-line-html-close.js
 - path: test262/test/annexB/language/comments/single-line-html-close.js
-  cmd: runTest262 :fail, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/annexB/language/comments/single-line-html-close.js
 - path: test262/test/annexB/language/comments/single-line-html-close.js
-  cmd: runTest262 :fail, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/annexB/language/comments/single-line-html-open.js
 - path: test262/test/annexB/language/comments/single-line-html-open.js
-  cmd: runTest262 :fail, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
+  cmd: runTest262 :normal, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], []
 - path: test262/test/annexB/language/comments/single-line-html-open.js
 - path: test262/test/annexB/language/comments/single-line-html-open.js
-  cmd: runTest262 :fail, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
+  cmd: runTest262 :normal, "Test262Error", ["../../../../harness/assert.js", "../../../../harness/sta.js"], [:strict]
 - path: test262/test/annexB/language/eval-code/direct/func-block-decl-eval-func-block-scoping.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/annexB/language/eval-code/direct/func-block-decl-eval-func-exsting-block-fn-no-init.js
 - path: test262/test/annexB/language/eval-code/direct/func-block-decl-eval-func-block-scoping.js
   cmd: runTest262 :normal, "NoException", ["../../../../../harness/assert.js", "../../../../../harness/sta.js"], []
 - path: test262/test/annexB/language/eval-code/direct/func-block-decl-eval-func-exsting-block-fn-no-init.js
 - path: test262/test/language/module-code/eval-export-dflt-expr-cls-named.js
   cmd: runTest262 :normal, "NoException", ["../../../harness/assert.js", "../../../harness/sta.js"], [:module]
 - path: test262/test/language/module-code/eval-export-dflt-expr-err-eval.js
 - path: test262/test/language/module-code/eval-export-dflt-expr-cls-named.js
   cmd: runTest262 :normal, "NoException", ["../../../harness/assert.js", "../../../harness/sta.js"], [:module]
 - path: test262/test/language/module-code/eval-export-dflt-expr-err-eval.js
-  cmd: runTest262 :fail, "Test262Error", ["../../../harness/assert.js", "../../../harness/sta.js"], [:module]
+  cmd: runTest262 :normal, "Test262Error", ["../../../harness/assert.js", "../../../harness/sta.js"], [:module]
 - path: test262/test/language/module-code/eval-export-dflt-expr-err-get-value.js
   cmd: runTest262 :normal, "ReferenceError", ["../../../harness/assert.js", "../../../harness/sta.js"], [:module]
 - path: test262/test/language/module-code/eval-export-dflt-expr-fn-anon.js
 - path: test262/test/language/module-code/eval-export-dflt-expr-err-get-value.js
   cmd: runTest262 :normal, "ReferenceError", ["../../../harness/assert.js", "../../../harness/sta.js"], [:module]
 - path: test262/test/language/module-code/eval-export-dflt-expr-fn-anon.js
 - path: test262/test/language/module-code/eval-rqstd-order.js
   cmd: runTest262 :normal, "NoException", ["../../../harness/assert.js", "../../../harness/sta.js", "../../../harness/fnGlobalObject.js"], [:module]
 - path: test262/test/language/module-code/eval-self-abrupt.js
 - path: test262/test/language/module-code/eval-rqstd-order.js
   cmd: runTest262 :normal, "NoException", ["../../../harness/assert.js", "../../../harness/sta.js", "../../../harness/fnGlobalObject.js"], [:module]
 - path: test262/test/language/module-code/eval-self-abrupt.js
-  cmd: runTest262 :fail, "Test262Error", ["../../../harness/assert.js", "../../../harness/sta.js"], [:module]
+  cmd: runTest262 :normal, "Test262Error", ["../../../harness/assert.js", "../../../harness/sta.js"], [:module]
 - path: test262/test/language/module-code/eval-self-once.js
   cmd: runTest262 :normal, "NoException", ["../../../harness/assert.js", "../../../harness/sta.js", "../../../harness/fnGlobalObject.js"], [:module]
 - path: test262/test/language/module-code/eval-this.js
 - path: test262/test/language/module-code/eval-self-once.js
   cmd: runTest262 :normal, "NoException", ["../../../harness/assert.js", "../../../harness/sta.js", "../../../harness/fnGlobalObject.js"], [:module]
 - path: test262/test/language/module-code/eval-this.js