| OLD | NEW |
| 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 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 // -- esp[kFastApiCallArguments * 4 + 4] : last argument in the internal | 444 // -- esp[kFastApiCallArguments * 4 + 4] : last argument in the internal |
| 445 // frame. | 445 // frame. |
| 446 // ----------------------------------- | 446 // ----------------------------------- |
| 447 __ pop(scratch); | 447 __ pop(scratch); |
| 448 __ add(Operand(esp), Immediate(kPointerSize * kFastApiCallArguments)); | 448 __ add(Operand(esp), Immediate(kPointerSize * kFastApiCallArguments)); |
| 449 __ push(scratch); | 449 __ push(scratch); |
| 450 } | 450 } |
| 451 | 451 |
| 452 | 452 |
| 453 // Generates call to API function. | 453 // Generates call to API function. |
| 454 static bool GenerateFastApiCall(MacroAssembler* masm, | 454 static MaybeObject* GenerateFastApiCall(MacroAssembler* masm, |
| 455 const CallOptimization& optimization, | 455 const CallOptimization& optimization, |
| 456 int argc, | 456 int argc) { |
| 457 Failure** failure) { | |
| 458 // ----------- S t a t e ------------- | 457 // ----------- S t a t e ------------- |
| 459 // -- esp[0] : return address | 458 // -- esp[0] : return address |
| 460 // -- esp[4] : object passing the type check | 459 // -- esp[4] : object passing the type check |
| 461 // (last fast api call extra argument, | 460 // (last fast api call extra argument, |
| 462 // set by CheckPrototypes) | 461 // set by CheckPrototypes) |
| 463 // -- esp[8] : api function | 462 // -- esp[8] : api function |
| 464 // (first fast api call extra argument) | 463 // (first fast api call extra argument) |
| 465 // -- esp[12] : api call data | 464 // -- esp[12] : api call data |
| 466 // -- esp[16] : last argument | 465 // -- esp[16] : last argument |
| 467 // -- ... | 466 // -- ... |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 __ Set(ApiParameterOperand(4), Immediate(0)); | 508 __ Set(ApiParameterOperand(4), Immediate(0)); |
| 510 | 509 |
| 511 // v8::InvocationCallback's argument. | 510 // v8::InvocationCallback's argument. |
| 512 __ lea(eax, ApiParameterOperand(1)); | 511 __ lea(eax, ApiParameterOperand(1)); |
| 513 __ mov(ApiParameterOperand(0), eax); | 512 __ mov(ApiParameterOperand(0), eax); |
| 514 | 513 |
| 515 // Emitting a stub call may try to allocate (if the code is not | 514 // Emitting a stub call may try to allocate (if the code is not |
| 516 // already generated). Do not allow the assembler to perform a | 515 // already generated). Do not allow the assembler to perform a |
| 517 // garbage collection but instead return the allocation failure | 516 // garbage collection but instead return the allocation failure |
| 518 // object. | 517 // object. |
| 519 MaybeObject* result = | 518 return masm->TryCallApiFunctionAndReturn(&fun, |
| 520 masm->TryCallApiFunctionAndReturn(&fun, argc + kFastApiCallArguments + 1); | 519 argc + kFastApiCallArguments + 1); |
| 521 if (result->IsFailure()) { | |
| 522 *failure = Failure::cast(result); | |
| 523 return false; | |
| 524 } | |
| 525 return true; | |
| 526 } | 520 } |
| 527 | 521 |
| 528 | 522 |
| 529 class CallInterceptorCompiler BASE_EMBEDDED { | 523 class CallInterceptorCompiler BASE_EMBEDDED { |
| 530 public: | 524 public: |
| 531 CallInterceptorCompiler(StubCompiler* stub_compiler, | 525 CallInterceptorCompiler(StubCompiler* stub_compiler, |
| 532 const ParameterCount& arguments, | 526 const ParameterCount& arguments, |
| 533 Register name) | 527 Register name) |
| 534 : stub_compiler_(stub_compiler), | 528 : stub_compiler_(stub_compiler), |
| 535 arguments_(arguments), | 529 arguments_(arguments), |
| 536 name_(name) {} | 530 name_(name) {} |
| 537 | 531 |
| 538 bool Compile(MacroAssembler* masm, | 532 MaybeObject* Compile(MacroAssembler* masm, |
| 539 JSObject* object, | 533 JSObject* object, |
| 540 JSObject* holder, | 534 JSObject* holder, |
| 541 String* name, | 535 String* name, |
| 542 LookupResult* lookup, | 536 LookupResult* lookup, |
| 543 Register receiver, | 537 Register receiver, |
| 544 Register scratch1, | 538 Register scratch1, |
| 545 Register scratch2, | 539 Register scratch2, |
| 546 Register scratch3, | 540 Register scratch3, |
| 547 Label* miss, | 541 Label* miss) { |
| 548 Failure** failure) { | |
| 549 ASSERT(holder->HasNamedInterceptor()); | 542 ASSERT(holder->HasNamedInterceptor()); |
| 550 ASSERT(!holder->GetNamedInterceptor()->getter()->IsUndefined()); | 543 ASSERT(!holder->GetNamedInterceptor()->getter()->IsUndefined()); |
| 551 | 544 |
| 552 // Check that the receiver isn't a smi. | 545 // Check that the receiver isn't a smi. |
| 553 __ test(receiver, Immediate(kSmiTagMask)); | 546 __ test(receiver, Immediate(kSmiTagMask)); |
| 554 __ j(zero, miss, not_taken); | 547 __ j(zero, miss, not_taken); |
| 555 | 548 |
| 556 CallOptimization optimization(lookup); | 549 CallOptimization optimization(lookup); |
| 557 | 550 |
| 558 if (optimization.is_constant_call()) { | 551 if (optimization.is_constant_call()) { |
| 559 return CompileCacheable(masm, | 552 return CompileCacheable(masm, |
| 560 object, | 553 object, |
| 561 receiver, | 554 receiver, |
| 562 scratch1, | 555 scratch1, |
| 563 scratch2, | 556 scratch2, |
| 564 scratch3, | 557 scratch3, |
| 565 holder, | 558 holder, |
| 566 lookup, | 559 lookup, |
| 567 name, | 560 name, |
| 568 optimization, | 561 optimization, |
| 569 miss, | 562 miss); |
| 570 failure); | |
| 571 } else { | 563 } else { |
| 572 CompileRegular(masm, | 564 CompileRegular(masm, |
| 573 object, | 565 object, |
| 574 receiver, | 566 receiver, |
| 575 scratch1, | 567 scratch1, |
| 576 scratch2, | 568 scratch2, |
| 577 scratch3, | 569 scratch3, |
| 578 name, | 570 name, |
| 579 holder, | 571 holder, |
| 580 miss); | 572 miss); |
| 581 return true; | 573 return Heap::undefined_value(); // Success. |
| 582 } | 574 } |
| 583 } | 575 } |
| 584 | 576 |
| 585 private: | 577 private: |
| 586 bool CompileCacheable(MacroAssembler* masm, | 578 MaybeObject* CompileCacheable(MacroAssembler* masm, |
| 587 JSObject* object, | 579 JSObject* object, |
| 588 Register receiver, | 580 Register receiver, |
| 589 Register scratch1, | 581 Register scratch1, |
| 590 Register scratch2, | 582 Register scratch2, |
| 591 Register scratch3, | 583 Register scratch3, |
| 592 JSObject* interceptor_holder, | 584 JSObject* interceptor_holder, |
| 593 LookupResult* lookup, | 585 LookupResult* lookup, |
| 594 String* name, | 586 String* name, |
| 595 const CallOptimization& optimization, | 587 const CallOptimization& optimization, |
| 596 Label* miss_label, | 588 Label* miss_label) { |
| 597 Failure** failure) { | |
| 598 ASSERT(optimization.is_constant_call()); | 589 ASSERT(optimization.is_constant_call()); |
| 599 ASSERT(!lookup->holder()->IsGlobalObject()); | 590 ASSERT(!lookup->holder()->IsGlobalObject()); |
| 600 | 591 |
| 601 int depth1 = kInvalidProtoDepth; | 592 int depth1 = kInvalidProtoDepth; |
| 602 int depth2 = kInvalidProtoDepth; | 593 int depth2 = kInvalidProtoDepth; |
| 603 bool can_do_fast_api_call = false; | 594 bool can_do_fast_api_call = false; |
| 604 if (optimization.is_simple_api_call() && | 595 if (optimization.is_simple_api_call() && |
| 605 !lookup->holder()->IsGlobalObject()) { | 596 !lookup->holder()->IsGlobalObject()) { |
| 606 depth1 = | 597 depth1 = |
| 607 optimization.GetPrototypeDepthOfExpectedType(object, | 598 optimization.GetPrototypeDepthOfExpectedType(object, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 } else { | 640 } else { |
| 650 // CheckPrototypes has a side effect of fetching a 'holder' | 641 // CheckPrototypes has a side effect of fetching a 'holder' |
| 651 // for API (object which is instanceof for the signature). It's | 642 // for API (object which is instanceof for the signature). It's |
| 652 // safe to omit it here, as if present, it should be fetched | 643 // safe to omit it here, as if present, it should be fetched |
| 653 // by the previous CheckPrototypes. | 644 // by the previous CheckPrototypes. |
| 654 ASSERT(depth2 == kInvalidProtoDepth); | 645 ASSERT(depth2 == kInvalidProtoDepth); |
| 655 } | 646 } |
| 656 | 647 |
| 657 // Invoke function. | 648 // Invoke function. |
| 658 if (can_do_fast_api_call) { | 649 if (can_do_fast_api_call) { |
| 659 bool success = GenerateFastApiCall(masm, optimization, | 650 MaybeObject* result = |
| 660 arguments_.immediate(), failure); | 651 GenerateFastApiCall(masm, optimization, arguments_.immediate()); |
| 661 if (!success) { | 652 if (result->IsFailure()) return result; |
| 662 return false; | |
| 663 } | |
| 664 } else { | 653 } else { |
| 665 __ InvokeFunction(optimization.constant_function(), arguments_, | 654 __ InvokeFunction(optimization.constant_function(), arguments_, |
| 666 JUMP_FUNCTION); | 655 JUMP_FUNCTION); |
| 667 } | 656 } |
| 668 | 657 |
| 669 // Deferred code for fast API call case---clean preallocated space. | 658 // Deferred code for fast API call case---clean preallocated space. |
| 670 if (can_do_fast_api_call) { | 659 if (can_do_fast_api_call) { |
| 671 __ bind(&miss_cleanup); | 660 __ bind(&miss_cleanup); |
| 672 FreeSpaceForFastApiCall(masm, scratch1); | 661 FreeSpaceForFastApiCall(masm, scratch1); |
| 673 __ jmp(miss_label); | 662 __ jmp(miss_label); |
| 674 } | 663 } |
| 675 | 664 |
| 676 // Invoke a regular function. | 665 // Invoke a regular function. |
| 677 __ bind(®ular_invoke); | 666 __ bind(®ular_invoke); |
| 678 if (can_do_fast_api_call) { | 667 if (can_do_fast_api_call) { |
| 679 FreeSpaceForFastApiCall(masm, scratch1); | 668 FreeSpaceForFastApiCall(masm, scratch1); |
| 680 } | 669 } |
| 681 | 670 |
| 682 return true; | 671 return Heap::undefined_value(); // Success. |
| 683 } | 672 } |
| 684 | 673 |
| 685 void CompileRegular(MacroAssembler* masm, | 674 void CompileRegular(MacroAssembler* masm, |
| 686 JSObject* object, | 675 JSObject* object, |
| 687 Register receiver, | 676 Register receiver, |
| 688 Register scratch1, | 677 Register scratch1, |
| 689 Register scratch2, | 678 Register scratch2, |
| 690 Register scratch3, | 679 Register scratch3, |
| 691 String* name, | 680 String* name, |
| 692 JSObject* interceptor_holder, | 681 JSObject* interceptor_holder, |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1050 Register reg = | 1039 Register reg = |
| 1051 CheckPrototypes(object, receiver, holder, | 1040 CheckPrototypes(object, receiver, holder, |
| 1052 scratch1, scratch2, scratch3, name, miss); | 1041 scratch1, scratch2, scratch3, name, miss); |
| 1053 | 1042 |
| 1054 // Get the value from the properties. | 1043 // Get the value from the properties. |
| 1055 GenerateFastPropertyLoad(masm(), eax, reg, holder, index); | 1044 GenerateFastPropertyLoad(masm(), eax, reg, holder, index); |
| 1056 __ ret(0); | 1045 __ ret(0); |
| 1057 } | 1046 } |
| 1058 | 1047 |
| 1059 | 1048 |
| 1060 bool StubCompiler::GenerateLoadCallback(JSObject* object, | 1049 MaybeObject* StubCompiler::GenerateLoadCallback(JSObject* object, |
| 1061 JSObject* holder, | 1050 JSObject* holder, |
| 1062 Register receiver, | 1051 Register receiver, |
| 1063 Register name_reg, | 1052 Register name_reg, |
| 1064 Register scratch1, | 1053 Register scratch1, |
| 1065 Register scratch2, | 1054 Register scratch2, |
| 1066 Register scratch3, | 1055 Register scratch3, |
| 1067 AccessorInfo* callback, | 1056 AccessorInfo* callback, |
| 1068 String* name, | 1057 String* name, |
| 1069 Label* miss, | 1058 Label* miss) { |
| 1070 Failure** failure) { | |
| 1071 // Check that the receiver isn't a smi. | 1059 // Check that the receiver isn't a smi. |
| 1072 __ test(receiver, Immediate(kSmiTagMask)); | 1060 __ test(receiver, Immediate(kSmiTagMask)); |
| 1073 __ j(zero, miss, not_taken); | 1061 __ j(zero, miss, not_taken); |
| 1074 | 1062 |
| 1075 // Check that the maps haven't changed. | 1063 // Check that the maps haven't changed. |
| 1076 Register reg = | 1064 Register reg = |
| 1077 CheckPrototypes(object, receiver, holder, scratch1, | 1065 CheckPrototypes(object, receiver, holder, scratch1, |
| 1078 scratch2, scratch3, name, miss); | 1066 scratch2, scratch3, name, miss); |
| 1079 | 1067 |
| 1080 Handle<AccessorInfo> callback_handle(callback); | 1068 Handle<AccessorInfo> callback_handle(callback); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 | 1103 |
| 1116 __ PrepareCallApiFunction(kApiArgc, eax); | 1104 __ PrepareCallApiFunction(kApiArgc, eax); |
| 1117 __ mov(ApiParameterOperand(0), ebx); // name. | 1105 __ mov(ApiParameterOperand(0), ebx); // name. |
| 1118 __ add(Operand(ebx), Immediate(kPointerSize)); | 1106 __ add(Operand(ebx), Immediate(kPointerSize)); |
| 1119 __ mov(ApiParameterOperand(1), ebx); // arguments pointer. | 1107 __ mov(ApiParameterOperand(1), ebx); // arguments pointer. |
| 1120 | 1108 |
| 1121 // Emitting a stub call may try to allocate (if the code is not | 1109 // Emitting a stub call may try to allocate (if the code is not |
| 1122 // already generated). Do not allow the assembler to perform a | 1110 // already generated). Do not allow the assembler to perform a |
| 1123 // garbage collection but instead return the allocation failure | 1111 // garbage collection but instead return the allocation failure |
| 1124 // object. | 1112 // object. |
| 1125 MaybeObject* result = masm()->TryCallApiFunctionAndReturn(&fun, kStackSpace); | 1113 return masm()->TryCallApiFunctionAndReturn(&fun, kStackSpace); |
| 1126 if (result->IsFailure()) { | |
| 1127 *failure = Failure::cast(result); | |
| 1128 return false; | |
| 1129 } | |
| 1130 | |
| 1131 return true; | |
| 1132 } | 1114 } |
| 1133 | 1115 |
| 1134 | 1116 |
| 1135 void StubCompiler::GenerateLoadConstant(JSObject* object, | 1117 void StubCompiler::GenerateLoadConstant(JSObject* object, |
| 1136 JSObject* holder, | 1118 JSObject* holder, |
| 1137 Register receiver, | 1119 Register receiver, |
| 1138 Register scratch1, | 1120 Register scratch1, |
| 1139 Register scratch2, | 1121 Register scratch2, |
| 1140 Register scratch3, | 1122 Register scratch3, |
| 1141 Object* value, | 1123 Object* value, |
| (...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2273 ebx, edx, edi, name, &miss); | 2255 ebx, edx, edi, name, &miss); |
| 2274 } | 2256 } |
| 2275 break; | 2257 break; |
| 2276 } | 2258 } |
| 2277 | 2259 |
| 2278 default: | 2260 default: |
| 2279 UNREACHABLE(); | 2261 UNREACHABLE(); |
| 2280 } | 2262 } |
| 2281 | 2263 |
| 2282 if (depth != kInvalidProtoDepth) { | 2264 if (depth != kInvalidProtoDepth) { |
| 2283 Failure* failure; | |
| 2284 // Move the return address on top of the stack. | 2265 // Move the return address on top of the stack. |
| 2285 __ mov(eax, Operand(esp, 3 * kPointerSize)); | 2266 __ mov(eax, Operand(esp, 3 * kPointerSize)); |
| 2286 __ mov(Operand(esp, 0 * kPointerSize), eax); | 2267 __ mov(Operand(esp, 0 * kPointerSize), eax); |
| 2287 | 2268 |
| 2288 // esp[2 * kPointerSize] is uninitialized, esp[3 * kPointerSize] contains | 2269 // esp[2 * kPointerSize] is uninitialized, esp[3 * kPointerSize] contains |
| 2289 // duplicate of return address and will be overwritten. | 2270 // duplicate of return address and will be overwritten. |
| 2290 bool success = GenerateFastApiCall(masm(), optimization, argc, &failure); | 2271 MaybeObject* result = GenerateFastApiCall(masm(), optimization, argc); |
| 2291 if (!success) { | 2272 if (result->IsFailure()) return result; |
| 2292 return failure; | |
| 2293 } | |
| 2294 } else { | 2273 } else { |
| 2295 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2274 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
| 2296 } | 2275 } |
| 2297 | 2276 |
| 2298 // Handle call cache miss. | 2277 // Handle call cache miss. |
| 2299 __ bind(&miss); | 2278 __ bind(&miss); |
| 2300 if (depth != kInvalidProtoDepth) { | 2279 if (depth != kInvalidProtoDepth) { |
| 2301 __ add(Operand(esp), Immediate(kFastApiCallArguments * kPointerSize)); | 2280 __ add(Operand(esp), Immediate(kFastApiCallArguments * kPointerSize)); |
| 2302 } | 2281 } |
| 2303 __ bind(&miss_in_smi_check); | 2282 __ bind(&miss_in_smi_check); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2328 // Get the number of arguments. | 2307 // Get the number of arguments. |
| 2329 const int argc = arguments().immediate(); | 2308 const int argc = arguments().immediate(); |
| 2330 | 2309 |
| 2331 LookupResult lookup; | 2310 LookupResult lookup; |
| 2332 LookupPostInterceptor(holder, name, &lookup); | 2311 LookupPostInterceptor(holder, name, &lookup); |
| 2333 | 2312 |
| 2334 // Get the receiver from the stack. | 2313 // Get the receiver from the stack. |
| 2335 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 2314 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 2336 | 2315 |
| 2337 CallInterceptorCompiler compiler(this, arguments(), ecx); | 2316 CallInterceptorCompiler compiler(this, arguments(), ecx); |
| 2338 Failure* failure; | 2317 MaybeObject* result = compiler.Compile(masm(), |
| 2339 bool success = compiler.Compile(masm(), | 2318 object, |
| 2340 object, | 2319 holder, |
| 2341 holder, | 2320 name, |
| 2342 name, | 2321 &lookup, |
| 2343 &lookup, | 2322 edx, |
| 2344 edx, | 2323 ebx, |
| 2345 ebx, | 2324 edi, |
| 2346 edi, | 2325 eax, |
| 2347 eax, | 2326 &miss); |
| 2348 &miss, | 2327 if (result->IsFailure()) return result; |
| 2349 &failure); | |
| 2350 if (!success) { | |
| 2351 return failure; | |
| 2352 } | |
| 2353 | 2328 |
| 2354 // Restore receiver. | 2329 // Restore receiver. |
| 2355 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 2330 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 2356 | 2331 |
| 2357 // Check that the function really is a function. | 2332 // Check that the function really is a function. |
| 2358 __ test(eax, Immediate(kSmiTagMask)); | 2333 __ test(eax, Immediate(kSmiTagMask)); |
| 2359 __ j(zero, &miss, not_taken); | 2334 __ j(zero, &miss, not_taken); |
| 2360 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx); | 2335 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx); |
| 2361 __ j(not_equal, &miss, not_taken); | 2336 __ j(not_equal, &miss, not_taken); |
| 2362 | 2337 |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2792 JSObject* object, | 2767 JSObject* object, |
| 2793 JSObject* holder, | 2768 JSObject* holder, |
| 2794 AccessorInfo* callback) { | 2769 AccessorInfo* callback) { |
| 2795 // ----------- S t a t e ------------- | 2770 // ----------- S t a t e ------------- |
| 2796 // -- eax : receiver | 2771 // -- eax : receiver |
| 2797 // -- ecx : name | 2772 // -- ecx : name |
| 2798 // -- esp[0] : return address | 2773 // -- esp[0] : return address |
| 2799 // ----------------------------------- | 2774 // ----------------------------------- |
| 2800 Label miss; | 2775 Label miss; |
| 2801 | 2776 |
| 2802 Failure* failure = Failure::InternalError(); | 2777 MaybeObject* result = GenerateLoadCallback(object, holder, eax, ecx, ebx, edx, |
| 2803 bool success = GenerateLoadCallback(object, holder, eax, ecx, ebx, edx, edi, | 2778 edi, callback, name, &miss); |
| 2804 callback, name, &miss, &failure); | 2779 if (result->IsFailure()) { |
| 2805 if (!success) { | |
| 2806 miss.Unuse(); | 2780 miss.Unuse(); |
| 2807 return failure; | 2781 return result; |
| 2808 } | 2782 } |
| 2809 | 2783 |
| 2810 __ bind(&miss); | 2784 __ bind(&miss); |
| 2811 GenerateLoadMiss(masm(), Code::LOAD_IC); | 2785 GenerateLoadMiss(masm(), Code::LOAD_IC); |
| 2812 | 2786 |
| 2813 // Return the generated code. | 2787 // Return the generated code. |
| 2814 return GetCode(CALLBACKS, name); | 2788 return GetCode(CALLBACKS, name); |
| 2815 } | 2789 } |
| 2816 | 2790 |
| 2817 | 2791 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2961 // -- esp[0] : return address | 2935 // -- esp[0] : return address |
| 2962 // ----------------------------------- | 2936 // ----------------------------------- |
| 2963 Label miss; | 2937 Label miss; |
| 2964 | 2938 |
| 2965 __ IncrementCounter(&Counters::keyed_load_callback, 1); | 2939 __ IncrementCounter(&Counters::keyed_load_callback, 1); |
| 2966 | 2940 |
| 2967 // Check that the name has not changed. | 2941 // Check that the name has not changed. |
| 2968 __ cmp(Operand(eax), Immediate(Handle<String>(name))); | 2942 __ cmp(Operand(eax), Immediate(Handle<String>(name))); |
| 2969 __ j(not_equal, &miss, not_taken); | 2943 __ j(not_equal, &miss, not_taken); |
| 2970 | 2944 |
| 2971 Failure* failure = Failure::InternalError(); | 2945 MaybeObject* result = GenerateLoadCallback(receiver, holder, edx, eax, ebx, |
| 2972 bool success = GenerateLoadCallback(receiver, holder, edx, eax, ebx, ecx, edi, | 2946 ecx, edi, callback, name, &miss); |
| 2973 callback, name, &miss, &failure); | 2947 if (result->IsFailure()) { |
| 2974 if (!success) { | |
| 2975 miss.Unuse(); | 2948 miss.Unuse(); |
| 2976 return failure; | 2949 return result; |
| 2977 } | 2950 } |
| 2978 | 2951 |
| 2979 __ bind(&miss); | 2952 __ bind(&miss); |
| 2980 | 2953 |
| 2981 __ DecrementCounter(&Counters::keyed_load_callback, 1); | 2954 __ DecrementCounter(&Counters::keyed_load_callback, 1); |
| 2982 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 2955 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 2983 | 2956 |
| 2984 // Return the generated code. | 2957 // Return the generated code. |
| 2985 return GetCode(CALLBACKS, name); | 2958 return GetCode(CALLBACKS, name); |
| 2986 } | 2959 } |
| (...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3662 | 3635 |
| 3663 return GetCode(flags); | 3636 return GetCode(flags); |
| 3664 } | 3637 } |
| 3665 | 3638 |
| 3666 | 3639 |
| 3667 #undef __ | 3640 #undef __ |
| 3668 | 3641 |
| 3669 } } // namespace v8::internal | 3642 } } // namespace v8::internal |
| 3670 | 3643 |
| 3671 #endif // V8_TARGET_ARCH_IA32 | 3644 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |