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 |