Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/api-natives.h" | 5 #include "src/api-natives.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/isolate-inl.h" | 8 #include "src/isolate-inl.h" |
| 9 #include "src/lookup.h" | 9 #include "src/lookup.h" |
| 10 #include "src/messages.h" | 10 #include "src/messages.h" |
| (...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 297 Handle<JSReceiver> new_target, | 297 Handle<JSReceiver> new_target, |
| 298 bool is_hidden_prototype) { | 298 bool is_hidden_prototype) { |
| 299 Handle<JSFunction> constructor; | 299 Handle<JSFunction> constructor; |
| 300 uint32_t serial_number = | 300 uint32_t serial_number = |
| 301 static_cast<uint32_t>(Smi::cast(info->serial_number())->value()); | 301 static_cast<uint32_t>(Smi::cast(info->serial_number())->value()); |
| 302 if (!new_target.is_null()) { | 302 if (!new_target.is_null()) { |
| 303 if (new_target->IsJSFunction() && | 303 if (new_target->IsJSFunction() && |
| 304 JSFunction::cast(*new_target)->shared()->function_data() == | 304 JSFunction::cast(*new_target)->shared()->function_data() == |
| 305 info->constructor() && | 305 info->constructor() && |
| 306 JSFunction::cast(*new_target)->context()->native_context() == | 306 JSFunction::cast(*new_target)->context()->native_context() == |
| 307 isolate->context()->native_context()) { | 307 isolate->context()->native_context() && |
| 308 !info->immutable_proto()) { | |
| 308 constructor = Handle<JSFunction>::cast(new_target); | 309 constructor = Handle<JSFunction>::cast(new_target); |
| 309 } else { | 310 } else { |
| 310 // Disable caching for subclass instantiation. | 311 // Disable caching for subclass instantiation. |
| 311 serial_number = 0; | 312 serial_number = 0; |
| 312 } | 313 } |
| 313 } | 314 } |
| 314 // Fast path. | 315 // Fast path. |
| 315 Handle<JSObject> result; | 316 Handle<JSObject> result; |
| 316 if (serial_number) { | 317 if (serial_number) { |
| 317 // Probe cache. | 318 // Probe cache. |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 339 | 340 |
| 340 if (new_target.is_null()) new_target = constructor; | 341 if (new_target.is_null()) new_target = constructor; |
| 341 } | 342 } |
| 342 | 343 |
| 343 Handle<JSObject> object; | 344 Handle<JSObject> object; |
| 344 ASSIGN_RETURN_ON_EXCEPTION(isolate, object, | 345 ASSIGN_RETURN_ON_EXCEPTION(isolate, object, |
| 345 JSObject::New(constructor, new_target), JSObject); | 346 JSObject::New(constructor, new_target), JSObject); |
| 346 ASSIGN_RETURN_ON_EXCEPTION( | 347 ASSIGN_RETURN_ON_EXCEPTION( |
| 347 isolate, result, | 348 isolate, result, |
| 348 ConfigureInstance(isolate, object, info, is_hidden_prototype), JSObject); | 349 ConfigureInstance(isolate, object, info, is_hidden_prototype), JSObject); |
| 350 if (info->immutable_proto()) { | |
| 351 MAYBE_RETURN(JSObject::SetImmutableProto( | |
|
Toon Verwaest
2016/06/30 15:35:33
I don't think we need to walk the hidden prototype
Dan Ehrenberg
2016/06/30 23:12:41
Removed all that extra useless code.
| |
| 352 object, false, Object::ShouldThrow::THROW_ON_ERROR), | |
| 353 MaybeHandle<JSObject>()); | |
| 354 } | |
| 349 // TODO(dcarney): is this necessary? | 355 // TODO(dcarney): is this necessary? |
| 350 JSObject::MigrateSlowToFast(result, 0, "ApiNatives::InstantiateObject"); | 356 JSObject::MigrateSlowToFast(result, 0, "ApiNatives::InstantiateObject"); |
| 351 | 357 |
| 352 if (serial_number) { | 358 if (serial_number) { |
| 353 CacheTemplateInstantiation(isolate, serial_number, result); | 359 CacheTemplateInstantiation(isolate, serial_number, result); |
| 354 result = isolate->factory()->CopyJSObject(result); | 360 result = isolate->factory()->CopyJSObject(result); |
| 355 } | 361 } |
| 356 return scope.CloseAndEscape(result); | 362 return scope.CloseAndEscape(result); |
| 357 } | 363 } |
| 358 | 364 |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 565 } else { | 571 } else { |
| 566 JSObject::AddProperty(Handle<JSObject>::cast(prototype), | 572 JSObject::AddProperty(Handle<JSObject>::cast(prototype), |
| 567 isolate->factory()->constructor_string(), result, | 573 isolate->factory()->constructor_string(), result, |
| 568 DONT_ENUM); | 574 DONT_ENUM); |
| 569 } | 575 } |
| 570 | 576 |
| 571 int internal_field_count = 0; | 577 int internal_field_count = 0; |
| 572 if (!obj->instance_template()->IsUndefined(isolate)) { | 578 if (!obj->instance_template()->IsUndefined(isolate)) { |
| 573 Handle<ObjectTemplateInfo> instance_template = Handle<ObjectTemplateInfo>( | 579 Handle<ObjectTemplateInfo> instance_template = Handle<ObjectTemplateInfo>( |
| 574 ObjectTemplateInfo::cast(obj->instance_template())); | 580 ObjectTemplateInfo::cast(obj->instance_template())); |
| 575 internal_field_count = | 581 internal_field_count = instance_template->internal_field_count(); |
| 576 Smi::cast(instance_template->internal_field_count())->value(); | |
| 577 } | 582 } |
| 578 | 583 |
| 579 // TODO(svenpanne) Kill ApiInstanceType and refactor things by generalizing | 584 // TODO(svenpanne) Kill ApiInstanceType and refactor things by generalizing |
| 580 // JSObject::GetHeaderSize. | 585 // JSObject::GetHeaderSize. |
| 581 int instance_size = kPointerSize * internal_field_count; | 586 int instance_size = kPointerSize * internal_field_count; |
| 582 InstanceType type; | 587 InstanceType type; |
| 583 switch (instance_type) { | 588 switch (instance_type) { |
| 584 case JavaScriptObjectType: | 589 case JavaScriptObjectType: |
| 585 if (!obj->needs_access_check() && | 590 if (!obj->needs_access_check() && |
| 586 obj->named_property_handler()->IsUndefined(isolate) && | 591 obj->named_property_handler()->IsUndefined(isolate) && |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 631 if (!obj->instance_call_handler()->IsUndefined(isolate)) { | 636 if (!obj->instance_call_handler()->IsUndefined(isolate)) { |
| 632 map->set_is_callable(); | 637 map->set_is_callable(); |
| 633 map->set_is_constructor(true); | 638 map->set_is_constructor(true); |
| 634 } | 639 } |
| 635 | 640 |
| 636 return result; | 641 return result; |
| 637 } | 642 } |
| 638 | 643 |
| 639 } // namespace internal | 644 } // namespace internal |
| 640 } // namespace v8 | 645 } // namespace v8 |
| OLD | NEW |