Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(329)

Side by Side Diff: src/objects.cc

Issue 247013002: Replaced empty handle checks with MaybeHandles (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Removed unnecessary assert. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/runtime.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 5843 matching lines...) Expand 10 before | Expand all | Expand 10 after
5854 5854
5855 template<class ContextObject> 5855 template<class ContextObject>
5856 class JSObjectWalkVisitor { 5856 class JSObjectWalkVisitor {
5857 public: 5857 public:
5858 JSObjectWalkVisitor(ContextObject* site_context, bool copying, 5858 JSObjectWalkVisitor(ContextObject* site_context, bool copying,
5859 JSObject::DeepCopyHints hints) 5859 JSObject::DeepCopyHints hints)
5860 : site_context_(site_context), 5860 : site_context_(site_context),
5861 copying_(copying), 5861 copying_(copying),
5862 hints_(hints) {} 5862 hints_(hints) {}
5863 5863
5864 Handle<JSObject> StructureWalk(Handle<JSObject> object); 5864 MUST_USE_RESULT MaybeHandle<JSObject> StructureWalk(Handle<JSObject> object);
5865 5865
5866 protected: 5866 protected:
5867 inline Handle<JSObject> VisitElementOrProperty(Handle<JSObject> object, 5867 MUST_USE_RESULT inline MaybeHandle<JSObject> VisitElementOrProperty(
5868 Handle<JSObject> value) { 5868 Handle<JSObject> object,
5869 Handle<JSObject> value) {
5869 Handle<AllocationSite> current_site = site_context()->EnterNewScope(); 5870 Handle<AllocationSite> current_site = site_context()->EnterNewScope();
5870 Handle<JSObject> copy_of_value = StructureWalk(value); 5871 MaybeHandle<JSObject> copy_of_value = StructureWalk(value);
5871 site_context()->ExitScope(current_site, value); 5872 site_context()->ExitScope(current_site, value);
5872 return copy_of_value; 5873 return copy_of_value;
5873 } 5874 }
5874 5875
5875 inline ContextObject* site_context() { return site_context_; } 5876 inline ContextObject* site_context() { return site_context_; }
5876 inline Isolate* isolate() { return site_context()->isolate(); } 5877 inline Isolate* isolate() { return site_context()->isolate(); }
5877 5878
5878 inline bool copying() const { return copying_; } 5879 inline bool copying() const { return copying_; }
5879 5880
5880 private: 5881 private:
5881 ContextObject* site_context_; 5882 ContextObject* site_context_;
5882 const bool copying_; 5883 const bool copying_;
5883 const JSObject::DeepCopyHints hints_; 5884 const JSObject::DeepCopyHints hints_;
5884 }; 5885 };
5885 5886
5886 5887
5887 template <class ContextObject> 5888 template <class ContextObject>
5888 Handle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( 5889 MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk(
5889 Handle<JSObject> object) { 5890 Handle<JSObject> object) {
5890 Isolate* isolate = this->isolate(); 5891 Isolate* isolate = this->isolate();
5891 bool copying = this->copying(); 5892 bool copying = this->copying();
5892 bool shallow = hints_ == JSObject::kObjectIsShallowArray; 5893 bool shallow = hints_ == JSObject::kObjectIsShallowArray;
5893 5894
5894 if (!shallow) { 5895 if (!shallow) {
5895 StackLimitCheck check(isolate); 5896 StackLimitCheck check(isolate);
5896 5897
5897 if (check.HasOverflowed()) { 5898 if (check.HasOverflowed()) {
5898 isolate->StackOverflow(); 5899 isolate->StackOverflow();
5899 return Handle<JSObject>::null(); 5900 return MaybeHandle<JSObject>();
5900 } 5901 }
5901 } 5902 }
5902 5903
5903 if (object->map()->is_deprecated()) { 5904 if (object->map()->is_deprecated()) {
5904 JSObject::MigrateInstance(object); 5905 JSObject::MigrateInstance(object);
5905 } 5906 }
5906 5907
5907 Handle<JSObject> copy; 5908 Handle<JSObject> copy;
5908 if (copying) { 5909 if (copying) {
5909 Handle<AllocationSite> site_to_pass; 5910 Handle<AllocationSite> site_to_pass;
(...skipping 20 matching lines...) Expand all
5930 // Deep copy local properties. 5931 // Deep copy local properties.
5931 if (copy->HasFastProperties()) { 5932 if (copy->HasFastProperties()) {
5932 Handle<DescriptorArray> descriptors(copy->map()->instance_descriptors()); 5933 Handle<DescriptorArray> descriptors(copy->map()->instance_descriptors());
5933 int limit = copy->map()->NumberOfOwnDescriptors(); 5934 int limit = copy->map()->NumberOfOwnDescriptors();
5934 for (int i = 0; i < limit; i++) { 5935 for (int i = 0; i < limit; i++) {
5935 PropertyDetails details = descriptors->GetDetails(i); 5936 PropertyDetails details = descriptors->GetDetails(i);
5936 if (details.type() != FIELD) continue; 5937 if (details.type() != FIELD) continue;
5937 int index = descriptors->GetFieldIndex(i); 5938 int index = descriptors->GetFieldIndex(i);
5938 Handle<Object> value(object->RawFastPropertyAt(index), isolate); 5939 Handle<Object> value(object->RawFastPropertyAt(index), isolate);
5939 if (value->IsJSObject()) { 5940 if (value->IsJSObject()) {
5940 value = VisitElementOrProperty(copy, Handle<JSObject>::cast(value)); 5941 ASSIGN_RETURN_ON_EXCEPTION(
5941 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, value, Handle<JSObject>()); 5942 isolate, value,
5943 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)),
5944 JSObject);
5942 } else { 5945 } else {
5943 Representation representation = details.representation(); 5946 Representation representation = details.representation();
5944 value = Object::NewStorageFor(isolate, value, representation); 5947 value = Object::NewStorageFor(isolate, value, representation);
5945 } 5948 }
5946 if (copying) { 5949 if (copying) {
5947 copy->FastPropertyAtPut(index, *value); 5950 copy->FastPropertyAtPut(index, *value);
5948 } 5951 }
5949 } 5952 }
5950 } else { 5953 } else {
5951 Handle<FixedArray> names = 5954 Handle<FixedArray> names =
5952 isolate->factory()->NewFixedArray(copy->NumberOfLocalProperties()); 5955 isolate->factory()->NewFixedArray(copy->NumberOfLocalProperties());
5953 copy->GetLocalPropertyNames(*names, 0); 5956 copy->GetLocalPropertyNames(*names, 0);
5954 for (int i = 0; i < names->length(); i++) { 5957 for (int i = 0; i < names->length(); i++) {
5955 ASSERT(names->get(i)->IsString()); 5958 ASSERT(names->get(i)->IsString());
5956 Handle<String> key_string(String::cast(names->get(i))); 5959 Handle<String> key_string(String::cast(names->get(i)));
5957 PropertyAttributes attributes = 5960 PropertyAttributes attributes =
5958 JSReceiver::GetLocalPropertyAttribute(copy, key_string); 5961 JSReceiver::GetLocalPropertyAttribute(copy, key_string);
5959 // Only deep copy fields from the object literal expression. 5962 // Only deep copy fields from the object literal expression.
5960 // In particular, don't try to copy the length attribute of 5963 // In particular, don't try to copy the length attribute of
5961 // an array. 5964 // an array.
5962 if (attributes != NONE) continue; 5965 if (attributes != NONE) continue;
5963 Handle<Object> value = 5966 Handle<Object> value =
5964 Object::GetProperty(copy, key_string).ToHandleChecked(); 5967 Object::GetProperty(copy, key_string).ToHandleChecked();
5965 if (value->IsJSObject()) { 5968 if (value->IsJSObject()) {
5966 Handle<JSObject> result = VisitElementOrProperty( 5969 Handle<JSObject> result;
5967 copy, Handle<JSObject>::cast(value)); 5970 ASSIGN_RETURN_ON_EXCEPTION(
5968 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<JSObject>()); 5971 isolate, result,
5972 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)),
5973 JSObject);
5969 if (copying) { 5974 if (copying) {
5970 // Creating object copy for literals. No strict mode needed. 5975 // Creating object copy for literals. No strict mode needed.
5971 JSObject::SetProperty( 5976 JSObject::SetProperty(
5972 copy, key_string, result, NONE, SLOPPY).Assert(); 5977 copy, key_string, result, NONE, SLOPPY).Assert();
5973 } 5978 }
5974 } 5979 }
5975 } 5980 }
5976 } 5981 }
5977 5982
5978 // Deep copy local elements. 5983 // Deep copy local elements.
(...skipping 11 matching lines...) Expand all
5990 ASSERT(!elements->get(i)->IsJSObject()); 5995 ASSERT(!elements->get(i)->IsJSObject());
5991 } 5996 }
5992 #endif 5997 #endif
5993 } else { 5998 } else {
5994 for (int i = 0; i < elements->length(); i++) { 5999 for (int i = 0; i < elements->length(); i++) {
5995 Handle<Object> value(elements->get(i), isolate); 6000 Handle<Object> value(elements->get(i), isolate);
5996 ASSERT(value->IsSmi() || 6001 ASSERT(value->IsSmi() ||
5997 value->IsTheHole() || 6002 value->IsTheHole() ||
5998 (IsFastObjectElementsKind(copy->GetElementsKind()))); 6003 (IsFastObjectElementsKind(copy->GetElementsKind())));
5999 if (value->IsJSObject()) { 6004 if (value->IsJSObject()) {
6000 Handle<JSObject> result = VisitElementOrProperty( 6005 Handle<JSObject> result;
6001 copy, Handle<JSObject>::cast(value)); 6006 ASSIGN_RETURN_ON_EXCEPTION(
6002 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<JSObject>()); 6007 isolate, result,
6008 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)),
6009 JSObject);
6003 if (copying) { 6010 if (copying) {
6004 elements->set(i, *result); 6011 elements->set(i, *result);
6005 } 6012 }
6006 } 6013 }
6007 } 6014 }
6008 } 6015 }
6009 break; 6016 break;
6010 } 6017 }
6011 case DICTIONARY_ELEMENTS: { 6018 case DICTIONARY_ELEMENTS: {
6012 Handle<SeededNumberDictionary> element_dictionary( 6019 Handle<SeededNumberDictionary> element_dictionary(
6013 copy->element_dictionary()); 6020 copy->element_dictionary());
6014 int capacity = element_dictionary->Capacity(); 6021 int capacity = element_dictionary->Capacity();
6015 for (int i = 0; i < capacity; i++) { 6022 for (int i = 0; i < capacity; i++) {
6016 Object* k = element_dictionary->KeyAt(i); 6023 Object* k = element_dictionary->KeyAt(i);
6017 if (element_dictionary->IsKey(k)) { 6024 if (element_dictionary->IsKey(k)) {
6018 Handle<Object> value(element_dictionary->ValueAt(i), isolate); 6025 Handle<Object> value(element_dictionary->ValueAt(i), isolate);
6019 if (value->IsJSObject()) { 6026 if (value->IsJSObject()) {
6020 Handle<JSObject> result = VisitElementOrProperty( 6027 Handle<JSObject> result;
6021 copy, Handle<JSObject>::cast(value)); 6028 ASSIGN_RETURN_ON_EXCEPTION(
6022 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<JSObject>()); 6029 isolate, result,
6030 VisitElementOrProperty(copy, Handle<JSObject>::cast(value)),
6031 JSObject);
6023 if (copying) { 6032 if (copying) {
6024 element_dictionary->ValueAtPut(i, *result); 6033 element_dictionary->ValueAtPut(i, *result);
6025 } 6034 }
6026 } 6035 }
6027 } 6036 }
6028 } 6037 }
6029 break; 6038 break;
6030 } 6039 }
6031 case SLOPPY_ARGUMENTS_ELEMENTS: 6040 case SLOPPY_ARGUMENTS_ELEMENTS:
6032 UNIMPLEMENTED(); 6041 UNIMPLEMENTED();
(...skipping 11 matching lines...) Expand all
6044 case FAST_HOLEY_DOUBLE_ELEMENTS: 6053 case FAST_HOLEY_DOUBLE_ELEMENTS:
6045 // No contained objects, nothing to do. 6054 // No contained objects, nothing to do.
6046 break; 6055 break;
6047 } 6056 }
6048 } 6057 }
6049 6058
6050 return copy; 6059 return copy;
6051 } 6060 }
6052 6061
6053 6062
6054 Handle<JSObject> JSObject::DeepWalk( 6063 MaybeHandle<JSObject> JSObject::DeepWalk(
6055 Handle<JSObject> object, 6064 Handle<JSObject> object,
6056 AllocationSiteCreationContext* site_context) { 6065 AllocationSiteCreationContext* site_context) {
6057 JSObjectWalkVisitor<AllocationSiteCreationContext> v(site_context, false, 6066 JSObjectWalkVisitor<AllocationSiteCreationContext> v(site_context, false,
6058 kNoHints); 6067 kNoHints);
6059 Handle<JSObject> result = v.StructureWalk(object); 6068 MaybeHandle<JSObject> result = v.StructureWalk(object);
6060 ASSERT(result.is_null() || result.is_identical_to(object)); 6069 Handle<JSObject> for_assert;
6070 ASSERT(!result.ToHandle(&for_assert) || for_assert.is_identical_to(object));
6061 return result; 6071 return result;
6062 } 6072 }
6063 6073
6064 6074
6065 Handle<JSObject> JSObject::DeepCopy(Handle<JSObject> object, 6075 MaybeHandle<JSObject> JSObject::DeepCopy(
6066 AllocationSiteUsageContext* site_context, 6076 Handle<JSObject> object,
6067 DeepCopyHints hints) { 6077 AllocationSiteUsageContext* site_context,
6078 DeepCopyHints hints) {
6068 JSObjectWalkVisitor<AllocationSiteUsageContext> v(site_context, true, hints); 6079 JSObjectWalkVisitor<AllocationSiteUsageContext> v(site_context, true, hints);
6069 Handle<JSObject> copy = v.StructureWalk(object); 6080 MaybeHandle<JSObject> copy = v.StructureWalk(object);
6070 ASSERT(!copy.is_identical_to(object)); 6081 Handle<JSObject> for_assert;
6082 ASSERT(!copy.ToHandle(&for_assert) || !for_assert.is_identical_to(object));
6071 return copy; 6083 return copy;
6072 } 6084 }
6073 6085
6074 6086
6075 Handle<Object> JSObject::GetDataProperty(Handle<JSObject> object, 6087 Handle<Object> JSObject::GetDataProperty(Handle<JSObject> object,
6076 Handle<Name> key) { 6088 Handle<Name> key) {
6077 Isolate* isolate = object->GetIsolate(); 6089 Isolate* isolate = object->GetIsolate();
6078 LookupResult lookup(isolate); 6090 LookupResult lookup(isolate);
6079 { 6091 {
6080 DisallowHeapAllocation no_allocation; 6092 DisallowHeapAllocation no_allocation;
(...skipping 6309 matching lines...) Expand 10 before | Expand all | Expand 10 after
12390 Handle<Map> new_map = GetPrototypeTransition(map, prototype); 12402 Handle<Map> new_map = GetPrototypeTransition(map, prototype);
12391 if (new_map.is_null()) { 12403 if (new_map.is_null()) {
12392 new_map = Copy(map); 12404 new_map = Copy(map);
12393 PutPrototypeTransition(map, prototype, new_map); 12405 PutPrototypeTransition(map, prototype, new_map);
12394 new_map->set_prototype(*prototype); 12406 new_map->set_prototype(*prototype);
12395 } 12407 }
12396 return new_map; 12408 return new_map;
12397 } 12409 }
12398 12410
12399 12411
12400 Handle<Object> JSObject::SetPrototype(Handle<JSObject> object, 12412 MaybeHandle<Object> JSObject::SetPrototype(Handle<JSObject> object,
12401 Handle<Object> value, 12413 Handle<Object> value,
12402 bool skip_hidden_prototypes) { 12414 bool skip_hidden_prototypes) {
12403 #ifdef DEBUG 12415 #ifdef DEBUG
12404 int size = object->Size(); 12416 int size = object->Size();
12405 #endif 12417 #endif
12406 12418
12407 Isolate* isolate = object->GetIsolate(); 12419 Isolate* isolate = object->GetIsolate();
12408 Heap* heap = isolate->heap(); 12420 Heap* heap = isolate->heap();
12409 // Silently ignore the change if value is not a JSObject or null. 12421 // Silently ignore the change if value is not a JSObject or null.
12410 // SpiderMonkey behaves this way. 12422 // SpiderMonkey behaves this way.
12411 if (!value->IsJSReceiver() && !value->IsNull()) return value; 12423 if (!value->IsJSReceiver() && !value->IsNull()) return value;
12412 12424
12413 // From 8.6.2 Object Internal Methods 12425 // From 8.6.2 Object Internal Methods
12414 // ... 12426 // ...
12415 // In addition, if [[Extensible]] is false the value of the [[Class]] and 12427 // In addition, if [[Extensible]] is false the value of the [[Class]] and
12416 // [[Prototype]] internal properties of the object may not be modified. 12428 // [[Prototype]] internal properties of the object may not be modified.
12417 // ... 12429 // ...
12418 // Implementation specific extensions that modify [[Class]], [[Prototype]] 12430 // Implementation specific extensions that modify [[Class]], [[Prototype]]
12419 // or [[Extensible]] must not violate the invariants defined in the preceding 12431 // or [[Extensible]] must not violate the invariants defined in the preceding
12420 // paragraph. 12432 // paragraph.
12421 if (!object->map()->is_extensible()) { 12433 if (!object->map()->is_extensible()) {
12422 Handle<Object> args[] = { object }; 12434 Handle<Object> args[] = { object };
12423 Handle<Object> error = isolate->factory()->NewTypeError( 12435 Handle<Object> error = isolate->factory()->NewTypeError(
12424 "non_extensible_proto", HandleVector(args, ARRAY_SIZE(args))); 12436 "non_extensible_proto", HandleVector(args, ARRAY_SIZE(args)));
12425 isolate->Throw(*error); 12437 return isolate->Throw<Object>(error);
12426 return Handle<Object>();
12427 } 12438 }
12428 12439
12429 // Before we can set the prototype we need to be sure 12440 // Before we can set the prototype we need to be sure
12430 // prototype cycles are prevented. 12441 // prototype cycles are prevented.
12431 // It is sufficient to validate that the receiver is not in the new prototype 12442 // It is sufficient to validate that the receiver is not in the new prototype
12432 // chain. 12443 // chain.
12433 for (Object* pt = *value; 12444 for (Object* pt = *value;
12434 pt != heap->null_value(); 12445 pt != heap->null_value();
12435 pt = pt->GetPrototype(isolate)) { 12446 pt = pt->GetPrototype(isolate)) {
12436 if (JSReceiver::cast(pt) == *object) { 12447 if (JSReceiver::cast(pt) == *object) {
12437 // Cycle detected. 12448 // Cycle detected.
12438 Handle<Object> error = isolate->factory()->NewError( 12449 Handle<Object> error = isolate->factory()->NewError(
12439 "cyclic_proto", HandleVector<Object>(NULL, 0)); 12450 "cyclic_proto", HandleVector<Object>(NULL, 0));
12440 isolate->Throw(*error); 12451 return isolate->Throw<Object>(error);
12441 return Handle<Object>();
12442 } 12452 }
12443 } 12453 }
12444 12454
12445 bool dictionary_elements_in_chain = 12455 bool dictionary_elements_in_chain =
12446 object->map()->DictionaryElementsInPrototypeChainOnly(); 12456 object->map()->DictionaryElementsInPrototypeChainOnly();
12447 Handle<JSObject> real_receiver = object; 12457 Handle<JSObject> real_receiver = object;
12448 12458
12449 if (skip_hidden_prototypes) { 12459 if (skip_hidden_prototypes) {
12450 // Find the first object in the chain whose prototype object is not 12460 // Find the first object in the chain whose prototype object is not
12451 // hidden and set the new prototype on that object. 12461 // hidden and set the new prototype on that object.
(...skipping 4665 matching lines...) Expand 10 before | Expand all | Expand 10 after
17117 #define ERROR_MESSAGES_TEXTS(C, T) T, 17127 #define ERROR_MESSAGES_TEXTS(C, T) T,
17118 static const char* error_messages_[] = { 17128 static const char* error_messages_[] = {
17119 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 17129 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
17120 }; 17130 };
17121 #undef ERROR_MESSAGES_TEXTS 17131 #undef ERROR_MESSAGES_TEXTS
17122 return error_messages_[reason]; 17132 return error_messages_[reason];
17123 } 17133 }
17124 17134
17125 17135
17126 } } // namespace v8::internal 17136 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698