| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 1420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1431 { MaybeObject* maybe_result = dict->Add(name, store_value, details); | 1431 { MaybeObject* maybe_result = dict->Add(name, store_value, details); |
| 1432 if (!maybe_result->ToObject(&result)) return maybe_result; | 1432 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1433 } | 1433 } |
| 1434 if (dict != result) set_properties(StringDictionary::cast(result)); | 1434 if (dict != result) set_properties(StringDictionary::cast(result)); |
| 1435 return value; | 1435 return value; |
| 1436 } | 1436 } |
| 1437 | 1437 |
| 1438 | 1438 |
| 1439 MaybeObject* JSObject::AddProperty(String* name, | 1439 MaybeObject* JSObject::AddProperty(String* name, |
| 1440 Object* value, | 1440 Object* value, |
| 1441 PropertyAttributes attributes) { | 1441 PropertyAttributes attributes, |
| 1442 StrictModeFlag strict_mode) { |
| 1442 ASSERT(!IsJSGlobalProxy()); | 1443 ASSERT(!IsJSGlobalProxy()); |
| 1443 Heap* heap = GetHeap(); | 1444 Heap* heap = GetHeap(); |
| 1444 if (!map()->is_extensible()) { | 1445 if (!map()->is_extensible()) { |
| 1445 Handle<Object> args[1] = {Handle<String>(name)}; | 1446 if (strict_mode == kNonStrictMode) { |
| 1446 return heap->isolate()->Throw( | 1447 return heap->undefined_value(); |
| 1447 *FACTORY->NewTypeError("object_not_extensible", HandleVector(args, 1))); | 1448 } else { |
| 1449 Handle<Object> args[1] = {Handle<String>(name)}; |
| 1450 return heap->isolate()->Throw( |
| 1451 *FACTORY->NewTypeError("object_not_extensible", |
| 1452 HandleVector(args, 1))); |
| 1453 } |
| 1448 } | 1454 } |
| 1449 if (HasFastProperties()) { | 1455 if (HasFastProperties()) { |
| 1450 // Ensure the descriptor array does not get too big. | 1456 // Ensure the descriptor array does not get too big. |
| 1451 if (map()->instance_descriptors()->number_of_descriptors() < | 1457 if (map()->instance_descriptors()->number_of_descriptors() < |
| 1452 DescriptorArray::kMaxNumberOfDescriptors) { | 1458 DescriptorArray::kMaxNumberOfDescriptors) { |
| 1453 if (value->IsJSFunction() && !heap->InNewSpace(value)) { | 1459 if (value->IsJSFunction() && !heap->InNewSpace(value)) { |
| 1454 return AddConstantFunctionProperty(name, | 1460 return AddConstantFunctionProperty(name, |
| 1455 JSFunction::cast(value), | 1461 JSFunction::cast(value), |
| 1456 attributes); | 1462 attributes); |
| 1457 } else { | 1463 } else { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1478 StrictModeFlag strict_mode) { | 1484 StrictModeFlag strict_mode) { |
| 1479 // Check local property, ignore interceptor. | 1485 // Check local property, ignore interceptor. |
| 1480 LookupResult result; | 1486 LookupResult result; |
| 1481 LocalLookupRealNamedProperty(name, &result); | 1487 LocalLookupRealNamedProperty(name, &result); |
| 1482 if (result.IsFound()) { | 1488 if (result.IsFound()) { |
| 1483 // An existing property, a map transition or a null descriptor was | 1489 // An existing property, a map transition or a null descriptor was |
| 1484 // found. Use set property to handle all these cases. | 1490 // found. Use set property to handle all these cases. |
| 1485 return SetProperty(&result, name, value, attributes, strict_mode); | 1491 return SetProperty(&result, name, value, attributes, strict_mode); |
| 1486 } | 1492 } |
| 1487 // Add a new real property. | 1493 // Add a new real property. |
| 1488 return AddProperty(name, value, attributes); | 1494 return AddProperty(name, value, attributes, strict_mode); |
| 1489 } | 1495 } |
| 1490 | 1496 |
| 1491 | 1497 |
| 1492 MaybeObject* JSObject::ReplaceSlowProperty(String* name, | 1498 MaybeObject* JSObject::ReplaceSlowProperty(String* name, |
| 1493 Object* value, | 1499 Object* value, |
| 1494 PropertyAttributes attributes) { | 1500 PropertyAttributes attributes) { |
| 1495 StringDictionary* dictionary = property_dictionary(); | 1501 StringDictionary* dictionary = property_dictionary(); |
| 1496 int old_index = dictionary->FindEntry(name); | 1502 int old_index = dictionary->FindEntry(name); |
| 1497 int new_enumeration_index = 0; // 0 means "Use the next available index." | 1503 int new_enumeration_index = 0; // 0 means "Use the next available index." |
| 1498 if (old_index != -1) { | 1504 if (old_index != -1) { |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1982 LookupCallbackSetterInPrototypes(name, &accessor_result); | 1988 LookupCallbackSetterInPrototypes(name, &accessor_result); |
| 1983 if (accessor_result.IsProperty()) { | 1989 if (accessor_result.IsProperty()) { |
| 1984 return SetPropertyWithCallback(accessor_result.GetCallbackObject(), | 1990 return SetPropertyWithCallback(accessor_result.GetCallbackObject(), |
| 1985 name, | 1991 name, |
| 1986 value, | 1992 value, |
| 1987 accessor_result.holder()); | 1993 accessor_result.holder()); |
| 1988 } | 1994 } |
| 1989 } | 1995 } |
| 1990 if (!result->IsFound()) { | 1996 if (!result->IsFound()) { |
| 1991 // Neither properties nor transitions found. | 1997 // Neither properties nor transitions found. |
| 1992 return AddProperty(name, value, attributes); | 1998 return AddProperty(name, value, attributes, strict_mode); |
| 1993 } | 1999 } |
| 1994 if (result->IsReadOnly() && result->IsProperty()) { | 2000 if (result->IsReadOnly() && result->IsProperty()) { |
| 1995 if (strict_mode == kStrictMode) { | 2001 if (strict_mode == kStrictMode) { |
| 1996 HandleScope scope; | 2002 HandleScope scope; |
| 1997 Handle<String> key(name); | 2003 Handle<String> key(name); |
| 1998 Handle<Object> holder(this); | 2004 Handle<Object> holder(this); |
| 1999 Handle<Object> args[2] = { key, holder }; | 2005 Handle<Object> args[2] = { key, holder }; |
| 2000 return heap->isolate()->Throw(*heap->isolate()->factory()->NewTypeError( | 2006 return heap->isolate()->Throw(*heap->isolate()->factory()->NewTypeError( |
| 2001 "strict_read_only_property", HandleVector(args, 2))); | 2007 "strict_read_only_property", HandleVector(args, 2))); |
| 2002 } else { | 2008 } else { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2089 ASSERT(proto->IsJSGlobalObject()); | 2095 ASSERT(proto->IsJSGlobalObject()); |
| 2090 return JSObject::cast(proto)->SetLocalPropertyIgnoreAttributes( | 2096 return JSObject::cast(proto)->SetLocalPropertyIgnoreAttributes( |
| 2091 name, | 2097 name, |
| 2092 value, | 2098 value, |
| 2093 attributes); | 2099 attributes); |
| 2094 } | 2100 } |
| 2095 | 2101 |
| 2096 // Check for accessor in prototype chain removed here in clone. | 2102 // Check for accessor in prototype chain removed here in clone. |
| 2097 if (!result.IsFound()) { | 2103 if (!result.IsFound()) { |
| 2098 // Neither properties nor transitions found. | 2104 // Neither properties nor transitions found. |
| 2099 return AddProperty(name, value, attributes); | 2105 return AddProperty(name, value, attributes, kNonStrictMode); |
| 2100 } | 2106 } |
| 2101 | 2107 |
| 2102 PropertyDetails details = PropertyDetails(attributes, NORMAL); | 2108 PropertyDetails details = PropertyDetails(attributes, NORMAL); |
| 2103 | 2109 |
| 2104 // Check of IsReadOnly removed from here in clone. | 2110 // Check of IsReadOnly removed from here in clone. |
| 2105 switch (result.type()) { | 2111 switch (result.type()) { |
| 2106 case NORMAL: | 2112 case NORMAL: |
| 2107 return SetNormalizedProperty(name, value, details); | 2113 return SetNormalizedProperty(name, value, details); |
| 2108 case FIELD: | 2114 case FIELD: |
| 2109 return FastPropertyAtPut(result.GetFieldIndex(), value); | 2115 return FastPropertyAtPut(result.GetFieldIndex(), value); |
| (...skipping 5230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7340 if (check_prototype) { | 7346 if (check_prototype) { |
| 7341 bool found; | 7347 bool found; |
| 7342 MaybeObject* result = | 7348 MaybeObject* result = |
| 7343 // Strict mode not needed. No-setter case already handled. | 7349 // Strict mode not needed. No-setter case already handled. |
| 7344 SetElementWithCallbackSetterInPrototypes(index, value, &found); | 7350 SetElementWithCallbackSetterInPrototypes(index, value, &found); |
| 7345 if (found) return result; | 7351 if (found) return result; |
| 7346 } | 7352 } |
| 7347 // When we set the is_extensible flag to false we always force | 7353 // When we set the is_extensible flag to false we always force |
| 7348 // the element into dictionary mode (and force them to stay there). | 7354 // the element into dictionary mode (and force them to stay there). |
| 7349 if (!map()->is_extensible()) { | 7355 if (!map()->is_extensible()) { |
| 7350 Handle<Object> number(isolate->factory()->NewNumberFromUint(index)); | 7356 if (strict_mode == kNonStrictMode) { |
| 7351 Handle<String> index_string( | 7357 return isolate->heap()->undefined_value(); |
| 7352 isolate->factory()->NumberToString(number)); | 7358 } else { |
| 7353 Handle<Object> args[1] = { index_string }; | 7359 Handle<Object> number(isolate->factory()->NewNumberFromUint(index)); |
| 7354 return isolate->Throw( | 7360 Handle<String> index_string( |
| 7355 *isolate->factory()->NewTypeError("object_not_extensible", | 7361 isolate->factory()->NumberToString(number)); |
| 7356 HandleVector(args, 1))); | 7362 Handle<Object> args[1] = { index_string }; |
| 7363 return isolate->Throw( |
| 7364 *isolate->factory()->NewTypeError("object_not_extensible", |
| 7365 HandleVector(args, 1))); |
| 7366 } |
| 7357 } | 7367 } |
| 7358 Object* result; | 7368 Object* result; |
| 7359 { MaybeObject* maybe_result = dictionary->AtNumberPut(index, value); | 7369 { MaybeObject* maybe_result = dictionary->AtNumberPut(index, value); |
| 7360 if (!maybe_result->ToObject(&result)) return maybe_result; | 7370 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 7361 } | 7371 } |
| 7362 if (elms != FixedArray::cast(result)) { | 7372 if (elms != FixedArray::cast(result)) { |
| 7363 set_elements(FixedArray::cast(result)); | 7373 set_elements(FixedArray::cast(result)); |
| 7364 } | 7374 } |
| 7365 } | 7375 } |
| 7366 | 7376 |
| (...skipping 2795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10162 if (break_point_objects()->IsUndefined()) return 0; | 10172 if (break_point_objects()->IsUndefined()) return 0; |
| 10163 // Single beak point. | 10173 // Single beak point. |
| 10164 if (!break_point_objects()->IsFixedArray()) return 1; | 10174 if (!break_point_objects()->IsFixedArray()) return 1; |
| 10165 // Multiple break points. | 10175 // Multiple break points. |
| 10166 return FixedArray::cast(break_point_objects())->length(); | 10176 return FixedArray::cast(break_point_objects())->length(); |
| 10167 } | 10177 } |
| 10168 #endif | 10178 #endif |
| 10169 | 10179 |
| 10170 | 10180 |
| 10171 } } // namespace v8::internal | 10181 } } // namespace v8::internal |
| OLD | NEW |