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

Side by Side Diff: src/code-stub-assembler.cc

Issue 2319243002: [stubs] Fixing loads/stores from arrays by int32 offsets/indices. Step 3. (Closed)
Patch Set: Fixing redness Created 4 years, 3 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
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.cc » ('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 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 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/code-stub-assembler.h" 5 #include "src/code-stub-assembler.h"
6 #include "src/code-factory.h" 6 #include "src/code-factory.h"
7 #include "src/frames-inl.h" 7 #include "src/frames-inl.h"
8 #include "src/frames.h" 8 #include "src/frames.h"
9 #include "src/ic/handler-configuration.h" 9 #include "src/ic/handler-configuration.h"
10 #include "src/ic/stub-cache.h" 10 #include "src/ic/stub-cache.h"
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 1026
1027 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { 1027 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) {
1028 return LoadObjectField(map, Map::kDescriptorsOffset); 1028 return LoadObjectField(map, Map::kDescriptorsOffset);
1029 } 1029 }
1030 1030
1031 Node* CodeStubAssembler::LoadMapPrototype(Node* map) { 1031 Node* CodeStubAssembler::LoadMapPrototype(Node* map) {
1032 return LoadObjectField(map, Map::kPrototypeOffset); 1032 return LoadObjectField(map, Map::kPrototypeOffset);
1033 } 1033 }
1034 1034
1035 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { 1035 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) {
1036 return LoadObjectField(map, Map::kInstanceSizeOffset, MachineType::Uint8()); 1036 return ChangeUint32ToWord(
1037 LoadObjectField(map, Map::kInstanceSizeOffset, MachineType::Uint8()));
1037 } 1038 }
1038 1039
1039 Node* CodeStubAssembler::LoadMapInobjectProperties(Node* map) { 1040 Node* CodeStubAssembler::LoadMapInobjectProperties(Node* map) {
1040 // See Map::GetInObjectProperties() for details. 1041 // See Map::GetInObjectProperties() for details.
1041 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); 1042 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE);
1042 Assert(Int32GreaterThanOrEqual(LoadMapInstanceType(map), 1043 Assert(Int32GreaterThanOrEqual(LoadMapInstanceType(map),
1043 Int32Constant(FIRST_JS_OBJECT_TYPE))); 1044 Int32Constant(FIRST_JS_OBJECT_TYPE)));
1044 return LoadObjectField( 1045 return ChangeUint32ToWord(LoadObjectField(
1045 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, 1046 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset,
1046 MachineType::Uint8()); 1047 MachineType::Uint8()));
1048 }
1049
1050 Node* CodeStubAssembler::LoadMapConstructorFunctionIndex(Node* map) {
1051 // See Map::GetConstructorFunctionIndex() for details.
1052 STATIC_ASSERT(FIRST_PRIMITIVE_TYPE == FIRST_TYPE);
1053 Assert(Int32LessThanOrEqual(LoadMapInstanceType(map),
1054 Int32Constant(LAST_PRIMITIVE_TYPE)));
1055 return ChangeUint32ToWord(LoadObjectField(
1056 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset,
1057 MachineType::Uint8()));
1047 } 1058 }
1048 1059
1049 Node* CodeStubAssembler::LoadMapConstructor(Node* map) { 1060 Node* CodeStubAssembler::LoadMapConstructor(Node* map) {
1050 Variable result(this, MachineRepresentation::kTagged); 1061 Variable result(this, MachineRepresentation::kTagged);
1051 result.Bind(LoadObjectField(map, Map::kConstructorOrBackPointerOffset)); 1062 result.Bind(LoadObjectField(map, Map::kConstructorOrBackPointerOffset));
1052 1063
1053 Label done(this), loop(this, &result); 1064 Label done(this), loop(this, &result);
1054 Goto(&loop); 1065 Goto(&loop);
1055 Bind(&loop); 1066 Bind(&loop);
1056 { 1067 {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 int additional_offset, ParameterMode parameter_mode) { 1142 int additional_offset, ParameterMode parameter_mode) {
1132 int32_t header_size = 1143 int32_t header_size =
1133 FixedDoubleArray::kHeaderSize + additional_offset - kHeapObjectTag; 1144 FixedDoubleArray::kHeaderSize + additional_offset - kHeapObjectTag;
1134 Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_DOUBLE_ELEMENTS, 1145 Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_DOUBLE_ELEMENTS,
1135 parameter_mode, header_size); 1146 parameter_mode, header_size);
1136 return Load(machine_type, object, offset); 1147 return Load(machine_type, object, offset);
1137 } 1148 }
1138 1149
1139 Node* CodeStubAssembler::LoadNativeContext(Node* context) { 1150 Node* CodeStubAssembler::LoadNativeContext(Node* context) {
1140 return LoadFixedArrayElement(context, 1151 return LoadFixedArrayElement(context,
1141 Int32Constant(Context::NATIVE_CONTEXT_INDEX)); 1152 IntPtrConstant(Context::NATIVE_CONTEXT_INDEX));
1142 } 1153 }
1143 1154
1144 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, 1155 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind,
1145 Node* native_context) { 1156 Node* native_context) {
1146 return LoadFixedArrayElement(native_context, 1157 return LoadFixedArrayElement(native_context,
1147 Int32Constant(Context::ArrayMapIndex(kind))); 1158 IntPtrConstant(Context::ArrayMapIndex(kind)));
1148 } 1159 }
1149 1160
1150 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { 1161 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) {
1151 return StoreObjectFieldNoWriteBarrier(object, HeapNumber::kValueOffset, value, 1162 return StoreObjectFieldNoWriteBarrier(object, HeapNumber::kValueOffset, value,
1152 MachineRepresentation::kFloat64); 1163 MachineRepresentation::kFloat64);
1153 } 1164 }
1154 1165
1155 Node* CodeStubAssembler::StoreObjectField( 1166 Node* CodeStubAssembler::StoreObjectField(
1156 Node* object, int offset, Node* value) { 1167 Node* object, int offset, Node* value) {
1157 return Store(MachineRepresentation::kTagged, object, 1168 return Store(MachineRepresentation::kTagged, object,
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
1404 Node* value = LoadRoot(value_root_index); 1415 Node* value = LoadRoot(value_root_index);
1405 1416
1406 int const first_element_offset = FixedArray::kHeaderSize - kHeapObjectTag; 1417 int const first_element_offset = FixedArray::kHeaderSize - kHeapObjectTag;
1407 int32_t to; 1418 int32_t to;
1408 bool constant_to = ToInt32Constant(to_node, to); 1419 bool constant_to = ToInt32Constant(to_node, to);
1409 int32_t from; 1420 int32_t from;
1410 bool constant_from = ToInt32Constant(from_node, from); 1421 bool constant_from = ToInt32Constant(from_node, from);
1411 if (constant_to && constant_from && 1422 if (constant_to && constant_from &&
1412 (to - from) <= kElementLoopUnrollThreshold) { 1423 (to - from) <= kElementLoopUnrollThreshold) {
1413 for (int i = from; i < to; ++i) { 1424 for (int i = from; i < to; ++i) {
1425 Node* index = IntPtrConstant(i);
1414 if (is_double) { 1426 if (is_double) {
1415 Node* offset = ElementOffsetFromIndex(Int32Constant(i), kind, mode, 1427 Node* offset = ElementOffsetFromIndex(index, kind, INTPTR_PARAMETERS,
1416 first_element_offset); 1428 first_element_offset);
1417 // Don't use doubles to store the hole double, since manipulating the 1429 // Don't use doubles to store the hole double, since manipulating the
1418 // signaling NaN used for the hole in C++, e.g. with bit_cast, will 1430 // signaling NaN used for the hole in C++, e.g. with bit_cast, will
1419 // change its value on ia32 (the x87 stack is used to return values 1431 // change its value on ia32 (the x87 stack is used to return values
1420 // and stores to the stack silently clear the signalling bit). 1432 // and stores to the stack silently clear the signalling bit).
1421 // 1433 //
1422 // TODO(danno): When we have a Float32/Float64 wrapper class that 1434 // TODO(danno): When we have a Float32/Float64 wrapper class that
1423 // preserves double bits during manipulation, remove this code/change 1435 // preserves double bits during manipulation, remove this code/change
1424 // this to an indexed Float64 store. 1436 // this to an indexed Float64 store.
1425 if (Is64()) { 1437 if (Is64()) {
1426 StoreNoWriteBarrier(MachineRepresentation::kWord64, array, offset, 1438 StoreNoWriteBarrier(MachineRepresentation::kWord64, array, offset,
1427 double_hole); 1439 double_hole);
1428 } else { 1440 } else {
1429 StoreNoWriteBarrier(MachineRepresentation::kWord32, array, offset, 1441 StoreNoWriteBarrier(MachineRepresentation::kWord32, array, offset,
1430 double_hole); 1442 double_hole);
1431 offset = ElementOffsetFromIndex(Int32Constant(i), kind, mode, 1443 offset = ElementOffsetFromIndex(index, kind, INTPTR_PARAMETERS,
1432 first_element_offset + kPointerSize); 1444 first_element_offset + kPointerSize);
1433 StoreNoWriteBarrier(MachineRepresentation::kWord32, array, offset, 1445 StoreNoWriteBarrier(MachineRepresentation::kWord32, array, offset,
1434 double_hole); 1446 double_hole);
1435 } 1447 }
1436 } else { 1448 } else {
1437 StoreFixedArrayElement(array, Int32Constant(i), value, 1449 StoreFixedArrayElement(array, index, value, SKIP_WRITE_BARRIER,
1438 SKIP_WRITE_BARRIER); 1450 INTPTR_PARAMETERS);
1439 } 1451 }
1440 } 1452 }
1441 } else { 1453 } else {
1442 Variable current(this, MachineRepresentation::kTagged); 1454 Variable current(this, MachineRepresentation::kTagged);
1443 Label test(this); 1455 Label test(this);
1444 Label decrement(this, &current); 1456 Label decrement(this, &current);
1445 Label done(this); 1457 Label done(this);
1446 Node* limit = 1458 Node* limit =
1447 IntPtrAdd(array, ElementOffsetFromIndex(from_node, kind, mode)); 1459 IntPtrAdd(array, ElementOffsetFromIndex(from_node, kind, mode));
1448 current.Bind(IntPtrAdd(array, ElementOffsetFromIndex(to_node, kind, mode))); 1460 current.Bind(IntPtrAdd(array, ElementOffsetFromIndex(to_node, kind, mode)));
1449 1461
1450 Branch(WordEqual(current.value(), limit), &done, &decrement); 1462 Branch(WordEqual(current.value(), limit), &done, &decrement);
1451 1463
1452 Bind(&decrement); 1464 Bind(&decrement);
1453 current.Bind(IntPtrSub( 1465 current.Bind(IntPtrSub(
1454 current.value(), 1466 current.value(),
1455 Int32Constant(IsFastDoubleElementsKind(kind) ? kDoubleSize 1467 IntPtrConstant(IsFastDoubleElementsKind(kind) ? kDoubleSize
1456 : kPointerSize))); 1468 : kPointerSize)));
1457 if (is_double) { 1469 if (is_double) {
1458 // Don't use doubles to store the hole double, since manipulating the 1470 // Don't use doubles to store the hole double, since manipulating the
1459 // signaling NaN used for the hole in C++, e.g. with bit_cast, will 1471 // signaling NaN used for the hole in C++, e.g. with bit_cast, will
1460 // change its value on ia32 (the x87 stack is used to return values 1472 // change its value on ia32 (the x87 stack is used to return values
1461 // and stores to the stack silently clear the signalling bit). 1473 // and stores to the stack silently clear the signalling bit).
1462 // 1474 //
1463 // TODO(danno): When we have a Float32/Float64 wrapper class that 1475 // TODO(danno): When we have a Float32/Float64 wrapper class that
1464 // preserves double bits during manipulation, remove this code/change 1476 // preserves double bits during manipulation, remove this code/change
1465 // this to an indexed Float64 store. 1477 // this to an indexed Float64 store.
1466 if (Is64()) { 1478 if (Is64()) {
(...skipping 21 matching lines...) Expand all
1488 compiler::Node* from_array, 1500 compiler::Node* from_array,
1489 compiler::Node* to_array, 1501 compiler::Node* to_array,
1490 compiler::Node* element_count, 1502 compiler::Node* element_count,
1491 WriteBarrierMode barrier_mode, 1503 WriteBarrierMode barrier_mode,
1492 ParameterMode mode) { 1504 ParameterMode mode) {
1493 Label test(this); 1505 Label test(this);
1494 Label done(this); 1506 Label done(this);
1495 bool double_elements = IsFastDoubleElementsKind(kind); 1507 bool double_elements = IsFastDoubleElementsKind(kind);
1496 bool needs_write_barrier = 1508 bool needs_write_barrier =
1497 barrier_mode == UPDATE_WRITE_BARRIER && !IsFastObjectElementsKind(kind); 1509 barrier_mode == UPDATE_WRITE_BARRIER && !IsFastObjectElementsKind(kind);
1498 Node* limit_offset = ElementOffsetFromIndex( 1510 Node* limit_offset =
1499 IntPtrConstant(0), kind, mode, FixedArray::kHeaderSize - kHeapObjectTag); 1511 ElementOffsetFromIndex(IntPtrOrSmiConstant(0, mode), kind, mode,
1512 FixedArray::kHeaderSize - kHeapObjectTag);
1500 Variable current_offset(this, MachineType::PointerRepresentation()); 1513 Variable current_offset(this, MachineType::PointerRepresentation());
1501 current_offset.Bind(ElementOffsetFromIndex( 1514 current_offset.Bind(ElementOffsetFromIndex(
1502 element_count, kind, mode, FixedArray::kHeaderSize - kHeapObjectTag)); 1515 element_count, kind, mode, FixedArray::kHeaderSize - kHeapObjectTag));
1503 Label decrement(this, &current_offset); 1516 Label decrement(this, &current_offset);
1504 1517
1505 Branch(WordEqual(current_offset.value(), limit_offset), &done, &decrement); 1518 Branch(WordEqual(current_offset.value(), limit_offset), &done, &decrement);
1506 1519
1507 Bind(&decrement); 1520 Bind(&decrement);
1508 { 1521 {
1509 current_offset.Bind(IntPtrSub( 1522 current_offset.Bind(IntPtrSub(
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after
2596 var_details->Bind(details); 2609 var_details->Bind(details);
2597 2610
2598 Node* location = BitFieldDecode<PropertyDetails::LocationField>(details); 2611 Node* location = BitFieldDecode<PropertyDetails::LocationField>(details);
2599 2612
2600 Label if_in_field(this), if_in_descriptor(this), done(this); 2613 Label if_in_field(this), if_in_descriptor(this), done(this);
2601 Branch(Word32Equal(location, Int32Constant(kField)), &if_in_field, 2614 Branch(Word32Equal(location, Int32Constant(kField)), &if_in_field,
2602 &if_in_descriptor); 2615 &if_in_descriptor);
2603 Bind(&if_in_field); 2616 Bind(&if_in_field);
2604 { 2617 {
2605 Node* field_index = 2618 Node* field_index =
2606 BitFieldDecode<PropertyDetails::FieldIndexField>(details); 2619 BitFieldDecodeWord<PropertyDetails::FieldIndexField>(details);
2607 Node* representation = 2620 Node* representation =
2608 BitFieldDecode<PropertyDetails::RepresentationField>(details); 2621 BitFieldDecode<PropertyDetails::RepresentationField>(details);
2609 2622
2610 Node* inobject_properties = LoadMapInobjectProperties(map); 2623 Node* inobject_properties = LoadMapInobjectProperties(map);
2611 2624
2612 Label if_inobject(this), if_backing_store(this); 2625 Label if_inobject(this), if_backing_store(this);
2613 Variable var_double_value(this, MachineRepresentation::kFloat64); 2626 Variable var_double_value(this, MachineRepresentation::kFloat64);
2614 Label rebox_double(this, &var_double_value); 2627 Label rebox_double(this, &var_double_value);
2615 BranchIfInt32LessThan(field_index, inobject_properties, &if_inobject, 2628 BranchIfUintPtrLessThan(field_index, inobject_properties, &if_inobject,
2616 &if_backing_store); 2629 &if_backing_store);
2617 Bind(&if_inobject); 2630 Bind(&if_inobject);
2618 { 2631 {
2619 Comment("if_inobject"); 2632 Comment("if_inobject");
2620 Node* field_offset = ChangeInt32ToIntPtr( 2633 Node* field_offset =
2621 Int32Mul(Int32Sub(LoadMapInstanceSize(map), 2634 IntPtrMul(IntPtrSub(LoadMapInstanceSize(map),
2622 Int32Sub(inobject_properties, field_index)), 2635 IntPtrSub(inobject_properties, field_index)),
2623 Int32Constant(kPointerSize))); 2636 IntPtrConstant(kPointerSize));
2624 2637
2625 Label if_double(this), if_tagged(this); 2638 Label if_double(this), if_tagged(this);
2626 BranchIfWord32NotEqual(representation, 2639 BranchIfWord32NotEqual(representation,
2627 Int32Constant(Representation::kDouble), &if_tagged, 2640 Int32Constant(Representation::kDouble), &if_tagged,
2628 &if_double); 2641 &if_double);
2629 Bind(&if_tagged); 2642 Bind(&if_tagged);
2630 { 2643 {
2631 var_value->Bind(LoadObjectField(object, field_offset)); 2644 var_value->Bind(LoadObjectField(object, field_offset));
2632 Goto(&done); 2645 Goto(&done);
2633 } 2646 }
2634 Bind(&if_double); 2647 Bind(&if_double);
2635 { 2648 {
2636 if (FLAG_unbox_double_fields) { 2649 if (FLAG_unbox_double_fields) {
2637 var_double_value.Bind( 2650 var_double_value.Bind(
2638 LoadObjectField(object, field_offset, MachineType::Float64())); 2651 LoadObjectField(object, field_offset, MachineType::Float64()));
2639 } else { 2652 } else {
2640 Node* mutable_heap_number = LoadObjectField(object, field_offset); 2653 Node* mutable_heap_number = LoadObjectField(object, field_offset);
2641 var_double_value.Bind(LoadHeapNumberValue(mutable_heap_number)); 2654 var_double_value.Bind(LoadHeapNumberValue(mutable_heap_number));
2642 } 2655 }
2643 Goto(&rebox_double); 2656 Goto(&rebox_double);
2644 } 2657 }
2645 } 2658 }
2646 Bind(&if_backing_store); 2659 Bind(&if_backing_store);
2647 { 2660 {
2648 Comment("if_backing_store"); 2661 Comment("if_backing_store");
2649 Node* properties = LoadProperties(object); 2662 Node* properties = LoadProperties(object);
2650 field_index = Int32Sub(field_index, inobject_properties); 2663 field_index = IntPtrSub(field_index, inobject_properties);
2651 Node* value = LoadFixedArrayElement(properties, field_index); 2664 Node* value = LoadFixedArrayElement(properties, field_index);
2652 2665
2653 Label if_double(this), if_tagged(this); 2666 Label if_double(this), if_tagged(this);
2654 BranchIfWord32NotEqual(representation, 2667 BranchIfWord32NotEqual(representation,
2655 Int32Constant(Representation::kDouble), &if_tagged, 2668 Int32Constant(Representation::kDouble), &if_tagged,
2656 &if_double); 2669 &if_double);
2657 Bind(&if_tagged); 2670 Bind(&if_tagged);
2658 { 2671 {
2659 var_value->Bind(value); 2672 var_value->Bind(value);
2660 Goto(&done); 2673 Goto(&done);
(...skipping 1433 matching lines...) Expand 10 before | Expand all | Expand 10 after
4094 Node* handler = 4107 Node* handler =
4095 LoadFixedArrayElement(p->vector, p->slot, kPointerSize, SMI_PARAMETERS); 4108 LoadFixedArrayElement(p->vector, p->slot, kPointerSize, SMI_PARAMETERS);
4096 GotoIf(WordEqual(handler, LoadRoot(Heap::kuninitialized_symbolRootIndex)), 4109 GotoIf(WordEqual(handler, LoadRoot(Heap::kuninitialized_symbolRootIndex)),
4097 &miss); 4110 &miss);
4098 4111
4099 // In this case {handler} must be a Code object. 4112 // In this case {handler} must be a Code object.
4100 AssertInstanceType(handler, CODE_TYPE); 4113 AssertInstanceType(handler, CODE_TYPE);
4101 LoadWithVectorDescriptor descriptor(isolate()); 4114 LoadWithVectorDescriptor descriptor(isolate());
4102 Node* native_context = LoadNativeContext(p->context); 4115 Node* native_context = LoadNativeContext(p->context);
4103 Node* receiver = LoadFixedArrayElement( 4116 Node* receiver = LoadFixedArrayElement(
4104 native_context, Int32Constant(Context::EXTENSION_INDEX)); 4117 native_context, IntPtrConstant(Context::EXTENSION_INDEX), 0,
4118 INTPTR_PARAMETERS);
4105 Node* fake_name = IntPtrConstant(0); 4119 Node* fake_name = IntPtrConstant(0);
4106 TailCallStub(descriptor, handler, p->context, receiver, fake_name, p->slot, 4120 TailCallStub(descriptor, handler, p->context, receiver, fake_name, p->slot,
4107 p->vector); 4121 p->vector);
4108 } 4122 }
4109 Bind(&miss); 4123 Bind(&miss);
4110 { 4124 {
4111 TailCallRuntime(Runtime::kLoadGlobalIC_Miss, p->context, p->slot, 4125 TailCallRuntime(Runtime::kLoadGlobalIC_Miss, p->context, p->slot,
4112 p->vector); 4126 p->vector);
4113 } 4127 }
4114 } 4128 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
4193 Heap::kTheHoleValueRootIndex); 4207 Heap::kTheHoleValueRootIndex);
4194 4208
4195 // Store the WeakCell in the feedback vector. 4209 // Store the WeakCell in the feedback vector.
4196 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, 4210 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER,
4197 CodeStubAssembler::SMI_PARAMETERS); 4211 CodeStubAssembler::SMI_PARAMETERS);
4198 return cell; 4212 return cell;
4199 } 4213 }
4200 4214
4201 } // namespace internal 4215 } // namespace internal
4202 } // namespace v8 4216 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698