OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1208 if (to_ == JS_FUNCTION_TYPE) stream->Add(" function"); | 1208 if (to_ == JS_FUNCTION_TYPE) stream->Add(" function"); |
1209 break; | 1209 break; |
1210 default: | 1210 default: |
1211 break; | 1211 break; |
1212 } | 1212 } |
1213 } | 1213 } |
1214 | 1214 |
1215 | 1215 |
1216 void HTypeofIsAndBranch::PrintDataTo(StringStream* stream) { | 1216 void HTypeofIsAndBranch::PrintDataTo(StringStream* stream) { |
1217 value()->PrintNameTo(stream); | 1217 value()->PrintNameTo(stream); |
1218 stream->Add(" == %o", *type_literal_); | 1218 stream->Add(" == %o", *type_literal_.handle()); |
1219 HControlInstruction::PrintDataTo(stream); | 1219 HControlInstruction::PrintDataTo(stream); |
1220 } | 1220 } |
1221 | 1221 |
1222 | 1222 |
1223 static String* TypeOfString(HConstant* constant, Isolate* isolate) { | |
1224 Heap* heap = isolate->heap(); | |
1225 if (constant->HasNumberValue()) return heap->number_string(); | |
1226 if (constant->IsUndetectable()) return heap->undefined_string(); | |
1227 if (constant->HasStringValue()) return heap->string_string(); | |
1228 switch (constant->GetInstanceType()) { | |
1229 case ODDBALL_TYPE: { | |
1230 Unique<Object> unique = constant->GetUnique(); | |
1231 if (unique.IsKnownGlobal(heap->true_value()) || | |
1232 unique.IsKnownGlobal(heap->false_value())) { | |
1233 return heap->boolean_string(); | |
1234 } | |
1235 if (unique.IsKnownGlobal(heap->null_value())) { | |
1236 return FLAG_harmony_typeof ? heap->null_string() | |
1237 : heap->object_string(); | |
1238 } | |
1239 ASSERT(unique.IsKnownGlobal(heap->undefined_value())); | |
1240 return heap->undefined_string(); | |
1241 } | |
1242 case SYMBOL_TYPE: | |
1243 return heap->symbol_string(); | |
1244 case JS_FUNCTION_TYPE: | |
1245 case JS_FUNCTION_PROXY_TYPE: | |
1246 return heap->function_string(); | |
1247 default: | |
1248 return heap->object_string(); | |
1249 } | |
1250 } | |
1251 | |
1252 | |
1223 bool HTypeofIsAndBranch::KnownSuccessorBlock(HBasicBlock** block) { | 1253 bool HTypeofIsAndBranch::KnownSuccessorBlock(HBasicBlock** block) { |
1224 if (value()->representation().IsSpecialization()) { | 1254 if (FLAG_fold_constants && value()->IsConstant()) { |
1225 if (compares_number_type()) { | 1255 HConstant* constant = HConstant::cast(value()); |
1226 *block = FirstSuccessor(); | 1256 String* type_string = TypeOfString(constant, isolate()); |
1227 } else { | 1257 bool same_type = type_literal_.IsKnownGlobal(type_string); |
1228 *block = SecondSuccessor(); | 1258 *block = same_type ? FirstSuccessor() : SecondSuccessor(); |
1229 } | 1259 return true; |
1260 } else if (value()->representation().IsSpecialization()) { | |
1261 bool number_type = | |
1262 type_literal_.IsKnownGlobal(isolate()->heap()->number_string()); | |
1263 *block = number_type ? FirstSuccessor() : SecondSuccessor(); | |
1230 return true; | 1264 return true; |
1231 } | 1265 } |
1232 *block = NULL; | 1266 *block = NULL; |
1233 return false; | 1267 return false; |
1234 } | 1268 } |
1235 | 1269 |
1236 | 1270 |
1237 void HCheckMapValue::PrintDataTo(StringStream* stream) { | 1271 void HCheckMapValue::PrintDataTo(StringStream* stream) { |
1238 value()->PrintNameTo(stream); | 1272 value()->PrintNameTo(stream); |
1239 stream->Add(" "); | 1273 stream->Add(" "); |
(...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2491 } | 2525 } |
2492 | 2526 |
2493 | 2527 |
2494 HConstant::HConstant(Handle<Object> handle, Representation r) | 2528 HConstant::HConstant(Handle<Object> handle, Representation r) |
2495 : HTemplateInstruction<0>(HType::TypeFromValue(handle)), | 2529 : HTemplateInstruction<0>(HType::TypeFromValue(handle)), |
2496 object_(Unique<Object>::CreateUninitialized(handle)), | 2530 object_(Unique<Object>::CreateUninitialized(handle)), |
2497 has_smi_value_(false), | 2531 has_smi_value_(false), |
2498 has_int32_value_(false), | 2532 has_int32_value_(false), |
2499 has_double_value_(false), | 2533 has_double_value_(false), |
2500 has_external_reference_value_(false), | 2534 has_external_reference_value_(false), |
2501 is_internalized_string_(false), | |
2502 is_not_in_new_space_(true), | 2535 is_not_in_new_space_(true), |
2503 is_cell_(false), | 2536 boolean_value_(handle->BooleanValue()), |
2504 boolean_value_(handle->BooleanValue()) { | 2537 is_undetectable_(false), |
2538 instance_type_(kUnknownInstanceType) { | |
2505 if (handle->IsHeapObject()) { | 2539 if (handle->IsHeapObject()) { |
2506 Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap(); | 2540 Handle<HeapObject> heap_obj = Handle<HeapObject>::cast(handle); |
2541 Heap* heap = heap_obj->GetHeap(); | |
2507 is_not_in_new_space_ = !heap->InNewSpace(*handle); | 2542 is_not_in_new_space_ = !heap->InNewSpace(*handle); |
2543 instance_type_ = heap_obj->map()->instance_type(); | |
2544 is_undetectable_ = heap_obj->map()->is_undetectable(); | |
2508 } | 2545 } |
2509 if (handle->IsNumber()) { | 2546 if (handle->IsNumber()) { |
2510 double n = handle->Number(); | 2547 double n = handle->Number(); |
2511 has_int32_value_ = IsInteger32(n); | 2548 has_int32_value_ = IsInteger32(n); |
2512 int32_value_ = DoubleToInt32(n); | 2549 int32_value_ = DoubleToInt32(n); |
2513 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); | 2550 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); |
2514 double_value_ = n; | 2551 double_value_ = n; |
2515 has_double_value_ = true; | 2552 has_double_value_ = true; |
2516 // TODO(titzer): if this heap number is new space, tenure a new one. | 2553 // TODO(titzer): if this heap number is new space, tenure a new one. |
2517 } else { | |
2518 is_internalized_string_ = handle->IsInternalizedString(); | |
2519 } | 2554 } |
2520 | 2555 |
2521 is_cell_ = !handle.is_null() && | |
2522 (handle->IsCell() || handle->IsPropertyCell()); | |
2523 Initialize(r); | 2556 Initialize(r); |
2524 } | 2557 } |
2525 | 2558 |
2526 | 2559 |
2527 HConstant::HConstant(Unique<Object> unique, | 2560 HConstant::HConstant(Unique<Object> unique, |
2528 Representation r, | 2561 Representation r, |
2529 HType type, | 2562 HType type, |
2530 bool is_internalize_string, | |
2531 bool is_not_in_new_space, | 2563 bool is_not_in_new_space, |
2532 bool is_cell, | 2564 bool boolean_value, |
2533 bool boolean_value) | 2565 bool is_undetectable, |
2566 InstanceType instance_type) | |
2534 : HTemplateInstruction<0>(type), | 2567 : HTemplateInstruction<0>(type), |
2535 object_(unique), | 2568 object_(unique), |
2536 has_smi_value_(false), | 2569 has_smi_value_(false), |
2537 has_int32_value_(false), | 2570 has_int32_value_(false), |
2538 has_double_value_(false), | 2571 has_double_value_(false), |
2539 has_external_reference_value_(false), | 2572 has_external_reference_value_(false), |
2540 is_internalized_string_(is_internalize_string), | |
2541 is_not_in_new_space_(is_not_in_new_space), | 2573 is_not_in_new_space_(is_not_in_new_space), |
2542 is_cell_(is_cell), | 2574 boolean_value_(boolean_value), |
2543 boolean_value_(boolean_value) { | 2575 is_undetectable_(is_undetectable), |
2576 instance_type_(instance_type) { | |
2544 ASSERT(!unique.handle().is_null()); | 2577 ASSERT(!unique.handle().is_null()); |
2545 ASSERT(!type.IsTaggedNumber()); | 2578 ASSERT(!type.IsTaggedNumber()); |
2546 Initialize(r); | 2579 Initialize(r); |
2547 } | 2580 } |
2548 | 2581 |
2549 | 2582 |
2550 HConstant::HConstant(int32_t integer_value, | 2583 HConstant::HConstant(int32_t integer_value, |
2551 Representation r, | 2584 Representation r, |
2552 bool is_not_in_new_space, | 2585 bool is_not_in_new_space, |
2553 Unique<Object> object) | 2586 Unique<Object> object) |
2554 : object_(object), | 2587 : object_(object), |
2555 has_smi_value_(Smi::IsValid(integer_value)), | 2588 has_smi_value_(Smi::IsValid(integer_value)), |
2556 has_int32_value_(true), | 2589 has_int32_value_(true), |
2557 has_double_value_(true), | 2590 has_double_value_(true), |
2558 has_external_reference_value_(false), | 2591 has_external_reference_value_(false), |
2559 is_internalized_string_(false), | |
2560 is_not_in_new_space_(is_not_in_new_space), | 2592 is_not_in_new_space_(is_not_in_new_space), |
2561 is_cell_(false), | |
2562 boolean_value_(integer_value != 0), | 2593 boolean_value_(integer_value != 0), |
2594 is_undetectable_(false), | |
2563 int32_value_(integer_value), | 2595 int32_value_(integer_value), |
2564 double_value_(FastI2D(integer_value)) { | 2596 double_value_(FastI2D(integer_value)), |
2597 instance_type_(kUnknownInstanceType) { | |
2565 // It's possible to create a constant with a value in Smi-range but stored | 2598 // It's possible to create a constant with a value in Smi-range but stored |
2566 // in a (pre-existing) HeapNumber. See crbug.com/349878. | 2599 // in a (pre-existing) HeapNumber. See crbug.com/349878. |
2567 bool could_be_heapobject = r.IsTagged() && !object.handle().is_null(); | 2600 bool could_be_heapobject = r.IsTagged() && !object.handle().is_null(); |
2568 bool is_smi = has_smi_value_ && !could_be_heapobject; | 2601 bool is_smi = has_smi_value_ && !could_be_heapobject; |
2569 set_type(is_smi ? HType::Smi() : HType::TaggedNumber()); | 2602 set_type(is_smi ? HType::Smi() : HType::TaggedNumber()); |
2570 Initialize(r); | 2603 Initialize(r); |
2571 } | 2604 } |
2572 | 2605 |
2573 | 2606 |
2574 HConstant::HConstant(double double_value, | 2607 HConstant::HConstant(double double_value, |
2575 Representation r, | 2608 Representation r, |
2576 bool is_not_in_new_space, | 2609 bool is_not_in_new_space, |
2577 Unique<Object> object) | 2610 Unique<Object> object) |
2578 : object_(object), | 2611 : object_(object), |
2579 has_int32_value_(IsInteger32(double_value)), | 2612 has_int32_value_(IsInteger32(double_value)), |
2580 has_double_value_(true), | 2613 has_double_value_(true), |
2581 has_external_reference_value_(false), | 2614 has_external_reference_value_(false), |
2582 is_internalized_string_(false), | |
2583 is_not_in_new_space_(is_not_in_new_space), | 2615 is_not_in_new_space_(is_not_in_new_space), |
2584 is_cell_(false), | |
2585 boolean_value_(double_value != 0 && !std::isnan(double_value)), | 2616 boolean_value_(double_value != 0 && !std::isnan(double_value)), |
2617 is_undetectable_(false), | |
2586 int32_value_(DoubleToInt32(double_value)), | 2618 int32_value_(DoubleToInt32(double_value)), |
2587 double_value_(double_value) { | 2619 double_value_(double_value), |
2620 instance_type_(kUnknownInstanceType) { | |
2588 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); | 2621 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); |
2589 // It's possible to create a constant with a value in Smi-range but stored | 2622 // It's possible to create a constant with a value in Smi-range but stored |
2590 // in a (pre-existing) HeapNumber. See crbug.com/349878. | 2623 // in a (pre-existing) HeapNumber. See crbug.com/349878. |
2591 bool could_be_heapobject = r.IsTagged() && !object.handle().is_null(); | 2624 bool could_be_heapobject = r.IsTagged() && !object.handle().is_null(); |
2592 bool is_smi = has_smi_value_ && !could_be_heapobject; | 2625 bool is_smi = has_smi_value_ && !could_be_heapobject; |
2593 set_type(is_smi ? HType::Smi() : HType::TaggedNumber()); | 2626 set_type(is_smi ? HType::Smi() : HType::TaggedNumber()); |
2594 Initialize(r); | 2627 Initialize(r); |
2595 } | 2628 } |
2596 | 2629 |
2597 | 2630 |
2598 HConstant::HConstant(ExternalReference reference) | 2631 HConstant::HConstant(ExternalReference reference) |
2599 : HTemplateInstruction<0>(HType::None()), | 2632 : HTemplateInstruction<0>(HType::None()), |
2600 object_(Unique<Object>(Handle<Object>::null())), | 2633 object_(Unique<Object>(Handle<Object>::null())), |
2601 has_smi_value_(false), | 2634 has_smi_value_(false), |
2602 has_int32_value_(false), | 2635 has_int32_value_(false), |
2603 has_double_value_(false), | 2636 has_double_value_(false), |
2604 has_external_reference_value_(true), | 2637 has_external_reference_value_(true), |
2605 is_internalized_string_(false), | |
2606 is_not_in_new_space_(true), | 2638 is_not_in_new_space_(true), |
2607 is_cell_(false), | |
2608 boolean_value_(true), | 2639 boolean_value_(true), |
2609 external_reference_value_(reference) { | 2640 is_undetectable_(false), |
2641 external_reference_value_(reference), | |
2642 instance_type_(kUnknownInstanceType) { | |
2610 Initialize(Representation::External()); | 2643 Initialize(Representation::External()); |
2611 } | 2644 } |
2612 | 2645 |
2613 | 2646 |
2614 void HConstant::Initialize(Representation r) { | 2647 void HConstant::Initialize(Representation r) { |
2615 if (r.IsNone()) { | 2648 if (r.IsNone()) { |
2616 if (has_smi_value_ && SmiValuesAre31Bits()) { | 2649 if (has_smi_value_ && SmiValuesAre31Bits()) { |
2617 r = Representation::Smi(); | 2650 r = Representation::Smi(); |
2618 } else if (has_int32_value_) { | 2651 } else if (has_int32_value_) { |
2619 r = Representation::Integer32(); | 2652 r = Representation::Integer32(); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2698 if (has_double_value_) { | 2731 if (has_double_value_) { |
2699 return new(zone) HConstant(double_value_, r, is_not_in_new_space_, object_); | 2732 return new(zone) HConstant(double_value_, r, is_not_in_new_space_, object_); |
2700 } | 2733 } |
2701 if (has_external_reference_value_) { | 2734 if (has_external_reference_value_) { |
2702 return new(zone) HConstant(external_reference_value_); | 2735 return new(zone) HConstant(external_reference_value_); |
2703 } | 2736 } |
2704 ASSERT(!object_.handle().is_null()); | 2737 ASSERT(!object_.handle().is_null()); |
2705 return new(zone) HConstant(object_, | 2738 return new(zone) HConstant(object_, |
2706 r, | 2739 r, |
2707 type_, | 2740 type_, |
2708 is_internalized_string_, | |
2709 is_not_in_new_space_, | 2741 is_not_in_new_space_, |
2710 is_cell_, | 2742 boolean_value_, |
2711 boolean_value_); | 2743 is_undetectable_, |
2744 instance_type_); | |
2712 } | 2745 } |
2713 | 2746 |
2714 | 2747 |
2715 Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) { | 2748 Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) { |
2716 HConstant* res = NULL; | 2749 HConstant* res = NULL; |
2717 if (has_int32_value_) { | 2750 if (has_int32_value_) { |
2718 res = new(zone) HConstant(int32_value_, | 2751 res = new(zone) HConstant(int32_value_, |
2719 Representation::Integer32(), | 2752 Representation::Integer32(), |
2720 is_not_in_new_space_, | 2753 is_not_in_new_space_, |
2721 object_); | 2754 object_); |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3015 | 3048 |
3016 void HCompareObjectEqAndBranch::PrintDataTo(StringStream* stream) { | 3049 void HCompareObjectEqAndBranch::PrintDataTo(StringStream* stream) { |
3017 left()->PrintNameTo(stream); | 3050 left()->PrintNameTo(stream); |
3018 stream->Add(" "); | 3051 stream->Add(" "); |
3019 right()->PrintNameTo(stream); | 3052 right()->PrintNameTo(stream); |
3020 HControlInstruction::PrintDataTo(stream); | 3053 HControlInstruction::PrintDataTo(stream); |
3021 } | 3054 } |
3022 | 3055 |
3023 | 3056 |
3024 bool HCompareObjectEqAndBranch::KnownSuccessorBlock(HBasicBlock** block) { | 3057 bool HCompareObjectEqAndBranch::KnownSuccessorBlock(HBasicBlock** block) { |
3025 if (left()->IsConstant() && right()->IsConstant()) { | 3058 if (FLAG_fold_constants && left()->IsConstant() && right()->IsConstant()) { |
3026 bool comparison_result = | 3059 *block = HConstant::cast(left())->Equals(HConstant::cast(right())) |
3027 HConstant::cast(left())->Equals(HConstant::cast(right())); | 3060 ? FirstSuccessor() : SecondSuccessor(); |
3028 *block = comparison_result | |
3029 ? FirstSuccessor() | |
3030 : SecondSuccessor(); | |
3031 return true; | 3061 return true; |
3032 } | 3062 } |
3033 *block = NULL; | 3063 *block = NULL; |
3064 return false; | |
3065 } | |
3066 | |
3067 | |
3068 bool ConstantIsObject(HConstant* constant, Isolate* isolate) { | |
3069 if (constant->HasNumberValue()) return false; | |
3070 if (constant->GetUnique().IsKnownGlobal(isolate->heap()->null_value())) { | |
3071 return true; | |
3072 } | |
3073 if (constant->IsUndetectable()) return false; | |
3074 InstanceType type = constant->GetInstanceType(); | |
3075 return (FIRST_NONCALLABLE_SPEC_OBJECT_TYPE <= type) && | |
3076 (type <= LAST_NONCALLABLE_SPEC_OBJECT_TYPE); | |
3077 } | |
3078 | |
3079 | |
3080 bool HIsObjectAndBranch::KnownSuccessorBlock(HBasicBlock** block) { | |
3081 if (FLAG_fold_constants && value()->IsConstant()) { | |
3082 *block = ConstantIsObject(HConstant::cast(value()), isolate()) | |
3083 ? FirstSuccessor() : SecondSuccessor(); | |
3084 return true; | |
3085 } | |
3086 *block = NULL; | |
3087 return false; | |
3088 } | |
3089 | |
3090 | |
3091 bool HIsStringAndBranch::KnownSuccessorBlock(HBasicBlock** block) { | |
3092 if (FLAG_fold_constants && value()->IsConstant()) { | |
3093 *block = HConstant::cast(value())->HasStringValue() | |
3094 ? FirstSuccessor() : SecondSuccessor(); | |
3095 return true; | |
3096 } | |
3097 *block = NULL; | |
3098 return false; | |
3099 } | |
3100 | |
3101 | |
3102 bool HIsSmiAndBranch::KnownSuccessorBlock(HBasicBlock** block) { | |
3103 if (FLAG_fold_constants && value()->IsConstant()) { | |
3104 *block = HConstant::cast(value())->HasSmiValue() | |
3105 ? FirstSuccessor() : SecondSuccessor(); | |
3106 return true; | |
3107 } | |
3108 *block = NULL; | |
3109 return false; | |
3110 } | |
3111 | |
3112 | |
3113 bool HIsUndetectableAndBranch::KnownSuccessorBlock(HBasicBlock** block) { | |
3114 if (FLAG_fold_constants && value()->IsConstant()) { | |
3115 *block = HConstant::cast(value())->IsUndetectable() | |
3116 ? FirstSuccessor() : SecondSuccessor(); | |
3117 return true; | |
3118 } | |
3119 *block = NULL; | |
3120 return false; | |
3121 } | |
3122 | |
3123 | |
3124 bool HHasInstanceTypeAndBranch::KnownSuccessorBlock(HBasicBlock** block) { | |
3125 if (FLAG_fold_constants && value()->IsConstant()) { | |
3126 InstanceType type = HConstant::cast(value())->GetInstanceType(); | |
3127 *block = (from_ <= type) && (type <= to_) | |
3128 ? FirstSuccessor() : SecondSuccessor(); | |
3129 return true; | |
3130 } | |
3131 *block = NULL; | |
3034 return false; | 3132 return false; |
3035 } | 3133 } |
3036 | 3134 |
3037 | 3135 |
3038 void HCompareHoleAndBranch::InferRepresentation( | 3136 void HCompareHoleAndBranch::InferRepresentation( |
3039 HInferRepresentationPhase* h_infer) { | 3137 HInferRepresentationPhase* h_infer) { |
3040 ChangeRepresentation(value()->representation()); | 3138 ChangeRepresentation(value()->representation()); |
3041 } | 3139 } |
3042 | 3140 |
3043 | 3141 |
3044 bool HCompareMinusZeroAndBranch::KnownSuccessorBlock(HBasicBlock** block) { | 3142 bool HCompareMinusZeroAndBranch::KnownSuccessorBlock(HBasicBlock** block) { |
3143 if (FLAG_fold_constants && value()->IsConstant()) { | |
3144 HConstant* constant = HConstant::cast(value()); | |
3145 if (constant->HasDoubleValue()) { | |
3146 *block = IsMinusZero(constant->DoubleValue()) | |
3147 ? FirstSuccessor() : SecondSuccessor(); | |
3148 } | |
3149 return true; | |
Jakob Kummerow
2014/03/10 14:51:08
I think this needs to be inside the if() {...} blo
| |
3150 } | |
3045 if (value()->representation().IsSmiOrInteger32()) { | 3151 if (value()->representation().IsSmiOrInteger32()) { |
3046 // A Smi or Integer32 cannot contain minus zero. | 3152 // A Smi or Integer32 cannot contain minus zero. |
3047 *block = SecondSuccessor(); | 3153 *block = SecondSuccessor(); |
3048 return true; | 3154 return true; |
3049 } | 3155 } |
3050 *block = NULL; | 3156 *block = NULL; |
3051 return false; | 3157 return false; |
3052 } | 3158 } |
3053 | 3159 |
3054 | 3160 |
(...skipping 1382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4437 break; | 4543 break; |
4438 case kExternalMemory: | 4544 case kExternalMemory: |
4439 stream->Add("[external-memory]"); | 4545 stream->Add("[external-memory]"); |
4440 break; | 4546 break; |
4441 } | 4547 } |
4442 | 4548 |
4443 stream->Add("@%d", offset()); | 4549 stream->Add("@%d", offset()); |
4444 } | 4550 } |
4445 | 4551 |
4446 } } // namespace v8::internal | 4552 } } // namespace v8::internal |
OLD | NEW |