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

Side by Side Diff: src/ia32/full-codegen-ia32.cc

Issue 1135243004: [es6] Support super.property in eval and arrow functions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 5 years, 7 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_IA32 7 #if V8_TARGET_ARCH_IA32
8 8
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 } else { 296 } else {
297 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; 297 type = ArgumentsAccessStub::NEW_SLOPPY_FAST;
298 } 298 }
299 299
300 ArgumentsAccessStub stub(isolate(), type, has_new_target); 300 ArgumentsAccessStub stub(isolate(), type, has_new_target);
301 __ CallStub(&stub); 301 __ CallStub(&stub);
302 302
303 SetVar(arguments, eax, ebx, edx); 303 SetVar(arguments, eax, ebx, edx);
304 } 304 }
305 305
306 // Possibly set up a local binding to the [[HomeObject]].
307 Variable* home_object_var = scope()->home_object_var();
308 if (home_object_var != nullptr) {
309 Comment cmnt(masm_, "[ Home object");
310 if (function_in_register) {
311 __ mov(LoadDescriptor::ReceiverRegister(), edi);
312 } else {
313 __ mov(LoadDescriptor::ReceiverRegister(),
314 Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
315 }
316 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
317 __ mov(LoadDescriptor::NameRegister(), Immediate(home_object_symbol));
318 __ mov(LoadDescriptor::SlotRegister(),
319 Immediate(SmiFromSlot(function()->HomeObjectFeedbackSlot())));
320 CallLoadIC(NOT_CONTEXTUAL);
321
322 SetVar(home_object_var, eax, ebx, edx);
323 }
324
306 if (FLAG_trace) { 325 if (FLAG_trace) {
307 __ CallRuntime(Runtime::kTraceEnter, 0); 326 __ CallRuntime(Runtime::kTraceEnter, 0);
308 } 327 }
309 328
310 // Visit the declarations and body unless there is an illegal 329 // Visit the declarations and body unless there is an illegal
311 // redeclaration. 330 // redeclaration.
312 if (scope()->HasIllegalRedeclaration()) { 331 if (scope()->HasIllegalRedeclaration()) {
313 Comment cmnt(masm_, "[ Declarations"); 332 Comment cmnt(masm_, "[ Declarations");
314 scope()->VisitIllegalRedeclaration(this); 333 scope()->VisitIllegalRedeclaration(this);
315 334
(...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after
1244 context()->Plug(eax); 1263 context()->Plug(eax);
1245 } 1264 }
1246 1265
1247 1266
1248 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { 1267 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) {
1249 Comment cmnt(masm_, "[ VariableProxy"); 1268 Comment cmnt(masm_, "[ VariableProxy");
1250 EmitVariableLoad(expr); 1269 EmitVariableLoad(expr);
1251 } 1270 }
1252 1271
1253 1272
1254 void FullCodeGenerator::EmitLoadHomeObject(SuperReference* expr) {
1255 Comment cnmt(masm_, "[ SuperReference ");
1256
1257 __ mov(LoadDescriptor::ReceiverRegister(),
1258 Operand(ebp, JavaScriptFrameConstants::kFunctionOffset));
1259
1260 Handle<Symbol> home_object_symbol(isolate()->heap()->home_object_symbol());
1261 __ mov(LoadDescriptor::NameRegister(), home_object_symbol);
1262
1263 __ mov(LoadDescriptor::SlotRegister(),
1264 Immediate(SmiFromSlot(expr->HomeObjectFeedbackSlot())));
1265 CallLoadIC(NOT_CONTEXTUAL);
1266
1267 __ cmp(eax, isolate()->factory()->undefined_value());
1268 Label done;
1269 __ j(not_equal, &done);
1270 __ CallRuntime(Runtime::kThrowNonMethodError, 0);
1271 __ bind(&done);
1272 }
1273
1274
1275 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer, 1273 void FullCodeGenerator::EmitSetHomeObjectIfNeeded(Expression* initializer,
1276 int offset) { 1274 int offset) {
1277 if (NeedsHomeObject(initializer)) { 1275 if (NeedsHomeObject(initializer)) {
1278 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0)); 1276 __ mov(StoreDescriptor::ReceiverRegister(), Operand(esp, 0));
1279 __ mov(StoreDescriptor::NameRegister(), 1277 __ mov(StoreDescriptor::NameRegister(),
1280 Immediate(isolate()->factory()->home_object_symbol())); 1278 Immediate(isolate()->factory()->home_object_symbol()));
1281 __ mov(StoreDescriptor::ValueRegister(), 1279 __ mov(StoreDescriptor::ValueRegister(),
1282 Operand(esp, offset * kPointerSize)); 1280 Operand(esp, offset * kPointerSize));
1283 CallStoreIC(); 1281 CallStoreIC();
1284 } 1282 }
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after
1868 Property* property = expr->target()->AsProperty(); 1866 Property* property = expr->target()->AsProperty();
1869 LhsKind assign_type = GetAssignType(property); 1867 LhsKind assign_type = GetAssignType(property);
1870 1868
1871 // Evaluate LHS expression. 1869 // Evaluate LHS expression.
1872 switch (assign_type) { 1870 switch (assign_type) {
1873 case VARIABLE: 1871 case VARIABLE:
1874 // Nothing to do here. 1872 // Nothing to do here.
1875 break; 1873 break;
1876 case NAMED_SUPER_PROPERTY: 1874 case NAMED_SUPER_PROPERTY:
1877 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); 1875 VisitForStackValue(property->obj()->AsSuperReference()->this_var());
1878 EmitLoadHomeObject(property->obj()->AsSuperReference()); 1876 VisitForAccumulatorValue(
1877 property->obj()->AsSuperReference()->home_object_var());
1879 __ push(result_register()); 1878 __ push(result_register());
1880 if (expr->is_compound()) { 1879 if (expr->is_compound()) {
1881 __ push(MemOperand(esp, kPointerSize)); 1880 __ push(MemOperand(esp, kPointerSize));
1882 __ push(result_register()); 1881 __ push(result_register());
1883 } 1882 }
1884 break; 1883 break;
1885 case NAMED_PROPERTY: 1884 case NAMED_PROPERTY:
1886 if (expr->is_compound()) { 1885 if (expr->is_compound()) {
1887 // We need the receiver both on the stack and in the register. 1886 // We need the receiver both on the stack and in the register.
1888 VisitForStackValue(property->obj()); 1887 VisitForStackValue(property->obj());
1889 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); 1888 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0));
1890 } else { 1889 } else {
1891 VisitForStackValue(property->obj()); 1890 VisitForStackValue(property->obj());
1892 } 1891 }
1893 break; 1892 break;
1894 case KEYED_SUPER_PROPERTY: 1893 case KEYED_SUPER_PROPERTY:
1895 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); 1894 VisitForStackValue(property->obj()->AsSuperReference()->this_var());
1896 EmitLoadHomeObject(property->obj()->AsSuperReference()); 1895 VisitForStackValue(
1897 __ Push(result_register()); 1896 property->obj()->AsSuperReference()->home_object_var());
1898 VisitForAccumulatorValue(property->key()); 1897 VisitForAccumulatorValue(property->key());
1899 __ Push(result_register()); 1898 __ Push(result_register());
1900 if (expr->is_compound()) { 1899 if (expr->is_compound()) {
1901 __ push(MemOperand(esp, 2 * kPointerSize)); 1900 __ push(MemOperand(esp, 2 * kPointerSize));
1902 __ push(MemOperand(esp, 2 * kPointerSize)); 1901 __ push(MemOperand(esp, 2 * kPointerSize));
1903 __ push(result_register()); 1902 __ push(result_register());
1904 } 1903 }
1905 break; 1904 break;
1906 case KEYED_PROPERTY: { 1905 case KEYED_PROPERTY: {
1907 if (expr->is_compound()) { 1906 if (expr->is_compound()) {
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after
2510 __ Move(StoreDescriptor::ReceiverRegister(), eax); 2509 __ Move(StoreDescriptor::ReceiverRegister(), eax);
2511 __ pop(StoreDescriptor::ValueRegister()); // Restore value. 2510 __ pop(StoreDescriptor::ValueRegister()); // Restore value.
2512 __ mov(StoreDescriptor::NameRegister(), 2511 __ mov(StoreDescriptor::NameRegister(),
2513 prop->key()->AsLiteral()->value()); 2512 prop->key()->AsLiteral()->value());
2514 CallStoreIC(); 2513 CallStoreIC();
2515 break; 2514 break;
2516 } 2515 }
2517 case NAMED_SUPER_PROPERTY: { 2516 case NAMED_SUPER_PROPERTY: {
2518 __ push(eax); 2517 __ push(eax);
2519 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 2518 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
2520 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 2519 VisitForAccumulatorValue(
2520 prop->obj()->AsSuperReference()->home_object_var());
2521 // stack: value, this; eax: home_object 2521 // stack: value, this; eax: home_object
2522 Register scratch = ecx; 2522 Register scratch = ecx;
2523 Register scratch2 = edx; 2523 Register scratch2 = edx;
2524 __ mov(scratch, result_register()); // home_object 2524 __ mov(scratch, result_register()); // home_object
2525 __ mov(eax, MemOperand(esp, kPointerSize)); // value 2525 __ mov(eax, MemOperand(esp, kPointerSize)); // value
2526 __ mov(scratch2, MemOperand(esp, 0)); // this 2526 __ mov(scratch2, MemOperand(esp, 0)); // this
2527 __ mov(MemOperand(esp, kPointerSize), scratch2); // this 2527 __ mov(MemOperand(esp, kPointerSize), scratch2); // this
2528 __ mov(MemOperand(esp, 0), scratch); // home_object 2528 __ mov(MemOperand(esp, 0), scratch); // home_object
2529 // stack: this, home_object. eax: value 2529 // stack: this, home_object. eax: value
2530 EmitNamedSuperPropertyStore(prop); 2530 EmitNamedSuperPropertyStore(prop);
2531 break; 2531 break;
2532 } 2532 }
2533 case KEYED_SUPER_PROPERTY: { 2533 case KEYED_SUPER_PROPERTY: {
2534 __ push(eax); 2534 __ push(eax);
2535 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 2535 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
2536 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 2536 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var());
2537 __ push(result_register());
2538 VisitForAccumulatorValue(prop->key()); 2537 VisitForAccumulatorValue(prop->key());
2539 Register scratch = ecx; 2538 Register scratch = ecx;
2540 Register scratch2 = edx; 2539 Register scratch2 = edx;
2541 __ mov(scratch2, MemOperand(esp, 2 * kPointerSize)); // value 2540 __ mov(scratch2, MemOperand(esp, 2 * kPointerSize)); // value
2542 // stack: value, this, home_object; eax: key, edx: value 2541 // stack: value, this, home_object; eax: key, edx: value
2543 __ mov(scratch, MemOperand(esp, kPointerSize)); // this 2542 __ mov(scratch, MemOperand(esp, kPointerSize)); // this
2544 __ mov(MemOperand(esp, 2 * kPointerSize), scratch); 2543 __ mov(MemOperand(esp, 2 * kPointerSize), scratch);
2545 __ mov(scratch, MemOperand(esp, 0)); // home_object 2544 __ mov(scratch, MemOperand(esp, 0)); // home_object
2546 __ mov(MemOperand(esp, kPointerSize), scratch); 2545 __ mov(MemOperand(esp, kPointerSize), scratch);
2547 __ mov(MemOperand(esp, 0), eax); 2546 __ mov(MemOperand(esp, 0), eax);
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
2738 Comment cmnt(masm_, "[ Property"); 2737 Comment cmnt(masm_, "[ Property");
2739 Expression* key = expr->key(); 2738 Expression* key = expr->key();
2740 2739
2741 if (key->IsPropertyName()) { 2740 if (key->IsPropertyName()) {
2742 if (!expr->IsSuperAccess()) { 2741 if (!expr->IsSuperAccess()) {
2743 VisitForAccumulatorValue(expr->obj()); 2742 VisitForAccumulatorValue(expr->obj());
2744 __ Move(LoadDescriptor::ReceiverRegister(), result_register()); 2743 __ Move(LoadDescriptor::ReceiverRegister(), result_register());
2745 EmitNamedPropertyLoad(expr); 2744 EmitNamedPropertyLoad(expr);
2746 } else { 2745 } else {
2747 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); 2746 VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
2748 EmitLoadHomeObject(expr->obj()->AsSuperReference()); 2747 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var());
2749 __ push(result_register());
2750 EmitNamedSuperPropertyLoad(expr); 2748 EmitNamedSuperPropertyLoad(expr);
2751 } 2749 }
2752 } else { 2750 } else {
2753 if (!expr->IsSuperAccess()) { 2751 if (!expr->IsSuperAccess()) {
2754 VisitForStackValue(expr->obj()); 2752 VisitForStackValue(expr->obj());
2755 VisitForAccumulatorValue(expr->key()); 2753 VisitForAccumulatorValue(expr->key());
2756 __ pop(LoadDescriptor::ReceiverRegister()); // Object. 2754 __ pop(LoadDescriptor::ReceiverRegister()); // Object.
2757 __ Move(LoadDescriptor::NameRegister(), result_register()); // Key. 2755 __ Move(LoadDescriptor::NameRegister(), result_register()); // Key.
2758 EmitKeyedPropertyLoad(expr); 2756 EmitKeyedPropertyLoad(expr);
2759 } else { 2757 } else {
2760 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); 2758 VisitForStackValue(expr->obj()->AsSuperReference()->this_var());
2761 EmitLoadHomeObject(expr->obj()->AsSuperReference()); 2759 VisitForStackValue(expr->obj()->AsSuperReference()->home_object_var());
2762 __ push(result_register());
2763 VisitForStackValue(expr->key()); 2760 VisitForStackValue(expr->key());
2764 EmitKeyedSuperPropertyLoad(expr); 2761 EmitKeyedSuperPropertyLoad(expr);
2765 } 2762 }
2766 } 2763 }
2767 PrepareForBailoutForId(expr->LoadId(), TOS_REG); 2764 PrepareForBailoutForId(expr->LoadId(), TOS_REG);
2768 context()->Plug(eax); 2765 context()->Plug(eax);
2769 } 2766 }
2770 2767
2771 2768
2772 void FullCodeGenerator::CallIC(Handle<Code> code, 2769 void FullCodeGenerator::CallIC(Handle<Code> code,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2811 Expression* callee = expr->expression(); 2808 Expression* callee = expr->expression();
2812 DCHECK(callee->IsProperty()); 2809 DCHECK(callee->IsProperty());
2813 Property* prop = callee->AsProperty(); 2810 Property* prop = callee->AsProperty();
2814 DCHECK(prop->IsSuperAccess()); 2811 DCHECK(prop->IsSuperAccess());
2815 2812
2816 SetSourcePosition(prop->position()); 2813 SetSourcePosition(prop->position());
2817 Literal* key = prop->key()->AsLiteral(); 2814 Literal* key = prop->key()->AsLiteral();
2818 DCHECK(!key->value()->IsSmi()); 2815 DCHECK(!key->value()->IsSmi());
2819 // Load the function from the receiver. 2816 // Load the function from the receiver.
2820 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); 2817 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference();
2821 EmitLoadHomeObject(super_ref); 2818 VisitForStackValue(super_ref->home_object_var());
2822 __ push(eax);
2823 VisitForAccumulatorValue(super_ref->this_var()); 2819 VisitForAccumulatorValue(super_ref->this_var());
2824 __ push(eax); 2820 __ push(eax);
2825 __ push(eax); 2821 __ push(eax);
2826 __ push(Operand(esp, kPointerSize * 2)); 2822 __ push(Operand(esp, kPointerSize * 2));
2827 __ push(Immediate(key->value())); 2823 __ push(Immediate(key->value()));
2828 // Stack here: 2824 // Stack here:
2829 // - home_object 2825 // - home_object
2830 // - this (receiver) 2826 // - this (receiver)
2831 // - this (receiver) <-- LoadFromSuper will pop here and below. 2827 // - this (receiver) <-- LoadFromSuper will pop here and below.
2832 // - home_object 2828 // - home_object
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2868 2864
2869 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) { 2865 void FullCodeGenerator::EmitKeyedSuperCallWithLoadIC(Call* expr) {
2870 Expression* callee = expr->expression(); 2866 Expression* callee = expr->expression();
2871 DCHECK(callee->IsProperty()); 2867 DCHECK(callee->IsProperty());
2872 Property* prop = callee->AsProperty(); 2868 Property* prop = callee->AsProperty();
2873 DCHECK(prop->IsSuperAccess()); 2869 DCHECK(prop->IsSuperAccess());
2874 2870
2875 SetSourcePosition(prop->position()); 2871 SetSourcePosition(prop->position());
2876 // Load the function from the receiver. 2872 // Load the function from the receiver.
2877 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference(); 2873 SuperReference* super_ref = callee->AsProperty()->obj()->AsSuperReference();
2878 EmitLoadHomeObject(super_ref); 2874 VisitForStackValue(super_ref->home_object_var());
2879 __ push(eax);
2880 VisitForAccumulatorValue(super_ref->this_var()); 2875 VisitForAccumulatorValue(super_ref->this_var());
2881 __ push(eax); 2876 __ push(eax);
2882 __ push(eax); 2877 __ push(eax);
2883 __ push(Operand(esp, kPointerSize * 2)); 2878 __ push(Operand(esp, kPointerSize * 2));
2884 VisitForStackValue(prop->key()); 2879 VisitForStackValue(prop->key());
2885 // Stack here: 2880 // Stack here:
2886 // - home_object 2881 // - home_object
2887 // - this (receiver) 2882 // - this (receiver)
2888 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below. 2883 // - this (receiver) <-- LoadKeyedFromSuper will pop here and below.
2889 // - home_object 2884 // - home_object
(...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after
4741 case NAMED_PROPERTY: { 4736 case NAMED_PROPERTY: {
4742 // Put the object both on the stack and in the register. 4737 // Put the object both on the stack and in the register.
4743 VisitForStackValue(prop->obj()); 4738 VisitForStackValue(prop->obj());
4744 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0)); 4739 __ mov(LoadDescriptor::ReceiverRegister(), Operand(esp, 0));
4745 EmitNamedPropertyLoad(prop); 4740 EmitNamedPropertyLoad(prop);
4746 break; 4741 break;
4747 } 4742 }
4748 4743
4749 case NAMED_SUPER_PROPERTY: { 4744 case NAMED_SUPER_PROPERTY: {
4750 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 4745 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
4751 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 4746 VisitForAccumulatorValue(
4747 prop->obj()->AsSuperReference()->home_object_var());
4752 __ push(result_register()); 4748 __ push(result_register());
4753 __ push(MemOperand(esp, kPointerSize)); 4749 __ push(MemOperand(esp, kPointerSize));
4754 __ push(result_register()); 4750 __ push(result_register());
4755 EmitNamedSuperPropertyLoad(prop); 4751 EmitNamedSuperPropertyLoad(prop);
4756 break; 4752 break;
4757 } 4753 }
4758 4754
4759 case KEYED_SUPER_PROPERTY: { 4755 case KEYED_SUPER_PROPERTY: {
4760 VisitForStackValue(prop->obj()->AsSuperReference()->this_var()); 4756 VisitForStackValue(prop->obj()->AsSuperReference()->this_var());
4761 EmitLoadHomeObject(prop->obj()->AsSuperReference()); 4757 VisitForStackValue(prop->obj()->AsSuperReference()->home_object_var());
4762 __ push(result_register());
4763 VisitForAccumulatorValue(prop->key()); 4758 VisitForAccumulatorValue(prop->key());
4764 __ push(result_register()); 4759 __ push(result_register());
4765 __ push(MemOperand(esp, 2 * kPointerSize)); 4760 __ push(MemOperand(esp, 2 * kPointerSize));
4766 __ push(MemOperand(esp, 2 * kPointerSize)); 4761 __ push(MemOperand(esp, 2 * kPointerSize));
4767 __ push(result_register()); 4762 __ push(result_register());
4768 EmitKeyedSuperPropertyLoad(prop); 4763 EmitKeyedSuperPropertyLoad(prop);
4769 break; 4764 break;
4770 } 4765 }
4771 4766
4772 case KEYED_PROPERTY: { 4767 case KEYED_PROPERTY: {
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
5349 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), 5344 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(),
5350 Assembler::target_address_at(call_target_address, 5345 Assembler::target_address_at(call_target_address,
5351 unoptimized_code)); 5346 unoptimized_code));
5352 return OSR_AFTER_STACK_CHECK; 5347 return OSR_AFTER_STACK_CHECK;
5353 } 5348 }
5354 5349
5355 5350
5356 } } // namespace v8::internal 5351 } } // namespace v8::internal
5357 5352
5358 #endif // V8_TARGET_ARCH_IA32 5353 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/full-codegen.h ('k') | src/mips/full-codegen-mips.cc » ('j') | src/x64/full-codegen-x64.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698