speculationFromCell() should speculate non-Identifier strings as SpecString instead...
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Dec 2018 04:34:27 +0000 (04:34 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Dec 2018 04:34:27 +0000 (04:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=192441
<rdar://problem/46480355>

Reviewed by Saam Barati.

JSTests:

* stress/regress-192441.js: Added.

Source/JavaScriptCore:

This is because a regular String (non-Identifier) can be converted into an
Identifier.  During DFG/FTL compilation, AbstractValue::checkConsistency() may
expect a value to be of type SpecStringVar, but the mutator thread may have
converted the string into an Identifier.  This creates a race where
AbstractValue::checkConsistency() may fail because it sees a SpecStringIdent when
it expects the a SpecStringVar.

The fix is to speculate non-Identifier strings as type SpecString which allows it
to be SpecStringVar or SpecStringIndent.

* bytecode/SpeculatedType.cpp:
(JSC::speculationFromCell):

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

JSTests/ChangeLog
JSTests/stress/regress-192441.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecode/SpeculatedType.cpp

index 274fce0..a40c5dd 100644 (file)
@@ -1,3 +1,13 @@
+2018-12-05  Mark Lam  <mark.lam@apple.com>
+
+        speculationFromCell() should speculate non-Identifier strings as SpecString instead of SpecStringVar.
+        https://bugs.webkit.org/show_bug.cgi?id=192441
+        <rdar://problem/46480355>
+
+        Reviewed by Saam Barati.
+
+        * stress/regress-192441.js: Added.
+
 2018-12-04  Mark Lam  <mark.lam@apple.com>
 
         DFG's StrengthReduction phase should not reduce Construct into DirectContruct when the executable does not have constructAbility.
diff --git a/JSTests/stress/regress-192441.js b/JSTests/stress/regress-192441.js
new file mode 100644 (file)
index 0000000..e56d11a
--- /dev/null
@@ -0,0 +1,12 @@
+//@ requireOptions("--jitPolicyScale=0")
+
+// This test passes if it does not crash.
+
+let x = {}
+let enUS = ['en', 'US'].join('-')
+for (let i=0; i<100; i++) {
+    Intl.NumberFormat(enUS)
+}
+for (let i=0; i<10000; i++) {
+    x[enUS]
+};
index 501fd76..ac53c4c 100644 (file)
@@ -1,3 +1,24 @@
+2018-12-05  Mark Lam  <mark.lam@apple.com>
+
+        speculationFromCell() should speculate non-Identifier strings as SpecString instead of SpecStringVar.
+        https://bugs.webkit.org/show_bug.cgi?id=192441
+        <rdar://problem/46480355>
+
+        Reviewed by Saam Barati.
+
+        This is because a regular String (non-Identifier) can be converted into an
+        Identifier.  During DFG/FTL compilation, AbstractValue::checkConsistency() may
+        expect a value to be of type SpecStringVar, but the mutator thread may have
+        converted the string into an Identifier.  This creates a race where
+        AbstractValue::checkConsistency() may fail because it sees a SpecStringIdent when
+        it expects the a SpecStringVar.  
+
+        The fix is to speculate non-Identifier strings as type SpecString which allows it
+        to be SpecStringVar or SpecStringIndent.
+
+        * bytecode/SpeculatedType.cpp:
+        (JSC::speculationFromCell):
+
 2018-12-04  Mark Lam  <mark.lam@apple.com>
 
         DFG's StrengthReduction phase should not reduce Construct into DirectContruct when the executable does not have constructAbility.
index 66b07db..cba2117 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2017 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -480,7 +480,7 @@ SpeculatedType speculationFromCell(JSCell* cell)
             if (impl->isAtomic())
                 return SpecStringIdent;
         }
-        return SpecStringVar;
+        return SpecString;
     }
     return speculationFromStructure(cell->structure());
 }