Changeset 44076 in webkit for trunk/JavaScriptCore/jit/JITStubs.cpp
- Timestamp:
- May 22, 2009, 6:48:32 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/jit/JITStubs.cpp
r44030 r44076 688 688 689 689 CHECK_FOR_EXCEPTION_AT_END(); 690 return JSValue::encode(result); 691 } 692 693 EncodedJSValue JITStubs::cti_op_get_by_id_method_check(STUB_ARGS_DECLARATION) 694 { 695 STUB_INIT_STACK_FRAME(stackFrame); 696 697 CallFrame* callFrame = stackFrame.callFrame; 698 Identifier& ident = stackFrame.args[1].identifier(); 699 700 JSValue baseValue = stackFrame.args[0].jsValue(); 701 PropertySlot slot(baseValue); 702 JSValue result = baseValue.get(callFrame, ident, slot); 703 704 ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_get_by_id_method_check_second)); 705 706 CHECK_FOR_EXCEPTION_AT_END(); 707 return JSValue::encode(result); 708 } 709 710 EncodedJSValue JITStubs::cti_op_get_by_id_method_check_second(STUB_ARGS_DECLARATION) 711 { 712 STUB_INIT_STACK_FRAME(stackFrame); 713 714 CallFrame* callFrame = stackFrame.callFrame; 715 Identifier& ident = stackFrame.args[1].identifier(); 716 717 JSValue baseValue = stackFrame.args[0].jsValue(); 718 PropertySlot slot(baseValue); 719 JSValue result = baseValue.get(callFrame, ident, slot); 720 721 CHECK_FOR_EXCEPTION(); 722 723 // If we successfully got something, then the base from which it is being accessed must 724 // be an object. (Assertion to ensure asObject() call below is safe, which comes after 725 // an isCacheable() chceck. 726 ASSERT(!slot.isCacheable() || slot.slotBase().isObject()); 727 728 // Check that: 729 // * We're dealing with a JSCell, 730 // * the property is cachable, 731 // * it's not a dictionary 732 // * there is a function cached. 733 Structure* structure; 734 JSCell* specific; 735 if (baseValue.isCell() 736 && slot.isCacheable() 737 && !(structure = asCell(baseValue)->structure())->isDictionary() 738 && asObject(slot.slotBase())->getPropertySpecificValue(callFrame, ident, specific) 739 && specific 740 ) { 741 742 JSFunction* callee = (JSFunction*)specific; 743 744 // The result fetched should always be the callee! 745 ASSERT(result == JSValue(callee)); 746 MethodCallLinkInfo& methodCallLinkInfo = callFrame->codeBlock()->getMethodCallLinkInfo(STUB_RETURN_ADDRESS); 747 748 // Check to see if the function is on the object's prototype. Patch up the code to optimize. 749 if (slot.slotBase() == structure->prototypeForLookup(callFrame)) 750 JIT::patchMethodCallProto(methodCallLinkInfo, callee, structure, asObject(slot.slotBase())); 751 // Check to see if the function is on the object itself. 752 // Since we generate the method-check to check both the structure and a prototype-structure (since this 753 // is the common case) we have a problem - we need to patch the prototype structure check to do something 754 // useful. We could try to nop it out altogether, but that's a little messy, so lets do something simpler 755 // for now. For now it performs a check on a special object on the global object only used for this 756 // purpose. The object is in no way exposed, and as such the check will always pass. 757 else if (slot.slotBase() == baseValue) 758 JIT::patchMethodCallProto(methodCallLinkInfo, callee, structure, callFrame->scopeChain()->globalObject()->methodCallDummy()); 759 760 // For now let any other case be cached as a normal get_by_id. 761 } 762 763 // Revert the get_by_id op back to being a regular get_by_id - allow it to cache like normal, if it needs to. 764 ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_get_by_id)); 765 690 766 return JSValue::encode(result); 691 767 }
Note:
See TracChangeset
for help on using the changeset viewer.