Revision: 20001
Author: [email protected]
Date: Mon Mar 17 15:01:45 2014 UTC
Log: Handlification of ArrayConstructorCommon().
[email protected]
Review URL: https://codereview.chromium.org/200213003
http://code.google.com/p/v8/source/detail?r=20001
Modified:
/branches/bleeding_edge/src/elements.cc
/branches/bleeding_edge/src/elements.h
/branches/bleeding_edge/src/factory.cc
/branches/bleeding_edge/src/factory.h
/branches/bleeding_edge/src/objects.cc
/branches/bleeding_edge/src/objects.h
/branches/bleeding_edge/src/runtime.cc
=======================================
--- /branches/bleeding_edge/src/elements.cc Tue Mar 11 14:39:08 2014 UTC
+++ /branches/bleeding_edge/src/elements.cc Mon Mar 17 15:01:45 2014 UTC
@@ -1908,6 +1908,15 @@
}
return array;
}
+
+
+// TODO(ishell): Temporary wrapper until handlified.
+Handle<Object> ArrayConstructInitializeElements(Handle<JSArray> array,
+ Arguments* args) {
+ CALL_HEAP_FUNCTION(array->GetIsolate(),
+ ArrayConstructInitializeElements(*array, args),
+ Object);
+}
MUST_USE_RESULT MaybeObject* ArrayConstructInitializeElements(
=======================================
--- /branches/bleeding_edge/src/elements.h Tue Mar 11 14:39:08 2014 UTC
+++ /branches/bleeding_edge/src/elements.h Mon Mar 17 15:01:45 2014 UTC
@@ -200,6 +200,9 @@
void CheckArrayAbuse(JSObject* obj, const char* op, uint32_t key,
bool allow_appending = false);
+Handle<Object> ArrayConstructInitializeElements(Handle<JSArray> array,
+ Arguments* args);
+
MUST_USE_RESULT MaybeObject* ArrayConstructInitializeElements(
JSArray* array, Arguments* args);
=======================================
--- /branches/bleeding_edge/src/factory.cc Mon Mar 17 13:42:37 2014 UTC
+++ /branches/bleeding_edge/src/factory.cc Mon Mar 17 15:01:45 2014 UTC
@@ -1408,12 +1408,18 @@
}
-Handle<JSObject> Factory::NewJSObjectFromMap(Handle<Map> map,
- PretenureFlag pretenure,
- bool alloc_props) {
+Handle<JSObject> Factory::NewJSObjectFromMap(
+ Handle<Map> map,
+ PretenureFlag pretenure,
+ bool alloc_props,
+ Handle<AllocationSite> allocation_site) {
CALL_HEAP_FUNCTION(
isolate(),
- isolate()->heap()->AllocateJSObjectFromMap(*map, pretenure,
alloc_props),
+ isolate()->heap()->AllocateJSObjectFromMap(
+ *map,
+ pretenure,
+ alloc_props,
+ allocation_site.is_null() ? NULL : *allocation_site),
JSObject);
}
@@ -1446,6 +1452,18 @@
pretenure),
JSArray);
}
+
+
+void Factory::NewJSArrayStorage(Handle<JSArray> array,
+ int length,
+ int capacity,
+ ArrayStorageAllocationMode mode) {
+ CALL_HEAP_FUNCTION_VOID(isolate(),
+ isolate()->heap()->AllocateJSArrayStorage(*array,
+ length,
+
capacity,
+ mode));
+}
void Factory::SetElementsCapacityAndLength(Handle<JSArray> array,
=======================================
--- /branches/bleeding_edge/src/factory.h Mon Mar 17 13:42:37 2014 UTC
+++ /branches/bleeding_edge/src/factory.h Mon Mar 17 15:01:45 2014 UTC
@@ -334,9 +334,11 @@
// JS objects are pretenured when allocated by the bootstrapper and
// runtime.
- Handle<JSObject> NewJSObjectFromMap(Handle<Map> map,
- PretenureFlag pretenure =
NOT_TENURED,
- bool allocate_properties = true);
+ Handle<JSObject> NewJSObjectFromMap(
+ Handle<Map> map,
+ PretenureFlag pretenure = NOT_TENURED,
+ bool allocate_properties = true,
+ Handle<AllocationSite> allocation_site =
Handle<AllocationSite>::null());
Handle<JSObject> NewJSObjectFromMapForDeoptimizer(
Handle<Map> map, PretenureFlag pretenure = NOT_TENURED);
@@ -356,6 +358,12 @@
ElementsKind elements_kind = TERMINAL_FAST_ELEMENTS_KIND,
PretenureFlag pretenure = NOT_TENURED);
+ void NewJSArrayStorage(
+ Handle<JSArray> array,
+ int length,
+ int capacity,
+ ArrayStorageAllocationMode mode = DONT_INITIALIZE_ARRAY_ELEMENTS);
+
void SetElementsCapacityAndLength(Handle<JSArray> array,
int capacity,
int length);
=======================================
--- /branches/bleeding_edge/src/objects.cc Mon Mar 17 08:31:21 2014 UTC
+++ /branches/bleeding_edge/src/objects.cc Mon Mar 17 15:01:45 2014 UTC
@@ -3360,6 +3360,15 @@
return start_map->AsElementsKind(to_kind);
}
+
+
+// TODO(ishell): Temporary wrapper until handlified.
+// static
+Handle<Map> Map::AsElementsKind(Handle<Map> map, ElementsKind kind) {
+ CALL_HEAP_FUNCTION(map->GetIsolate(),
+ map->AsElementsKind(kind),
+ Map);
+}
MaybeObject* Map::AsElementsKind(ElementsKind kind) {
=======================================
--- /branches/bleeding_edge/src/objects.h Mon Mar 17 13:55:22 2014 UTC
+++ /branches/bleeding_edge/src/objects.h Mon Mar 17 15:01:45 2014 UTC
@@ -6222,6 +6222,7 @@
Descriptor* descriptor,
int index,
TransitionFlag flag);
+ static Handle<Map> AsElementsKind(Handle<Map> map, ElementsKind kind);
MUST_USE_RESULT MaybeObject* AsElementsKind(ElementsKind kind);
MUST_USE_RESULT MaybeObject* CopyAsElementsKind(ElementsKind kind,
=======================================
--- /branches/bleeding_edge/src/runtime.cc Mon Mar 17 08:31:21 2014 UTC
+++ /branches/bleeding_edge/src/runtime.cc Mon Mar 17 15:01:45 2014 UTC
@@ -14749,12 +14749,14 @@
Handle<JSFunction> constructor,
Handle<AllocationSite> site,
Arguments* caller_args) {
+ Factory* factory = isolate->factory();
+
bool holey = false;
bool can_use_type_feedback = true;
if (caller_args->length() == 1) {
- Object* argument_one = (*caller_args)[0];
+ Handle<Object> argument_one = caller_args->at<Object>(0);
if (argument_one->IsSmi()) {
- int value = Smi::cast(argument_one)->value();
+ int value = Handle<Smi>::cast(argument_one)->value();
if (value < 0 || value >= JSObject::kInitialMaxFastElementArray) {
// the array is a dictionary in this case.
can_use_type_feedback = false;
@@ -14767,8 +14769,7 @@
}
}
- JSArray* array;
- MaybeObject* maybe_array;
+ Handle<JSArray> array;
if (!site.is_null() && can_use_type_feedback) {
ElementsKind to_kind = site->GetElementsKind();
if (holey && !IsFastHoleyElementsKind(to_kind)) {
@@ -14780,42 +14781,37 @@
// We should allocate with an initial map that reflects the allocation
site
// advice. Therefore we use AllocateJSObjectFromMap instead of passing
// the constructor.
- Map* initial_map = constructor->initial_map();
+ Handle<Map> initial_map(constructor->initial_map(), isolate);
if (to_kind != initial_map->elements_kind()) {
- MaybeObject* maybe_new_map = initial_map->AsElementsKind(to_kind);
- if (!maybe_new_map->To(&initial_map)) return maybe_new_map;
+ initial_map = Map::AsElementsKind(initial_map, to_kind);
+ RETURN_IF_EMPTY_HANDLE(isolate, initial_map);
}
// If we don't care to track arrays of to_kind ElementsKind, then
// don't emit a memento for them.
- AllocationSite* allocation_site =
- (AllocationSite::GetMode(to_kind) == TRACK_ALLOCATION_SITE)
- ? *site
- : NULL;
+ Handle<AllocationSite> allocation_site;
+ if (AllocationSite::GetMode(to_kind) == TRACK_ALLOCATION_SITE) {
+ allocation_site = site;
+ }
- maybe_array = isolate->heap()->AllocateJSObjectFromMap(initial_map,
- NOT_TENURED,
- true,
-
allocation_site);
- if (!maybe_array->To(&array)) return maybe_array;
+ array = Handle<JSArray>::cast(factory->NewJSObjectFromMap(
+ initial_map, NOT_TENURED, true, allocation_site));
} else {
- maybe_array = isolate->heap()->AllocateJSObject(*constructor);
- if (!maybe_array->To(&array)) return maybe_array;
+ array = Handle<JSArray>::cast(factory->NewJSObject(constructor));
+
// We might need to transition to holey
ElementsKind kind = constructor->initial_map()->elements_kind();
if (holey && !IsFastHoleyElementsKind(kind)) {
kind = GetHoleyElementsKind(kind);
- maybe_array = array->TransitionElementsKind(kind);
- if (maybe_array->IsFailure()) return maybe_array;
+ JSObject::TransitionElementsKind(array, kind);
}
}
- maybe_array = isolate->heap()->AllocateJSArrayStorage(array, 0, 0,
- DONT_INITIALIZE_ARRAY_ELEMENTS);
- if (maybe_array->IsFailure()) return maybe_array;
+ factory->NewJSArrayStorage(array, 0, 0, DONT_INITIALIZE_ARRAY_ELEMENTS);
+
ElementsKind old_kind = array->GetElementsKind();
- maybe_array = ArrayConstructInitializeElements(array, caller_args);
- if (maybe_array->IsFailure()) return maybe_array;
+ RETURN_IF_EMPTY_HANDLE(isolate,
+ ArrayConstructInitializeElements(array,
caller_args));
if (!site.is_null() &&
(old_kind != array->GetElementsKind() ||
!can_use_type_feedback)) {
@@ -14824,7 +14820,7 @@
// We must mark the allocationsite as un-inlinable.
site->SetDoNotInlineCall();
}
- return array;
+ return *array;
}
--
--
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.