Check for cached transition to ExternalArray elements kind.

R=ishell@chromium.org, verwaest@chromium.org
BUG=v8:3337
LOG=Y

Review URL: https://codereview.chromium.org/291193011

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21466 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
dslomov@chromium.org 2014-05-23 14:01:17 +00:00
parent 18412a83b0
commit 45ab7d5266
2 changed files with 25 additions and 1 deletions

View File

@ -3379,9 +3379,16 @@ static Map* FindClosestElementsTransition(Map* map, ElementsKind to_kind) {
? to_kind ? to_kind
: TERMINAL_FAST_ELEMENTS_KIND; : TERMINAL_FAST_ELEMENTS_KIND;
// Support for legacy API. // Support for legacy API: SetIndexedPropertiesTo{External,Pixel}Data
// allows to change elements from arbitrary kind to any ExternalArray
// elements kind. Satisfy its requirements, checking whether we already
// have the cached transition.
if (IsExternalArrayElementsKind(to_kind) && if (IsExternalArrayElementsKind(to_kind) &&
!IsFixedTypedArrayElementsKind(map->elements_kind())) { !IsFixedTypedArrayElementsKind(map->elements_kind())) {
if (map->HasElementsTransition()) {
Map* next_map = map->elements_transition_map();
if (next_map->elements_kind() == to_kind) return next_map;
}
return map; return map;
} }

View File

@ -21357,6 +21357,23 @@ THREADED_TEST(Regress142088) {
} }
THREADED_TEST(Regress3337) {
LocalContext context;
v8::Isolate* isolate = context->GetIsolate();
v8::HandleScope scope(isolate);
Local<v8::Object> o1 = Object::New(isolate);
Local<v8::Object> o2 = Object::New(isolate);
i::Handle<i::JSObject> io1 = v8::Utils::OpenHandle(*o1);
i::Handle<i::JSObject> io2 = v8::Utils::OpenHandle(*o2);
CHECK(io1->map() == io2->map());
o1->SetIndexedPropertiesToExternalArrayData(
NULL, v8::kExternalUint32Array, 0);
o2->SetIndexedPropertiesToExternalArrayData(
NULL, v8::kExternalUint32Array, 0);
CHECK(io1->map() == io2->map());
}
THREADED_TEST(Regress137496) { THREADED_TEST(Regress137496) {
i::FLAG_expose_gc = true; i::FLAG_expose_gc = true;
LocalContext context; LocalContext context;