Title: [170517] trunk
Revision
170517
Author
[email protected]
Date
2014-06-26 20:20:34 -0700 (Thu, 26 Jun 2014)

Log Message

iOS 8 beta 2 ES6 'Set' clear() broken
https://bugs.webkit.org/show_bug.cgi?id=134346

Reviewed by Oliver Hunt.


Source/_javascript_Core: 
The object map was not cleared :(.

Kudos to Ashley Gullen for tracking this and making a regression test.
Credit to Oliver for finding the missing code.

* runtime/MapData.h:
(JSC::MapData::clear):

LayoutTests: 
* js/script-tests/set-clear.js: Added.
* js/set-clear-expected.txt: Added.
* js/set-clear.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (170516 => 170517)


--- trunk/LayoutTests/ChangeLog	2014-06-27 02:43:21 UTC (rev 170516)
+++ trunk/LayoutTests/ChangeLog	2014-06-27 03:20:34 UTC (rev 170517)
@@ -1,3 +1,14 @@
+2014-06-26  Benjamin Poulain  <[email protected]>
+
+        iOS 8 beta 2 ES6 'Set' clear() broken
+        https://bugs.webkit.org/show_bug.cgi?id=134346
+
+        Reviewed by Oliver Hunt.
+
+        * js/script-tests/set-clear.js: Added.
+        * js/set-clear-expected.txt: Added.
+        * js/set-clear.html: Added.
+
 2014-06-26  Manuel Rego Casasnovas  <[email protected]>
 
         [CSS Grid Layout] Properly support for z-index on grid items

Added: trunk/LayoutTests/js/map-clear-expected.txt (0 => 170517)


--- trunk/LayoutTests/js/map-clear-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/js/map-clear-expected.txt	2014-06-27 03:20:34 UTC (rev 170517)
@@ -0,0 +1,30 @@
+Tests basic correctness of ES Map's clear() API
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS stringMap.size is 0
+PASS stringMap.values.length is 0
+PASS stringMap.has('Oliver') is false
+PASS stringMap.has('Benjamin') is false
+PASS valueMap.size is 0
+PASS valueMap.values.length is 0
+PASS valueMap.has(0) is false
+PASS valueMap.has(1) is false
+PASS objectMap.size is 0
+PASS objectMap.values.length is 0
+PASS objectMap.has(anArray) is false
+PASS objectMap.has(anObject) is false
+PASS objectMap.has(otherObject) is false
+PASS mixedTypeMap.size is 0
+PASS mixedTypeMap.values.length is 0
+PASS mixedTypeMap.has(0) is false
+PASS mixedTypeMap.has('Oliver') is false
+PASS mixedTypeMap.has(stringMap) is false
+PASS mixedTypeMap.has(valueMap) is false
+PASS mixedTypeMap.has(objectMap) is false
+PASS mixedTypeMap.has(anObject) is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/js/map-clear.html (0 => 170517)


--- trunk/LayoutTests/js/map-clear.html	                        (rev 0)
+++ trunk/LayoutTests/js/map-clear.html	2014-06-27 03:20:34 UTC (rev 170517)
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script src=""
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/js/script-tests/map-clear.js (0 => 170517)


--- trunk/LayoutTests/js/script-tests/map-clear.js	                        (rev 0)
+++ trunk/LayoutTests/js/script-tests/map-clear.js	2014-06-27 03:20:34 UTC (rev 170517)
@@ -0,0 +1,58 @@
+description("Tests basic correctness of ES Map's clear() API");
+
+// Map containing only String types.
+var stringMap = new Map;
+stringMap.set('Oliver', 'Hunt');
+stringMap.set('Benjamin', 'Poulain');
+
+stringMap.clear();
+shouldBe("stringMap.size", "0");
+shouldBe("stringMap.values.length", "0");
+shouldBeFalse("stringMap.has('Oliver')");
+shouldBeFalse("stringMap.has('Benjamin')");
+
+// Map containing only primitive values.
+var valueMap = new Map;
+valueMap.set(0, 1);
+valueMap.set(1, 2);
+
+valueMap.clear();
+shouldBe("valueMap.size", "0");
+shouldBe("valueMap.values.length", "0");
+shouldBeFalse("valueMap.has(0)");
+shouldBeFalse("valueMap.has(1)");
+
+// Map containing objects;
+var objectMap = new Map;
+var anArray = new Array;
+objectMap.set(anArray, 0);
+var anObject = new Object;
+objectMap.set(anObject, 1);
+var otherObject = {"a":1, "b":2};
+objectMap.set(otherObject, 2);
+
+objectMap.clear();
+shouldBe("objectMap.size", "0");
+shouldBe("objectMap.values.length", "0");
+shouldBeFalse("objectMap.has(anArray)");
+shouldBeFalse("objectMap.has(anObject)");
+shouldBeFalse("objectMap.has(otherObject)");
+
+// Mixed types.
+var mixedTypeMap = new Map;
+mixedTypeMap.set(0, objectMap);
+mixedTypeMap.set('Oliver', stringMap);
+mixedTypeMap.set(stringMap, valueMap);
+mixedTypeMap.set(valueMap, anObject);
+mixedTypeMap.set(objectMap, objectMap);
+mixedTypeMap.set(anObject, stringMap);
+
+mixedTypeMap.clear();
+shouldBe("mixedTypeMap.size", "0");
+shouldBe("mixedTypeMap.values.length", "0");
+shouldBeFalse("mixedTypeMap.has(0)");
+shouldBeFalse("mixedTypeMap.has('Oliver')");
+shouldBeFalse("mixedTypeMap.has(stringMap)");
+shouldBeFalse("mixedTypeMap.has(valueMap)");
+shouldBeFalse("mixedTypeMap.has(objectMap)");
+shouldBeFalse("mixedTypeMap.has(anObject)");

Added: trunk/LayoutTests/js/script-tests/set-clear.js (0 => 170517)


--- trunk/LayoutTests/js/script-tests/set-clear.js	                        (rev 0)
+++ trunk/LayoutTests/js/script-tests/set-clear.js	2014-06-27 03:20:34 UTC (rev 170517)
@@ -0,0 +1,58 @@
+description("Tests basic correctness of ES Set's clear() API");
+
+// Set containing only String types.
+var stringSet = new Set;
+stringSet.add('Oliver');
+stringSet.add('Benjamin');
+
+stringSet.clear();
+shouldBe("stringSet.size", "0");
+shouldBe("stringSet.values.length", "0");
+shouldBeFalse("stringSet.has('Oliver')");
+shouldBeFalse("stringSet.has('Benjamin')");
+
+// Set containing only primitive values.
+var valueSet = new Set;
+valueSet.add(0);
+valueSet.add(1);
+
+valueSet.clear();
+shouldBe("valueSet.size", "0");
+shouldBe("valueSet.values.length", "0");
+shouldBeFalse("valueSet.has(0)");
+shouldBeFalse("valueSet.has(1)");
+
+// Set containing objects;
+var objectSet = new Set;
+var anArray = new Array;
+objectSet.add(anArray);
+var anObject = new Object;
+objectSet.add(anObject);
+var otherObject = {"a":1, "b":2};
+objectSet.add(otherObject);
+
+objectSet.clear();
+shouldBe("objectSet.size", "0");
+shouldBe("objectSet.values.length", "0");
+shouldBeFalse("objectSet.has(anArray)");
+shouldBeFalse("objectSet.has(anObject)");
+shouldBeFalse("objectSet.has(otherObject)");
+
+// Mixed types.
+var mixedTypeSet = new Set;
+mixedTypeSet.add(0);
+mixedTypeSet.add('Oliver');
+mixedTypeSet.add(stringSet);
+mixedTypeSet.add(valueSet);
+mixedTypeSet.add(objectSet);
+mixedTypeSet.add(anObject);
+
+mixedTypeSet.clear();
+shouldBe("mixedTypeSet.size", "0");
+shouldBe("mixedTypeSet.values.length", "0");
+shouldBeFalse("mixedTypeSet.has(0)");
+shouldBeFalse("mixedTypeSet.has('Oliver')");
+shouldBeFalse("mixedTypeSet.has(stringSet)");
+shouldBeFalse("mixedTypeSet.has(valueSet)");
+shouldBeFalse("mixedTypeSet.has(objectSet)");
+shouldBeFalse("mixedTypeSet.has(anObject)");

Added: trunk/LayoutTests/js/set-clear-expected.txt (0 => 170517)


--- trunk/LayoutTests/js/set-clear-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/js/set-clear-expected.txt	2014-06-27 03:20:34 UTC (rev 170517)
@@ -0,0 +1,30 @@
+Tests basic correctness of ES Set's clear() API
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS stringSet.size is 0
+PASS stringSet.values.length is 0
+PASS stringSet.has('Oliver') is false
+PASS stringSet.has('Benjamin') is false
+PASS valueSet.size is 0
+PASS valueSet.values.length is 0
+PASS valueSet.has(0) is false
+PASS valueSet.has(1) is false
+PASS objectSet.size is 0
+PASS objectSet.values.length is 0
+PASS objectSet.has(anArray) is false
+PASS objectSet.has(anObject) is false
+PASS objectSet.has(otherObject) is false
+PASS mixedTypeSet.size is 0
+PASS mixedTypeSet.values.length is 0
+PASS mixedTypeSet.has(0) is false
+PASS mixedTypeSet.has('Oliver') is false
+PASS mixedTypeSet.has(stringSet) is false
+PASS mixedTypeSet.has(valueSet) is false
+PASS mixedTypeSet.has(objectSet) is false
+PASS mixedTypeSet.has(anObject) is false
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/js/set-clear.html (0 => 170517)


--- trunk/LayoutTests/js/set-clear.html	                        (rev 0)
+++ trunk/LayoutTests/js/set-clear.html	2014-06-27 03:20:34 UTC (rev 170517)
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script src=""
+<script src=""
+</body>
+</html>

Modified: trunk/Source/_javascript_Core/ChangeLog (170516 => 170517)


--- trunk/Source/_javascript_Core/ChangeLog	2014-06-27 02:43:21 UTC (rev 170516)
+++ trunk/Source/_javascript_Core/ChangeLog	2014-06-27 03:20:34 UTC (rev 170517)
@@ -1,3 +1,18 @@
+2014-06-26  Benjamin Poulain  <[email protected]>
+
+        iOS 8 beta 2 ES6 'Set' clear() broken
+        https://bugs.webkit.org/show_bug.cgi?id=134346
+
+        Reviewed by Oliver Hunt.
+
+        The object map was not cleared :(.
+
+        Kudos to Ashley Gullen for tracking this and making a regression test.
+        Credit to Oliver for finding the missing code.
+
+        * runtime/MapData.h:
+        (JSC::MapData::clear):
+
 2014-06-25  Brent Fulgham  <[email protected]>
 
         [Win] Expose Cache Information to WinLauncher

Modified: trunk/Source/_javascript_Core/runtime/MapData.h (170516 => 170517)


--- trunk/Source/_javascript_Core/runtime/MapData.h	2014-06-27 02:43:21 UTC (rev 170516)
+++ trunk/Source/_javascript_Core/runtime/MapData.h	2014-06-27 03:20:34 UTC (rev 170517)
@@ -142,12 +142,13 @@
 
 ALWAYS_INLINE void MapData::clear()
 {
+    m_cellKeyedTable.clear();
     m_valueKeyedTable.clear();
     m_stringKeyedTable.clear();
     m_capacity = 0;
     m_size = 0;
     m_deletedCount = 0;
-    m_entries = 0;
+    m_entries = nullptr;
 }
 
 ALWAYS_INLINE MapData::KeyType::KeyType(JSValue v)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to