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

Side by Side Diff: src/ic.cc

Issue 155283: Allow access through the global proxy to use ICs. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 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
OLDNEW
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 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 // Get the constant function and compute the code stub for this 445 // Get the constant function and compute the code stub for this
446 // call; used for rewriting to monomorphic state and making sure 446 // call; used for rewriting to monomorphic state and making sure
447 // that the code stub is in the stub cache. 447 // that the code stub is in the stub cache.
448 JSFunction* function = lookup->GetConstantFunction(); 448 JSFunction* function = lookup->GetConstantFunction();
449 code = StubCache::ComputeCallConstant(argc, in_loop, *name, *object, 449 code = StubCache::ComputeCallConstant(argc, in_loop, *name, *object,
450 lookup->holder(), function); 450 lookup->holder(), function);
451 break; 451 break;
452 } 452 }
453 case NORMAL: { 453 case NORMAL: {
454 if (!object->IsJSObject()) return; 454 if (!object->IsJSObject()) return;
455 if (object->IsGlobalObject()) { 455 Handle<JSObject> receiver = Handle<JSObject>::cast(object);
456 // The stub generated for the global object picks the value directly 456
457 // from the property cell. So the property must be directly on the 457 if (lookup->holder()->IsGlobalObject()) {
458 // global object. 458 GlobalObject* global = GlobalObject::cast(lookup->holder());
459 Handle<GlobalObject> global = Handle<GlobalObject>::cast(object);
460 if (lookup->holder() != *global) return;
461 JSGlobalPropertyCell* cell = 459 JSGlobalPropertyCell* cell =
462 JSGlobalPropertyCell::cast(global->GetPropertyCell(lookup)); 460 JSGlobalPropertyCell::cast(global->GetPropertyCell(lookup));
463 if (!cell->value()->IsJSFunction()) return; 461 if (!cell->value()->IsJSFunction()) return;
464 JSFunction* function = JSFunction::cast(cell->value()); 462 JSFunction* function = JSFunction::cast(cell->value());
465 code = StubCache::ComputeCallGlobal(argc, in_loop, *name, *global, 463 code = StubCache::ComputeCallGlobal(argc,
466 cell, function); 464 in_loop,
465 *name,
466 *receiver,
467 global,
468 cell,
469 function);
467 } else { 470 } else {
468 // There is only one shared stub for calling normalized 471 // There is only one shared stub for calling normalized
469 // properties. It does not traverse the prototype chain, so the 472 // properties. It does not traverse the prototype chain, so the
470 // property must be found in the receiver for the stub to be 473 // property must be found in the receiver for the stub to be
471 // applicable. 474 // applicable.
472 Handle<JSObject> receiver = Handle<JSObject>::cast(object);
473 if (lookup->holder() != *receiver) return; 475 if (lookup->holder() != *receiver) return;
474 code = StubCache::ComputeCallNormal(argc, in_loop, *name, *receiver); 476 code = StubCache::ComputeCallNormal(argc, in_loop, *name, *receiver);
475 } 477 }
476 break; 478 break;
477 } 479 }
478 case INTERCEPTOR: { 480 case INTERCEPTOR: {
479 ASSERT(HasInterceptorGetter(lookup->holder())); 481 ASSERT(HasInterceptorGetter(lookup->holder()));
480 code = StubCache::ComputeCallInterceptor(argc, *name, *object, 482 code = StubCache::ComputeCallInterceptor(argc, *name, *object,
481 lookup->holder()); 483 lookup->holder());
482 break; 484 break;
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 lookup->GetFieldIndex()); 652 lookup->GetFieldIndex());
651 break; 653 break;
652 } 654 }
653 case CONSTANT_FUNCTION: { 655 case CONSTANT_FUNCTION: {
654 Object* constant = lookup->GetConstantFunction(); 656 Object* constant = lookup->GetConstantFunction();
655 code = StubCache::ComputeLoadConstant(*name, *receiver, 657 code = StubCache::ComputeLoadConstant(*name, *receiver,
656 lookup->holder(), constant); 658 lookup->holder(), constant);
657 break; 659 break;
658 } 660 }
659 case NORMAL: { 661 case NORMAL: {
660 if (object->IsGlobalObject()) { 662 if (lookup->holder()->IsGlobalObject()) {
661 // The stub generated for the global object picks the value directly 663 GlobalObject* global = GlobalObject::cast(lookup->holder());
662 // from the property cell. So the property must be directly on the
663 // global object.
664 Handle<GlobalObject> global = Handle<GlobalObject>::cast(object);
665 if (lookup->holder() != *global) return;
666 JSGlobalPropertyCell* cell = 664 JSGlobalPropertyCell* cell =
667 JSGlobalPropertyCell::cast(global->GetPropertyCell(lookup)); 665 JSGlobalPropertyCell::cast(global->GetPropertyCell(lookup));
668 code = StubCache::ComputeLoadGlobal(*name, *global, 666 code = StubCache::ComputeLoadGlobal(*name,
669 cell, lookup->IsDontDelete()); 667 *receiver,
668 global,
669 cell,
670 lookup->IsDontDelete());
670 } else { 671 } else {
671 // There is only one shared stub for loading normalized 672 // There is only one shared stub for loading normalized
672 // properties. It does not traverse the prototype chain, so the 673 // properties. It does not traverse the prototype chain, so the
673 // property must be found in the receiver for the stub to be 674 // property must be found in the receiver for the stub to be
674 // applicable. 675 // applicable.
675 if (lookup->holder() != *receiver) return; 676 if (lookup->holder() != *receiver) return;
676 code = StubCache::ComputeLoadNormal(*name, *receiver); 677 code = StubCache::ComputeLoadNormal(*name, *receiver);
677 } 678 }
678 break; 679 break;
679 } 680 }
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after
1355 #undef ADDR 1356 #undef ADDR
1356 }; 1357 };
1357 1358
1358 1359
1359 Address IC::AddressFromUtilityId(IC::UtilityId id) { 1360 Address IC::AddressFromUtilityId(IC::UtilityId id) {
1360 return IC_utilities[id]; 1361 return IC_utilities[id];
1361 } 1362 }
1362 1363
1363 1364
1364 } } // namespace v8::internal 1365 } } // namespace v8::internal
OLDNEW
« src/arm/stub-cache-arm.cc ('K') | « src/ia32/stub-cache-ia32.cc ('k') | src/stub-cache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698