OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 2942 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2953 } | 2953 } |
2954 | 2954 |
2955 // If the object isn't a JavaScript object, we ignore the store. | 2955 // If the object isn't a JavaScript object, we ignore the store. |
2956 if (!object->IsJSObject()) return *value; | 2956 if (!object->IsJSObject()) return *value; |
2957 | 2957 |
2958 Handle<JSObject> js_object = Handle<JSObject>::cast(object); | 2958 Handle<JSObject> js_object = Handle<JSObject>::cast(object); |
2959 | 2959 |
2960 // Check if the given key is an array index. | 2960 // Check if the given key is an array index. |
2961 uint32_t index; | 2961 uint32_t index; |
2962 if (Array::IndexFromObject(*key, &index)) { | 2962 if (Array::IndexFromObject(*key, &index)) { |
2963 ASSERT(attr == NONE); | |
2964 | |
2965 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters | 2963 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters |
2966 // of a string using [] notation. We need to support this too in | 2964 // of a string using [] notation. We need to support this too in |
2967 // JavaScript. | 2965 // JavaScript. |
2968 // In the case of a String object we just need to redirect the assignment to | 2966 // In the case of a String object we just need to redirect the assignment to |
2969 // the underlying string if the index is in range. Since the underlying | 2967 // the underlying string if the index is in range. Since the underlying |
2970 // string does nothing with the assignment then we can ignore such | 2968 // string does nothing with the assignment then we can ignore such |
2971 // assignments. | 2969 // assignments. |
2972 if (js_object->IsStringObjectWithCharacterAt(index)) { | 2970 if (js_object->IsStringObjectWithCharacterAt(index)) { |
2973 return *value; | 2971 return *value; |
2974 } | 2972 } |
2975 | 2973 |
2976 Handle<Object> result = SetElement(js_object, index, value); | 2974 Handle<Object> result = SetElement(js_object, index, value); |
2977 if (result.is_null()) return Failure::Exception(); | 2975 if (result.is_null()) return Failure::Exception(); |
2978 return *value; | 2976 return *value; |
2979 } | 2977 } |
2980 | 2978 |
2981 if (key->IsString()) { | 2979 if (key->IsString()) { |
2982 Handle<Object> result; | 2980 Handle<Object> result; |
2983 if (Handle<String>::cast(key)->AsArrayIndex(&index)) { | 2981 if (Handle<String>::cast(key)->AsArrayIndex(&index)) { |
2984 ASSERT(attr == NONE); | |
2985 result = SetElement(js_object, index, value); | 2982 result = SetElement(js_object, index, value); |
2986 } else { | 2983 } else { |
2987 Handle<String> key_string = Handle<String>::cast(key); | 2984 Handle<String> key_string = Handle<String>::cast(key); |
2988 key_string->TryFlattenIfNotFlat(); | 2985 key_string->TryFlattenIfNotFlat(); |
2989 result = SetProperty(js_object, key_string, value, attr); | 2986 result = SetProperty(js_object, key_string, value, attr); |
2990 } | 2987 } |
2991 if (result.is_null()) return Failure::Exception(); | 2988 if (result.is_null()) return Failure::Exception(); |
2992 return *value; | 2989 return *value; |
2993 } | 2990 } |
2994 | 2991 |
2995 // Call-back into JavaScript to convert the key to a string. | 2992 // Call-back into JavaScript to convert the key to a string. |
2996 bool has_pending_exception = false; | 2993 bool has_pending_exception = false; |
2997 Handle<Object> converted = Execution::ToString(key, &has_pending_exception); | 2994 Handle<Object> converted = Execution::ToString(key, &has_pending_exception); |
2998 if (has_pending_exception) return Failure::Exception(); | 2995 if (has_pending_exception) return Failure::Exception(); |
2999 Handle<String> name = Handle<String>::cast(converted); | 2996 Handle<String> name = Handle<String>::cast(converted); |
3000 | 2997 |
3001 if (name->AsArrayIndex(&index)) { | 2998 if (name->AsArrayIndex(&index)) { |
3002 ASSERT(attr == NONE); | |
3003 return js_object->SetElement(index, *value); | 2999 return js_object->SetElement(index, *value); |
3004 } else { | 3000 } else { |
3005 return js_object->SetProperty(*name, *value, attr); | 3001 return js_object->SetProperty(*name, *value, attr); |
3006 } | 3002 } |
3007 } | 3003 } |
3008 | 3004 |
3009 | 3005 |
3010 Object* Runtime::ForceSetObjectProperty(Handle<JSObject> js_object, | 3006 Object* Runtime::ForceSetObjectProperty(Handle<JSObject> js_object, |
3011 Handle<Object> key, | 3007 Handle<Object> key, |
3012 Handle<Object> value, | 3008 Handle<Object> value, |
3013 PropertyAttributes attr) { | 3009 PropertyAttributes attr) { |
3014 HandleScope scope; | 3010 HandleScope scope; |
3015 | 3011 |
3016 // Check if the given key is an array index. | 3012 // Check if the given key is an array index. |
3017 uint32_t index; | 3013 uint32_t index; |
3018 if (Array::IndexFromObject(*key, &index)) { | 3014 if (Array::IndexFromObject(*key, &index)) { |
3019 ASSERT(attr == NONE); | |
3020 | |
3021 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters | 3015 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters |
3022 // of a string using [] notation. We need to support this too in | 3016 // of a string using [] notation. We need to support this too in |
3023 // JavaScript. | 3017 // JavaScript. |
3024 // In the case of a String object we just need to redirect the assignment to | 3018 // In the case of a String object we just need to redirect the assignment to |
3025 // the underlying string if the index is in range. Since the underlying | 3019 // the underlying string if the index is in range. Since the underlying |
3026 // string does nothing with the assignment then we can ignore such | 3020 // string does nothing with the assignment then we can ignore such |
3027 // assignments. | 3021 // assignments. |
3028 if (js_object->IsStringObjectWithCharacterAt(index)) { | 3022 if (js_object->IsStringObjectWithCharacterAt(index)) { |
3029 return *value; | 3023 return *value; |
3030 } | 3024 } |
3031 | 3025 |
3032 return js_object->SetElement(index, *value); | 3026 return js_object->SetElement(index, *value); |
3033 } | 3027 } |
3034 | 3028 |
3035 if (key->IsString()) { | 3029 if (key->IsString()) { |
3036 if (Handle<String>::cast(key)->AsArrayIndex(&index)) { | 3030 if (Handle<String>::cast(key)->AsArrayIndex(&index)) { |
3037 ASSERT(attr == NONE); | |
3038 return js_object->SetElement(index, *value); | 3031 return js_object->SetElement(index, *value); |
3039 } else { | 3032 } else { |
3040 Handle<String> key_string = Handle<String>::cast(key); | 3033 Handle<String> key_string = Handle<String>::cast(key); |
3041 key_string->TryFlattenIfNotFlat(); | 3034 key_string->TryFlattenIfNotFlat(); |
3042 return js_object->IgnoreAttributesAndSetLocalProperty(*key_string, | 3035 return js_object->IgnoreAttributesAndSetLocalProperty(*key_string, |
3043 *value, | 3036 *value, |
3044 attr); | 3037 attr); |
3045 } | 3038 } |
3046 } | 3039 } |
3047 | 3040 |
3048 // Call-back into JavaScript to convert the key to a string. | 3041 // Call-back into JavaScript to convert the key to a string. |
3049 bool has_pending_exception = false; | 3042 bool has_pending_exception = false; |
3050 Handle<Object> converted = Execution::ToString(key, &has_pending_exception); | 3043 Handle<Object> converted = Execution::ToString(key, &has_pending_exception); |
3051 if (has_pending_exception) return Failure::Exception(); | 3044 if (has_pending_exception) return Failure::Exception(); |
3052 Handle<String> name = Handle<String>::cast(converted); | 3045 Handle<String> name = Handle<String>::cast(converted); |
3053 | 3046 |
3054 if (name->AsArrayIndex(&index)) { | 3047 if (name->AsArrayIndex(&index)) { |
3055 ASSERT(attr == NONE); | |
3056 return js_object->SetElement(index, *value); | 3048 return js_object->SetElement(index, *value); |
3057 } else { | 3049 } else { |
3058 return js_object->IgnoreAttributesAndSetLocalProperty(*name, *value, attr); | 3050 return js_object->IgnoreAttributesAndSetLocalProperty(*name, *value, attr); |
3059 } | 3051 } |
3060 } | 3052 } |
3061 | 3053 |
3062 | 3054 |
3063 Object* Runtime::ForceDeleteObjectProperty(Handle<JSObject> js_object, | 3055 Object* Runtime::ForceDeleteObjectProperty(Handle<JSObject> js_object, |
3064 Handle<Object> key) { | 3056 Handle<Object> key) { |
3065 HandleScope scope; | 3057 HandleScope scope; |
(...skipping 5116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8182 } else { | 8174 } else { |
8183 // Handle last resort GC and make sure to allow future allocations | 8175 // Handle last resort GC and make sure to allow future allocations |
8184 // to grow the heap without causing GCs (if possible). | 8176 // to grow the heap without causing GCs (if possible). |
8185 Counters::gc_last_resort_from_js.Increment(); | 8177 Counters::gc_last_resort_from_js.Increment(); |
8186 Heap::CollectAllGarbage(false); | 8178 Heap::CollectAllGarbage(false); |
8187 } | 8179 } |
8188 } | 8180 } |
8189 | 8181 |
8190 | 8182 |
8191 } } // namespace v8::internal | 8183 } } // namespace v8::internal |
OLD | NEW |