Title: [209030] trunk/Source/_javascript_Core
Revision
209030
Author
mark....@apple.com
Date
2016-11-28 15:23:40 -0800 (Mon, 28 Nov 2016)

Log Message

Fix exception scope verification failures in runtime/Operations.cpp/h.
https://bugs.webkit.org/show_bug.cgi?id=165046

Reviewed by Saam Barati.

Also switched to using returning { } instead of JSValue().

* runtime/Operations.cpp:
(JSC::jsAddSlowCase):
(JSC::jsIsObjectTypeOrNull):
* runtime/Operations.h:
(JSC::jsStringFromRegisterArray):
(JSC::jsStringFromArguments):
(JSC::jsLess):
(JSC::jsLessEq):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (209029 => 209030)


--- trunk/Source/_javascript_Core/ChangeLog	2016-11-28 23:17:55 UTC (rev 209029)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-11-28 23:23:40 UTC (rev 209030)
@@ -1,5 +1,23 @@
 2016-11-28  Mark Lam  <mark....@apple.com>
 
+        Fix exception scope verification failures in runtime/Operations.cpp/h.
+        https://bugs.webkit.org/show_bug.cgi?id=165046
+
+        Reviewed by Saam Barati.
+
+        Also switched to using returning { } instead of JSValue().
+
+        * runtime/Operations.cpp:
+        (JSC::jsAddSlowCase):
+        (JSC::jsIsObjectTypeOrNull):
+        * runtime/Operations.h:
+        (JSC::jsStringFromRegisterArray):
+        (JSC::jsStringFromArguments):
+        (JSC::jsLess):
+        (JSC::jsLessEq):
+
+2016-11-28  Mark Lam  <mark....@apple.com>
+
         Fix exception scope verification failures in JSScope.cpp.
         https://bugs.webkit.org/show_bug.cgi?id=165047
 

Modified: trunk/Source/_javascript_Core/runtime/Operations.cpp (209029 => 209030)


--- trunk/Source/_javascript_Core/runtime/Operations.cpp	2016-11-28 23:17:55 UTC (rev 209029)
+++ trunk/Source/_javascript_Core/runtime/Operations.cpp	2016-11-28 23:23:40 UTC (rev 209030)
@@ -46,17 +46,28 @@
     VM& vm = callFrame->vm();
     auto scope = DECLARE_THROW_SCOPE(vm);
     JSValue p1 = v1.toPrimitive(callFrame);
-    RETURN_IF_EXCEPTION(scope, JSValue());
+    RETURN_IF_EXCEPTION(scope, { });
     JSValue p2 = v2.toPrimitive(callFrame);
-    RETURN_IF_EXCEPTION(scope, JSValue());
+    RETURN_IF_EXCEPTION(scope, { });
 
-    if (p1.isString())
-        return jsString(callFrame, asString(p1), p2.toString(callFrame));
+    if (p1.isString()) {
+        JSString* p2String = p2.toString(callFrame);
+        RETURN_IF_EXCEPTION(scope, { });
+        scope.release();
+        return jsString(callFrame, asString(p1), p2String);
+    }
 
-    if (p2.isString())
-        return jsString(callFrame, p1.toString(callFrame), asString(p2));
+    if (p2.isString()) {
+        JSString* p1String = p1.toString(callFrame);
+        RETURN_IF_EXCEPTION(scope, { });
+        scope.release();
+        return jsString(callFrame, p1String, asString(p2));
+    }
 
-    return jsNumber(p1.toNumber(callFrame) + p2.toNumber(callFrame));
+    double p1Number = p1.toNumber(callFrame);
+    RETURN_IF_EXCEPTION(scope, { });
+    scope.release();
+    return jsNumber(p1Number + p2.toNumber(callFrame));
 }
 
 JSValue jsTypeStringForValue(VM& vm, JSGlobalObject* globalObject, JSValue v)
