Commit dd430071 authored by bmeurer's avatar bmeurer Committed by Commit bot

[turbofan] Simplify graph construction for for-in.

This is an initial step towards a faster and less incorrect
implementation of for-in in TurboFan.

R=jarin@chromium.org

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

Cr-Commit-Position: refs/heads/master@{#28682}
parent d8b94f34
......@@ -1331,27 +1331,14 @@ void AstGraphBuilder::VisitForInStatement(ForInStatement* stmt) {
NewNode(javascript()->CallRuntime(Runtime::kForInCacheArrayLength, 2),
cache_type, cache_array);
{
// TODO(dcarney): this check is actually supposed to be for the
// empty enum case only.
IfBuilder have_no_properties(this);
Node* empty_array_cond = NewNode(javascript()->StrictEqual(),
cache_length, jsgraph()->ZeroConstant());
have_no_properties.If(empty_array_cond);
have_no_properties.Then();
// Pop obj and skip loop.
environment()->Pop();
have_no_properties.Else();
{
// Construct the rest of the environment.
environment()->Push(cache_type);
environment()->Push(cache_array);
environment()->Push(cache_length);
environment()->Push(jsgraph()->ZeroConstant());
// Build the actual loop body.
VisitForInBody(stmt);
}
have_no_properties.End();
// Construct the rest of the environment.
environment()->Push(cache_type);
environment()->Push(cache_array);
environment()->Push(cache_length);
environment()->Push(jsgraph()->ZeroConstant());
// Build the actual loop body.
VisitForInBody(stmt);
}
is_null.End();
}
......
......@@ -1318,14 +1318,9 @@ RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ForInInit) {
Handle<Object> cache_type = args.at<Object>(1);
if (cache_type->IsMap()) {
// Enum cache case.
if (Map::EnumLengthBits::decode(Map::cast(*cache_type)->bit_field3()) ==
0) {
// 0 length enum.
// Can't handle this case in the graph builder,
// so transform it into the empty fixed array case.
return MakePair(isolate->heap()->empty_fixed_array(), Smi::FromInt(1));
}
return MakePair(object->map()->instance_descriptors()->GetEnumCache(),
return MakePair(Map::cast(*cache_type)->EnumLength() != 0
? object->map()->instance_descriptors()->GetEnumCache()
: isolate->heap()->empty_fixed_array(),
*cache_type);
} else {
// FixedArray case.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment