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

Side by Side Diff: src/hydrogen-instructions.cc

Issue 1316933002: [es6] Initial steps towards a correct implementation of IsCallable. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase again. Created 5 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/hydrogen-instructions.h ('k') | src/ia32/lithium-codegen-ia32.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 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/hydrogen-instructions.h" 5 #include "src/hydrogen-instructions.h"
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/double.h" 8 #include "src/double.h"
9 #include "src/elements.h" 9 #include "src/elements.h"
10 #include "src/factory.h" 10 #include "src/factory.h"
(...skipping 1281 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 } 1292 }
1293 1293
1294 1294
1295 std::ostream& HTypeofIsAndBranch::PrintDataTo( 1295 std::ostream& HTypeofIsAndBranch::PrintDataTo(
1296 std::ostream& os) const { // NOLINT 1296 std::ostream& os) const { // NOLINT
1297 os << NameOf(value()) << " == " << type_literal()->ToCString().get(); 1297 os << NameOf(value()) << " == " << type_literal()->ToCString().get();
1298 return HControlInstruction::PrintDataTo(os); 1298 return HControlInstruction::PrintDataTo(os);
1299 } 1299 }
1300 1300
1301 1301
1302 static String* TypeOfString(HConstant* constant, Isolate* isolate) { 1302 namespace {
1303
1304 String* TypeOfString(HConstant* constant, Isolate* isolate) {
1303 Heap* heap = isolate->heap(); 1305 Heap* heap = isolate->heap();
1304 if (constant->HasNumberValue()) return heap->number_string(); 1306 if (constant->HasNumberValue()) return heap->number_string();
1305 if (constant->IsUndetectable()) return heap->undefined_string(); 1307 if (constant->IsUndetectable()) return heap->undefined_string();
1306 if (constant->HasStringValue()) return heap->string_string(); 1308 if (constant->HasStringValue()) return heap->string_string();
1307 switch (constant->GetInstanceType()) { 1309 switch (constant->GetInstanceType()) {
1308 case ODDBALL_TYPE: { 1310 case ODDBALL_TYPE: {
1309 Unique<Object> unique = constant->GetUnique(); 1311 Unique<Object> unique = constant->GetUnique();
1310 if (unique.IsKnownGlobal(heap->true_value()) || 1312 if (unique.IsKnownGlobal(heap->true_value()) ||
1311 unique.IsKnownGlobal(heap->false_value())) { 1313 unique.IsKnownGlobal(heap->false_value())) {
1312 return heap->boolean_string(); 1314 return heap->boolean_string();
(...skipping 10 matching lines...) Expand all
1323 Unique<Map> map = constant->ObjectMap(); 1325 Unique<Map> map = constant->ObjectMap();
1324 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \ 1326 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \
1325 if (map.IsKnownGlobal(heap->type##_map())) { \ 1327 if (map.IsKnownGlobal(heap->type##_map())) { \
1326 return heap->type##_string(); \ 1328 return heap->type##_string(); \
1327 } 1329 }
1328 SIMD128_TYPES(SIMD128_TYPE) 1330 SIMD128_TYPES(SIMD128_TYPE)
1329 #undef SIMD128_TYPE 1331 #undef SIMD128_TYPE
1330 UNREACHABLE(); 1332 UNREACHABLE();
1331 return nullptr; 1333 return nullptr;
1332 } 1334 }
1333 case JS_FUNCTION_TYPE:
1334 case JS_FUNCTION_PROXY_TYPE:
1335 return heap->function_string();
1336 default: 1335 default:
1336 if (constant->IsCallable()) return heap->function_string();
1337 return heap->object_string(); 1337 return heap->object_string();
1338 } 1338 }
1339 } 1339 }
1340 1340
1341 } // namespace
1342
1341 1343
1342 bool HTypeofIsAndBranch::KnownSuccessorBlock(HBasicBlock** block) { 1344 bool HTypeofIsAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
1343 if (FLAG_fold_constants && value()->IsConstant()) { 1345 if (FLAG_fold_constants && value()->IsConstant()) {
1344 HConstant* constant = HConstant::cast(value()); 1346 HConstant* constant = HConstant::cast(value());
1345 String* type_string = TypeOfString(constant, isolate()); 1347 String* type_string = TypeOfString(constant, isolate());
1346 bool same_type = type_literal_.IsKnownGlobal(type_string); 1348 bool same_type = type_literal_.IsKnownGlobal(type_string);
1347 *block = same_type ? FirstSuccessor() : SecondSuccessor(); 1349 *block = same_type ? FirstSuccessor() : SecondSuccessor();
1348 return true; 1350 return true;
1349 } else if (value()->representation().IsSpecialization()) { 1351 } else if (value()->representation().IsSpecialization()) {
1350 bool number_type = 1352 bool number_type =
(...skipping 1347 matching lines...) Expand 10 before | Expand all | Expand 10 after
2698 DCHECK_EQ(kHoleNaN, special); 2700 DCHECK_EQ(kHoleNaN, special);
2699 std::memcpy(&double_value_, &kHoleNanInt64, sizeof(double_value_)); 2701 std::memcpy(&double_value_, &kHoleNanInt64, sizeof(double_value_));
2700 Initialize(Representation::Double()); 2702 Initialize(Representation::Double());
2701 } 2703 }
2702 2704
2703 2705
2704 HConstant::HConstant(Handle<Object> object, Representation r) 2706 HConstant::HConstant(Handle<Object> object, Representation r)
2705 : HTemplateInstruction<0>(HType::FromValue(object)), 2707 : HTemplateInstruction<0>(HType::FromValue(object)),
2706 object_(Unique<Object>::CreateUninitialized(object)), 2708 object_(Unique<Object>::CreateUninitialized(object)),
2707 object_map_(Handle<Map>::null()), 2709 object_map_(Handle<Map>::null()),
2708 bit_field_(HasStableMapValueField::encode(false) | 2710 bit_field_(
2709 HasSmiValueField::encode(false) | 2711 HasStableMapValueField::encode(false) |
2710 HasInt32ValueField::encode(false) | 2712 HasSmiValueField::encode(false) | HasInt32ValueField::encode(false) |
2711 HasDoubleValueField::encode(false) | 2713 HasDoubleValueField::encode(false) |
2712 HasExternalReferenceValueField::encode(false) | 2714 HasExternalReferenceValueField::encode(false) |
2713 IsNotInNewSpaceField::encode(true) | 2715 IsNotInNewSpaceField::encode(true) |
2714 BooleanValueField::encode(object->BooleanValue()) | 2716 BooleanValueField::encode(object->BooleanValue()) |
2715 IsUndetectableField::encode(false) | 2717 IsUndetectableField::encode(false) | IsCallableField::encode(false) |
2716 InstanceTypeField::encode(kUnknownInstanceType)) { 2718 InstanceTypeField::encode(kUnknownInstanceType)) {
2717 if (object->IsHeapObject()) { 2719 if (object->IsHeapObject()) {
2718 Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object); 2720 Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object);
2719 Isolate* isolate = heap_object->GetIsolate(); 2721 Isolate* isolate = heap_object->GetIsolate();
2720 Handle<Map> map(heap_object->map(), isolate); 2722 Handle<Map> map(heap_object->map(), isolate);
2721 bit_field_ = IsNotInNewSpaceField::update( 2723 bit_field_ = IsNotInNewSpaceField::update(
2722 bit_field_, !isolate->heap()->InNewSpace(*object)); 2724 bit_field_, !isolate->heap()->InNewSpace(*object));
2723 bit_field_ = InstanceTypeField::update(bit_field_, map->instance_type()); 2725 bit_field_ = InstanceTypeField::update(bit_field_, map->instance_type());
2724 bit_field_ = 2726 bit_field_ =
2725 IsUndetectableField::update(bit_field_, map->is_undetectable()); 2727 IsUndetectableField::update(bit_field_, map->is_undetectable());
2728 bit_field_ = IsCallableField::update(bit_field_, map->is_callable());
2726 if (map->is_stable()) object_map_ = Unique<Map>::CreateImmovable(map); 2729 if (map->is_stable()) object_map_ = Unique<Map>::CreateImmovable(map);
2727 bit_field_ = HasStableMapValueField::update( 2730 bit_field_ = HasStableMapValueField::update(
2728 bit_field_, 2731 bit_field_,
2729 HasMapValue() && Handle<Map>::cast(heap_object)->is_stable()); 2732 HasMapValue() && Handle<Map>::cast(heap_object)->is_stable());
2730 } 2733 }
2731 if (object->IsNumber()) { 2734 if (object->IsNumber()) {
2732 double n = object->Number(); 2735 double n = object->Number();
2733 bool has_int32_value = IsInteger32(n); 2736 bool has_int32_value = IsInteger32(n);
2734 bit_field_ = HasInt32ValueField::update(bit_field_, has_int32_value); 2737 bit_field_ = HasInt32ValueField::update(bit_field_, has_int32_value);
2735 int32_value_ = DoubleToInt32(n); 2738 int32_value_ = DoubleToInt32(n);
(...skipping 1972 matching lines...) Expand 10 before | Expand all | Expand 10 after
4708 case HObjectAccess::kExternalMemory: 4711 case HObjectAccess::kExternalMemory:
4709 os << "[external-memory]"; 4712 os << "[external-memory]";
4710 break; 4713 break;
4711 } 4714 }
4712 4715
4713 return os << "@" << access.offset(); 4716 return os << "@" << access.offset();
4714 } 4717 }
4715 4718
4716 } // namespace internal 4719 } // namespace internal
4717 } // namespace v8 4720 } // namespace v8
OLDNEW
« no previous file with comments | « src/hydrogen-instructions.h ('k') | src/ia32/lithium-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698