OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/object.h" | 5 #include "vm/object.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
43 | 43 |
44 DEFINE_FLAG(bool, show_internal_names, false, | 44 DEFINE_FLAG(bool, show_internal_names, false, |
45 "Show names of internal classes (e.g. \"OneByteString\") in error messages " | 45 "Show names of internal classes (e.g. \"OneByteString\") in error messages " |
46 "instead of showing the corresponding interface names (e.g. \"String\")"); | 46 "instead of showing the corresponding interface names (e.g. \"String\")"); |
47 DEFINE_FLAG(bool, trace_disabling_optimized_code, false, | 47 DEFINE_FLAG(bool, trace_disabling_optimized_code, false, |
48 "Trace disabling optimized code."); | 48 "Trace disabling optimized code."); |
49 DEFINE_FLAG(int, huge_method_cutoff_in_tokens, 20000, | 49 DEFINE_FLAG(int, huge_method_cutoff_in_tokens, 20000, |
50 "Huge method cutoff in tokens: Disables optimizations for huge methods."); | 50 "Huge method cutoff in tokens: Disables optimizations for huge methods."); |
51 DEFINE_FLAG(int, huge_method_cutoff_in_code_size, 200000, | 51 DEFINE_FLAG(int, huge_method_cutoff_in_code_size, 200000, |
52 "Huge method cutoff in unoptimized code size (in bytes)."); | 52 "Huge method cutoff in unoptimized code size (in bytes)."); |
53 DEFINE_FLAG(bool, report_incorrect_const_objects, true, | |
hausner
2013/06/11 23:29:24
Why do we need the flag?
srdjan
2013/06/12 00:22:22
Removing. It is easy to disable the error reportin
| |
54 "Report if a const object has incorrect fields."); | |
53 DEFINE_FLAG(bool, throw_on_javascript_int_overflow, false, | 55 DEFINE_FLAG(bool, throw_on_javascript_int_overflow, false, |
54 "Throw an exception when integer arithmetic exceeds 53 bits."); | 56 "Throw an exception when integer arithmetic exceeds 53 bits."); |
55 DECLARE_FLAG(bool, trace_compiler); | 57 DECLARE_FLAG(bool, trace_compiler); |
56 DECLARE_FLAG(bool, eliminate_type_checks); | 58 DECLARE_FLAG(bool, eliminate_type_checks); |
57 DECLARE_FLAG(bool, enable_type_checks); | 59 DECLARE_FLAG(bool, enable_type_checks); |
58 DECLARE_FLAG(int, deoptimization_counter_threshold); | 60 DECLARE_FLAG(int, deoptimization_counter_threshold); |
59 | 61 |
60 static const char* kGetterPrefix = "get:"; | 62 static const char* kGetterPrefix = "get:"; |
61 static const intptr_t kGetterPrefixLength = strlen(kGetterPrefix); | 63 static const intptr_t kGetterPrefixLength = strlen(kGetterPrefix); |
62 static const char* kSetterPrefix = "set:"; | 64 static const char* kSetterPrefix = "set:"; |
(...skipping 9024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9087 if ((*reinterpret_cast<RawObject**>(this_addr + offset)) != | 9089 if ((*reinterpret_cast<RawObject**>(this_addr + offset)) != |
9088 (*reinterpret_cast<RawObject**>(other_addr + offset))) { | 9090 (*reinterpret_cast<RawObject**>(other_addr + offset))) { |
9089 return false; | 9091 return false; |
9090 } | 9092 } |
9091 } | 9093 } |
9092 } | 9094 } |
9093 return true; | 9095 return true; |
9094 } | 9096 } |
9095 | 9097 |
9096 | 9098 |
9097 RawInstance* Instance::Canonicalize() const { | 9099 RawInstance* Instance::CheckAndCanonicalize(const char** error_str) const { |
9098 ASSERT(!IsNull()); | 9100 ASSERT(!IsNull()); |
9099 if (this->IsCanonical()) { | 9101 if (this->IsCanonical()) { |
9100 return this->raw(); | 9102 return this->raw(); |
9101 } | 9103 } |
9102 Instance& result = Instance::Handle(); | 9104 Instance& result = Instance::Handle(); |
9103 const Class& cls = Class::Handle(this->clazz()); | 9105 const Class& cls = Class::Handle(this->clazz()); |
9106 if (cls.id() >= kNumPredefinedCids) { | |
hausner
2013/06/11 23:29:24
As discussed offline, this excludes arrays.
srdjan
2013/06/12 00:22:22
Added arrays.
| |
9107 // Iterate over all fields, canonicalize numbers and strings, expect all | |
9108 // other instances to be canonical otherwise report error (return | |
9109 // Instance::null()). | |
9110 Object& obj = Object::Handle(); | |
9111 const intptr_t end_field_offset = cls.instance_size() - kWordSize; | |
9112 for (intptr_t field_offset = 0; | |
9113 field_offset <= end_field_offset; | |
9114 field_offset += kWordSize) { | |
9115 obj = *this->FieldAddrAtOffset(field_offset); | |
9116 if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) { | |
9117 if (obj.IsNumber() || obj.IsString()) { | |
9118 obj = Instance::Cast(obj).CheckAndCanonicalize(NULL); | |
9119 ASSERT(!obj.IsNull()); | |
9120 this->SetFieldAtOffset(field_offset, obj); | |
9121 } else { | |
9122 if (FLAG_report_incorrect_const_objects) { | |
9123 ASSERT(error_str != NULL); | |
9124 const char* kFormat = "field: %s\n"; | |
9125 const intptr_t len = | |
9126 OS::SNPrint(NULL, 0, kFormat, obj.ToCString()) + 1; | |
9127 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | |
9128 OS::SNPrint(chars, len, kFormat, obj.ToCString()); | |
9129 *error_str = chars; | |
9130 return Instance::null(); | |
9131 } | |
9132 } | |
9133 } | |
9134 } | |
9135 } | |
9104 Array& constants = Array::Handle(cls.constants()); | 9136 Array& constants = Array::Handle(cls.constants()); |
9105 const intptr_t constants_len = constants.Length(); | 9137 const intptr_t constants_len = constants.Length(); |
9106 // Linear search to see whether this value is already present in the | 9138 // Linear search to see whether this value is already present in the |
9107 // list of canonicalized constants. | 9139 // list of canonicalized constants. |
9108 intptr_t index = 0; | 9140 intptr_t index = 0; |
9109 while (index < constants_len) { | 9141 while (index < constants_len) { |
9110 result ^= constants.At(index); | 9142 result ^= constants.At(index); |
9111 if (result.IsNull()) { | 9143 if (result.IsNull()) { |
9112 break; | 9144 break; |
9113 } | 9145 } |
(...skipping 2327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11441 intptr_t slen = other.Length(); | 11473 intptr_t slen = other.Length(); |
11442 for (int i = 0; i < slen; i++) { | 11474 for (int i = 0; i < slen; i++) { |
11443 if (this->CharAt(i) != other.CharAt(i)) { | 11475 if (this->CharAt(i) != other.CharAt(i)) { |
11444 return false; | 11476 return false; |
11445 } | 11477 } |
11446 } | 11478 } |
11447 return true; | 11479 return true; |
11448 } | 11480 } |
11449 | 11481 |
11450 | 11482 |
11451 RawInstance* String::Canonicalize() const { | 11483 RawInstance* String::CheckAndCanonicalize(const char** error_str) const { |
11452 if (IsCanonical()) { | 11484 if (IsCanonical()) { |
11453 return this->raw(); | 11485 return this->raw(); |
11454 } | 11486 } |
11455 return Symbols::New(*this); | 11487 return Symbols::New(*this); |
11456 } | 11488 } |
11457 | 11489 |
11458 | 11490 |
11459 RawString* String::New(const char* cstr, Heap::Space space) { | 11491 RawString* String::New(const char* cstr, Heap::Space space) { |
11460 ASSERT(cstr != NULL); | 11492 ASSERT(cstr != NULL); |
11461 intptr_t array_len = strlen(cstr); | 11493 intptr_t array_len = strlen(cstr); |
(...skipping 1940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13402 space); | 13434 space); |
13403 return reinterpret_cast<RawWeakProperty*>(raw); | 13435 return reinterpret_cast<RawWeakProperty*>(raw); |
13404 } | 13436 } |
13405 | 13437 |
13406 | 13438 |
13407 const char* WeakProperty::ToCString() const { | 13439 const char* WeakProperty::ToCString() const { |
13408 return "_WeakProperty"; | 13440 return "_WeakProperty"; |
13409 } | 13441 } |
13410 | 13442 |
13411 } // namespace dart | 13443 } // namespace dart |
OLD | NEW |