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

Side by Side Diff: src/runtime.cc

Issue 62333002: Handlify Runtime::SetObjectProperty (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: whitespace Created 7 years, 1 month 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 // 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 5104 matching lines...) Expand 10 before | Expand all | Expand 10 after
5115 case INTERCEPTOR: 5115 case INTERCEPTOR:
5116 case TRANSITION: 5116 case TRANSITION:
5117 return isolate->heap()->undefined_value(); 5117 return isolate->heap()->undefined_value();
5118 case NONEXISTENT: 5118 case NONEXISTENT:
5119 UNREACHABLE(); 5119 UNREACHABLE();
5120 } 5120 }
5121 return isolate->heap()->undefined_value(); 5121 return isolate->heap()->undefined_value();
5122 } 5122 }
5123 5123
5124 5124
5125 MaybeObject* Runtime::SetObjectPropertyOrFail( 5125 Handle<Object> Runtime::SetObjectProperty(Isolate* isolate,
5126 Isolate* isolate, 5126 Handle<Object> object,
5127 Handle<Object> object, 5127 Handle<Object> key,
5128 Handle<Object> key, 5128 Handle<Object> value,
5129 Handle<Object> value, 5129 PropertyAttributes attr,
5130 PropertyAttributes attr, 5130 StrictModeFlag strict_mode) {
5131 StrictModeFlag strict_mode) {
5132 CALL_HEAP_FUNCTION_PASS_EXCEPTION(isolate,
5133 SetObjectProperty(isolate, object, key, value, attr, strict_mode));
5134 }
5135
5136
5137 MaybeObject* Runtime::SetObjectProperty(Isolate* isolate,
5138 Handle<Object> object,
5139 Handle<Object> key,
5140 Handle<Object> value,
5141 PropertyAttributes attr,
5142 StrictModeFlag strict_mode) {
5143 SetPropertyMode set_mode = attr == NONE ? SET_PROPERTY : DEFINE_PROPERTY; 5131 SetPropertyMode set_mode = attr == NONE ? SET_PROPERTY : DEFINE_PROPERTY;
5144 HandleScope scope(isolate);
5145 5132
5146 if (object->IsUndefined() || object->IsNull()) { 5133 if (object->IsUndefined() || object->IsNull()) {
5147 Handle<Object> args[2] = { key, object }; 5134 Handle<Object> args[2] = { key, object };
5148 Handle<Object> error = 5135 Handle<Object> error =
5149 isolate->factory()->NewTypeError("non_object_property_store", 5136 isolate->factory()->NewTypeError("non_object_property_store",
5150 HandleVector(args, 2)); 5137 HandleVector(args, 2));
5151 return isolate->Throw(*error); 5138 isolate->Throw(*error);
5139 return Handle<Object>();
5152 } 5140 }
5153 5141
5154 if (object->IsJSProxy()) { 5142 if (object->IsJSProxy()) {
5155 bool has_pending_exception = false; 5143 bool has_pending_exception = false;
5156 Handle<Object> name_object = key->IsSymbol() 5144 Handle<Object> name_object = key->IsSymbol()
5157 ? key : Execution::ToString(isolate, key, &has_pending_exception); 5145 ? key : Execution::ToString(isolate, key, &has_pending_exception);
5158 if (has_pending_exception) return Failure::Exception(); 5146 if (has_pending_exception) return Handle<Object>(); // exception
5159 Handle<Name> name = Handle<Name>::cast(name_object); 5147 Handle<Name> name = Handle<Name>::cast(name_object);
5160 Handle<Object> result = JSReceiver::SetProperty( 5148 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value,
5161 Handle<JSProxy>::cast(object), name, value, attr, strict_mode); 5149 attr,
5162 RETURN_IF_EMPTY_HANDLE(isolate, result); 5150 strict_mode);
5163 return *result;
5164 } 5151 }
5165 5152
5166 // If the object isn't a JavaScript object, we ignore the store. 5153 // If the object isn't a JavaScript object, we ignore the store.
5167 if (!object->IsJSObject()) return *value; 5154 if (!object->IsJSObject()) return value;
5168 5155
5169 Handle<JSObject> js_object = Handle<JSObject>::cast(object); 5156 Handle<JSObject> js_object = Handle<JSObject>::cast(object);
5170 5157
5171 // Check if the given key is an array index. 5158 // Check if the given key is an array index.
5172 uint32_t index; 5159 uint32_t index;
5173 if (key->ToArrayIndex(&index)) { 5160 if (key->ToArrayIndex(&index)) {
5174 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters 5161 // In Firefox/SpiderMonkey, Safari and Opera you can access the characters
5175 // of a string using [] notation. We need to support this too in 5162 // of a string using [] notation. We need to support this too in
5176 // JavaScript. 5163 // JavaScript.
5177 // In the case of a String object we just need to redirect the assignment to 5164 // In the case of a String object we just need to redirect the assignment to
5178 // the underlying string if the index is in range. Since the underlying 5165 // the underlying string if the index is in range. Since the underlying
5179 // string does nothing with the assignment then we can ignore such 5166 // string does nothing with the assignment then we can ignore such
5180 // assignments. 5167 // assignments.
5181 if (js_object->IsStringObjectWithCharacterAt(index)) { 5168 if (js_object->IsStringObjectWithCharacterAt(index)) {
5182 return *value; 5169 return value;
5183 } 5170 }
5184 5171
5185 js_object->ValidateElements(); 5172 js_object->ValidateElements();
5186 if (js_object->HasExternalArrayElements()) { 5173 if (js_object->HasExternalArrayElements()) {
5187 if (!value->IsNumber() && !value->IsUndefined()) { 5174 if (!value->IsNumber() && !value->IsUndefined()) {
5188 bool has_exception; 5175 bool has_exception;
5189 Handle<Object> number = 5176 Handle<Object> number =
5190 Execution::ToNumber(isolate, value, &has_exception); 5177 Execution::ToNumber(isolate, value, &has_exception);
5191 if (has_exception) return Failure::Exception(); 5178 if (has_exception) return Handle<Object>(); // exception
5192 value = number; 5179 value = number;
5193 } 5180 }
5194 } 5181 }
5195 MaybeObject* result = js_object->SetElement( 5182 Handle<Object> result = JSObject::SetElement(js_object, index, value, attr,
5196 index, *value, attr, strict_mode, true, set_mode); 5183 strict_mode,
5184 true,
5185 set_mode);
5197 js_object->ValidateElements(); 5186 js_object->ValidateElements();
5198 if (result->IsFailure()) return result; 5187 return result.is_null() ? result : value;
5199 return *value;
5200 } 5188 }
5201 5189
5202 if (key->IsName()) { 5190 if (key->IsName()) {
5203 Handle<Name> name = Handle<Name>::cast(key); 5191 Handle<Name> name = Handle<Name>::cast(key);
5204 if (name->AsArrayIndex(&index)) { 5192 if (name->AsArrayIndex(&index)) {
5205 if (js_object->HasExternalArrayElements()) { 5193 if (js_object->HasExternalArrayElements()) {
5206 if (!value->IsNumber() && !value->IsUndefined()) { 5194 if (!value->IsNumber() && !value->IsUndefined()) {
5207 bool has_exception; 5195 bool has_exception;
5208 Handle<Object> number = 5196 Handle<Object> number =
5209 Execution::ToNumber(isolate, value, &has_exception); 5197 Execution::ToNumber(isolate, value, &has_exception);
5210 if (has_exception) return Failure::Exception(); 5198 if (has_exception) return Handle<Object>(); // exception
5211 value = number; 5199 value = number;
5212 } 5200 }
5213 } 5201 }
5214 MaybeObject* result = js_object->SetElement( 5202 return JSObject::SetElement(js_object, index, value, attr, strict_mode,
5215 index, *value, attr, strict_mode, true, set_mode); 5203 true,
5216 if (result->IsFailure()) return result; 5204 set_mode);
5217 } else { 5205 } else {
5218 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); 5206 if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
5219 Handle<Object> result = 5207 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode);
5220 JSReceiver::SetProperty(js_object, name, value, attr, strict_mode);
5221 RETURN_IF_EMPTY_HANDLE(isolate, result);
5222 } 5208 }
5223 return *value;
5224 } 5209 }
5225 5210
5226 // Call-back into JavaScript to convert the key to a string. 5211 // Call-back into JavaScript to convert the key to a string.
5227 bool has_pending_exception = false; 5212 bool has_pending_exception = false;
5228 Handle<Object> converted = 5213 Handle<Object> converted =
5229 Execution::ToString(isolate, key, &has_pending_exception); 5214 Execution::ToString(isolate, key, &has_pending_exception);
5230 if (has_pending_exception) return Failure::Exception(); 5215 if (has_pending_exception) return Handle<Object>(); // exception
5231 Handle<String> name = Handle<String>::cast(converted); 5216 Handle<String> name = Handle<String>::cast(converted);
5232 5217
5233 if (name->AsArrayIndex(&index)) { 5218 if (name->AsArrayIndex(&index)) {
5234 return js_object->SetElement( 5219 return JSObject::SetElement(js_object, index, value, attr, strict_mode,
5235 index, *value, attr, strict_mode, true, set_mode); 5220 true,
5221 set_mode);
5236 } else { 5222 } else {
5237 Handle<Object> result = 5223 return JSReceiver::SetProperty(js_object, name, value, attr, strict_mode);
5238 JSReceiver::SetProperty(js_object, name, value, attr, strict_mode);
5239 RETURN_IF_EMPTY_HANDLE(isolate, result);
5240 return *result;
5241 } 5224 }
5242 } 5225 }
5243 5226
5244 5227
5245 Handle<Object> Runtime::ForceSetObjectProperty(Isolate* isolate, 5228 Handle<Object> Runtime::ForceSetObjectProperty(Isolate* isolate,
5246 Handle<JSObject> js_object, 5229 Handle<JSObject> js_object,
5247 Handle<Object> key, 5230 Handle<Object> key,
5248 Handle<Object> value, 5231 Handle<Object> value,
5249 PropertyAttributes attr) { 5232 PropertyAttributes attr) {
5250 // Check if the given key is an array index. 5233 // Check if the given key is an array index.
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
5334 } 5317 }
5335 5318
5336 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); 5319 if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
5337 Handle<Object> result = JSReceiver::DeleteProperty(receiver, name, mode); 5320 Handle<Object> result = JSReceiver::DeleteProperty(receiver, name, mode);
5338 RETURN_IF_EMPTY_HANDLE(isolate, result); 5321 RETURN_IF_EMPTY_HANDLE(isolate, result);
5339 return *result; 5322 return *result;
5340 } 5323 }
5341 5324
5342 5325
5343 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetProperty) { 5326 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetProperty) {
5344 SealHandleScope shs(isolate); 5327 HandleScope scope(isolate);
5345 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); 5328 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5);
5346 5329
5347 Handle<Object> object = args.at<Object>(0); 5330 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
5348 Handle<Object> key = args.at<Object>(1); 5331 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
5349 Handle<Object> value = args.at<Object>(2); 5332 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
5350 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); 5333 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3);
5351 RUNTIME_ASSERT( 5334 RUNTIME_ASSERT(
5352 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 5335 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
5353 // Compute attributes. 5336 // Compute attributes.
5354 PropertyAttributes attributes = 5337 PropertyAttributes attributes =
5355 static_cast<PropertyAttributes>(unchecked_attributes); 5338 static_cast<PropertyAttributes>(unchecked_attributes);
5356 5339
5357 StrictModeFlag strict_mode = kNonStrictMode; 5340 StrictModeFlag strict_mode = kNonStrictMode;
5358 if (args.length() == 5) { 5341 if (args.length() == 5) {
5359 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode_flag, 4); 5342 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode_flag, 4);
5360 strict_mode = strict_mode_flag; 5343 strict_mode = strict_mode_flag;
5361 } 5344 }
5362 5345
5363 return Runtime::SetObjectProperty(isolate, 5346 Handle<Object> result = Runtime::SetObjectProperty(isolate, object, key,
5364 object, 5347 value,
5365 key, 5348 attributes,
5366 value, 5349 strict_mode);
5367 attributes, 5350 RETURN_IF_EMPTY_HANDLE(isolate, result);
5368 strict_mode); 5351 return *result;
5369 } 5352 }
5370 5353
5371 5354
5372 RUNTIME_FUNCTION(MaybeObject*, Runtime_TransitionElementsKind) { 5355 RUNTIME_FUNCTION(MaybeObject*, Runtime_TransitionElementsKind) {
5373 HandleScope scope(isolate); 5356 HandleScope scope(isolate);
5374 RUNTIME_ASSERT(args.length() == 2); 5357 RUNTIME_ASSERT(args.length() == 2);
5375 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 5358 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
5376 CONVERT_ARG_HANDLE_CHECKED(Map, map, 1); 5359 CONVERT_ARG_HANDLE_CHECKED(Map, map, 1);
5377 JSObject::TransitionElementsKind(array, map->elements_kind()); 5360 JSObject::TransitionElementsKind(array, map->elements_kind());
5378 return *array; 5361 return *array;
5379 } 5362 }
5380 5363
5381 5364
5382 // Set the native flag on the function. 5365 // Set the native flag on the function.
5383 // This is used to decide if we should transform null and undefined 5366 // This is used to decide if we should transform null and undefined
5384 // into the global object when doing call and apply. 5367 // into the global object when doing call and apply.
5385 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNativeFlag) { 5368 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNativeFlag) {
5386 SealHandleScope shs(isolate); 5369 SealHandleScope shs(isolate);
5387 RUNTIME_ASSERT(args.length() == 1); 5370 RUNTIME_ASSERT(args.length() == 1);
5388 5371
5389 Handle<Object> object = args.at<Object>(0); 5372 CONVERT_ARG_CHECKED(Object, object, 0);
5390 5373
5391 if (object->IsJSFunction()) { 5374 if (object->IsJSFunction()) {
5392 JSFunction* func = JSFunction::cast(*object); 5375 JSFunction* func = JSFunction::cast(object);
5393 func->shared()->set_native(true); 5376 func->shared()->set_native(true);
5394 } 5377 }
5395 return isolate->heap()->undefined_value(); 5378 return isolate->heap()->undefined_value();
5396 } 5379 }
5397 5380
5398 5381
5399 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) { 5382 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) {
5400 HandleScope scope(isolate); 5383 HandleScope scope(isolate);
5401 RUNTIME_ASSERT(args.length() == 5); 5384 RUNTIME_ASSERT(args.length() == 5);
5402 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 5385 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
(...skipping 5937 matching lines...) Expand 10 before | Expand all | Expand 10 after
11340 // First fill all parameters. 11323 // First fill all parameters.
11341 for (int i = 0; i < scope_info->ParameterCount(); ++i) { 11324 for (int i = 0; i < scope_info->ParameterCount(); ++i) {
11342 Handle<Object> value(i < frame_inspector->GetParametersCount() 11325 Handle<Object> value(i < frame_inspector->GetParametersCount()
11343 ? frame_inspector->GetParameter(i) 11326 ? frame_inspector->GetParameter(i)
11344 : isolate->heap()->undefined_value(), 11327 : isolate->heap()->undefined_value(),
11345 isolate); 11328 isolate);
11346 ASSERT(!value->IsTheHole()); 11329 ASSERT(!value->IsTheHole());
11347 11330
11348 RETURN_IF_EMPTY_HANDLE_VALUE( 11331 RETURN_IF_EMPTY_HANDLE_VALUE(
11349 isolate, 11332 isolate,
11350 SetProperty(isolate, 11333 Runtime::SetObjectProperty(isolate,
11351 target, 11334 target,
11352 Handle<String>(scope_info->ParameterName(i)), 11335 Handle<String>(scope_info->ParameterName(i)),
11353 value, 11336 value,
11354 NONE, 11337 NONE,
11355 kNonStrictMode), 11338 kNonStrictMode),
11356 Handle<JSObject>()); 11339 Handle<JSObject>());
11357 } 11340 }
11358 11341
11359 // Second fill all stack locals. 11342 // Second fill all stack locals.
11360 for (int i = 0; i < scope_info->StackLocalCount(); ++i) { 11343 for (int i = 0; i < scope_info->StackLocalCount(); ++i) {
11361 Handle<Object> value(frame_inspector->GetExpression(i), isolate); 11344 Handle<Object> value(frame_inspector->GetExpression(i), isolate);
11362 if (value->IsTheHole()) continue; 11345 if (value->IsTheHole()) continue;
11363 11346
11364 RETURN_IF_EMPTY_HANDLE_VALUE( 11347 RETURN_IF_EMPTY_HANDLE_VALUE(
11365 isolate, 11348 isolate,
11366 SetProperty(isolate, 11349 Runtime::SetObjectProperty(
11367 target, 11350 isolate,
11368 Handle<String>(scope_info->StackLocalName(i)), 11351 target,
11369 value, 11352 Handle<String>(scope_info->StackLocalName(i)),
11370 NONE, 11353 value,
11371 kNonStrictMode), 11354 NONE,
11355 kNonStrictMode),
11372 Handle<JSObject>()); 11356 Handle<JSObject>());
11373 } 11357 }
11374 11358
11375 return target; 11359 return target;
11376 } 11360 }
11377 11361
11378 11362
11379 static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate, 11363 static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate,
11380 Handle<JSObject> target, 11364 Handle<JSObject> target,
11381 Handle<JSFunction> function, 11365 Handle<JSFunction> function,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
11439 Handle<FixedArray> keys = 11423 Handle<FixedArray> keys =
11440 GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS, &threw); 11424 GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS, &threw);
11441 if (threw) return Handle<JSObject>(); 11425 if (threw) return Handle<JSObject>();
11442 11426
11443 for (int i = 0; i < keys->length(); i++) { 11427 for (int i = 0; i < keys->length(); i++) {
11444 // Names of variables introduced by eval are strings. 11428 // Names of variables introduced by eval are strings.
11445 ASSERT(keys->get(i)->IsString()); 11429 ASSERT(keys->get(i)->IsString());
11446 Handle<String> key(String::cast(keys->get(i))); 11430 Handle<String> key(String::cast(keys->get(i)));
11447 RETURN_IF_EMPTY_HANDLE_VALUE( 11431 RETURN_IF_EMPTY_HANDLE_VALUE(
11448 isolate, 11432 isolate,
11449 SetProperty(isolate, 11433 Runtime::SetObjectProperty(isolate,
11450 target, 11434 target,
11451 key, 11435 key,
11452 GetProperty(isolate, ext, key), 11436 GetProperty(isolate, ext, key),
11453 NONE, 11437 NONE,
11454 kNonStrictMode), 11438 kNonStrictMode),
11455 Handle<JSObject>()); 11439 Handle<JSObject>());
11456 } 11440 }
11457 } 11441 }
11458 } 11442 }
11459 11443
11460 return target; 11444 return target;
11461 } 11445 }
11462 11446
11463 11447
11464 static Handle<JSObject> MaterializeLocalScope( 11448 static Handle<JSObject> MaterializeLocalScope(
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
11544 11528
11545 // Function context extension. These are variables introduced by eval. 11529 // Function context extension. These are variables introduced by eval.
11546 if (function_context->closure() == *function) { 11530 if (function_context->closure() == *function) {
11547 if (function_context->has_extension() && 11531 if (function_context->has_extension() &&
11548 !function_context->IsNativeContext()) { 11532 !function_context->IsNativeContext()) {
11549 Handle<JSObject> ext(JSObject::cast(function_context->extension())); 11533 Handle<JSObject> ext(JSObject::cast(function_context->extension()));
11550 11534
11551 if (JSReceiver::HasProperty(ext, variable_name)) { 11535 if (JSReceiver::HasProperty(ext, variable_name)) {
11552 // We don't expect this to do anything except replacing 11536 // We don't expect this to do anything except replacing
11553 // property value. 11537 // property value.
11554 SetProperty(isolate, 11538 Runtime::SetObjectProperty(isolate, ext, variable_name, new_value,
11555 ext, 11539 NONE,
11556 variable_name, 11540 kNonStrictMode);
11557 new_value,
11558 NONE,
11559 kNonStrictMode);
11560 return true; 11541 return true;
11561 } 11542 }
11562 } 11543 }
11563 } 11544 }
11564 } 11545 }
11565 11546
11566 return default_result; 11547 return default_result;
11567 } 11548 }
11568 11549
11569 11550
(...skipping 25 matching lines...) Expand all
11595 Handle<FixedArray> keys = 11576 Handle<FixedArray> keys =
11596 GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS, &threw); 11577 GetKeysInFixedArrayFor(ext, INCLUDE_PROTOS, &threw);
11597 if (threw) return Handle<JSObject>(); 11578 if (threw) return Handle<JSObject>();
11598 11579
11599 for (int i = 0; i < keys->length(); i++) { 11580 for (int i = 0; i < keys->length(); i++) {
11600 // Names of variables introduced by eval are strings. 11581 // Names of variables introduced by eval are strings.
11601 ASSERT(keys->get(i)->IsString()); 11582 ASSERT(keys->get(i)->IsString());
11602 Handle<String> key(String::cast(keys->get(i))); 11583 Handle<String> key(String::cast(keys->get(i)));
11603 RETURN_IF_EMPTY_HANDLE_VALUE( 11584 RETURN_IF_EMPTY_HANDLE_VALUE(
11604 isolate, 11585 isolate,
11605 SetProperty(isolate, 11586 Runtime::SetObjectProperty(isolate, closure_scope, key,
11606 closure_scope, 11587 GetProperty(isolate, ext, key),
11607 key, 11588 NONE,
11608 GetProperty(isolate, ext, key), 11589 kNonStrictMode),
11609 NONE,
11610 kNonStrictMode),
11611 Handle<JSObject>()); 11590 Handle<JSObject>());
11612 } 11591 }
11613 } 11592 }
11614 11593
11615 return closure_scope; 11594 return closure_scope;
11616 } 11595 }
11617 11596
11618 11597
11619 // This method copies structure of MaterializeClosure method above. 11598 // This method copies structure of MaterializeClosure method above.
11620 static bool SetClosureVariableValue(Isolate* isolate, 11599 static bool SetClosureVariableValue(Isolate* isolate,
(...skipping 10 matching lines...) Expand all
11631 isolate, scope_info, context, variable_name, new_value)) { 11610 isolate, scope_info, context, variable_name, new_value)) {
11632 return true; 11611 return true;
11633 } 11612 }
11634 11613
11635 // Properties from the function context extension. This will 11614 // Properties from the function context extension. This will
11636 // be variables introduced by eval. 11615 // be variables introduced by eval.
11637 if (context->has_extension()) { 11616 if (context->has_extension()) {
11638 Handle<JSObject> ext(JSObject::cast(context->extension())); 11617 Handle<JSObject> ext(JSObject::cast(context->extension()));
11639 if (JSReceiver::HasProperty(ext, variable_name)) { 11618 if (JSReceiver::HasProperty(ext, variable_name)) {
11640 // We don't expect this to do anything except replacing property value. 11619 // We don't expect this to do anything except replacing property value.
11641 SetProperty(isolate, 11620 Runtime::SetObjectProperty(isolate, ext, variable_name, new_value,
11642 ext, 11621 NONE,
11643 variable_name, 11622 kNonStrictMode);
11644 new_value,
11645 NONE,
11646 kNonStrictMode);
11647 return true; 11623 return true;
11648 } 11624 }
11649 } 11625 }
11650 11626
11651 return false; 11627 return false;
11652 } 11628 }
11653 11629
11654 11630
11655 // Create a plain JSObject which materializes the scope for the specified 11631 // Create a plain JSObject which materializes the scope for the specified
11656 // catch context. 11632 // catch context.
11657 static Handle<JSObject> MaterializeCatchScope(Isolate* isolate, 11633 static Handle<JSObject> MaterializeCatchScope(Isolate* isolate,
11658 Handle<Context> context) { 11634 Handle<Context> context) {
11659 ASSERT(context->IsCatchContext()); 11635 ASSERT(context->IsCatchContext());
11660 Handle<String> name(String::cast(context->extension())); 11636 Handle<String> name(String::cast(context->extension()));
11661 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX), 11637 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX),
11662 isolate); 11638 isolate);
11663 Handle<JSObject> catch_scope = 11639 Handle<JSObject> catch_scope =
11664 isolate->factory()->NewJSObject(isolate->object_function()); 11640 isolate->factory()->NewJSObject(isolate->object_function());
11665 RETURN_IF_EMPTY_HANDLE_VALUE( 11641 RETURN_IF_EMPTY_HANDLE_VALUE(
11666 isolate, 11642 isolate,
11667 SetProperty(isolate, 11643 Runtime::SetObjectProperty(isolate, catch_scope, name, thrown_object,
11668 catch_scope, 11644 NONE,
11669 name, 11645 kNonStrictMode),
11670 thrown_object,
11671 NONE,
11672 kNonStrictMode),
11673 Handle<JSObject>()); 11646 Handle<JSObject>());
11674 return catch_scope; 11647 return catch_scope;
11675 } 11648 }
11676 11649
11677 11650
11678 static bool SetCatchVariableValue(Isolate* isolate, 11651 static bool SetCatchVariableValue(Isolate* isolate,
11679 Handle<Context> context, 11652 Handle<Context> context,
11680 Handle<String> variable_name, 11653 Handle<String> variable_name,
11681 Handle<Object> new_value) { 11654 Handle<Object> new_value) {
11682 ASSERT(context->IsCatchContext()); 11655 ASSERT(context->IsCatchContext());
(...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after
12680 // Skip if "arguments" is already taken. 12653 // Skip if "arguments" is already taken.
12681 if (!function->shared()->is_function() || 12654 if (!function->shared()->is_function() ||
12682 JSReceiver::HasLocalProperty(target, 12655 JSReceiver::HasLocalProperty(target,
12683 isolate->factory()->arguments_string())) { 12656 isolate->factory()->arguments_string())) {
12684 return target; 12657 return target;
12685 } 12658 }
12686 12659
12687 // FunctionGetArguments can't throw an exception. 12660 // FunctionGetArguments can't throw an exception.
12688 Handle<JSObject> arguments = Handle<JSObject>::cast( 12661 Handle<JSObject> arguments = Handle<JSObject>::cast(
12689 Accessors::FunctionGetArguments(function)); 12662 Accessors::FunctionGetArguments(function));
12690 SetProperty(isolate, 12663 Runtime::SetObjectProperty(isolate, target,
12691 target, 12664 isolate->factory()->arguments_string(),
12692 isolate->factory()->arguments_string(), 12665 arguments,
12693 arguments, 12666 ::NONE,
12694 ::NONE, 12667 kNonStrictMode);
12695 kNonStrictMode);
12696 return target; 12668 return target;
12697 } 12669 }
12698 12670
12699 12671
12700 // Compile and evaluate source for the given context. 12672 // Compile and evaluate source for the given context.
12701 static MaybeObject* DebugEvaluate(Isolate* isolate, 12673 static MaybeObject* DebugEvaluate(Isolate* isolate,
12702 Handle<Context> context, 12674 Handle<Context> context,
12703 Handle<Object> context_extension, 12675 Handle<Object> context_extension,
12704 Handle<Object> receiver, 12676 Handle<Object> receiver,
12705 Handle<String> source) { 12677 Handle<String> source) {
(...skipping 2130 matching lines...) Expand 10 before | Expand all | Expand 10 after
14836 // Handle last resort GC and make sure to allow future allocations 14808 // Handle last resort GC and make sure to allow future allocations
14837 // to grow the heap without causing GCs (if possible). 14809 // to grow the heap without causing GCs (if possible).
14838 isolate->counters()->gc_last_resort_from_js()->Increment(); 14810 isolate->counters()->gc_last_resort_from_js()->Increment();
14839 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 14811 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
14840 "Runtime::PerformGC"); 14812 "Runtime::PerformGC");
14841 } 14813 }
14842 } 14814 }
14843 14815
14844 14816
14845 } } // namespace v8::internal 14817 } } // 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