Revision: 21408
Author: [email protected]
Date: Wed May 21 12:16:47 2014 UTC
Log: Teach OrderedHashSet::Remove to report whether it actually
removed anything
This avoids an unnecessary runtime call from Set.prototype.delete().
[email protected]
Review URL: https://codereview.chromium.org/290733008
http://code.google.com/p/v8/source/detail?r=21408
Modified:
/branches/bleeding_edge/src/collection.js
/branches/bleeding_edge/src/objects.cc
/branches/bleeding_edge/src/objects.h
/branches/bleeding_edge/src/runtime.cc
/branches/bleeding_edge/test/cctest/test-ordered-hash-table.cc
=======================================
--- /branches/bleeding_edge/src/collection.js Wed May 21 09:25:50 2014 UTC
+++ /branches/bleeding_edge/src/collection.js Wed May 21 12:16:47 2014 UTC
@@ -47,12 +47,7 @@
throw MakeTypeError('incompatible_method_receiver',
['Set.prototype.delete', this]);
}
- if (%SetHas(this, key)) {
- %SetDelete(this, key);
- return true;
- } else {
- return false;
- }
+ return %SetDelete(this, key);
}
=======================================
--- /branches/bleeding_edge/src/objects.cc Wed May 21 08:47:02 2014 UTC
+++ /branches/bleeding_edge/src/objects.cc Wed May 21 12:16:47 2014 UTC
@@ -16456,9 +16456,14 @@
Handle<OrderedHashSet> OrderedHashSet::Remove(Handle<OrderedHashSet> table,
- Handle<Object> key) {
+ Handle<Object> key,
+ bool* was_present) {
int entry = table->FindEntry(key);
- if (entry == kNotFound) return table;
+ if (entry == kNotFound) {
+ *was_present = false;
+ return table;
+ }
+ *was_present = true;
table->RemoveEntry(entry);
return Shrink(table);
}
=======================================
--- /branches/bleeding_edge/src/objects.h Wed May 21 08:47:02 2014 UTC
+++ /branches/bleeding_edge/src/objects.h Wed May 21 12:16:47 2014 UTC
@@ -4323,7 +4323,7 @@
static Handle<OrderedHashSet> Add(
Handle<OrderedHashSet> table, Handle<Object> key);
static Handle<OrderedHashSet> Remove(
- Handle<OrderedHashSet> table, Handle<Object> key);
+ Handle<OrderedHashSet> table, Handle<Object> key, bool* was_present);
};
=======================================
--- /branches/bleeding_edge/src/runtime.cc Wed May 21 09:49:18 2014 UTC
+++ /branches/bleeding_edge/src/runtime.cc Wed May 21 12:16:47 2014 UTC
@@ -1554,9 +1554,10 @@
CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table()));
- table = OrderedHashSet::Remove(table, key);
+ bool was_present = false;
+ table = OrderedHashSet::Remove(table, key, &was_present);
holder->set_table(*table);
- return isolate->heap()->undefined_value();
+ return isolate->heap()->ToBoolean(was_present);
}
=======================================
--- /branches/bleeding_edge/test/cctest/test-ordered-hash-table.cc Tue Apr
29 14:16:38 2014 UTC
+++ /branches/bleeding_edge/test/cctest/test-ordered-hash-table.cc Wed May
21 12:16:47 2014 UTC
@@ -75,10 +75,16 @@
ordered_set = OrderedHashSet::Add(ordered_set, obj);
CHECK_EQ(1, ordered_set->NumberOfElements());
CHECK(ordered_set->Contains(obj));
- ordered_set = OrderedHashSet::Remove(ordered_set, obj);
+ bool was_present = false;
+ ordered_set = OrderedHashSet::Remove(ordered_set, obj, &was_present);
+ CHECK(was_present);
CHECK_EQ(0, ordered_set->NumberOfElements());
CHECK(!ordered_set->Contains(obj));
+ // Removing a not-present object should set was_present to false.
+ ordered_set = OrderedHashSet::Remove(ordered_set, obj, &was_present);
+ CHECK(!was_present);
+
// Test for collisions/chaining
Handle<JSObject> obj1 = factory->NewJSObjectFromMap(map);
ordered_set = OrderedHashSet::Add(ordered_set, obj1);
@@ -133,10 +139,14 @@
true);
// Test shrinking
- ordered_set = OrderedHashSet::Remove(ordered_set, obj);
- ordered_set = OrderedHashSet::Remove(ordered_set, obj1);
- ordered_set = OrderedHashSet::Remove(ordered_set, obj2);
- ordered_set = OrderedHashSet::Remove(ordered_set, obj3);
+ ordered_set = OrderedHashSet::Remove(ordered_set, obj, &was_present);
+ CHECK(was_present);
+ ordered_set = OrderedHashSet::Remove(ordered_set, obj1, &was_present);
+ CHECK(was_present);
+ ordered_set = OrderedHashSet::Remove(ordered_set, obj2, &was_present);
+ CHECK(was_present);
+ ordered_set = OrderedHashSet::Remove(ordered_set, obj3, &was_present);
+ CHECK(was_present);
CHECK_EQ(1, ordered_set->NumberOfElements());
CHECK_EQ(2, ordered_set->NumberOfBuckets());
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.