Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/runtime.cc

Issue 351853005: Split SetProperty(...attributes, strictmode) into AddProperty(...attributes) and SetProperty(...… (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/runtime.h ('k') | src/scopeinfo.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdlib.h> 5 #include <stdlib.h>
6 #include <limits> 6 #include <limits>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 isolate, value, 266 isolate, value,
267 CreateLiteralBoilerplate(isolate, literals, array), 267 CreateLiteralBoilerplate(isolate, literals, array),
268 Object); 268 Object);
269 } 269 }
270 MaybeHandle<Object> maybe_result; 270 MaybeHandle<Object> maybe_result;
271 uint32_t element_index = 0; 271 uint32_t element_index = 0;
272 StoreMode mode = value->IsJSObject() ? FORCE_FIELD : ALLOW_AS_CONSTANT; 272 StoreMode mode = value->IsJSObject() ? FORCE_FIELD : ALLOW_AS_CONSTANT;
273 if (key->IsInternalizedString()) { 273 if (key->IsInternalizedString()) {
274 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { 274 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) {
275 // Array index as string (uint32). 275 // Array index as string (uint32).
276 maybe_result = JSObject::SetOwnElement( 276 if (value->IsUninitialized()) {
277 boilerplate, element_index, value, SLOPPY); 277 maybe_result = value;
278 } else {
279 maybe_result = JSObject::SetOwnElement(
280 boilerplate, element_index, value, SLOPPY);
281 }
278 } else { 282 } else {
279 Handle<String> name(String::cast(*key)); 283 Handle<String> name(String::cast(*key));
280 ASSERT(!name->AsArrayIndex(&element_index)); 284 ASSERT(!name->AsArrayIndex(&element_index));
281 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( 285 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(
282 boilerplate, name, value, NONE, 286 boilerplate, name, value, NONE,
283 value_type, mode); 287 value_type, mode);
284 } 288 }
285 } else if (key->ToArrayIndex(&element_index)) { 289 } else if (key->ToArrayIndex(&element_index)) {
286 // Array index (uint32). 290 // Array index (uint32).
287 maybe_result = JSObject::SetOwnElement( 291 if (value->IsUninitialized()) {
288 boilerplate, element_index, value, SLOPPY); 292 maybe_result = value;
293 } else {
294 maybe_result = JSObject::SetOwnElement(
295 boilerplate, element_index, value, SLOPPY);
296 }
289 } else { 297 } else {
290 // Non-uint32 number. 298 // Non-uint32 number.
291 ASSERT(key->IsNumber()); 299 ASSERT(key->IsNumber());
292 double num = key->Number(); 300 double num = key->Number();
293 char arr[100]; 301 char arr[100];
294 Vector<char> buffer(arr, ARRAY_SIZE(arr)); 302 Vector<char> buffer(arr, ARRAY_SIZE(arr));
295 const char* str = DoubleToCString(num, buffer); 303 const char* str = DoubleToCString(num, buffer);
296 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str); 304 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str);
297 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( 305 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(
298 boilerplate, name, value, NONE, 306 boilerplate, name, value, NONE,
(...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after
2088 Handle<Map> old_map(object->map()); 2096 Handle<Map> old_map(object->map());
2089 RUNTIME_ASSERT(!old_map->is_access_check_needed()); 2097 RUNTIME_ASSERT(!old_map->is_access_check_needed());
2090 // Copy map so it won't interfere constructor's initial map. 2098 // Copy map so it won't interfere constructor's initial map.
2091 Handle<Map> new_map = Map::Copy(old_map); 2099 Handle<Map> new_map = Map::Copy(old_map);
2092 new_map->set_is_access_check_needed(true); 2100 new_map->set_is_access_check_needed(true);
2093 JSObject::MigrateToMap(object, new_map); 2101 JSObject::MigrateToMap(object, new_map);
2094 return isolate->heap()->undefined_value(); 2102 return isolate->heap()->undefined_value();
2095 } 2103 }
2096 2104
2097 2105
2098 // Transform getter or setter into something DefineAccessor can handle.
2099 static Handle<Object> InstantiateAccessorComponent(Isolate* isolate,
2100 Handle<Object> component) {
2101 if (component->IsUndefined()) return isolate->factory()->null_value();
2102 Handle<FunctionTemplateInfo> info =
2103 Handle<FunctionTemplateInfo>::cast(component);
2104 return Utils::OpenHandle(*Utils::ToLocal(info)->GetFunction());
2105 }
2106
2107
2108 RUNTIME_FUNCTION(Runtime_SetAccessorProperty) {
2109 HandleScope scope(isolate);
2110 ASSERT(args.length() == 5);
2111 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
2112 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
2113 CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2);
2114 CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3);
2115 CONVERT_SMI_ARG_CHECKED(attribute, 4);
2116 RUNTIME_ASSERT(getter->IsUndefined() || getter->IsFunctionTemplateInfo());
2117 RUNTIME_ASSERT(setter->IsUndefined() || setter->IsFunctionTemplateInfo());
2118 RUNTIME_ASSERT(PropertyDetails::AttributesField::is_valid(
2119 static_cast<PropertyAttributes>(attribute)));
2120 JSObject::DefineAccessor(object,
2121 name,
2122 InstantiateAccessorComponent(isolate, getter),
2123 InstantiateAccessorComponent(isolate, setter),
2124 static_cast<PropertyAttributes>(attribute));
2125 return isolate->heap()->undefined_value();
2126 }
2127
2128
2129 static Object* ThrowRedeclarationError(Isolate* isolate, Handle<String> name) { 2106 static Object* ThrowRedeclarationError(Isolate* isolate, Handle<String> name) {
2130 HandleScope scope(isolate); 2107 HandleScope scope(isolate);
2131 Handle<Object> args[1] = { name }; 2108 Handle<Object> args[1] = { name };
2132 Handle<Object> error = isolate->factory()->NewTypeError( 2109 Handle<Object> error = isolate->factory()->NewTypeError(
2133 "var_redeclaration", HandleVector(args, 1)); 2110 "var_redeclaration", HandleVector(args, 1));
2134 return isolate->Throw(*error); 2111 return isolate->Throw(*error);
2135 } 2112 }
2136 2113
2137 2114
2138 RUNTIME_FUNCTION(RuntimeHidden_DeclareGlobals) { 2115 RUNTIME_FUNCTION(RuntimeHidden_DeclareGlobals) {
(...skipping 2891 matching lines...) Expand 10 before | Expand all | Expand 10 after
5030 return obj->IsUndefined() || obj->IsSpecFunction() || obj->IsNull(); 5007 return obj->IsUndefined() || obj->IsSpecFunction() || obj->IsNull();
5031 } 5008 }
5032 5009
5033 5010
5034 // Implements part of 8.12.9 DefineOwnProperty. 5011 // Implements part of 8.12.9 DefineOwnProperty.
5035 // There are 3 cases that lead here: 5012 // There are 3 cases that lead here:
5036 // Step 4b - define a new accessor property. 5013 // Step 4b - define a new accessor property.
5037 // Steps 9c & 12 - replace an existing data property with an accessor property. 5014 // Steps 9c & 12 - replace an existing data property with an accessor property.
5038 // Step 12 - update an existing accessor property with an accessor or generic 5015 // Step 12 - update an existing accessor property with an accessor or generic
5039 // descriptor. 5016 // descriptor.
5040 RUNTIME_FUNCTION(Runtime_DefineOrRedefineAccessorProperty) { 5017 RUNTIME_FUNCTION(Runtime_DefineAccessorPropertyUnchecked) {
5041 HandleScope scope(isolate); 5018 HandleScope scope(isolate);
5042 ASSERT(args.length() == 5); 5019 ASSERT(args.length() == 5);
5043 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 5020 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
5044 RUNTIME_ASSERT(!obj->IsNull()); 5021 RUNTIME_ASSERT(!obj->IsNull());
5045 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 5022 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
5046 CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2); 5023 CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2);
5047 RUNTIME_ASSERT(IsValidAccessor(getter)); 5024 RUNTIME_ASSERT(IsValidAccessor(getter));
5048 CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3); 5025 CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3);
5049 RUNTIME_ASSERT(IsValidAccessor(setter)); 5026 RUNTIME_ASSERT(IsValidAccessor(setter));
5050 CONVERT_SMI_ARG_CHECKED(unchecked, 4); 5027 CONVERT_SMI_ARG_CHECKED(unchecked, 4);
5051 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 5028 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
5052 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); 5029 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked);
5053 5030
5054 bool fast = obj->HasFastProperties(); 5031 bool fast = obj->HasFastProperties();
5055 // DefineAccessor checks access rights. 5032 // DefineAccessor checks access rights.
5056 JSObject::DefineAccessor(obj, name, getter, setter, attr); 5033 JSObject::DefineAccessor(obj, name, getter, setter, attr);
5057 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 5034 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
5058 if (fast) JSObject::TransformToFastProperties(obj, 0); 5035 if (fast) JSObject::TransformToFastProperties(obj, 0);
5059 return isolate->heap()->undefined_value(); 5036 return isolate->heap()->undefined_value();
5060 } 5037 }
5061 5038
5062 5039
5063 // Implements part of 8.12.9 DefineOwnProperty. 5040 // Implements part of 8.12.9 DefineOwnProperty.
5064 // There are 3 cases that lead here: 5041 // There are 3 cases that lead here:
5065 // Step 4a - define a new data property. 5042 // Step 4a - define a new data property.
5066 // Steps 9b & 12 - replace an existing accessor property with a data property. 5043 // Steps 9b & 12 - replace an existing accessor property with a data property.
5067 // Step 12 - update an existing data property with a data or generic 5044 // Step 12 - update an existing data property with a data or generic
5068 // descriptor. 5045 // descriptor.
5069 RUNTIME_FUNCTION(Runtime_DefineOrRedefineDataProperty) { 5046 RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) {
5070 HandleScope scope(isolate); 5047 HandleScope scope(isolate);
5071 ASSERT(args.length() == 4); 5048 ASSERT(args.length() == 4);
5072 CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0); 5049 CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0);
5073 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 5050 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
5074 CONVERT_ARG_HANDLE_CHECKED(Object, obj_value, 2); 5051 CONVERT_ARG_HANDLE_CHECKED(Object, obj_value, 2);
5075 CONVERT_SMI_ARG_CHECKED(unchecked, 3); 5052 CONVERT_SMI_ARG_CHECKED(unchecked, 3);
5076 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 5053 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
5077 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); 5054 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked);
5078 5055
5079 // Check access rights if needed. 5056 // Check access rights if needed.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
5117 ALLOW_AS_CONSTANT, 5094 ALLOW_AS_CONSTANT,
5118 JSReceiver::PERFORM_EXTENSIBILITY_CHECK, 5095 JSReceiver::PERFORM_EXTENSIBILITY_CHECK,
5119 JSReceiver::MAY_BE_STORE_FROM_KEYED, 5096 JSReceiver::MAY_BE_STORE_FROM_KEYED,
5120 JSObject::DONT_FORCE_FIELD)); 5097 JSObject::DONT_FORCE_FIELD));
5121 return *result; 5098 return *result;
5122 } 5099 }
5123 5100
5124 Handle<Object> result; 5101 Handle<Object> result;
5125 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5102 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5126 isolate, result, 5103 isolate, result,
5127 Runtime::ForceSetObjectProperty( 5104 Runtime::DefineObjectProperty(
5128 js_object, name, obj_value, attr, 5105 js_object, name, obj_value, attr,
5129 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED)); 5106 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED));
5130 return *result; 5107 return *result;
5131 } 5108 }
5132 5109
5133 5110
5134 // Return property without being observable by accessors or interceptors. 5111 // Return property without being observable by accessors or interceptors.
5135 RUNTIME_FUNCTION(Runtime_GetDataProperty) { 5112 RUNTIME_FUNCTION(Runtime_GetDataProperty) {
5136 HandleScope scope(isolate); 5113 HandleScope scope(isolate);
5137 ASSERT(args.length() == 2); 5114 ASSERT(args.length() == 2);
5138 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 5115 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
5139 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5116 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5140 return *JSObject::GetDataProperty(object, key); 5117 return *JSObject::GetDataProperty(object, key);
5141 } 5118 }
5142 5119
5143 5120
5144 MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, 5121 MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate,
5145 Handle<Object> object, 5122 Handle<Object> object,
5146 Handle<Object> key, 5123 Handle<Object> key,
5147 Handle<Object> value, 5124 Handle<Object> value,
5148 PropertyAttributes attr, 5125 StrictMode strict_mode,
5149 StrictMode strict_mode) { 5126 PropertyAttributes attrs) {
5150 SetPropertyMode set_mode = attr == NONE ? SET_PROPERTY : DEFINE_PROPERTY;
5151
5152 if (object->IsUndefined() || object->IsNull()) { 5127 if (object->IsUndefined() || object->IsNull()) {
5153 Handle<Object> args[2] = { key, object }; 5128 Handle<Object> args[2] = { key, object };
5154 Handle<Object> error = 5129 Handle<Object> error =
5155 isolate->factory()->NewTypeError("non_object_property_store", 5130 isolate->factory()->NewTypeError("non_object_property_store",
5156 HandleVector(args, 2)); 5131 HandleVector(args, 2));
5157 return isolate->Throw<Object>(error); 5132 return isolate->Throw<Object>(error);
5158 } 5133 }
5159 5134
5160 if (object->IsJSProxy()) { 5135 if (object->IsJSProxy()) {
5161 Handle<Object> name_object; 5136 Handle<Object> name_object;
5162 if (key->IsSymbol()) { 5137 if (key->IsSymbol()) {
5163 name_object = key; 5138 name_object = key;
5164 } else { 5139 } else {
5165 ASSIGN_RETURN_ON_EXCEPTION( 5140 ASSIGN_RETURN_ON_EXCEPTION(
5166 isolate, name_object, Execution::ToString(isolate, key), Object); 5141 isolate, name_object, Execution::ToString(isolate, key), Object);
5167 } 5142 }
5168 Handle<Name> name = Handle<Name>::cast(name_object); 5143 Handle<Name> name = Handle<Name>::cast(name_object);
5169 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value, 5144 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value,
5170 attr, 5145 attrs, strict_mode);
5171 strict_mode);
5172 } 5146 }
5173 5147
5174 // If the object isn't a JavaScript object, we ignore the store. 5148 // If the object isn't a JavaScript object, we ignore the store.
5175 if (!object->IsJSObject()) return value; 5149 if (!object->IsJSObject()) return value;
5176 5150
5177 Handle<JSObject> js_object = Handle<JSObject>::cast(object); 5151 Handle<JSObject> js_object = Handle<JSObject>::cast(object);
5178 5152
5179 // Check if the given key is an array index. 5153 // Check if the given key is an array index.
5180 uint32_t index; 5154 uint32_t index;
5181 if (key->ToArrayIndex(&index)) { 5155 if (key->ToArrayIndex(&index)) {
(...skipping 11 matching lines...) Expand all
5193 JSObject::ValidateElements(js_object); 5167 JSObject::ValidateElements(js_object);
5194 if (js_object->HasExternalArrayElements() || 5168 if (js_object->HasExternalArrayElements() ||
5195 js_object->HasFixedTypedArrayElements()) { 5169 js_object->HasFixedTypedArrayElements()) {
5196 if (!value->IsNumber() && !value->IsUndefined()) { 5170 if (!value->IsNumber() && !value->IsUndefined()) {
5197 ASSIGN_RETURN_ON_EXCEPTION( 5171 ASSIGN_RETURN_ON_EXCEPTION(
5198 isolate, value, Execution::ToNumber(isolate, value), Object); 5172 isolate, value, Execution::ToNumber(isolate, value), Object);
5199 } 5173 }
5200 } 5174 }
5201 5175
5202 MaybeHandle<Object> result = JSObject::SetElement( 5176 MaybeHandle<Object> result = JSObject::SetElement(
5203 js_object, index, value, attr, strict_mode, true, set_mode); 5177 js_object, index, value, attrs, strict_mode, true, SET_PROPERTY);
5204 JSObject::ValidateElements(js_object); 5178 JSObject::ValidateElements(js_object);
5205 5179
5206 return result.is_null() ? result : value; 5180 return result.is_null() ? result : value;
5207 } 5181 }
5208 5182
5209 if (key->IsName()) { 5183 if (key->IsName()) {
5210 Handle<Name> name = Handle<Name>::cast(key); 5184 Handle<Name> name = Handle<Name>::cast(key);
5211 if (name->AsArrayIndex(&index)) { 5185 if (name->AsArrayIndex(&index)) {
5212 if (js_object->HasExternalArrayElements()) { 5186 if (js_object->HasExternalArrayElements()) {
5213 if (!value->IsNumber() && !value->IsUndefined()) { 5187 if (!value->IsNumber() && !value->IsUndefined()) {
5214 ASSIGN_RETURN_ON_EXCEPTION( 5188 ASSIGN_RETURN_ON_EXCEPTION(
5215 isolate, value, Execution::ToNumber(isolate, value), Object); 5189 isolate, value, Execution::ToNumber(isolate, value), Object);
5216 } 5190 }
5217 } 5191 }
5218 return JSObject::SetElement(js_object, index, value, attr, 5192 return JSObject::SetElement(js_object, index, value, attrs,
5219 strict_mode, true, set_mode); 5193 strict_mode, true, SET_PROPERTY);
5220 } else { 5194 } else {
5221 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); 5195 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name));
5222 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); 5196 return JSReceiver::SetProperty(
5197 js_object, name, value, attrs, strict_mode);
5223 } 5198 }
5224 } 5199 }
5225 5200
5226 // Call-back into JavaScript to convert the key to a string. 5201 // Call-back into JavaScript to convert the key to a string.
5227 Handle<Object> converted; 5202 Handle<Object> converted;
5228 ASSIGN_RETURN_ON_EXCEPTION( 5203 ASSIGN_RETURN_ON_EXCEPTION(
5229 isolate, converted, Execution::ToString(isolate, key), Object); 5204 isolate, converted, Execution::ToString(isolate, key), Object);
5230 Handle<String> name = Handle<String>::cast(converted); 5205 Handle<String> name = Handle<String>::cast(converted);
5231 5206
5232 if (name->AsArrayIndex(&index)) { 5207 if (name->AsArrayIndex(&index)) {
5233 return JSObject::SetElement(js_object, index, value, attr, 5208 return JSObject::SetElement(js_object, index, value, attrs,
5234 strict_mode, true, set_mode); 5209 strict_mode, true, SET_PROPERTY);
5235 } else { 5210 } else {
5236 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode); 5211 return JSReceiver::SetProperty(js_object, name, value, attrs, strict_mode);
5237 } 5212 }
5238 } 5213 }
5239 5214
5240 5215
5241 MaybeHandle<Object> Runtime::ForceSetObjectProperty( 5216 MaybeHandle<Object> Runtime::DefineObjectProperty(
5242 Handle<JSObject> js_object, 5217 Handle<JSObject> js_object,
5243 Handle<Object> key, 5218 Handle<Object> key,
5244 Handle<Object> value, 5219 Handle<Object> value,
5245 PropertyAttributes attr, 5220 PropertyAttributes attr,
5246 JSReceiver::StoreFromKeyed store_from_keyed) { 5221 JSReceiver::StoreFromKeyed store_from_keyed) {
5247 Isolate* isolate = js_object->GetIsolate(); 5222 Isolate* isolate = js_object->GetIsolate();
5248 // Check if the given key is an array index. 5223 // Check if the given key is an array index.
5249 uint32_t index; 5224 uint32_t index;
5250 if (key->ToArrayIndex(&index)) { 5225 if (key->ToArrayIndex(&index)) {
5251 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters 5226 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
5336 RUNTIME_ASSERT(args.length() == 3); 5311 RUNTIME_ASSERT(args.length() == 3);
5337 5312
5338 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 5313 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
5339 CONVERT_ARG_HANDLE_CHECKED(String, key, 1); 5314 CONVERT_ARG_HANDLE_CHECKED(String, key, 1);
5340 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 5315 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
5341 RUNTIME_ASSERT(key->IsUniqueName()); 5316 RUNTIME_ASSERT(key->IsUniqueName());
5342 return *JSObject::SetHiddenProperty(object, key, value); 5317 return *JSObject::SetHiddenProperty(object, key, value);
5343 } 5318 }
5344 5319
5345 5320
5346 RUNTIME_FUNCTION(Runtime_SetProperty) { 5321 RUNTIME_FUNCTION(Runtime_AddProperty) {
5347 HandleScope scope(isolate); 5322 HandleScope scope(isolate);
5348 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); 5323 RUNTIME_ASSERT(args.length() == 4);
5349 5324
5350 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); 5325 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
5351 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 5326 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
5352 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 5327 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
5353 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); 5328 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3);
5354 RUNTIME_ASSERT( 5329 RUNTIME_ASSERT(
5355 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 5330 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
5356 // Compute attributes. 5331 // Compute attributes.
5357 PropertyAttributes attributes = 5332 PropertyAttributes attributes =
5358 static_cast<PropertyAttributes>(unchecked_attributes); 5333 static_cast<PropertyAttributes>(unchecked_attributes);
5359 5334
5360 StrictMode strict_mode = SLOPPY; 5335 #ifdef DEBUG
5361 if (args.length() == 5) { 5336 if (key->IsName()) {
5362 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode_arg, 4); 5337 LookupIterator it(object, Handle<Name>::cast(key),
5363 strict_mode = strict_mode_arg; 5338 LookupIterator::CHECK_OWN);
5339 JSReceiver::GetPropertyAttributes(&it);
5340 RUNTIME_ASSERT(!it.IsFound());
5341 } else {
5342 uint32_t index = 0;
5343 RUNTIME_ASSERT(key->ToArrayIndex(&index));
5344 RUNTIME_ASSERT(!JSReceiver::HasOwnElement(object, index));
5364 } 5345 }
5346 #endif
5365 5347
5366 Handle<Object> result; 5348 Handle<Object> result;
5367 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5349 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5368 isolate, result, 5350 isolate, result,
5369 Runtime::SetObjectProperty( 5351 Runtime::DefineObjectProperty(object, key, value, attributes));
5370 isolate, object, key, value, attributes, strict_mode));
5371 return *result; 5352 return *result;
5372 } 5353 }
5373 5354
5355
5356 RUNTIME_FUNCTION(Runtime_SetProperty) {
5357 HandleScope scope(isolate);
5358 RUNTIME_ASSERT(args.length() == 4);
5359
5360 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
5361 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
5362 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
5363 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode_arg, 3);
5364 StrictMode strict_mode = strict_mode_arg;
5365
5366 Handle<Object> result;
5367 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5368 isolate, result,
5369 Runtime::SetObjectProperty(isolate, object, key, value, strict_mode));
5370 return *result;
5371 }
5372
5374 5373
5375 RUNTIME_FUNCTION(Runtime_TransitionElementsKind) { 5374 RUNTIME_FUNCTION(Runtime_TransitionElementsKind) {
5376 HandleScope scope(isolate); 5375 HandleScope scope(isolate);
5377 RUNTIME_ASSERT(args.length() == 2); 5376 RUNTIME_ASSERT(args.length() == 2);
5378 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 5377 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
5379 CONVERT_ARG_HANDLE_CHECKED(Map, map, 1); 5378 CONVERT_ARG_HANDLE_CHECKED(Map, map, 1);
5380 JSObject::TransitionElementsKind(array, map->elements_kind()); 5379 JSObject::TransitionElementsKind(array, map->elements_kind());
5381 return *array; 5380 return *array;
5382 } 5381 }
5383 5382
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
5514 5513
5515 5514
5516 RUNTIME_FUNCTION(Runtime_DebugPromiseHandleEpilogue) { 5515 RUNTIME_FUNCTION(Runtime_DebugPromiseHandleEpilogue) {
5517 ASSERT(args.length() == 0); 5516 ASSERT(args.length() == 0);
5518 SealHandleScope shs(isolate); 5517 SealHandleScope shs(isolate);
5519 isolate->debug()->PromiseHandleEpilogue(); 5518 isolate->debug()->PromiseHandleEpilogue();
5520 return isolate->heap()->undefined_value(); 5519 return isolate->heap()->undefined_value();
5521 } 5520 }
5522 5521
5523 5522
5524 // Set an own property, even if it is READ_ONLY. If the property does not
5525 // exist, it will be added with attributes NONE.
5526 RUNTIME_FUNCTION(Runtime_IgnoreAttributesAndSetProperty) {
5527 HandleScope scope(isolate);
5528 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4);
5529 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
5530 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
5531 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
5532 // Compute attributes.
5533 PropertyAttributes attributes = NONE;
5534 if (args.length() == 4) {
5535 CONVERT_SMI_ARG_CHECKED(unchecked_value, 3);
5536 // Only attribute bits should be set.
5537 RUNTIME_ASSERT(
5538 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
5539 attributes = static_cast<PropertyAttributes>(unchecked_value);
5540 }
5541 Handle<Object> result;
5542 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5543 isolate, result,
5544 JSObject::SetOwnPropertyIgnoreAttributes(
5545 object, name, value, attributes));
5546 return *result;
5547 }
5548
5549
5550 RUNTIME_FUNCTION(Runtime_DeleteProperty) { 5523 RUNTIME_FUNCTION(Runtime_DeleteProperty) {
5551 HandleScope scope(isolate); 5524 HandleScope scope(isolate);
5552 ASSERT(args.length() == 3); 5525 ASSERT(args.length() == 3);
5553 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); 5526 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
5554 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5527 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5555 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); 5528 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2);
5556 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT 5529 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT
5557 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION; 5530 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION;
5558 Handle<Object> result; 5531 Handle<Object> result;
5559 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5532 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
(...skipping 5837 matching lines...) Expand 10 before | Expand all | Expand 10 after
11397 11370
11398 HandleScope scope(isolate); 11371 HandleScope scope(isolate);
11399 Handle<Object> value(i < frame_inspector->GetParametersCount() 11372 Handle<Object> value(i < frame_inspector->GetParametersCount()
11400 ? frame_inspector->GetParameter(i) 11373 ? frame_inspector->GetParameter(i)
11401 : isolate->heap()->undefined_value(), 11374 : isolate->heap()->undefined_value(),
11402 isolate); 11375 isolate);
11403 ASSERT(!value->IsTheHole()); 11376 ASSERT(!value->IsTheHole());
11404 11377
11405 RETURN_ON_EXCEPTION( 11378 RETURN_ON_EXCEPTION(
11406 isolate, 11379 isolate,
11407 Runtime::SetObjectProperty(isolate, target, name, value, NONE, SLOPPY), 11380 Runtime::SetObjectProperty(isolate, target, name, value, SLOPPY),
11408 JSObject); 11381 JSObject);
11409 } 11382 }
11410 11383
11411 // Second fill all stack locals. 11384 // Second fill all stack locals.
11412 for (int i = 0; i < scope_info->StackLocalCount(); ++i) { 11385 for (int i = 0; i < scope_info->StackLocalCount(); ++i) {
11413 if (scope_info->LocalIsSynthetic(i)) continue; 11386 if (scope_info->LocalIsSynthetic(i)) continue;
11414 Handle<String> name(scope_info->StackLocalName(i)); 11387 Handle<String> name(scope_info->StackLocalName(i));
11415 Handle<Object> value(frame_inspector->GetExpression(i), isolate); 11388 Handle<Object> value(frame_inspector->GetExpression(i), isolate);
11416 if (value->IsTheHole()) continue; 11389 if (value->IsTheHole()) continue;
11417 11390
11418 RETURN_ON_EXCEPTION( 11391 RETURN_ON_EXCEPTION(
11419 isolate, 11392 isolate,
11420 Runtime::SetObjectProperty(isolate, target, name, value, NONE, SLOPPY), 11393 Runtime::SetObjectProperty(isolate, target, name, value, SLOPPY),
11421 JSObject); 11394 JSObject);
11422 } 11395 }
11423 11396
11424 return target; 11397 return target;
11425 } 11398 }
11426 11399
11427 11400
11428 static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate, 11401 static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate,
11429 Handle<JSObject> target, 11402 Handle<JSObject> target,
11430 Handle<JSFunction> function, 11403 Handle<JSFunction> function,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
11499 11472
11500 for (int i = 0; i < keys->length(); i++) { 11473 for (int i = 0; i < keys->length(); i++) {
11501 // Names of variables introduced by eval are strings. 11474 // Names of variables introduced by eval are strings.
11502 ASSERT(keys->get(i)->IsString()); 11475 ASSERT(keys->get(i)->IsString());
11503 Handle<String> key(String::cast(keys->get(i))); 11476 Handle<String> key(String::cast(keys->get(i)));
11504 Handle<Object> value; 11477 Handle<Object> value;
11505 ASSIGN_RETURN_ON_EXCEPTION( 11478 ASSIGN_RETURN_ON_EXCEPTION(
11506 isolate, value, Object::GetPropertyOrElement(ext, key), JSObject); 11479 isolate, value, Object::GetPropertyOrElement(ext, key), JSObject);
11507 RETURN_ON_EXCEPTION( 11480 RETURN_ON_EXCEPTION(
11508 isolate, 11481 isolate,
11509 Runtime::SetObjectProperty( 11482 Runtime::SetObjectProperty(isolate, target, key, value, SLOPPY),
11510 isolate, target, key, value, NONE, SLOPPY),
11511 JSObject); 11483 JSObject);
11512 } 11484 }
11513 } 11485 }
11514 } 11486 }
11515 11487
11516 return target; 11488 return target;
11517 } 11489 }
11518 11490
11519 11491
11520 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeLocalScope( 11492 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeLocalScope(
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
11605 // Function context extension. These are variables introduced by eval. 11577 // Function context extension. These are variables introduced by eval.
11606 if (function_context->closure() == *function) { 11578 if (function_context->closure() == *function) {
11607 if (function_context->has_extension() && 11579 if (function_context->has_extension() &&
11608 !function_context->IsNativeContext()) { 11580 !function_context->IsNativeContext()) {
11609 Handle<JSObject> ext(JSObject::cast(function_context->extension())); 11581 Handle<JSObject> ext(JSObject::cast(function_context->extension()));
11610 11582
11611 if (JSReceiver::HasProperty(ext, variable_name)) { 11583 if (JSReceiver::HasProperty(ext, variable_name)) {
11612 // We don't expect this to do anything except replacing 11584 // We don't expect this to do anything except replacing
11613 // property value. 11585 // property value.
11614 Runtime::SetObjectProperty(isolate, ext, variable_name, new_value, 11586 Runtime::SetObjectProperty(isolate, ext, variable_name, new_value,
11615 NONE, SLOPPY).Assert(); 11587 SLOPPY).Assert();
11616 return true; 11588 return true;
11617 } 11589 }
11618 } 11590 }
11619 } 11591 }
11620 } 11592 }
11621 11593
11622 return default_result; 11594 return default_result;
11623 } 11595 }
11624 11596
11625 11597
(...skipping 30 matching lines...) Expand all
11656 for (int i = 0; i < keys->length(); i++) { 11628 for (int i = 0; i < keys->length(); i++) {
11657 HandleScope scope(isolate); 11629 HandleScope scope(isolate);
11658 // Names of variables introduced by eval are strings. 11630 // Names of variables introduced by eval are strings.
11659 ASSERT(keys->get(i)->IsString()); 11631 ASSERT(keys->get(i)->IsString());
11660 Handle<String> key(String::cast(keys->get(i))); 11632 Handle<String> key(String::cast(keys->get(i)));
11661 Handle<Object> value; 11633 Handle<Object> value;
11662 ASSIGN_RETURN_ON_EXCEPTION( 11634 ASSIGN_RETURN_ON_EXCEPTION(
11663 isolate, value, Object::GetPropertyOrElement(ext, key), JSObject); 11635 isolate, value, Object::GetPropertyOrElement(ext, key), JSObject);
11664 RETURN_ON_EXCEPTION( 11636 RETURN_ON_EXCEPTION(
11665 isolate, 11637 isolate,
11666 Runtime::SetObjectProperty( 11638 Runtime::DefineObjectProperty(closure_scope, key, value, NONE),
11667 isolate, closure_scope, key, value, NONE, SLOPPY),
11668 JSObject); 11639 JSObject);
11669 } 11640 }
11670 } 11641 }
11671 11642
11672 return closure_scope; 11643 return closure_scope;
11673 } 11644 }
11674 11645
11675 11646
11676 // This method copies structure of MaterializeClosure method above. 11647 // This method copies structure of MaterializeClosure method above.
11677 static bool SetClosureVariableValue(Isolate* isolate, 11648 static bool SetClosureVariableValue(Isolate* isolate,
(...skipping 10 matching lines...) Expand all
11688 isolate, scope_info, context, variable_name, new_value)) { 11659 isolate, scope_info, context, variable_name, new_value)) {
11689 return true; 11660 return true;
11690 } 11661 }
11691 11662
11692 // Properties from the function context extension. This will 11663 // Properties from the function context extension. This will
11693 // be variables introduced by eval. 11664 // be variables introduced by eval.
11694 if (context->has_extension()) { 11665 if (context->has_extension()) {
11695 Handle<JSObject> ext(JSObject::cast(context->extension())); 11666 Handle<JSObject> ext(JSObject::cast(context->extension()));
11696 if (JSReceiver::HasProperty(ext, variable_name)) { 11667 if (JSReceiver::HasProperty(ext, variable_name)) {
11697 // We don't expect this to do anything except replacing property value. 11668 // We don't expect this to do anything except replacing property value.
11698 Runtime::SetObjectProperty(isolate, ext, variable_name, new_value, 11669 Runtime::DefineObjectProperty(
11699 NONE, SLOPPY).Assert(); 11670 ext, variable_name, new_value, NONE).Assert();
11700 return true; 11671 return true;
11701 } 11672 }
11702 } 11673 }
11703 11674
11704 return false; 11675 return false;
11705 } 11676 }
11706 11677
11707 11678
11708 // Create a plain JSObject which materializes the scope for the specified 11679 // Create a plain JSObject which materializes the scope for the specified
11709 // catch context. 11680 // catch context.
11710 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeCatchScope( 11681 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeCatchScope(
11711 Isolate* isolate, 11682 Isolate* isolate,
11712 Handle<Context> context) { 11683 Handle<Context> context) {
11713 ASSERT(context->IsCatchContext()); 11684 ASSERT(context->IsCatchContext());
11714 Handle<String> name(String::cast(context->extension())); 11685 Handle<String> name(String::cast(context->extension()));
11715 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX), 11686 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX),
11716 isolate); 11687 isolate);
11717 Handle<JSObject> catch_scope = 11688 Handle<JSObject> catch_scope =
11718 isolate->factory()->NewJSObject(isolate->object_function()); 11689 isolate->factory()->NewJSObject(isolate->object_function());
11719 RETURN_ON_EXCEPTION( 11690 RETURN_ON_EXCEPTION(
11720 isolate, 11691 isolate,
11721 Runtime::SetObjectProperty(isolate, catch_scope, name, thrown_object, 11692 Runtime::DefineObjectProperty(catch_scope, name, thrown_object, NONE),
11722 NONE, SLOPPY),
11723 JSObject); 11693 JSObject);
11724 return catch_scope; 11694 return catch_scope;
11725 } 11695 }
11726 11696
11727 11697
11728 static bool SetCatchVariableValue(Isolate* isolate, 11698 static bool SetCatchVariableValue(Isolate* isolate,
11729 Handle<Context> context, 11699 Handle<Context> context,
11730 Handle<String> variable_name, 11700 Handle<String> variable_name,
11731 Handle<Object> new_value) { 11701 Handle<Object> new_value) {
11732 ASSERT(context->IsCatchContext()); 11702 ASSERT(context->IsCatchContext());
(...skipping 1042 matching lines...) Expand 10 before | Expand all | Expand 10 after
12775 target, isolate->factory()->arguments_string())) { 12745 target, isolate->factory()->arguments_string())) {
12776 return target; 12746 return target;
12777 } 12747 }
12778 12748
12779 // FunctionGetArguments can't throw an exception. 12749 // FunctionGetArguments can't throw an exception.
12780 Handle<JSObject> arguments = Handle<JSObject>::cast( 12750 Handle<JSObject> arguments = Handle<JSObject>::cast(
12781 Accessors::FunctionGetArguments(function)); 12751 Accessors::FunctionGetArguments(function));
12782 Handle<String> arguments_str = isolate->factory()->arguments_string(); 12752 Handle<String> arguments_str = isolate->factory()->arguments_string();
12783 RETURN_ON_EXCEPTION( 12753 RETURN_ON_EXCEPTION(
12784 isolate, 12754 isolate,
12785 Runtime::SetObjectProperty( 12755 Runtime::DefineObjectProperty(target, arguments_str, arguments, NONE),
12786 isolate, target, arguments_str, arguments, ::NONE, SLOPPY),
12787 JSObject); 12756 JSObject);
12788 return target; 12757 return target;
12789 } 12758 }
12790 12759
12791 12760
12792 // Compile and evaluate source for the given context. 12761 // Compile and evaluate source for the given context.
12793 static MaybeHandle<Object> DebugEvaluate(Isolate* isolate, 12762 static MaybeHandle<Object> DebugEvaluate(Isolate* isolate,
12794 Handle<Context> context, 12763 Handle<Context> context,
12795 Handle<Object> context_extension, 12764 Handle<Object> context_extension,
12796 Handle<Object> receiver, 12765 Handle<Object> receiver,
(...skipping 2312 matching lines...) Expand 10 before | Expand all | Expand 10 after
15109 } 15078 }
15110 return NULL; 15079 return NULL;
15111 } 15080 }
15112 15081
15113 15082
15114 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { 15083 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) {
15115 return &(kIntrinsicFunctions[static_cast<int>(id)]); 15084 return &(kIntrinsicFunctions[static_cast<int>(id)]);
15116 } 15085 }
15117 15086
15118 } } // namespace v8::internal 15087 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | src/scopeinfo.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698