| 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 "platform/assert.h" | 7 #include "platform/assert.h" |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/bigint_operations.h" | 9 #include "vm/bigint_operations.h" |
| 10 #include "vm/bootstrap.h" | 10 #include "vm/bootstrap.h" |
| (...skipping 7172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7183 const Array& data = Array::Handle(ic_data()); | 7183 const Array& data = Array::Handle(ic_data()); |
| 7184 intptr_t data_pos = index * TestEntryLength(); | 7184 intptr_t data_pos = index * TestEntryLength(); |
| 7185 Smi& smi = Smi::Handle(); | 7185 Smi& smi = Smi::Handle(); |
| 7186 smi ^= data.At(data_pos); | 7186 smi ^= data.At(data_pos); |
| 7187 *class_id = smi.Value(); | 7187 *class_id = smi.Value(); |
| 7188 *target ^= data.At(data_pos + 1); | 7188 *target ^= data.At(data_pos + 1); |
| 7189 } | 7189 } |
| 7190 | 7190 |
| 7191 | 7191 |
| 7192 intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const { | 7192 intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const { |
| 7193 ASSERT(index < NumberOfChecks()); |
| 7193 const Array& data = Array::Handle(ic_data()); | 7194 const Array& data = Array::Handle(ic_data()); |
| 7194 const intptr_t data_pos = index * TestEntryLength(); | 7195 const intptr_t data_pos = index * TestEntryLength(); |
| 7195 Smi& smi = Smi::Handle(); | 7196 Smi& smi = Smi::Handle(); |
| 7196 smi ^= data.At(data_pos); | 7197 smi ^= data.At(data_pos); |
| 7197 return smi.Value(); | 7198 return smi.Value(); |
| 7198 } | 7199 } |
| 7199 | 7200 |
| 7200 | 7201 |
| 7201 RawFunction* ICData::GetTargetAt(intptr_t index) const { | 7202 RawFunction* ICData::GetTargetAt(intptr_t index) const { |
| 7202 const Array& data = Array::Handle(ic_data()); | 7203 const Array& data = Array::Handle(ic_data()); |
| 7203 const intptr_t data_pos = index * TestEntryLength() + num_args_tested(); | 7204 const intptr_t data_pos = index * TestEntryLength() + num_args_tested(); |
| 7204 Function& target = Function::Handle(); | 7205 Function& target = Function::Handle(); |
| 7205 target ^= data.At(data_pos); | 7206 target ^= data.At(data_pos); |
| 7206 return target.raw(); | 7207 return target.raw(); |
| 7207 } | 7208 } |
| 7208 | 7209 |
| 7209 | 7210 |
| 7210 RawFunction* ICData::GetTargetForReceiverClassId(intptr_t class_id) const { | 7211 RawFunction* ICData::GetTargetForReceiverClassId(intptr_t class_id) const { |
| 7211 for (intptr_t i = 0; i < NumberOfChecks(); i++) { | 7212 for (intptr_t i = 0; i < NumberOfChecks(); i++) { |
| 7212 if (GetReceiverClassIdAt(i) == class_id) { | 7213 if (GetReceiverClassIdAt(i) == class_id) { |
| 7213 return GetTargetAt(i); | 7214 return GetTargetAt(i); |
| 7214 } | 7215 } |
| 7215 } | 7216 } |
| 7216 return Function::null(); | 7217 return Function::null(); |
| 7217 } | 7218 } |
| 7218 | 7219 |
| 7219 | 7220 |
| 7221 RawICData* ICData::AsUnaryClassChecks() const { |
| 7222 ASSERT(!IsNull()); |
| 7223 ASSERT(num_args_tested() > 0); |
| 7224 if (num_args_tested() == 1) return raw(); |
| 7225 const intptr_t kNumArgsTested = 1; |
| 7226 ICData& result = ICData::Handle(ICData::New( |
| 7227 Function::Handle(function()), |
| 7228 String::Handle(target_name()), |
| 7229 id(), |
| 7230 kNumArgsTested)); |
| 7231 for (intptr_t i = 0; i < NumberOfChecks(); i++) { |
| 7232 const intptr_t class_id = GetReceiverClassIdAt(i); |
| 7233 intptr_t duplicate_class_id = -1; |
| 7234 for (intptr_t k = 0; k < result.NumberOfChecks(); k++) { |
| 7235 if (class_id == result.GetReceiverClassIdAt(k)) { |
| 7236 duplicate_class_id = k; |
| 7237 break; |
| 7238 } |
| 7239 } |
| 7240 if (duplicate_class_id >= 0) { |
| 7241 ASSERT(result.GetTargetAt(duplicate_class_id) == GetTargetAt(i)); |
| 7242 } else { |
| 7243 // This will make sure that Smi is first if it exists. |
| 7244 result.AddReceiverCheck(class_id, |
| 7245 Function::Handle(GetTargetAt(i))); |
| 7246 } |
| 7247 } |
| 7248 return result.raw(); |
| 7249 } |
| 7250 |
| 7251 |
| 7220 RawICData* ICData::New(const Function& function, | 7252 RawICData* ICData::New(const Function& function, |
| 7221 const String& target_name, | 7253 const String& target_name, |
| 7222 intptr_t id, | 7254 intptr_t id, |
| 7223 intptr_t num_args_tested) { | 7255 intptr_t num_args_tested) { |
| 7224 ASSERT(num_args_tested > 0); | 7256 ASSERT(num_args_tested > 0); |
| 7225 const Class& cls = Class::Handle(Object::icdata_class()); | 7257 const Class& cls = Class::Handle(Object::icdata_class()); |
| 7226 ASSERT(!cls.IsNull()); | 7258 ASSERT(!cls.IsNull()); |
| 7227 ICData& result = ICData::Handle(); | 7259 ICData& result = ICData::Handle(); |
| 7228 { | 7260 { |
| 7229 // IC data objects are long living objects, allocate them in old generation. | 7261 // IC data objects are long living objects, allocate them in old generation. |
| (...skipping 3481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10711 const String& str = String::Handle(pattern()); | 10743 const String& str = String::Handle(pattern()); |
| 10712 const char* format = "JSRegExp: pattern=%s flags=%s"; | 10744 const char* format = "JSRegExp: pattern=%s flags=%s"; |
| 10713 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); | 10745 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); |
| 10714 char* chars = reinterpret_cast<char*>( | 10746 char* chars = reinterpret_cast<char*>( |
| 10715 Isolate::Current()->current_zone()->Allocate(len + 1)); | 10747 Isolate::Current()->current_zone()->Allocate(len + 1)); |
| 10716 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); | 10748 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); |
| 10717 return chars; | 10749 return chars; |
| 10718 } | 10750 } |
| 10719 | 10751 |
| 10720 } // namespace dart | 10752 } // namespace dart |
| OLD | NEW |