Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index a3690c45c3f163238284a41706b8adb73eee5bce..a8a0b4f8d35bfa4e8bddbcc0e4db46cf0bbba2bd 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -1045,7 +1045,7 @@ static AccessCheckResult CheckElementAccess( |
static AccessCheckResult CheckPropertyAccess( |
JSObject* obj, |
- String* name, |
+ Name* name, |
v8::AccessType access_type) { |
uint32_t index; |
if (name->AsArrayIndex(&index)) { |
@@ -1105,7 +1105,7 @@ enum PropertyDescriptorIndices { |
static MaybeObject* GetOwnProperty(Isolate* isolate, |
Handle<JSObject> obj, |
- Handle<String> name) { |
+ Handle<Name> name) { |
Heap* heap = isolate->heap(); |
// Due to some WebKit tests, we want to make sure that we do not log |
// more than one access failure here. |
@@ -1159,7 +1159,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOwnProperty) { |
ASSERT(args.length() == 2); |
HandleScope scope(isolate); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
- CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
return GetOwnProperty(isolate, obj, name); |
} |
@@ -2116,7 +2116,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetReadOnlyPrototype) { |
} else { // Dictionary properties. |
// Directly manipulate the property details. |
int entry = function->property_dictionary()->FindEntry(name); |
- ASSERT(entry != StringDictionary::kNotFound); |
+ ASSERT(entry != NameDictionary::kNotFound); |
PropertyDetails details = function->property_dictionary()->DetailsAt(entry); |
PropertyDetails new_details( |
static_cast<PropertyAttributes>(details.attributes() | READ_ONLY), |
@@ -3929,16 +3929,16 @@ MaybeObject* Runtime::GetObjectProperty(Isolate* isolate, |
return GetElementOrCharAt(isolate, object, index); |
} |
- // Convert the key to a string - possibly by calling back into JavaScript. |
- Handle<String> name; |
- if (key->IsString()) { |
- name = Handle<String>::cast(key); |
+ // Convert the key to a name - possibly by calling back into JavaScript. |
+ Handle<Name> name; |
+ if (key->IsName()) { |
+ name = Handle<Name>::cast(key); |
} else { |
bool has_pending_exception = false; |
Handle<Object> converted = |
Execution::ToString(key, &has_pending_exception); |
if (has_pending_exception) return Failure::Exception(); |
- name = Handle<String>::cast(converted); |
+ name = Handle<Name>::cast(converted); |
} |
// Check if the name is trivially convertible to an index and get |
@@ -3962,7 +3962,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetProperty) { |
} |
-// KeyedStringGetProperty is called from KeyedLoadIC::GenerateGeneric. |
+// KeyedGetProperty is called from KeyedLoadIC::GenerateGeneric. |
RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) { |
NoHandleAllocation ha; |
ASSERT(args.length() == 2); |
@@ -3981,9 +3981,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) { |
if (args[0]->IsJSObject()) { |
if (!args[0]->IsJSGlobalProxy() && |
!args[0]->IsAccessCheckNeeded() && |
- args[1]->IsString()) { |
+ args[1]->IsName()) { |
JSObject* receiver = JSObject::cast(args[0]); |
- String* key = String::cast(args[1]); |
+ Name* key = Name::cast(args[1]); |
if (receiver->HasFastProperties()) { |
// Attempt to use lookup cache. |
Map* receiver_map = receiver->map(); |
@@ -4006,9 +4006,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) { |
} |
} else { |
// Attempt dictionary lookup. |
- StringDictionary* dictionary = receiver->property_dictionary(); |
+ NameDictionary* dictionary = receiver->property_dictionary(); |
int entry = dictionary->FindEntry(key); |
- if ((entry != StringDictionary::kNotFound) && |
+ if ((entry != NameDictionary::kNotFound) && |
(dictionary->DetailsAt(entry).type() == NORMAL)) { |
Object* value = dictionary->ValueAt(entry); |
if (!receiver->IsGlobalObject()) return value; |
@@ -4018,7 +4018,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) { |
} |
} |
} else if (FLAG_smi_only_arrays && args.at<Object>(1)->IsSmi()) { |
- // JSObject without a string key. If the key is a Smi, check for a |
+ // JSObject without a name key. If the key is a Smi, check for a |
// definite out-of-bounds access to elements, which is a strong indicator |
// that subsequent accesses will also call the runtime. Proactively |
// transition elements to FAST_*_ELEMENTS to avoid excessive boxing of |
@@ -4078,7 +4078,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineAccessorProperty) { |
HandleScope scope(isolate); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
RUNTIME_ASSERT(!obj->IsNull()); |
- CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2); |
RUNTIME_ASSERT(IsValidAccessor(getter)); |
CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3); |
@@ -4103,7 +4103,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { |
ASSERT(args.length() == 4); |
HandleScope scope(isolate); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0); |
- CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
CONVERT_ARG_HANDLE_CHECKED(Object, obj_value, 2); |
CONVERT_SMI_ARG_CHECKED(unchecked, 3); |
RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
@@ -4168,7 +4168,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { |
RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDataProperty) { |
ASSERT(args.length() == 2); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
- CONVERT_ARG_HANDLE_CHECKED(String, key, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); |
LookupResult lookup(isolate); |
object->LookupRealNamedProperty(*key, &lookup); |
if (!lookup.IsFound()) return isolate->heap()->undefined_value(); |
@@ -4211,10 +4211,11 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate, |
if (object->IsJSProxy()) { |
bool has_pending_exception = false; |
- Handle<Object> name = Execution::ToString(key, &has_pending_exception); |
+ Handle<Object> name = key->IsSymbol() |
+ ? key : Execution::ToString(key, &has_pending_exception); |
if (has_pending_exception) return Failure::Exception(); |
return JSProxy::cast(*object)->SetProperty( |
- String::cast(*name), *value, attr, strict_mode); |
+ Name::cast(*name), *value, attr, strict_mode); |
} |
// If the object isn't a JavaScript object, we ignore the store. |
@@ -4244,16 +4245,16 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate, |
return *value; |
} |
- if (key->IsString()) { |
+ if (key->IsName()) { |
Handle<Object> result; |
- if (Handle<String>::cast(key)->AsArrayIndex(&index)) { |
+ Handle<Name> name = Handle<Name>::cast(key); |
+ if (name->AsArrayIndex(&index)) { |
result = JSObject::SetElement( |
js_object, index, value, attr, strict_mode, set_mode); |
} else { |
- Handle<String> key_string = Handle<String>::cast(key); |
- key_string->TryFlatten(); |
+ if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); |
result = JSReceiver::SetProperty( |
- js_object, key_string, value, attr, strict_mode); |
+ js_object, name, value, attr, strict_mode); |
} |
if (result.is_null()) return Failure::Exception(); |
return *value; |
@@ -4299,16 +4300,14 @@ MaybeObject* Runtime::ForceSetObjectProperty(Isolate* isolate, |
index, *value, attr, kNonStrictMode, false, DEFINE_PROPERTY); |
} |
- if (key->IsString()) { |
- if (Handle<String>::cast(key)->AsArrayIndex(&index)) { |
+ if (key->IsName()) { |
+ Handle<Name> name = Handle<Name>::cast(key); |
+ if (name->AsArrayIndex(&index)) { |
return js_object->SetElement( |
index, *value, attr, kNonStrictMode, false, DEFINE_PROPERTY); |
} else { |
- Handle<String> key_string = Handle<String>::cast(key); |
- key_string->TryFlatten(); |
- return js_object->SetLocalPropertyIgnoreAttributes(*key_string, |
- *value, |
- attr); |
+ if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); |
+ return js_object->SetLocalPropertyIgnoreAttributes(*name, *value, attr); |
} |
} |
@@ -4348,19 +4347,19 @@ MaybeObject* Runtime::ForceDeleteObjectProperty(Isolate* isolate, |
return receiver->DeleteElement(index, JSReceiver::FORCE_DELETION); |
} |
- Handle<String> key_string; |
- if (key->IsString()) { |
- key_string = Handle<String>::cast(key); |
+ Handle<Name> name; |
+ if (key->IsName()) { |
+ name = Handle<Name>::cast(key); |
} else { |
// Call-back into JavaScript to convert the key to a string. |
bool has_pending_exception = false; |
Handle<Object> converted = Execution::ToString(key, &has_pending_exception); |
if (has_pending_exception) return Failure::Exception(); |
- key_string = Handle<String>::cast(converted); |
+ name = Handle<String>::cast(converted); |
} |
- key_string->TryFlatten(); |
- return receiver->DeleteProperty(*key_string, JSReceiver::FORCE_DELETION); |
+ if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); |
+ return receiver->DeleteProperty(*name, JSReceiver::FORCE_DELETION); |
} |
@@ -4547,7 +4546,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) { |
NoHandleAllocation ha; |
RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); |
CONVERT_ARG_CHECKED(JSObject, object, 0); |
- CONVERT_ARG_CHECKED(String, name, 1); |
+ CONVERT_ARG_CHECKED(Name, name, 1); |
// Compute attributes. |
PropertyAttributes attributes = NONE; |
if (args.length() == 4) { |
@@ -4568,7 +4567,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { |
ASSERT(args.length() == 3); |
CONVERT_ARG_CHECKED(JSReceiver, object, 0); |
- CONVERT_ARG_CHECKED(String, key, 1); |
+ CONVERT_ARG_CHECKED(Name, key, 1); |
CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); |
return object->DeleteProperty(key, (strict_mode == kStrictMode) |
? JSReceiver::STRICT_DELETION |
@@ -4578,7 +4577,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { |
static Object* HasLocalPropertyImplementation(Isolate* isolate, |
Handle<JSObject> object, |
- Handle<String> key) { |
+ Handle<Name> key) { |
if (object->HasLocalProperty(*key)) return isolate->heap()->true_value(); |
// Handle hidden prototypes. If there's a hidden prototype above this thing |
// then we have to check it for properties, because they are supposed to |
@@ -4597,7 +4596,7 @@ static Object* HasLocalPropertyImplementation(Isolate* isolate, |
RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) { |
NoHandleAllocation ha; |
ASSERT(args.length() == 2); |
- CONVERT_ARG_CHECKED(String, key, 1); |
+ CONVERT_ARG_CHECKED(Name, key, 1); |
uint32_t index; |
const bool key_is_array_index = key->AsArrayIndex(&index); |
@@ -4620,7 +4619,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) { |
HandleScope scope(isolate); |
return HasLocalPropertyImplementation(isolate, |
Handle<JSObject>(object), |
- Handle<String>(key)); |
+ Handle<Name>(key)); |
} else if (obj->IsString() && key_is_array_index) { |
// Well, there is one exception: Handle [] on strings. |
String* string = String::cast(obj); |
@@ -4636,7 +4635,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) { |
NoHandleAllocation na; |
ASSERT(args.length() == 2); |
CONVERT_ARG_CHECKED(JSReceiver, receiver, 0); |
- CONVERT_ARG_CHECKED(String, key, 1); |
+ CONVERT_ARG_CHECKED(Name, key, 1); |
bool result = receiver->HasProperty(key); |
if (isolate->has_pending_exception()) return Failure::Exception(); |
@@ -4661,7 +4660,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) { |
ASSERT(args.length() == 2); |
CONVERT_ARG_CHECKED(JSObject, object, 0); |
- CONVERT_ARG_CHECKED(String, key, 1); |
+ CONVERT_ARG_CHECKED(Name, key, 1); |
PropertyAttributes att = object->GetLocalPropertyAttribute(key); |
return isolate->heap()->ToBoolean(att != ABSENT && (att & DONT_ENUM) == 0); |
@@ -4905,7 +4904,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_LocalKeys) { |
Handle<FixedArray> copy = isolate->factory()->NewFixedArray(length); |
for (int i = 0; i < length; i++) { |
Object* entry = contents->get(i); |
- if (entry->IsString()) { |
+ if (entry->IsName()) { |
copy->set(i, entry); |
} else { |
ASSERT(entry->IsNumber()); |
@@ -4939,6 +4938,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArgumentsProperty) { |
return frame->GetParameter(index); |
} |
+ if (args[0]->IsSymbol()) { |
+ // Lookup in the initial Object.prototype object. |
+ return isolate->initial_object_prototype()->GetProperty( |
+ Symbol::cast(args[0])); |
+ } |
+ |
// Convert the key to a string. |
HandleScope scope(isolate); |
bool exception = false; |
@@ -10079,7 +10084,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArrayKeys) { |
RUNTIME_FUNCTION(MaybeObject*, Runtime_LookupAccessor) { |
ASSERT(args.length() == 3); |
CONVERT_ARG_CHECKED(JSReceiver, receiver, 0); |
- CONVERT_ARG_CHECKED(String, name, 1); |
+ CONVERT_ARG_CHECKED(Name, name, 1); |
CONVERT_SMI_ARG_CHECKED(flag, 2); |
AccessorComponent component = flag == 0 ? ACCESSOR_GETTER : ACCESSOR_SETTER; |
if (!receiver->IsJSObject()) return isolate->heap()->undefined_value(); |
@@ -10132,7 +10137,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Break) { |
static MaybeObject* DebugLookupResultValue(Heap* heap, |
Object* receiver, |
- String* name, |
+ Name* name, |
LookupResult* result, |
bool* caught_exception) { |
Object* value; |
@@ -10204,7 +10209,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPropertyDetails) { |
ASSERT(args.length() == 2); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
- CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
// Make sure to set the current context to the context before the debugger was |
// entered (if the debugger is entered). The reason for switching context here |
@@ -10302,7 +10307,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetProperty) { |
ASSERT(args.length() == 2); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
- CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
LookupResult result(isolate); |
obj->Lookup(*name, &result); |
@@ -10349,7 +10354,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugNamedInterceptorPropertyValue) { |
ASSERT(args.length() == 2); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
RUNTIME_ASSERT(obj->HasNamedInterceptor()); |
- CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
PropertyAttributes attributes; |
return obj->GetPropertyWithInterceptor(*obj, *name, &attributes); |
@@ -13478,15 +13483,15 @@ MaybeObject* Runtime::InitializeIntrinsicFunctionNames(Heap* heap, |
Object* dictionary) { |
ASSERT(Isolate::Current()->heap() == heap); |
ASSERT(dictionary != NULL); |
- ASSERT(StringDictionary::cast(dictionary)->NumberOfElements() == 0); |
+ ASSERT(NameDictionary::cast(dictionary)->NumberOfElements() == 0); |
for (int i = 0; i < kNumFunctions; ++i) { |
Object* name_string; |
{ MaybeObject* maybe_name_string = |
heap->InternalizeUtf8String(kIntrinsicFunctions[i].name); |
if (!maybe_name_string->ToObject(&name_string)) return maybe_name_string; |
} |
- StringDictionary* string_dictionary = StringDictionary::cast(dictionary); |
- { MaybeObject* maybe_dictionary = string_dictionary->Add( |
+ NameDictionary* name_dictionary = NameDictionary::cast(dictionary); |
+ { MaybeObject* maybe_dictionary = name_dictionary->Add( |
String::cast(name_string), |
Smi::FromInt(i), |
PropertyDetails(NONE, NORMAL)); |