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

Side by Side Diff: src/ia32/stub-cache-ia32.cc

Issue 6392003: Minor cleanup: Use MaybeObject instead of bool and Failure** in... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 11 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
« no previous file with comments | « src/arm/stub-cache-arm.cc ('k') | src/stub-cache.h » ('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-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
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
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
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(&regular_invoke); 666 __ bind(&regular_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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/arm/stub-cache-arm.cc ('k') | src/stub-cache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698