@@ -96,6 +107,7 @@
 
 bool jsIsObjectTypeOrNull(CallFrame* callFrame, JSValue v)
 {
+    VM& vm = callFrame->vm();
     if (!v.isCell())
         return v.isNull();
 
@@ -103,11 +115,11 @@
     if (type == StringType || type == SymbolType)
         return false;
     if (type >= ObjectType) {
-        if (asObject(v)->structure(callFrame->vm())->masqueradesAsUndefined(callFrame->lexicalGlobalObject()))
+        if (asObject(v)->structure(vm)->masqueradesAsUndefined(callFrame->lexicalGlobalObject()))
             return false;
         CallData callData;
         JSObject* object = asObject(v);
-        if (object->methodTable(callFrame->vm())->getCallData(object, callData) != CallType::None)
+        if (object->methodTable(vm)->getCallData(object, callData) != CallType::None)
             return false;
     }
     return true;

Modified: trunk/Source/_javascript_Core/runtime/Operations.h (209029 => 209030)


--- trunk/Source/_javascript_Core/runtime/Operations.h	2016-11-28 23:17:55 UTC (rev 209029)
+++ trunk/Source/_javascript_Core/runtime/Operations.h	2016-11-28 23:23:40 UTC (rev 209030)
@@ -126,7 +126,9 @@
 
     for (unsigned i = 0; i < count; ++i) {
         JSValue v = strings[-static_cast<int>(i)].jsValue();
-        if (!ropeBuilder.append(v.toString(exec)))
+        JSString* string = v.toString(exec);
+        RETURN_IF_EXCEPTION(scope, { });
+        if (!ropeBuilder.append(string))
             return throwOutOfMemoryError(exec, scope);
     }
 
@@ -138,11 +140,15 @@
     VM* vm = &exec->vm();
     auto scope = DECLARE_THROW_SCOPE(*vm);
     JSRopeString::RopeBuilder ropeBuilder(*vm);
-    ropeBuilder.append(thisValue.toString(exec));
+    JSString* str = thisValue.toString(exec);
+    RETURN_IF_EXCEPTION(scope, { });
+    ropeBuilder.append(str);
 
     for (unsigned i = 0; i < exec->argumentCount(); ++i) {
         JSValue v = exec->argument(i);
-        if (!ropeBuilder.append(v.toString(exec)))
+        JSString* str = v.toString(exec);
+        RETURN_IF_EXCEPTION(scope, { });
+        if (UNLIKELY(!ropeBuilder.append(str)))
             return throwOutOfMemoryError(exec, scope);
     }
 
@@ -155,6 +161,9 @@
 template<bool leftFirst>
 ALWAYS_INLINE bool jsLess(CallFrame* callFrame, JSValue v1, JSValue v2)
 {
+    VM& vm = callFrame->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
+
     if (v1.isInt32() && v2.isInt32())
         return v1.asInt32() < v2.asInt32();
 
@@ -172,11 +181,14 @@
     bool wasNotString2;
     if (leftFirst) {
         wasNotString1 = v1.getPrimitiveNumber(callFrame, n1, p1);
+        RETURN_IF_EXCEPTION(scope, false);
         wasNotString2 = v2.getPrimitiveNumber(callFrame, n2, p2);
     } else {
         wasNotString2 = v2.getPrimitiveNumber(callFrame, n2, p2);
+        RETURN_IF_EXCEPTION(scope, false);
         wasNotString1 = v1.getPrimitiveNumber(callFrame, n1, p1);
     }
+    RETURN_IF_EXCEPTION(scope, false);
 
     if (wasNotString1 | wasNotString2)
         return n1 < n2;
@@ -189,6 +201,9 @@
 template<bool leftFirst>
 ALWAYS_INLINE bool jsLessEq(CallFrame* callFrame, JSValue v1, JSValue v2)
 {
+    VM& vm = callFrame->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
+
     if (v1.isInt32() && v2.isInt32())
         return v1.asInt32() <= v2.asInt32();
 
@@ -206,11 +221,14 @@
     bool wasNotString2;
     if (leftFirst) {
         wasNotString1 = v1.getPrimitiveNumber(callFrame, n1, p1);
+        RETURN_IF_EXCEPTION(scope, false);
         wasNotString2 = v2.getPrimitiveNumber(callFrame, n2, p2);
     } else {
         wasNotString2 = v2.getPrimitiveNumber(callFrame, n2, p2);
+        RETURN_IF_EXCEPTION(scope, false);
         wasNotString1 = v1.getPrimitiveNumber(callFrame, n1, p1);
     }
+    RETURN_IF_EXCEPTION(scope, false);
 
     if (wasNotString1 | wasNotString2)
         return n1 <= n2;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to