Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 78bf25a0f7d558e07d6b8e74fd2fe7d698dc05a2..39c3d2957d554610e094e3178adbd01d50d8787d 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -3124,12 +3124,18 @@ RUNTIME_FUNCTION(Runtime_SetExpectedNumberOfProperties) { |
CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); |
CONVERT_SMI_ARG_CHECKED(num, 1); |
RUNTIME_ASSERT(num >= 0); |
- |
- func->shared()->set_expected_nof_properties(num); |
- if (func->has_initial_map()) { |
- Handle<Map> new_initial_map = Map::Copy(handle(func->initial_map())); |
- new_initial_map->set_unused_property_fields(num); |
- func->set_initial_map(*new_initial_map); |
+ // If objects constructed from this function exist then changing |
+ // 'estimated_nof_properties' is dangerous since the previous value might |
+ // have been compiled into the fast construct stub. Moreover, the inobject |
+ // slack tracking logic might have adjusted the previous value, so even |
+ // passing the same value is risky. |
+ if (!func->shared()->live_objects_may_exist()) { |
+ func->shared()->set_expected_nof_properties(num); |
+ if (func->has_initial_map()) { |
+ Handle<Map> new_initial_map = Map::Copy(handle(func->initial_map())); |
+ new_initial_map->set_unused_property_fields(num); |
+ func->set_initial_map(*new_initial_map); |
+ } |
} |
return isolate->heap()->undefined_value(); |
} |
@@ -8366,6 +8372,15 @@ static Object* Runtime_NewObjectHelper(Isolate* isolate, |
// available. |
Compiler::EnsureCompiled(function, CLEAR_EXCEPTION); |
+ Handle<SharedFunctionInfo> shared(function->shared(), isolate); |
+ if (!function->has_initial_map() && |
+ shared->IsInobjectSlackTrackingInProgress()) { |
+ // The tracking is already in progress for another function. We can only |
+ // track one initial_map at a time, so we force the completion before the |
+ // function is called as a constructor for the first time. |
+ shared->CompleteInobjectSlackTracking(); |
+ } |
+ |
Handle<JSObject> result; |
if (site.is_null()) { |
result = isolate->factory()->NewJSObject(function); |
@@ -8409,7 +8424,7 @@ RUNTIME_FUNCTION(RuntimeHidden_FinalizeInstanceSize) { |
ASSERT(args.length() == 1); |
CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
- function->CompleteInobjectSlackTracking(); |
+ function->shared()->CompleteInobjectSlackTracking(); |
return isolate->heap()->undefined_value(); |
} |