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

Side by Side Diff: src/runtime.cc

Issue 14834: Fixing a subtle bug in receiver resolution when a thrown and caught function ... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 12 years 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') | test/mjsunit/throw-and-catch-function.js » ('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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 3409 matching lines...) Expand 10 before | Expand all | Expand 10 after
3420 CONVERT_CHECKED(JSFunction, function, args[0]); 3420 CONVERT_CHECKED(JSFunction, function, args[0]);
3421 int length = ScopeInfo<>::NumberOfContextSlots(function->code()); 3421 int length = ScopeInfo<>::NumberOfContextSlots(function->code());
3422 Object* result = Heap::AllocateFunctionContext(length, function); 3422 Object* result = Heap::AllocateFunctionContext(length, function);
3423 if (result->IsFailure()) return result; 3423 if (result->IsFailure()) return result;
3424 3424
3425 Top::set_context(Context::cast(result)); 3425 Top::set_context(Context::cast(result));
3426 3426
3427 return result; // non-failure 3427 return result; // non-failure
3428 } 3428 }
3429 3429
3430 3430 static Object* PushContextHelper(Object* object, bool is_catch_context) {
3431 static Object* Runtime_PushContext(Arguments args) {
3432 NoHandleAllocation ha;
3433 ASSERT(args.length() == 1);
3434
3435 // Convert the object to a proper JavaScript object. 3431 // Convert the object to a proper JavaScript object.
3436 Object* object = args[0]; 3432 Object* js_object = object;
3437 if (!object->IsJSObject()) { 3433 if (!js_object->IsJSObject()) {
3438 object = object->ToObject(); 3434 js_object = js_object->ToObject();
3439 if (object->IsFailure()) { 3435 if (js_object->IsFailure()) {
3440 if (!Failure::cast(object)->IsInternalError()) return object; 3436 if (!Failure::cast(js_object)->IsInternalError()) return js_object;
3441 HandleScope scope; 3437 HandleScope scope;
3442 Handle<Object> handle(args[0]); 3438 Handle<Object> handle(object);
3443 Handle<Object> result = 3439 Handle<Object> result =
3444 Factory::NewTypeError("with_expression", HandleVector(&handle, 1)); 3440 Factory::NewTypeError("with_expression", HandleVector(&handle, 1));
3445 return Top::Throw(*result); 3441 return Top::Throw(*result);
3446 } 3442 }
3447 } 3443 }
3448 3444
3449 Object* result = 3445 Object* result =
3450 Heap::AllocateWithContext(Top::context(), JSObject::cast(object)); 3446 Heap::AllocateWithContext(Top::context(),
3447 JSObject::cast(js_object),
3448 is_catch_context);
3451 if (result->IsFailure()) return result; 3449 if (result->IsFailure()) return result;
3452 3450
3453 Top::set_context(Context::cast(result)); 3451 Context* context = Context::cast(result);
3452 Top::set_context(context);
3454 3453
3455 return result; 3454 return result;
3456 } 3455 }
3457 3456
3458 3457
3458 static Object* Runtime_PushContext(Arguments args) {
3459 NoHandleAllocation ha;
3460 ASSERT(args.length() == 1);
3461 return PushContextHelper(args[0], false);
3462 }
3463
3464
3465 static Object* Runtime_PushCatchContext(Arguments args) {
3466 NoHandleAllocation ha;
3467 ASSERT(args.length() == 1);
3468 return PushContextHelper(args[0], true);
3469 }
3470
3471
3459 static Object* Runtime_LookupContext(Arguments args) { 3472 static Object* Runtime_LookupContext(Arguments args) {
3460 HandleScope scope; 3473 HandleScope scope;
3461 ASSERT(args.length() == 2); 3474 ASSERT(args.length() == 2);
3462 3475
3463 CONVERT_ARG_CHECKED(Context, context, 0); 3476 CONVERT_ARG_CHECKED(Context, context, 0);
3464 CONVERT_ARG_CHECKED(String, name, 1); 3477 CONVERT_ARG_CHECKED(String, name, 1);
3465 3478
3466 int index; 3479 int index;
3467 PropertyAttributes attributes; 3480 PropertyAttributes attributes;
3468 ContextLookupFlags flags = FOLLOW_CHAINS; 3481 ContextLookupFlags flags = FOLLOW_CHAINS;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
3546 Object* value = (holder->IsContext()) 3559 Object* value = (holder->IsContext())
3547 ? Context::cast(*holder)->get(index) 3560 ? Context::cast(*holder)->get(index)
3548 : JSObject::cast(*holder)->GetElement(index); 3561 : JSObject::cast(*holder)->GetElement(index);
3549 return MakePair(Unhole(value, attributes), receiver); 3562 return MakePair(Unhole(value, attributes), receiver);
3550 } 3563 }
3551 3564
3552 // If the holder is found, we read the property from it. 3565 // If the holder is found, we read the property from it.
3553 if (!holder.is_null() && holder->IsJSObject()) { 3566 if (!holder.is_null() && holder->IsJSObject()) {
3554 ASSERT(Handle<JSObject>::cast(holder)->HasProperty(*name)); 3567 ASSERT(Handle<JSObject>::cast(holder)->HasProperty(*name));
3555 JSObject* object = JSObject::cast(*holder); 3568 JSObject* object = JSObject::cast(*holder);
3556 JSObject* receiver = (object->IsGlobalObject()) 3569 JSObject* receiver;
3557 ? GlobalObject::cast(object)->global_receiver() 3570 if (object->IsGlobalObject()) {
3558 : ComputeReceiverForNonGlobal(object); 3571 receiver = GlobalObject::cast(object)->global_receiver();
3572 } else if (context->is_exception_holder(*holder)) {
3573 receiver = Top::context()->global()->global_receiver();
3574 } else {
3575 receiver = ComputeReceiverForNonGlobal(object);
3576 }
3559 // No need to unhole the value here. This is taken care of by the 3577 // No need to unhole the value here. This is taken care of by the
3560 // GetProperty function. 3578 // GetProperty function.
3561 Object* value = object->GetProperty(*name); 3579 Object* value = object->GetProperty(*name);
3562 return MakePair(value, receiver); 3580 return MakePair(value, receiver);
3563 } 3581 }
3564 3582
3565 if (throw_error) { 3583 if (throw_error) {
3566 // The property doesn't exist - throw exception. 3584 // The property doesn't exist - throw exception.
3567 Handle<Object> reference_error = 3585 Handle<Object> reference_error =
3568 Factory::NewReferenceError("not_defined", HandleVector(&name, 1)); 3586 Factory::NewReferenceError("not_defined", HandleVector(&name, 1));
(...skipping 1643 matching lines...) Expand 10 before | Expand all | Expand 10 after
5212 Handle<Context> function_context) { 5230 Handle<Context> function_context) {
5213 // At the bottom of the chain. Return the function context to link to. 5231 // At the bottom of the chain. Return the function context to link to.
5214 if (context_chain->is_function_context()) { 5232 if (context_chain->is_function_context()) {
5215 return function_context; 5233 return function_context;
5216 } 5234 }
5217 5235
5218 // Recursively copy the with contexts. 5236 // Recursively copy the with contexts.
5219 Handle<Context> previous(context_chain->previous()); 5237 Handle<Context> previous(context_chain->previous());
5220 Handle<JSObject> extension(JSObject::cast(context_chain->extension())); 5238 Handle<JSObject> extension(JSObject::cast(context_chain->extension()));
5221 return Factory::NewWithContext( 5239 return Factory::NewWithContext(
5222 CopyWithContextChain(function_context, previous), extension); 5240 CopyWithContextChain(function_context, previous),
5241 extension,
5242 context_chain->IsCatchContext());
5223 } 5243 }
5224 5244
5225 5245
5226 // Helper function to find or create the arguments object for 5246 // Helper function to find or create the arguments object for
5227 // Runtime_DebugEvaluate. 5247 // Runtime_DebugEvaluate.
5228 static Handle<Object> GetArgumentsObject(JavaScriptFrame* frame, 5248 static Handle<Object> GetArgumentsObject(JavaScriptFrame* frame,
5229 Handle<JSFunction> function, 5249 Handle<JSFunction> function,
5230 Handle<Code> code, 5250 Handle<Code> code,
5231 const ScopeInfo<>* sinfo, 5251 const ScopeInfo<>* sinfo,
5232 Handle<Context> function_context) { 5252 Handle<Context> function_context) {
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
5871 } else { 5891 } else {
5872 // Handle last resort GC and make sure to allow future allocations 5892 // Handle last resort GC and make sure to allow future allocations
5873 // to grow the heap without causing GCs (if possible). 5893 // to grow the heap without causing GCs (if possible).
5874 Counters::gc_last_resort_from_js.Increment(); 5894 Counters::gc_last_resort_from_js.Increment();
5875 Heap::CollectAllGarbage(); 5895 Heap::CollectAllGarbage();
5876 } 5896 }
5877 } 5897 }
5878 5898
5879 5899
5880 } } // namespace v8::internal 5900 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | test/mjsunit/throw-and-catch-function.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698