Chromium Code Reviews| 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 13078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13089 } | 13089 } |
| 13090 | 13090 |
| 13091 | 13091 |
| 13092 RawObject* Instance::Evaluate(const String& expr, | 13092 RawObject* Instance::Evaluate(const String& expr, |
| 13093 const Array& param_names, | 13093 const Array& param_names, |
| 13094 const Array& param_values) const { | 13094 const Array& param_values) const { |
| 13095 const Class& cls = Class::Handle(clazz()); | 13095 const Class& cls = Class::Handle(clazz()); |
| 13096 const Function& eval_func = | 13096 const Function& eval_func = |
| 13097 Function::Handle(EvaluateHelper(cls, expr, param_names, false)); | 13097 Function::Handle(EvaluateHelper(cls, expr, param_names, false)); |
| 13098 const Array& args = Array::Handle(Array::New(1 + param_values.Length())); | 13098 const Array& args = Array::Handle(Array::New(1 + param_values.Length())); |
| 13099 Object& param = Object::Handle(); | 13099 PassiveObject& param = PassiveObject::Handle(); |
| 13100 args.SetAt(0, *this); | 13100 args.SetAt(0, *this); |
| 13101 for (intptr_t i = 0; i < param_values.Length(); i++) { | 13101 for (intptr_t i = 0; i < param_values.Length(); i++) { |
| 13102 param = param_values.At(i); | 13102 param = param_values.At(i); |
| 13103 args.SetAt(i + 1, param); | 13103 args.SetAt(i + 1, param); |
| 13104 } | 13104 } |
| 13105 const Object& result = | 13105 const PassiveObject& result = |
| 13106 Object::Handle(DartEntry::InvokeFunction(eval_func, args)); | 13106 PassiveObject::Handle(DartEntry::InvokeFunction(eval_func, args)); |
| 13107 return result.raw(); | 13107 return result.raw(); |
| 13108 } | 13108 } |
| 13109 | 13109 |
| 13110 | 13110 |
| 13111 RawObject* Instance::HashCode() const { | 13111 RawObject* Instance::HashCode() const { |
| 13112 // TODO(koda): Optimize for all builtin classes and all classes | 13112 // TODO(koda): Optimize for all builtin classes and all classes |
| 13113 // that do not override hashCode. | 13113 // that do not override hashCode. |
| 13114 return DartLibraryCalls::HashCode(*this); | 13114 return DartLibraryCalls::HashCode(*this); |
| 13115 } | 13115 } |
| 13116 | 13116 |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13328 other_type_arguments = other.arguments(); | 13328 other_type_arguments = other.arguments(); |
| 13329 } | 13329 } |
| 13330 return cls.IsSubtypeOf(type_arguments, other_class, other_type_arguments, | 13330 return cls.IsSubtypeOf(type_arguments, other_class, other_type_arguments, |
| 13331 bound_error); | 13331 bound_error); |
| 13332 } | 13332 } |
| 13333 | 13333 |
| 13334 | 13334 |
| 13335 bool Instance::OperatorEquals(const Instance& other) const { | 13335 bool Instance::OperatorEquals(const Instance& other) const { |
| 13336 // TODO(koda): Optimize for all builtin classes and all classes | 13336 // TODO(koda): Optimize for all builtin classes and all classes |
| 13337 // that do not override operator==. | 13337 // that do not override operator==. |
| 13338 const Object& result = | 13338 const PassiveObject& result = |
| 13339 Object::Handle(DartLibraryCalls::Equals(*this, other)); | 13339 PassiveObject::Handle(DartLibraryCalls::Equals(*this, other)); |
| 13340 return result.raw() == Object::bool_true().raw(); | 13340 return result.raw() == Object::bool_true().raw(); |
|
Ivan Posva
2014/08/28 19:31:53
I don't think we need to wrap it in a handle to co
siva
2014/08/29 00:17:01
Done.
| |
| 13341 } | 13341 } |
| 13342 | 13342 |
| 13343 | 13343 |
| 13344 bool Instance::IsIdenticalTo(const Instance& other) const { | 13344 bool Instance::IsIdenticalTo(const Instance& other) const { |
| 13345 if (raw() == other.raw()) return true; | 13345 if (raw() == other.raw()) return true; |
| 13346 if (IsInteger() && other.IsInteger()) { | 13346 if (IsInteger() && other.IsInteger()) { |
| 13347 return Integer::Cast(*this).Equals(other); | 13347 return Integer::Cast(*this).Equals(other); |
| 13348 } | 13348 } |
| 13349 if (IsDouble() && other.IsDouble()) { | 13349 if (IsDouble() && other.IsDouble()) { |
| 13350 return Double::Cast(*this).CanonicalizeEquals(other); | 13350 return Double::Cast(*this).CanonicalizeEquals(other); |
| (...skipping 4755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 18106 JSONObject jselement(&jsarr); | 18106 JSONObject jselement(&jsarr); |
| 18107 jselement.AddProperty("index", index); | 18107 jselement.AddProperty("index", index); |
| 18108 | 18108 |
| 18109 Object& element = Object::Handle(At(index)); | 18109 Object& element = Object::Handle(At(index)); |
| 18110 jselement.AddProperty("value", element); | 18110 jselement.AddProperty("value", element); |
| 18111 } | 18111 } |
| 18112 } | 18112 } |
| 18113 } | 18113 } |
| 18114 | 18114 |
| 18115 | 18115 |
| 18116 RawArray* Array::Grow(const Array& source, | 18116 RawArray* Array::Grow(const Array& source, |
|
Ivan Posva
2014/08/28 19:31:53
Should we be requiring the isolate be passed into
siva
2014/08/29 00:17:01
I added a local variable isolate and used that in
| |
| 18117 intptr_t new_length, | 18117 intptr_t new_length, |
| 18118 Heap::Space space) { | 18118 Heap::Space space) { |
| 18119 const Array& result = Array::Handle(Array::New(new_length, space)); | 18119 const Array& result = Array::Handle(Array::New(new_length, space)); |
| 18120 intptr_t len = 0; | 18120 intptr_t len = 0; |
| 18121 if (!source.IsNull()) { | 18121 if (!source.IsNull()) { |
| 18122 len = source.Length(); | 18122 len = source.Length(); |
| 18123 result.SetTypeArguments(TypeArguments::Handle(source.GetTypeArguments())); | 18123 result.SetTypeArguments(TypeArguments::Handle(source.GetTypeArguments())); |
| 18124 } | 18124 } |
| 18125 ASSERT(new_length >= len); // Cannot copy 'source' into new array. | 18125 ASSERT(new_length >= len); // Cannot copy 'source' into new array. |
| 18126 ASSERT(new_length != len); // Unnecessary copying of array. | 18126 ASSERT(new_length != len); // Unnecessary copying of array. |
| 18127 Object& obj = Object::Handle(); | 18127 PassiveObject& obj = PassiveObject::Handle(); |
| 18128 for (int i = 0; i < len; i++) { | 18128 for (int i = 0; i < len; i++) { |
| 18129 obj = source.At(i); | 18129 obj = source.At(i); |
| 18130 result.SetAt(i, obj); | 18130 result.SetAt(i, obj); |
| 18131 } | 18131 } |
| 18132 return result.raw(); | 18132 return result.raw(); |
| 18133 } | 18133 } |
| 18134 | 18134 |
| 18135 | 18135 |
| 18136 RawArray* Array::MakeArray(const GrowableObjectArray& growable_array) { | 18136 RawArray* Array::MakeArray(const GrowableObjectArray& growable_array) { |
| 18137 ASSERT(!growable_array.IsNull()); | 18137 ASSERT(!growable_array.IsNull()); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 18237 Array::Handle(Array::Grow(contents, new_capacity, space)); | 18237 Array::Handle(Array::Grow(contents, new_capacity, space)); |
| 18238 StorePointer(&(raw_ptr()->data_), new_contents.raw()); | 18238 StorePointer(&(raw_ptr()->data_), new_contents.raw()); |
| 18239 } | 18239 } |
| 18240 | 18240 |
| 18241 | 18241 |
| 18242 RawObject* GrowableObjectArray::RemoveLast() const { | 18242 RawObject* GrowableObjectArray::RemoveLast() const { |
| 18243 ASSERT(!IsNull()); | 18243 ASSERT(!IsNull()); |
| 18244 ASSERT(Length() > 0); | 18244 ASSERT(Length() > 0); |
| 18245 intptr_t index = Length() - 1; | 18245 intptr_t index = Length() - 1; |
| 18246 const Array& contents = Array::Handle(data()); | 18246 const Array& contents = Array::Handle(data()); |
| 18247 const Object& obj = Object::Handle(contents.At(index)); | 18247 const PassiveObject& obj = PassiveObject::Handle(contents.At(index)); |
| 18248 contents.SetAt(index, Object::null_object()); | 18248 contents.SetAt(index, Object::null_object()); |
| 18249 SetLength(index); | 18249 SetLength(index); |
| 18250 return obj.raw(); | 18250 return obj.raw(); |
| 18251 } | 18251 } |
| 18252 | 18252 |
| 18253 | 18253 |
| 18254 bool GrowableObjectArray::CanonicalizeEquals(const Instance& other) const { | 18254 bool GrowableObjectArray::CanonicalizeEquals(const Instance& other) const { |
| 18255 // If both handles point to the same raw instance they are equal. | 18255 // If both handles point to the same raw instance they are equal. |
| 18256 if (this->raw() == other.raw()) { | 18256 if (this->raw() == other.raw()) { |
| 18257 return true; | 18257 return true; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 18399 if (!map.UpdateOrInsert(key, value)) { | 18399 if (!map.UpdateOrInsert(key, value)) { |
| 18400 SetModified(); | 18400 SetModified(); |
| 18401 } | 18401 } |
| 18402 StorePointer(&raw_ptr()->data_, map.Release().raw()); | 18402 StorePointer(&raw_ptr()->data_, map.Release().raw()); |
| 18403 } | 18403 } |
| 18404 | 18404 |
| 18405 | 18405 |
| 18406 RawObject* LinkedHashMap::LookUp(const Object& key) const { | 18406 RawObject* LinkedHashMap::LookUp(const Object& key) const { |
| 18407 ASSERT(!IsNull()); | 18407 ASSERT(!IsNull()); |
| 18408 EnumIndexDefaultMap map(data()); | 18408 EnumIndexDefaultMap map(data()); |
| 18409 const Object& result = Object::Handle(map.GetOrNull(key)); | 18409 const PassiveObject& result = PassiveObject::Handle(map.GetOrNull(key)); |
| 18410 ASSERT(map.Release().raw() == data()); | 18410 ASSERT(map.Release().raw() == data()); |
|
Ivan Posva
2014/08/28 19:31:53
You could stick the ASSERT in a NoGCScope and then
siva
2014/08/29 00:17:01
Done.
| |
| 18411 return result.raw(); | 18411 return result.raw(); |
| 18412 } | 18412 } |
| 18413 | 18413 |
| 18414 | 18414 |
| 18415 bool LinkedHashMap::Contains(const Object& key) const { | 18415 bool LinkedHashMap::Contains(const Object& key) const { |
| 18416 ASSERT(!IsNull()); | 18416 ASSERT(!IsNull()); |
| 18417 EnumIndexDefaultMap map(data()); | 18417 EnumIndexDefaultMap map(data()); |
| 18418 bool result = map.ContainsKey(key); | 18418 bool result = map.ContainsKey(key); |
| 18419 ASSERT(map.Release().raw() == data()); | 18419 ASSERT(map.Release().raw() == data()); |
| 18420 return result; | 18420 return result; |
| 18421 } | 18421 } |
| 18422 | 18422 |
| 18423 | 18423 |
| 18424 RawObject* LinkedHashMap::Remove(const Object& key) const { | 18424 RawObject* LinkedHashMap::Remove(const Object& key) const { |
| 18425 ASSERT(!IsNull()); | 18425 ASSERT(!IsNull()); |
| 18426 EnumIndexDefaultMap map(data()); | 18426 EnumIndexDefaultMap map(data()); |
| 18427 // TODO(koda): Make 'Remove' also return the old value. | 18427 // TODO(koda): Make 'Remove' also return the old value. |
| 18428 const Object& result = Object::Handle(map.GetOrNull(key)); | 18428 const PassiveObject& result = PassiveObject::Handle(map.GetOrNull(key)); |
| 18429 if (map.Remove(key)) { | 18429 if (map.Remove(key)) { |
| 18430 SetModified(); | 18430 SetModified(); |
| 18431 } | 18431 } |
| 18432 StorePointer(&raw_ptr()->data_, map.Release().raw()); | 18432 StorePointer(&raw_ptr()->data_, map.Release().raw()); |
| 18433 return result.raw(); | 18433 return result.raw(); |
| 18434 } | 18434 } |
| 18435 | 18435 |
| 18436 | 18436 |
| 18437 void LinkedHashMap::Clear() const { | 18437 void LinkedHashMap::Clear() const { |
| 18438 ASSERT(!IsNull()); | 18438 ASSERT(!IsNull()); |
| (...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 19079 } | 19079 } |
| 19080 result.set_code_array(code_array); | 19080 result.set_code_array(code_array); |
| 19081 result.set_pc_offset_array(pc_offset_array); | 19081 result.set_pc_offset_array(pc_offset_array); |
| 19082 result.SetCatchStacktrace(Object::empty_array(), | 19082 result.SetCatchStacktrace(Object::empty_array(), |
| 19083 Object::empty_array()); | 19083 Object::empty_array()); |
| 19084 result.set_expand_inlined(true); // default. | 19084 result.set_expand_inlined(true); // default. |
| 19085 return result.raw(); | 19085 return result.raw(); |
| 19086 } | 19086 } |
| 19087 | 19087 |
| 19088 | 19088 |
| 19089 void Stacktrace::Append(const Array& code_list, | 19089 void Stacktrace::Append(const Array& code_list, |
|
Ivan Posva
2014/08/28 19:31:53
Pass in isolate over here?
siva
2014/08/29 00:17:01
I added a local variable isolate and used that in
| |
| 19090 const Array& pc_offset_list, | 19090 const Array& pc_offset_list, |
| 19091 const intptr_t start_index) const { | 19091 const intptr_t start_index) const { |
| 19092 ASSERT(start_index <= code_list.Length()); | 19092 ASSERT(start_index <= code_list.Length()); |
| 19093 ASSERT(pc_offset_list.Length() == code_list.Length()); | 19093 ASSERT(pc_offset_list.Length() == code_list.Length()); |
| 19094 intptr_t old_length = Length(); | 19094 intptr_t old_length = Length(); |
| 19095 intptr_t new_length = old_length + pc_offset_list.Length() - start_index; | 19095 intptr_t new_length = old_length + pc_offset_list.Length() - start_index; |
| 19096 if (new_length == old_length) { | 19096 if (new_length == old_length) { |
| 19097 // Nothing to append. Avoid work and an assert that growing arrays always | 19097 // Nothing to append. Avoid work and an assert that growing arrays always |
| 19098 // increases their size. | 19098 // increases their size. |
| 19099 return; | 19099 return; |
| 19100 } | 19100 } |
| 19101 | 19101 |
| 19102 // Grow the arrays for code, pc_offset pairs to accommodate the new stack | 19102 // Grow the arrays for code, pc_offset pairs to accommodate the new stack |
| 19103 // frames. | 19103 // frames. |
| 19104 Array& code_array = Array::Handle(raw_ptr()->code_array_); | 19104 Array& code_array = Array::Handle(raw_ptr()->code_array_); |
| 19105 Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_); | 19105 Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_); |
| 19106 code_array = Array::Grow(code_array, new_length); | 19106 code_array = Array::Grow(code_array, new_length); |
| 19107 pc_offset_array = Array::Grow(pc_offset_array, new_length); | 19107 pc_offset_array = Array::Grow(pc_offset_array, new_length); |
| 19108 set_code_array(code_array); | 19108 set_code_array(code_array); |
| 19109 set_pc_offset_array(pc_offset_array); | 19109 set_pc_offset_array(pc_offset_array); |
| 19110 // Now append the new function and code list to the existing arrays. | 19110 // Now append the new function and code list to the existing arrays. |
| 19111 intptr_t j = start_index; | 19111 intptr_t j = start_index; |
| 19112 Object& obj = Object::Handle(); | 19112 PassiveObject& obj = PassiveObject::Handle(); |
| 19113 for (intptr_t i = old_length; i < new_length; i++, j++) { | 19113 for (intptr_t i = old_length; i < new_length; i++, j++) { |
| 19114 obj = code_list.At(j); | 19114 obj = code_list.At(j); |
| 19115 code_array.SetAt(i, obj); | 19115 code_array.SetAt(i, obj); |
| 19116 obj = pc_offset_list.At(j); | 19116 obj = pc_offset_list.At(j); |
| 19117 pc_offset_array.SetAt(i, obj); | 19117 pc_offset_array.SetAt(i, obj); |
| 19118 } | 19118 } |
| 19119 } | 19119 } |
| 19120 | 19120 |
| 19121 | 19121 |
| 19122 void Stacktrace::SetCatchStacktrace(const Array& code_array, | 19122 void Stacktrace::SetCatchStacktrace(const Array& code_array, |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 19575 return tag_label.ToCString(); | 19575 return tag_label.ToCString(); |
| 19576 } | 19576 } |
| 19577 | 19577 |
| 19578 | 19578 |
| 19579 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 19579 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 19580 Instance::PrintJSONImpl(stream, ref); | 19580 Instance::PrintJSONImpl(stream, ref); |
| 19581 } | 19581 } |
| 19582 | 19582 |
| 19583 | 19583 |
| 19584 } // namespace dart | 19584 } // namespace dart |
| OLD | NEW |