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

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

Issue 12300018: Made Isolate a mandatory parameter for everything Handle-related. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed CreateCode calls. Be nicer to MIPS. Created 7 years, 9 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/hydrogen-instructions.h ('k') | src/ia32/assembler-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 // 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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 69
70 70
71 int HValue::LoopWeight() const { 71 int HValue::LoopWeight() const {
72 const int w = FLAG_loop_weight; 72 const int w = FLAG_loop_weight;
73 static const int weights[] = { 1, w, w*w, w*w*w, w*w*w*w }; 73 static const int weights[] = { 1, w, w*w, w*w*w, w*w*w*w };
74 return weights[Min(block()->LoopNestingDepth(), 74 return weights[Min(block()->LoopNestingDepth(),
75 static_cast<int>(ARRAY_SIZE(weights)-1))]; 75 static_cast<int>(ARRAY_SIZE(weights)-1))];
76 } 76 }
77 77
78 78
79 Isolate* HValue::isolate() const {
80 ASSERT(block() != NULL);
81 return block()->graph()->isolate();
82 }
83
84
79 void HValue::AssumeRepresentation(Representation r) { 85 void HValue::AssumeRepresentation(Representation r) {
80 if (CheckFlag(kFlexibleRepresentation)) { 86 if (CheckFlag(kFlexibleRepresentation)) {
81 ChangeRepresentation(r); 87 ChangeRepresentation(r);
82 // The representation of the value is dictated by type feedback and 88 // The representation of the value is dictated by type feedback and
83 // will not be changed later. 89 // will not be changed later.
84 ClearFlag(kFlexibleRepresentation); 90 ClearFlag(kFlexibleRepresentation);
85 } 91 }
86 } 92 }
87 93
88 94
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 case kNonPrimitive: return "non-primitive"; 341 case kNonPrimitive: return "non-primitive";
336 case kJSArray: return "array"; 342 case kJSArray: return "array";
337 case kJSObject: return "object"; 343 case kJSObject: return "object";
338 case kUninitialized: return "uninitialized"; 344 case kUninitialized: return "uninitialized";
339 } 345 }
340 UNREACHABLE(); 346 UNREACHABLE();
341 return "Unreachable code"; 347 return "Unreachable code";
342 } 348 }
343 349
344 350
345 HType HType::TypeFromValue(Handle<Object> value) { 351 HType HType::TypeFromValue(Isolate* isolate, Handle<Object> value) {
346 // Handle dereferencing is safe here: an object's type as checked below 352 // Handle dereferencing is safe here: an object's type as checked below
347 // never changes. 353 // never changes.
348 AllowHandleDereference allow_handle_deref; 354 AllowHandleDereference allow_handle_deref(isolate);
349 355
350 HType result = HType::Tagged(); 356 HType result = HType::Tagged();
351 if (value->IsSmi()) { 357 if (value->IsSmi()) {
352 result = HType::Smi(); 358 result = HType::Smi();
353 } else if (value->IsHeapNumber()) { 359 } else if (value->IsHeapNumber()) {
354 result = HType::HeapNumber(); 360 result = HType::HeapNumber();
355 } else if (value->IsString()) { 361 } else if (value->IsString()) {
356 result = HType::String(); 362 result = HType::String();
357 } else if (value->IsBoolean()) { 363 } else if (value->IsBoolean()) {
358 result = HType::Boolean(); 364 result = HType::Boolean();
(...skipping 933 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 1298
1293 HValue* HCheckInstanceType::Canonicalize() { 1299 HValue* HCheckInstanceType::Canonicalize() {
1294 if (check_ == IS_STRING && 1300 if (check_ == IS_STRING &&
1295 !value()->type().IsUninitialized() && 1301 !value()->type().IsUninitialized() &&
1296 value()->type().IsString()) { 1302 value()->type().IsString()) {
1297 return NULL; 1303 return NULL;
1298 } 1304 }
1299 1305
1300 if (check_ == IS_SYMBOL && value()->IsConstant()) { 1306 if (check_ == IS_SYMBOL && value()->IsConstant()) {
1301 // Dereferencing is safe here: a symbol cannot become a non-symbol. 1307 // Dereferencing is safe here: a symbol cannot become a non-symbol.
1302 AllowHandleDereference allow_handle_deref; 1308 AllowHandleDereference allow_handle_deref(isolate());
1303 if (HConstant::cast(value())->handle()->IsSymbol()) return NULL; 1309 if (HConstant::cast(value())->handle()->IsSymbol()) return NULL;
1304 } 1310 }
1305 return this; 1311 return this;
1306 } 1312 }
1307 1313
1308 1314
1309 void HCheckInstanceType::GetCheckInterval(InstanceType* first, 1315 void HCheckInstanceType::GetCheckInterval(InstanceType* first,
1310 InstanceType* last) { 1316 InstanceType* last) {
1311 ASSERT(is_interval_check()); 1317 ASSERT(is_interval_check());
1312 switch (check_) { 1318 switch (check_) {
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
1798 double roundtrip_value = static_cast<double>(static_cast<int32_t>(value)); 1804 double roundtrip_value = static_cast<double>(static_cast<int32_t>(value));
1799 return BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(value); 1805 return BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(value);
1800 } 1806 }
1801 1807
1802 1808
1803 HConstant::HConstant(Handle<Object> handle, Representation r) 1809 HConstant::HConstant(Handle<Object> handle, Representation r)
1804 : handle_(handle), 1810 : handle_(handle),
1805 has_int32_value_(false), 1811 has_int32_value_(false),
1806 has_double_value_(false) { 1812 has_double_value_(false) {
1807 // Dereferencing here is safe: the value of a number object does not change. 1813 // Dereferencing here is safe: the value of a number object does not change.
1808 AllowHandleDereference allow_handle_deref; 1814 AllowHandleDereference allow_handle_deref(Isolate::Current());
1809 SetFlag(kUseGVN); 1815 SetFlag(kUseGVN);
1810 if (handle_->IsNumber()) { 1816 if (handle_->IsNumber()) {
1811 double n = handle_->Number(); 1817 double n = handle_->Number();
1812 has_int32_value_ = IsInteger32(n); 1818 has_int32_value_ = IsInteger32(n);
1813 int32_value_ = DoubleToInt32(n); 1819 int32_value_ = DoubleToInt32(n);
1814 double_value_ = n; 1820 double_value_ = n;
1815 has_double_value_ = true; 1821 has_double_value_ = true;
1816 } 1822 }
1817 if (r.IsNone()) { 1823 if (r.IsNone()) {
1818 if (has_int32_value_) { 1824 if (has_int32_value_) {
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1879 bool HConstant::ToBoolean() { 1885 bool HConstant::ToBoolean() {
1880 // Converts the constant's boolean value according to 1886 // Converts the constant's boolean value according to
1881 // ECMAScript section 9.2 ToBoolean conversion. 1887 // ECMAScript section 9.2 ToBoolean conversion.
1882 if (HasInteger32Value()) return Integer32Value() != 0; 1888 if (HasInteger32Value()) return Integer32Value() != 0;
1883 if (HasDoubleValue()) { 1889 if (HasDoubleValue()) {
1884 double v = DoubleValue(); 1890 double v = DoubleValue();
1885 return v != 0 && !isnan(v); 1891 return v != 0 && !isnan(v);
1886 } 1892 }
1887 // Dereferencing is safe: singletons do not change and strings are 1893 // Dereferencing is safe: singletons do not change and strings are
1888 // immutable. 1894 // immutable.
1889 AllowHandleDereference allow_handle_deref; 1895 AllowHandleDereference allow_handle_deref(isolate());
1890 if (handle_->IsTrue()) return true; 1896 if (handle_->IsTrue()) return true;
1891 if (handle_->IsFalse()) return false; 1897 if (handle_->IsFalse()) return false;
1892 if (handle_->IsUndefined()) return false; 1898 if (handle_->IsUndefined()) return false;
1893 if (handle_->IsNull()) return false; 1899 if (handle_->IsNull()) return false;
1894 if (handle_->IsString() && String::cast(*handle_)->length() == 0) { 1900 if (handle_->IsString() && String::cast(*handle_)->length() == 0) {
1895 return false; 1901 return false;
1896 } 1902 }
1897 return true; 1903 return true;
1898 } 1904 }
1899 1905
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after
2567 } 2573 }
2568 return result; 2574 return result;
2569 } 2575 }
2570 2576
2571 2577
2572 HType HConstant::CalculateInferredType() { 2578 HType HConstant::CalculateInferredType() {
2573 if (has_int32_value_) { 2579 if (has_int32_value_) {
2574 return Smi::IsValid(int32_value_) ? HType::Smi() : HType::HeapNumber(); 2580 return Smi::IsValid(int32_value_) ? HType::Smi() : HType::HeapNumber();
2575 } 2581 }
2576 if (has_double_value_) return HType::HeapNumber(); 2582 if (has_double_value_) return HType::HeapNumber();
2577 return HType::TypeFromValue(handle_); 2583 return HType::TypeFromValue(isolate(), handle_);
2578 } 2584 }
2579 2585
2580 2586
2581 HType HCompareGeneric::CalculateInferredType() { 2587 HType HCompareGeneric::CalculateInferredType() {
2582 return HType::Boolean(); 2588 return HType::Boolean();
2583 } 2589 }
2584 2590
2585 2591
2586 HType HInstanceOf::CalculateInferredType() { 2592 HType HInstanceOf::CalculateInferredType() {
2587 return HType::Boolean(); 2593 return HType::Boolean();
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
2826 } 2832 }
2827 } 2833 }
2828 return new(zone) HStringAdd(context, left, right); 2834 return new(zone) HStringAdd(context, left, right);
2829 } 2835 }
2830 2836
2831 2837
2832 HInstruction* HStringCharFromCode::New( 2838 HInstruction* HStringCharFromCode::New(
2833 Zone* zone, HValue* context, HValue* char_code) { 2839 Zone* zone, HValue* context, HValue* char_code) {
2834 if (FLAG_fold_constants && char_code->IsConstant()) { 2840 if (FLAG_fold_constants && char_code->IsConstant()) {
2835 HConstant* c_code = HConstant::cast(char_code); 2841 HConstant* c_code = HConstant::cast(char_code);
2842 Isolate* isolate = Isolate::Current();
2836 if (c_code->HasNumberValue()) { 2843 if (c_code->HasNumberValue()) {
2837 if (isfinite(c_code->DoubleValue())) { 2844 if (isfinite(c_code->DoubleValue())) {
2838 uint32_t code = c_code->NumberValueAsInteger32() & 0xffff; 2845 uint32_t code = c_code->NumberValueAsInteger32() & 0xffff;
2839 return new(zone) HConstant(LookupSingleCharacterStringFromCode(code), 2846 return new(zone) HConstant(LookupSingleCharacterStringFromCode(isolate,
2847 code),
2840 Representation::Tagged()); 2848 Representation::Tagged());
2841 } 2849 }
2842 return new(zone) HConstant(FACTORY->empty_string(), 2850 return new(zone) HConstant(isolate->factory()->empty_string(),
2843 Representation::Tagged()); 2851 Representation::Tagged());
2844 } 2852 }
2845 } 2853 }
2846 return new(zone) HStringCharFromCode(context, char_code); 2854 return new(zone) HStringCharFromCode(context, char_code);
2847 } 2855 }
2848 2856
2849 2857
2850 HInstruction* HStringLength::New(Zone* zone, HValue* string) { 2858 HInstruction* HStringLength::New(Zone* zone, HValue* string) {
2851 if (FLAG_fold_constants && string->IsConstant()) { 2859 if (FLAG_fold_constants && string->IsConstant()) {
2852 HConstant* c_string = HConstant::cast(string); 2860 HConstant* c_string = HConstant::cast(string);
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
3248 3256
3249 3257
3250 void HCheckFunction::Verify() { 3258 void HCheckFunction::Verify() {
3251 HInstruction::Verify(); 3259 HInstruction::Verify();
3252 ASSERT(HasNoUses()); 3260 ASSERT(HasNoUses());
3253 } 3261 }
3254 3262
3255 #endif 3263 #endif
3256 3264
3257 } } // namespace v8::internal 3265 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen-instructions.h ('k') | src/ia32/assembler-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698