Index: src/runtime/runtime-array.cc |
diff --git a/src/runtime/runtime-array.cc b/src/runtime/runtime-array.cc |
index a0b3080a092a4a1fa910338cfb18914038e601e6..52d921885da1f6009cc4c9504b0dff65c6f80123 100644 |
--- a/src/runtime/runtime-array.cc |
+++ b/src/runtime/runtime-array.cc |
@@ -85,6 +85,29 @@ |
CONVERT_ARG_HANDLE_CHECKED(Map, map, 1); |
JSObject::TransitionElementsKind(array, map->elements_kind()); |
return *array; |
+} |
+ |
+ |
+// Push an object unto an array of objects if it is not already in the |
+// array. Returns true if the element was pushed on the stack and |
+// false otherwise. |
+RUNTIME_FUNCTION(Runtime_PushIfAbsent) { |
+ HandleScope scope(isolate); |
+ DCHECK(args.length() == 2); |
+ CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(JSReceiver, element, 1); |
+ RUNTIME_ASSERT(array->HasFastSmiOrObjectElements()); |
+ int length = Smi::cast(array->length())->value(); |
+ FixedArray* elements = FixedArray::cast(array->elements()); |
+ for (int i = 0; i < length; i++) { |
+ if (elements->get(i) == *element) return isolate->heap()->false_value(); |
+ } |
+ |
+ // Strict not needed. Used for cycle detection in Array join implementation. |
+ RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, JSObject::AddDataElement(array, length, element, NONE)); |
+ JSObject::ValidateElements(array); |
+ return isolate->heap()->true_value(); |
} |