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

Side by Side Diff: src/objects.cc

Issue 1413463006: Map v8::Object to v8::internal::JSReceiver (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 5 years, 1 month 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
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 2149 matching lines...) Expand 10 before | Expand all | Expand 10 after
2160 // If the constructor is not present, return "Object". 2160 // If the constructor is not present, return "Object".
2161 return GetHeap()->Object_string(); 2161 return GetHeap()->Object_string();
2162 } 2162 }
2163 2163
2164 2164
2165 String* JSReceiver::constructor_name() { 2165 String* JSReceiver::constructor_name() {
2166 return map()->constructor_name(); 2166 return map()->constructor_name();
2167 } 2167 }
2168 2168
2169 2169
2170 Context* JSReceiver::GetCreationContext() {
2171 Object* constructor = map()->GetConstructor();
2172 JSFunction* function;
2173 if (!constructor->IsJSFunction()) {
2174 // Functions have null as a constructor,
2175 // but any JSFunction knows its context immediately.
2176 function = JSFunction::cast(this);
2177 } else {
2178 function = JSFunction::cast(constructor);
2179 }
2180
2181 return function->context()->native_context();
2182 }
2183
2184
2170 static Handle<Object> WrapType(Handle<HeapType> type) { 2185 static Handle<Object> WrapType(Handle<HeapType> type) {
2171 if (type->IsClass()) return Map::WeakCellForMap(type->AsClass()->Map()); 2186 if (type->IsClass()) return Map::WeakCellForMap(type->AsClass()->Map());
2172 return type; 2187 return type;
2173 } 2188 }
2174 2189
2175 2190
2176 MaybeHandle<Map> Map::CopyWithField(Handle<Map> map, 2191 MaybeHandle<Map> Map::CopyWithField(Handle<Map> map,
2177 Handle<Name> name, 2192 Handle<Name> name,
2178 Handle<HeapType> type, 2193 Handle<HeapType> type,
2179 PropertyAttributes attributes, 2194 PropertyAttributes attributes,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
2264 } else { 2279 } else {
2265 Handle<NameDictionary> dict(object->property_dictionary()); 2280 Handle<NameDictionary> dict(object->property_dictionary());
2266 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell); 2281 PropertyDetails details(attributes, DATA, 0, PropertyCellType::kNoCell);
2267 Handle<NameDictionary> result = 2282 Handle<NameDictionary> result =
2268 NameDictionary::Add(dict, name, value, details); 2283 NameDictionary::Add(dict, name, value, details);
2269 if (*dict != *result) object->set_properties(*result); 2284 if (*dict != *result) object->set_properties(*result);
2270 } 2285 }
2271 } 2286 }
2272 2287
2273 2288
2274 Context* JSObject::GetCreationContext() {
2275 Object* constructor = this->map()->GetConstructor();
2276 JSFunction* function;
2277 if (!constructor->IsJSFunction()) {
2278 // Functions have null as a constructor,
2279 // but any JSFunction knows its context immediately.
2280 function = JSFunction::cast(this);
2281 } else {
2282 function = JSFunction::cast(constructor);
2283 }
2284
2285 return function->context()->native_context();
2286 }
2287
2288
2289 MaybeHandle<Object> JSObject::EnqueueChangeRecord(Handle<JSObject> object, 2289 MaybeHandle<Object> JSObject::EnqueueChangeRecord(Handle<JSObject> object,
2290 const char* type_str, 2290 const char* type_str,
2291 Handle<Name> name, 2291 Handle<Name> name,
2292 Handle<Object> old_value) { 2292 Handle<Object> old_value) {
2293 DCHECK(!object->IsJSGlobalProxy()); 2293 DCHECK(!object->IsJSGlobalProxy());
2294 DCHECK(!object->IsJSGlobalObject()); 2294 DCHECK(!object->IsJSGlobalObject());
2295 Isolate* isolate = object->GetIsolate(); 2295 Isolate* isolate = object->GetIsolate();
2296 HandleScope scope(isolate); 2296 HandleScope scope(isolate);
2297 Handle<String> type = isolate->factory()->InternalizeUtf8String(type_str); 2297 Handle<String> type = isolate->factory()->InternalizeUtf8String(type_str);
2298 Handle<Object> args[] = { type, object, name, old_value }; 2298 Handle<Object> args[] = { type, object, name, old_value };
(...skipping 4089 matching lines...) Expand 10 before | Expand all | Expand 10 after
6388 JSObject::DefineAccessor(it, getter, setter, attrs); 6388 JSObject::DefineAccessor(it, getter, setter, attrs);
6389 if (result.is_null()) return false; 6389 if (result.is_null()) return false;
6390 } 6390 }
6391 } 6391 }
6392 6392
6393 // 11. Return true. 6393 // 11. Return true.
6394 return true; 6394 return true;
6395 } 6395 }
6396 6396
6397 6397
6398 // static
6399 Maybe<bool> JSReceiver::CreateDataProperty(LookupIterator* it,
6400 Handle<Object> value) {
6401 // TODO(rossberg): Support proxies.
6402 if (!it->GetReceiver()->IsJSObject()) return Nothing<bool>();
6403 return JSObject::CreateDataProperty(it, value);
6404 }
6405
6406
6398 // TODO(jkummerow): Consider unification with FastAsArrayLength() in 6407 // TODO(jkummerow): Consider unification with FastAsArrayLength() in
6399 // accessors.cc. 6408 // accessors.cc.
6400 bool PropertyKeyToArrayLength(Handle<Object> value, uint32_t* length) { 6409 bool PropertyKeyToArrayLength(Handle<Object> value, uint32_t* length) {
6401 DCHECK(value->IsNumber() || value->IsName()); 6410 DCHECK(value->IsNumber() || value->IsName());
6402 if (value->ToArrayLength(length)) return true; 6411 if (value->ToArrayLength(length)) return true;
6403 if (value->IsString()) return String::cast(*value)->AsArrayIndex(length); 6412 if (value->IsString()) return String::cast(*value)->AsArrayIndex(length);
6404 return false; 6413 return false;
6405 } 6414 }
6406 6415
6407 6416
(...skipping 8225 matching lines...) Expand 10 before | Expand all | Expand 10 after
14633 v8::Local<v8::Object> result; 14642 v8::Local<v8::Object> result;
14634 if (!interceptor->enumerator()->IsUndefined()) { 14643 if (!interceptor->enumerator()->IsUndefined()) {
14635 v8::GenericNamedPropertyEnumeratorCallback enum_fun = 14644 v8::GenericNamedPropertyEnumeratorCallback enum_fun =
14636 v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>( 14645 v8::ToCData<v8::GenericNamedPropertyEnumeratorCallback>(
14637 interceptor->enumerator()); 14646 interceptor->enumerator());
14638 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); 14647 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object));
14639 result = args.Call(enum_fun); 14648 result = args.Call(enum_fun);
14640 } 14649 }
14641 if (result.IsEmpty()) return MaybeHandle<JSObject>(); 14650 if (result.IsEmpty()) return MaybeHandle<JSObject>();
14642 DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || 14651 DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() ||
14643 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); 14652 (v8::Utils::OpenHandle(*result)->IsJSObject() &&
14653 Handle<JSObject>::cast(v8::Utils::OpenHandle(*result))
14654 ->HasSloppyArgumentsElements()));
14644 // Rebox before returning. 14655 // Rebox before returning.
14645 return handle(*v8::Utils::OpenHandle(*result), isolate); 14656 return handle(JSObject::cast(*v8::Utils::OpenHandle(*result)), isolate);
14646 } 14657 }
14647 14658
14648 14659
14649 // Compute the element keys from the interceptor. 14660 // Compute the element keys from the interceptor.
14650 MaybeHandle<JSObject> JSObject::GetKeysForIndexedInterceptor( 14661 MaybeHandle<JSObject> JSObject::GetKeysForIndexedInterceptor(
14651 Handle<JSObject> object, Handle<JSReceiver> receiver) { 14662 Handle<JSObject> object, Handle<JSReceiver> receiver) {
14652 Isolate* isolate = receiver->GetIsolate(); 14663 Isolate* isolate = receiver->GetIsolate();
14653 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); 14664 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor());
14654 PropertyCallbackArguments 14665 PropertyCallbackArguments
14655 args(isolate, interceptor->data(), *receiver, *object); 14666 args(isolate, interceptor->data(), *receiver, *object);
14656 v8::Local<v8::Object> result; 14667 v8::Local<v8::Object> result;
14657 if (!interceptor->enumerator()->IsUndefined()) { 14668 if (!interceptor->enumerator()->IsUndefined()) {
14658 v8::IndexedPropertyEnumeratorCallback enum_fun = 14669 v8::IndexedPropertyEnumeratorCallback enum_fun =
14659 v8::ToCData<v8::IndexedPropertyEnumeratorCallback>( 14670 v8::ToCData<v8::IndexedPropertyEnumeratorCallback>(
14660 interceptor->enumerator()); 14671 interceptor->enumerator());
14661 LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object)); 14672 LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object));
14662 result = args.Call(enum_fun); 14673 result = args.Call(enum_fun);
14663 } 14674 }
14664 if (result.IsEmpty()) return MaybeHandle<JSObject>(); 14675 if (result.IsEmpty()) return MaybeHandle<JSObject>();
14665 DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || 14676 DCHECK(v8::Utils::OpenHandle(*result)->IsJSArray() ||
14666 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); 14677 (v8::Utils::OpenHandle(*result)->IsJSObject() &&
14678 Handle<JSObject>::cast(v8::Utils::OpenHandle(*result))
14679 ->HasSloppyArgumentsElements()));
14667 // Rebox before returning. 14680 // Rebox before returning.
14668 return handle(*v8::Utils::OpenHandle(*result), isolate); 14681 return handle(JSObject::cast(*v8::Utils::OpenHandle(*result)), isolate);
14669 } 14682 }
14670 14683
14671 14684
14672 Maybe<bool> JSObject::HasRealNamedProperty(Handle<JSObject> object, 14685 Maybe<bool> JSObject::HasRealNamedProperty(Handle<JSObject> object,
14673 Handle<Name> name) { 14686 Handle<Name> name) {
14674 LookupIterator it = LookupIterator::PropertyOrElement( 14687 LookupIterator it = LookupIterator::PropertyOrElement(
14675 name->GetIsolate(), object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); 14688 name->GetIsolate(), object, name, LookupIterator::OWN_SKIP_INTERCEPTOR);
14676 return HasProperty(&it); 14689 return HasProperty(&it);
14677 } 14690 }
14678 14691
(...skipping 3203 matching lines...) Expand 10 before | Expand all | Expand 10 after
17882 if (cell->value() != *new_value) { 17895 if (cell->value() != *new_value) {
17883 cell->set_value(*new_value); 17896 cell->set_value(*new_value);
17884 Isolate* isolate = cell->GetIsolate(); 17897 Isolate* isolate = cell->GetIsolate();
17885 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17898 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17886 isolate, DependentCode::kPropertyCellChangedGroup); 17899 isolate, DependentCode::kPropertyCellChangedGroup);
17887 } 17900 }
17888 } 17901 }
17889 17902
17890 } // namespace internal 17903 } // namespace internal
17891 } // namespace v8 17904 } // namespace v8
OLDNEW
« src/api.cc ('K') | « src/objects.h ('k') | src/profiler/heap-snapshot-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698