OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1764 StrictModeFlag strict_mode) { | 1764 StrictModeFlag strict_mode) { |
1765 LookupResult result; | 1765 LookupResult result; |
1766 LocalLookup(name, &result); | 1766 LocalLookup(name, &result); |
1767 return SetProperty(&result, name, value, attributes, strict_mode); | 1767 return SetProperty(&result, name, value, attributes, strict_mode); |
1768 } | 1768 } |
1769 | 1769 |
1770 | 1770 |
1771 MaybeObject* JSObject::SetPropertyWithCallback(Object* structure, | 1771 MaybeObject* JSObject::SetPropertyWithCallback(Object* structure, |
1772 String* name, | 1772 String* name, |
1773 Object* value, | 1773 Object* value, |
1774 JSObject* holder) { | 1774 JSObject* holder, |
| 1775 StrictModeFlag strict_mode) { |
1775 Isolate* isolate = GetIsolate(); | 1776 Isolate* isolate = GetIsolate(); |
1776 HandleScope scope(isolate); | 1777 HandleScope scope(isolate); |
1777 | 1778 |
1778 // We should never get here to initialize a const with the hole | 1779 // We should never get here to initialize a const with the hole |
1779 // value since a const declaration would conflict with the setter. | 1780 // value since a const declaration would conflict with the setter. |
1780 ASSERT(!value->IsTheHole()); | 1781 ASSERT(!value->IsTheHole()); |
1781 Handle<Object> value_handle(value, isolate); | 1782 Handle<Object> value_handle(value, isolate); |
1782 | 1783 |
1783 // To accommodate both the old and the new api we switch on the | 1784 // To accommodate both the old and the new api we switch on the |
1784 // data structure used to store the callbacks. Eventually foreign | 1785 // data structure used to store the callbacks. Eventually foreign |
(...skipping 27 matching lines...) Expand all Loading... |
1812 } | 1813 } |
1813 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 1814 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1814 return *value_handle; | 1815 return *value_handle; |
1815 } | 1816 } |
1816 | 1817 |
1817 if (structure->IsFixedArray()) { | 1818 if (structure->IsFixedArray()) { |
1818 Object* setter = FixedArray::cast(structure)->get(kSetterIndex); | 1819 Object* setter = FixedArray::cast(structure)->get(kSetterIndex); |
1819 if (setter->IsJSFunction()) { | 1820 if (setter->IsJSFunction()) { |
1820 return SetPropertyWithDefinedSetter(JSFunction::cast(setter), value); | 1821 return SetPropertyWithDefinedSetter(JSFunction::cast(setter), value); |
1821 } else { | 1822 } else { |
| 1823 if (strict_mode == kNonStrictMode) { |
| 1824 return value; |
| 1825 } |
1822 Handle<String> key(name); | 1826 Handle<String> key(name); |
1823 Handle<Object> holder_handle(holder, isolate); | 1827 Handle<Object> holder_handle(holder, isolate); |
1824 Handle<Object> args[2] = { key, holder_handle }; | 1828 Handle<Object> args[2] = { key, holder_handle }; |
1825 return isolate->Throw( | 1829 return isolate->Throw( |
1826 *isolate->factory()->NewTypeError("no_setter_in_callback", | 1830 *isolate->factory()->NewTypeError("no_setter_in_callback", |
1827 HandleVector(args, 2))); | 1831 HandleVector(args, 2))); |
1828 } | 1832 } |
1829 } | 1833 } |
1830 | 1834 |
1831 UNREACHABLE(); | 1835 UNREACHABLE(); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1869 } | 1873 } |
1870 if (result->type() == CALLBACKS) { | 1874 if (result->type() == CALLBACKS) { |
1871 return; | 1875 return; |
1872 } | 1876 } |
1873 } | 1877 } |
1874 } | 1878 } |
1875 result->NotFound(); | 1879 result->NotFound(); |
1876 } | 1880 } |
1877 | 1881 |
1878 | 1882 |
1879 MaybeObject* JSObject::SetElementWithCallbackSetterInPrototypes(uint32_t index, | 1883 MaybeObject* JSObject::SetElementWithCallbackSetterInPrototypes( |
1880 Object* value, | 1884 uint32_t index, |
1881 bool* found) { | 1885 Object* value, |
| 1886 bool* found, |
| 1887 StrictModeFlag strict_mode) { |
1882 Heap* heap = GetHeap(); | 1888 Heap* heap = GetHeap(); |
1883 for (Object* pt = GetPrototype(); | 1889 for (Object* pt = GetPrototype(); |
1884 pt != heap->null_value(); | 1890 pt != heap->null_value(); |
1885 pt = pt->GetPrototype()) { | 1891 pt = pt->GetPrototype()) { |
1886 if (!JSObject::cast(pt)->HasDictionaryElements()) { | 1892 if (!JSObject::cast(pt)->HasDictionaryElements()) { |
1887 continue; | 1893 continue; |
1888 } | 1894 } |
1889 NumberDictionary* dictionary = JSObject::cast(pt)->element_dictionary(); | 1895 NumberDictionary* dictionary = JSObject::cast(pt)->element_dictionary(); |
1890 int entry = dictionary->FindEntry(index); | 1896 int entry = dictionary->FindEntry(index); |
1891 if (entry != NumberDictionary::kNotFound) { | 1897 if (entry != NumberDictionary::kNotFound) { |
1892 PropertyDetails details = dictionary->DetailsAt(entry); | 1898 PropertyDetails details = dictionary->DetailsAt(entry); |
1893 if (details.type() == CALLBACKS) { | 1899 if (details.type() == CALLBACKS) { |
1894 *found = true; | 1900 *found = true; |
1895 return SetElementWithCallback( | 1901 return SetElementWithCallback(dictionary->ValueAt(entry), |
1896 dictionary->ValueAt(entry), index, value, JSObject::cast(pt)); | 1902 index, |
| 1903 value, |
| 1904 JSObject::cast(pt), |
| 1905 strict_mode); |
1897 } | 1906 } |
1898 } | 1907 } |
1899 } | 1908 } |
1900 *found = false; | 1909 *found = false; |
1901 return heap->the_hole_value(); | 1910 return heap->the_hole_value(); |
1902 } | 1911 } |
1903 | 1912 |
1904 | 1913 |
1905 void JSObject::LookupInDescriptor(String* name, LookupResult* result) { | 1914 void JSObject::LookupInDescriptor(String* name, LookupResult* result) { |
1906 DescriptorArray* descriptors = map()->instance_descriptors(); | 1915 DescriptorArray* descriptors = map()->instance_descriptors(); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2067 pt != heap->null_value(); | 2076 pt != heap->null_value(); |
2068 pt = JSObject::cast(pt)->GetPrototype()) { | 2077 pt = JSObject::cast(pt)->GetPrototype()) { |
2069 JSObject::cast(pt)->LocalLookupRealNamedProperty(name, result); | 2078 JSObject::cast(pt)->LocalLookupRealNamedProperty(name, result); |
2070 if (result->IsProperty() && (result->type() != INTERCEPTOR)) return; | 2079 if (result->IsProperty() && (result->type() != INTERCEPTOR)) return; |
2071 } | 2080 } |
2072 result->NotFound(); | 2081 result->NotFound(); |
2073 } | 2082 } |
2074 | 2083 |
2075 | 2084 |
2076 // We only need to deal with CALLBACKS and INTERCEPTORS | 2085 // We only need to deal with CALLBACKS and INTERCEPTORS |
2077 MaybeObject* JSObject::SetPropertyWithFailedAccessCheck(LookupResult* result, | 2086 MaybeObject* JSObject::SetPropertyWithFailedAccessCheck( |
2078 String* name, | 2087 LookupResult* result, |
2079 Object* value, | 2088 String* name, |
2080 bool check_prototype) { | 2089 Object* value, |
| 2090 bool check_prototype, |
| 2091 StrictModeFlag strict_mode) { |
2081 if (check_prototype && !result->IsProperty()) { | 2092 if (check_prototype && !result->IsProperty()) { |
2082 LookupCallbackSetterInPrototypes(name, result); | 2093 LookupCallbackSetterInPrototypes(name, result); |
2083 } | 2094 } |
2084 | 2095 |
2085 if (result->IsProperty()) { | 2096 if (result->IsProperty()) { |
2086 if (!result->IsReadOnly()) { | 2097 if (!result->IsReadOnly()) { |
2087 switch (result->type()) { | 2098 switch (result->type()) { |
2088 case CALLBACKS: { | 2099 case CALLBACKS: { |
2089 Object* obj = result->GetCallbackObject(); | 2100 Object* obj = result->GetCallbackObject(); |
2090 if (obj->IsAccessorInfo()) { | 2101 if (obj->IsAccessorInfo()) { |
2091 AccessorInfo* info = AccessorInfo::cast(obj); | 2102 AccessorInfo* info = AccessorInfo::cast(obj); |
2092 if (info->all_can_write()) { | 2103 if (info->all_can_write()) { |
2093 return SetPropertyWithCallback(result->GetCallbackObject(), | 2104 return SetPropertyWithCallback(result->GetCallbackObject(), |
2094 name, | 2105 name, |
2095 value, | 2106 value, |
2096 result->holder()); | 2107 result->holder(), |
| 2108 strict_mode); |
2097 } | 2109 } |
2098 } | 2110 } |
2099 break; | 2111 break; |
2100 } | 2112 } |
2101 case INTERCEPTOR: { | 2113 case INTERCEPTOR: { |
2102 // Try lookup real named properties. Note that only property can be | 2114 // Try lookup real named properties. Note that only property can be |
2103 // set is callbacks marked as ALL_CAN_WRITE on the prototype chain. | 2115 // set is callbacks marked as ALL_CAN_WRITE on the prototype chain. |
2104 LookupResult r; | 2116 LookupResult r; |
2105 LookupRealNamedProperty(name, &r); | 2117 LookupRealNamedProperty(name, &r); |
2106 if (r.IsProperty()) { | 2118 if (r.IsProperty()) { |
2107 return SetPropertyWithFailedAccessCheck(&r, name, value, | 2119 return SetPropertyWithFailedAccessCheck(&r, |
2108 check_prototype); | 2120 name, |
| 2121 value, |
| 2122 check_prototype, |
| 2123 strict_mode); |
2109 } | 2124 } |
2110 break; | 2125 break; |
2111 } | 2126 } |
2112 default: { | 2127 default: { |
2113 break; | 2128 break; |
2114 } | 2129 } |
2115 } | 2130 } |
2116 } | 2131 } |
2117 } | 2132 } |
2118 | 2133 |
(...skipping 23 matching lines...) Expand all Loading... |
2142 { MaybeObject* maybe_symbol_version = heap->LookupSymbol(name); | 2157 { MaybeObject* maybe_symbol_version = heap->LookupSymbol(name); |
2143 if (maybe_symbol_version->ToObject(&symbol_version)) { | 2158 if (maybe_symbol_version->ToObject(&symbol_version)) { |
2144 name = String::cast(symbol_version); | 2159 name = String::cast(symbol_version); |
2145 } | 2160 } |
2146 } | 2161 } |
2147 } | 2162 } |
2148 | 2163 |
2149 // Check access rights if needed. | 2164 // Check access rights if needed. |
2150 if (IsAccessCheckNeeded() | 2165 if (IsAccessCheckNeeded() |
2151 && !heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_SET)) { | 2166 && !heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_SET)) { |
2152 return SetPropertyWithFailedAccessCheck(result, name, value, true); | 2167 return SetPropertyWithFailedAccessCheck(result, |
| 2168 name, |
| 2169 value, |
| 2170 true, |
| 2171 strict_mode); |
2153 } | 2172 } |
2154 | 2173 |
2155 if (IsJSGlobalProxy()) { | 2174 if (IsJSGlobalProxy()) { |
2156 Object* proto = GetPrototype(); | 2175 Object* proto = GetPrototype(); |
2157 if (proto->IsNull()) return value; | 2176 if (proto->IsNull()) return value; |
2158 ASSERT(proto->IsJSGlobalObject()); | 2177 ASSERT(proto->IsJSGlobalObject()); |
2159 return JSObject::cast(proto)->SetProperty( | 2178 return JSObject::cast(proto)->SetProperty( |
2160 result, name, value, attributes, strict_mode); | 2179 result, name, value, attributes, strict_mode); |
2161 } | 2180 } |
2162 | 2181 |
2163 if (!result->IsProperty() && !IsJSContextExtensionObject()) { | 2182 if (!result->IsProperty() && !IsJSContextExtensionObject()) { |
2164 // We could not find a local property so let's check whether there is an | 2183 // We could not find a local property so let's check whether there is an |
2165 // accessor that wants to handle the property. | 2184 // accessor that wants to handle the property. |
2166 LookupResult accessor_result; | 2185 LookupResult accessor_result; |
2167 LookupCallbackSetterInPrototypes(name, &accessor_result); | 2186 LookupCallbackSetterInPrototypes(name, &accessor_result); |
2168 if (accessor_result.IsProperty()) { | 2187 if (accessor_result.IsProperty()) { |
2169 return SetPropertyWithCallback(accessor_result.GetCallbackObject(), | 2188 return SetPropertyWithCallback(accessor_result.GetCallbackObject(), |
2170 name, | 2189 name, |
2171 value, | 2190 value, |
2172 accessor_result.holder()); | 2191 accessor_result.holder(), |
| 2192 strict_mode); |
2173 } | 2193 } |
2174 } | 2194 } |
2175 if (!result->IsFound()) { | 2195 if (!result->IsFound()) { |
2176 // Neither properties nor transitions found. | 2196 // Neither properties nor transitions found. |
2177 return AddProperty(name, value, attributes, strict_mode); | 2197 return AddProperty(name, value, attributes, strict_mode); |
2178 } | 2198 } |
2179 if (result->IsReadOnly() && result->IsProperty()) { | 2199 if (result->IsReadOnly() && result->IsProperty()) { |
2180 if (strict_mode == kStrictMode) { | 2200 if (strict_mode == kStrictMode) { |
2181 HandleScope scope; | 2201 HandleScope scope; |
2182 Handle<String> key(name); | 2202 Handle<String> key(name); |
(...skipping 23 matching lines...) Expand all Loading... |
2206 case CONSTANT_FUNCTION: | 2226 case CONSTANT_FUNCTION: |
2207 // Only replace the function if necessary. | 2227 // Only replace the function if necessary. |
2208 if (value == result->GetConstantFunction()) return value; | 2228 if (value == result->GetConstantFunction()) return value; |
2209 // Preserve the attributes of this existing property. | 2229 // Preserve the attributes of this existing property. |
2210 attributes = result->GetAttributes(); | 2230 attributes = result->GetAttributes(); |
2211 return ConvertDescriptorToField(name, value, attributes); | 2231 return ConvertDescriptorToField(name, value, attributes); |
2212 case CALLBACKS: | 2232 case CALLBACKS: |
2213 return SetPropertyWithCallback(result->GetCallbackObject(), | 2233 return SetPropertyWithCallback(result->GetCallbackObject(), |
2214 name, | 2234 name, |
2215 value, | 2235 value, |
2216 result->holder()); | 2236 result->holder(), |
| 2237 strict_mode); |
2217 case INTERCEPTOR: | 2238 case INTERCEPTOR: |
2218 return SetPropertyWithInterceptor(name, value, attributes, strict_mode); | 2239 return SetPropertyWithInterceptor(name, value, attributes, strict_mode); |
2219 case CONSTANT_TRANSITION: { | 2240 case CONSTANT_TRANSITION: { |
2220 // If the same constant function is being added we can simply | 2241 // If the same constant function is being added we can simply |
2221 // transition to the target map. | 2242 // transition to the target map. |
2222 Map* target_map = result->GetTransitionMap(); | 2243 Map* target_map = result->GetTransitionMap(); |
2223 DescriptorArray* target_descriptors = target_map->instance_descriptors(); | 2244 DescriptorArray* target_descriptors = target_map->instance_descriptors(); |
2224 int number = target_descriptors->SearchWithCache(name); | 2245 int number = target_descriptors->SearchWithCache(name); |
2225 ASSERT(number != DescriptorArray::kNotFound); | 2246 ASSERT(number != DescriptorArray::kNotFound); |
2226 ASSERT(target_descriptors->GetType(number) == CONSTANT_FUNCTION); | 2247 ASSERT(target_descriptors->GetType(number) == CONSTANT_FUNCTION); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2259 | 2280 |
2260 // Make sure that the top context does not change when doing callbacks or | 2281 // Make sure that the top context does not change when doing callbacks or |
2261 // interceptor calls. | 2282 // interceptor calls. |
2262 AssertNoContextChange ncc; | 2283 AssertNoContextChange ncc; |
2263 LookupResult result; | 2284 LookupResult result; |
2264 LocalLookup(name, &result); | 2285 LocalLookup(name, &result); |
2265 // Check access rights if needed. | 2286 // Check access rights if needed. |
2266 if (IsAccessCheckNeeded()) { | 2287 if (IsAccessCheckNeeded()) { |
2267 Heap* heap = GetHeap(); | 2288 Heap* heap = GetHeap(); |
2268 if (!heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_SET)) { | 2289 if (!heap->isolate()->MayNamedAccess(this, name, v8::ACCESS_SET)) { |
2269 return SetPropertyWithFailedAccessCheck(&result, name, value, false); | 2290 return SetPropertyWithFailedAccessCheck(&result, |
| 2291 name, |
| 2292 value, |
| 2293 false, |
| 2294 kNonStrictMode); |
2270 } | 2295 } |
2271 } | 2296 } |
2272 | 2297 |
2273 if (IsJSGlobalProxy()) { | 2298 if (IsJSGlobalProxy()) { |
2274 Object* proto = GetPrototype(); | 2299 Object* proto = GetPrototype(); |
2275 if (proto->IsNull()) return value; | 2300 if (proto->IsNull()) return value; |
2276 ASSERT(proto->IsJSGlobalObject()); | 2301 ASSERT(proto->IsJSGlobalObject()); |
2277 return JSObject::cast(proto)->SetLocalPropertyIgnoreAttributes( | 2302 return JSObject::cast(proto)->SetLocalPropertyIgnoreAttributes( |
2278 name, | 2303 name, |
2279 value, | 2304 value, |
(...skipping 5119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7399 } | 7424 } |
7400 | 7425 |
7401 UNREACHABLE(); | 7426 UNREACHABLE(); |
7402 return NULL; | 7427 return NULL; |
7403 } | 7428 } |
7404 | 7429 |
7405 | 7430 |
7406 MaybeObject* JSObject::SetElementWithCallback(Object* structure, | 7431 MaybeObject* JSObject::SetElementWithCallback(Object* structure, |
7407 uint32_t index, | 7432 uint32_t index, |
7408 Object* value, | 7433 Object* value, |
7409 JSObject* holder) { | 7434 JSObject* holder, |
| 7435 StrictModeFlag strict_mode) { |
7410 Isolate* isolate = GetIsolate(); | 7436 Isolate* isolate = GetIsolate(); |
7411 HandleScope scope(isolate); | 7437 HandleScope scope(isolate); |
7412 | 7438 |
7413 // We should never get here to initialize a const with the hole | 7439 // We should never get here to initialize a const with the hole |
7414 // value since a const declaration would conflict with the setter. | 7440 // value since a const declaration would conflict with the setter. |
7415 ASSERT(!value->IsTheHole()); | 7441 ASSERT(!value->IsTheHole()); |
7416 Handle<Object> value_handle(value, isolate); | 7442 Handle<Object> value_handle(value, isolate); |
7417 | 7443 |
7418 // To accommodate both the old and the new api we switch on the | 7444 // To accommodate both the old and the new api we switch on the |
7419 // data structure used to store the callbacks. Eventually foreign | 7445 // data structure used to store the callbacks. Eventually foreign |
(...skipping 18 matching lines...) Expand all Loading... |
7438 VMState state(isolate, EXTERNAL); | 7464 VMState state(isolate, EXTERNAL); |
7439 call_fun(v8::Utils::ToLocal(key), | 7465 call_fun(v8::Utils::ToLocal(key), |
7440 v8::Utils::ToLocal(value_handle), | 7466 v8::Utils::ToLocal(value_handle), |
7441 info); | 7467 info); |
7442 } | 7468 } |
7443 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 7469 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
7444 return *value_handle; | 7470 return *value_handle; |
7445 } | 7471 } |
7446 | 7472 |
7447 if (structure->IsFixedArray()) { | 7473 if (structure->IsFixedArray()) { |
7448 Object* setter = FixedArray::cast(structure)->get(kSetterIndex); | 7474 Handle<Object> setter(FixedArray::cast(structure)->get(kSetterIndex)); |
7449 if (setter->IsJSFunction()) { | 7475 if (setter->IsJSFunction()) { |
7450 return SetPropertyWithDefinedSetter(JSFunction::cast(setter), value); | 7476 return SetPropertyWithDefinedSetter(JSFunction::cast(*setter), value); |
7451 } else { | 7477 } else { |
| 7478 if (strict_mode == kNonStrictMode) { |
| 7479 return value; |
| 7480 } |
7452 Handle<Object> holder_handle(holder, isolate); | 7481 Handle<Object> holder_handle(holder, isolate); |
7453 Handle<Object> key(isolate->factory()->NewNumberFromUint(index)); | 7482 Handle<Object> key(isolate->factory()->NewNumberFromUint(index)); |
7454 Handle<Object> args[2] = { key, holder_handle }; | 7483 Handle<Object> args[2] = { key, holder_handle }; |
7455 return isolate->Throw( | 7484 return isolate->Throw( |
7456 *isolate->factory()->NewTypeError("no_setter_in_callback", | 7485 *isolate->factory()->NewTypeError("no_setter_in_callback", |
7457 HandleVector(args, 2))); | 7486 HandleVector(args, 2))); |
7458 } | 7487 } |
7459 } | 7488 } |
7460 | 7489 |
7461 UNREACHABLE(); | 7490 UNREACHABLE(); |
(...skipping 13 matching lines...) Expand all Loading... |
7475 Object* elms_obj; | 7504 Object* elms_obj; |
7476 { MaybeObject* maybe_elms_obj = EnsureWritableFastElements(); | 7505 { MaybeObject* maybe_elms_obj = EnsureWritableFastElements(); |
7477 if (!maybe_elms_obj->ToObject(&elms_obj)) return maybe_elms_obj; | 7506 if (!maybe_elms_obj->ToObject(&elms_obj)) return maybe_elms_obj; |
7478 } | 7507 } |
7479 FixedArray* elms = FixedArray::cast(elms_obj); | 7508 FixedArray* elms = FixedArray::cast(elms_obj); |
7480 uint32_t elms_length = static_cast<uint32_t>(elms->length()); | 7509 uint32_t elms_length = static_cast<uint32_t>(elms->length()); |
7481 | 7510 |
7482 if (check_prototype && | 7511 if (check_prototype && |
7483 (index >= elms_length || elms->get(index)->IsTheHole())) { | 7512 (index >= elms_length || elms->get(index)->IsTheHole())) { |
7484 bool found; | 7513 bool found; |
7485 MaybeObject* result = | 7514 MaybeObject* result = SetElementWithCallbackSetterInPrototypes(index, |
7486 SetElementWithCallbackSetterInPrototypes(index, value, &found); | 7515 value, |
| 7516 &found, |
| 7517 strict_mode); |
7487 if (found) return result; | 7518 if (found) return result; |
7488 } | 7519 } |
7489 | 7520 |
7490 | 7521 |
7491 // Check whether there is extra space in fixed array.. | 7522 // Check whether there is extra space in fixed array.. |
7492 if (index < elms_length) { | 7523 if (index < elms_length) { |
7493 elms->set(index, value); | 7524 elms->set(index, value); |
7494 if (IsJSArray()) { | 7525 if (IsJSArray()) { |
7495 // Update the length of the array if needed. | 7526 // Update the length of the array if needed. |
7496 uint32_t array_length = 0; | 7527 uint32_t array_length = 0; |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7620 case DICTIONARY_ELEMENTS: { | 7651 case DICTIONARY_ELEMENTS: { |
7621 // Insert element in the dictionary. | 7652 // Insert element in the dictionary. |
7622 FixedArray* elms = FixedArray::cast(elements()); | 7653 FixedArray* elms = FixedArray::cast(elements()); |
7623 NumberDictionary* dictionary = NumberDictionary::cast(elms); | 7654 NumberDictionary* dictionary = NumberDictionary::cast(elms); |
7624 | 7655 |
7625 int entry = dictionary->FindEntry(index); | 7656 int entry = dictionary->FindEntry(index); |
7626 if (entry != NumberDictionary::kNotFound) { | 7657 if (entry != NumberDictionary::kNotFound) { |
7627 Object* element = dictionary->ValueAt(entry); | 7658 Object* element = dictionary->ValueAt(entry); |
7628 PropertyDetails details = dictionary->DetailsAt(entry); | 7659 PropertyDetails details = dictionary->DetailsAt(entry); |
7629 if (details.type() == CALLBACKS) { | 7660 if (details.type() == CALLBACKS) { |
7630 return SetElementWithCallback(element, index, value, this); | 7661 return SetElementWithCallback(element, |
| 7662 index, |
| 7663 value, |
| 7664 this, |
| 7665 strict_mode); |
7631 } else { | 7666 } else { |
7632 dictionary->UpdateMaxNumberKey(index); | 7667 dictionary->UpdateMaxNumberKey(index); |
7633 // If put fails instrict mode, throw exception. | 7668 // If put fails instrict mode, throw exception. |
7634 if (!dictionary->ValueAtPut(entry, value) && | 7669 if (!dictionary->ValueAtPut(entry, value) && |
7635 strict_mode == kStrictMode) { | 7670 strict_mode == kStrictMode) { |
7636 Handle<Object> holder(this); | 7671 Handle<Object> holder(this); |
7637 Handle<Object> number(isolate->factory()->NewNumberFromUint(index)); | 7672 Handle<Object> number(isolate->factory()->NewNumberFromUint(index)); |
7638 Handle<Object> args[2] = { number, holder }; | 7673 Handle<Object> args[2] = { number, holder }; |
7639 return isolate->Throw( | 7674 return isolate->Throw( |
7640 *isolate->factory()->NewTypeError("strict_read_only_property", | 7675 *isolate->factory()->NewTypeError("strict_read_only_property", |
7641 HandleVector(args, 2))); | 7676 HandleVector(args, 2))); |
7642 } | 7677 } |
7643 } | 7678 } |
7644 } else { | 7679 } else { |
7645 // Index not already used. Look for an accessor in the prototype chain. | 7680 // Index not already used. Look for an accessor in the prototype chain. |
7646 if (check_prototype) { | 7681 if (check_prototype) { |
7647 bool found; | 7682 bool found; |
7648 MaybeObject* result = | 7683 MaybeObject* result = |
7649 // Strict mode not needed. No-setter case already handled. | 7684 // Strict mode not needed. No-setter case already handled. |
7650 SetElementWithCallbackSetterInPrototypes(index, value, &found); | 7685 SetElementWithCallbackSetterInPrototypes(index, |
| 7686 value, |
| 7687 &found, |
| 7688 strict_mode); |
7651 if (found) return result; | 7689 if (found) return result; |
7652 } | 7690 } |
7653 // When we set the is_extensible flag to false we always force | 7691 // When we set the is_extensible flag to false we always force |
7654 // the element into dictionary mode (and force them to stay there). | 7692 // the element into dictionary mode (and force them to stay there). |
7655 if (!map()->is_extensible()) { | 7693 if (!map()->is_extensible()) { |
7656 if (strict_mode == kNonStrictMode) { | 7694 if (strict_mode == kNonStrictMode) { |
7657 return isolate->heap()->undefined_value(); | 7695 return isolate->heap()->undefined_value(); |
7658 } else { | 7696 } else { |
7659 Handle<Object> number(isolate->factory()->NewNumberFromUint(index)); | 7697 Handle<Object> number(isolate->factory()->NewNumberFromUint(index)); |
7660 Handle<String> index_string( | 7698 Handle<String> index_string( |
(...skipping 2915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10576 if (break_point_objects()->IsUndefined()) return 0; | 10614 if (break_point_objects()->IsUndefined()) return 0; |
10577 // Single beak point. | 10615 // Single beak point. |
10578 if (!break_point_objects()->IsFixedArray()) return 1; | 10616 if (!break_point_objects()->IsFixedArray()) return 1; |
10579 // Multiple break points. | 10617 // Multiple break points. |
10580 return FixedArray::cast(break_point_objects())->length(); | 10618 return FixedArray::cast(break_point_objects())->length(); |
10581 } | 10619 } |
10582 #endif | 10620 #endif |
10583 | 10621 |
10584 | 10622 |
10585 } } // namespace v8::internal | 10623 } } // namespace v8::internal |
OLD | NEW |