| 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 3056 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3067 const intptr_t num_old_fields = arr.Length(); | 3067 const intptr_t num_old_fields = arr.Length(); |
| 3068 const Array& new_arr = Array::Handle( | 3068 const Array& new_arr = Array::Handle( |
| 3069 Array::Grow(arr, num_old_fields + num_new_fields, Heap::kOld)); | 3069 Array::Grow(arr, num_old_fields + num_new_fields, Heap::kOld)); |
| 3070 for (intptr_t i = 0; i < num_new_fields; i++) { | 3070 for (intptr_t i = 0; i < num_new_fields; i++) { |
| 3071 new_arr.SetAt(i + num_old_fields, *new_fields.At(i)); | 3071 new_arr.SetAt(i + num_old_fields, *new_fields.At(i)); |
| 3072 } | 3072 } |
| 3073 SetFields(new_arr); | 3073 SetFields(new_arr); |
| 3074 } | 3074 } |
| 3075 | 3075 |
| 3076 | 3076 |
| 3077 intptr_t Class::FindFieldIndex(const Field& needle) const { | |
| 3078 Thread* thread = Thread::Current(); | |
| 3079 if (EnsureIsFinalized(thread) != Error::null()) { | |
| 3080 return -1; | |
| 3081 } | |
| 3082 REUSABLE_ARRAY_HANDLESCOPE(thread); | |
| 3083 REUSABLE_FIELD_HANDLESCOPE(thread); | |
| 3084 REUSABLE_STRING_HANDLESCOPE(thread); | |
| 3085 Array& fields_array = thread->ArrayHandle(); | |
| 3086 Field& field = thread->FieldHandle(); | |
| 3087 String& field_name = thread->StringHandle(); | |
| 3088 fields_array ^= fields(); | |
| 3089 ASSERT(!fields_array.IsNull()); | |
| 3090 String& needle_name = String::Handle(thread->zone()); | |
| 3091 needle_name ^= needle.name(); | |
| 3092 const intptr_t len = fields_array.Length(); | |
| 3093 for (intptr_t i = 0; i < len; i++) { | |
| 3094 field ^= fields_array.At(i); | |
| 3095 field_name ^= field.name(); | |
| 3096 if (field_name.Equals(needle_name)) { | |
| 3097 return i; | |
| 3098 } | |
| 3099 } | |
| 3100 // No field found. | |
| 3101 return -1; | |
| 3102 } | |
| 3103 | |
| 3104 | |
| 3105 RawField* Class::FieldFromIndex(intptr_t idx) const { | |
| 3106 const Array& flds = Array::Handle(fields()); | |
| 3107 if ((idx < 0) || (idx >= flds.Length())) { | |
| 3108 return Field::null(); | |
| 3109 } | |
| 3110 Field& field = Field::Handle(); | |
| 3111 field ^= flds.At(idx); | |
| 3112 ASSERT(!field.IsNull()); | |
| 3113 return field.raw(); | |
| 3114 } | |
| 3115 | |
| 3116 | |
| 3117 template <class FakeInstance> | 3077 template <class FakeInstance> |
| 3118 RawClass* Class::New(intptr_t index) { | 3078 RawClass* Class::New(intptr_t index) { |
| 3119 ASSERT(Object::class_class() != Class::null()); | 3079 ASSERT(Object::class_class() != Class::null()); |
| 3120 Class& result = Class::Handle(); | 3080 Class& result = Class::Handle(); |
| 3121 { | 3081 { |
| 3122 RawObject* raw = Object::Allocate(Class::kClassId, | 3082 RawObject* raw = Object::Allocate(Class::kClassId, |
| 3123 Class::InstanceSize(), | 3083 Class::InstanceSize(), |
| 3124 Heap::kOld); | 3084 Heap::kOld); |
| 3125 NoSafepointScope no_safepoint; | 3085 NoSafepointScope no_safepoint; |
| 3126 result ^= raw; | 3086 result ^= raw; |
| (...skipping 4427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7554 const char* kF0 = is_static() ? " static" : ""; | 7514 const char* kF0 = is_static() ? " static" : ""; |
| 7555 const char* kF1 = is_final() ? " final" : ""; | 7515 const char* kF1 = is_final() ? " final" : ""; |
| 7556 const char* kF2 = is_const() ? " const" : ""; | 7516 const char* kF2 = is_const() ? " const" : ""; |
| 7557 const char* field_name = String::Handle(name()).ToCString(); | 7517 const char* field_name = String::Handle(name()).ToCString(); |
| 7558 const Class& cls = Class::Handle(owner()); | 7518 const Class& cls = Class::Handle(owner()); |
| 7559 const char* cls_name = String::Handle(cls.Name()).ToCString(); | 7519 const char* cls_name = String::Handle(cls.Name()).ToCString(); |
| 7560 return OS::SCreate(Thread::Current()->zone(), | 7520 return OS::SCreate(Thread::Current()->zone(), |
| 7561 "Field <%s.%s>:%s%s%s", cls_name, field_name, kF0, kF1, kF2); | 7521 "Field <%s.%s>:%s%s%s", cls_name, field_name, kF0, kF1, kF2); |
| 7562 } | 7522 } |
| 7563 | 7523 |
| 7524 |
| 7564 void Field::PrintJSONImpl(JSONStream* stream, bool ref) const { | 7525 void Field::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 7565 JSONObject jsobj(stream); | 7526 JSONObject jsobj(stream); |
| 7566 Class& cls = Class::Handle(owner()); | 7527 Class& cls = Class::Handle(owner()); |
| 7567 intptr_t id = cls.FindFieldIndex(*this); | 7528 String& field_name = String::Handle(name()); |
| 7568 ASSERT(id >= 0); | 7529 ASSERT(cls.LookupField(field_name) == this->raw()); |
| 7569 intptr_t cid = cls.id(); | 7530 field_name = String::EncodeIRI(field_name); |
| 7570 AddCommonObjectProperties(&jsobj, "Field", ref); | 7531 AddCommonObjectProperties(&jsobj, "Field", ref); |
| 7571 jsobj.AddFixedServiceId("classes/%" Pd "/fields/%" Pd "", cid, id); | 7532 jsobj.AddFixedServiceId("classes/%" Pd "/fields/%s", |
| 7533 cls.id(), field_name.ToCString()); |
| 7534 |
| 7572 const String& user_name = String::Handle(PrettyName()); | 7535 const String& user_name = String::Handle(PrettyName()); |
| 7573 const String& vm_name = String::Handle(name()); | 7536 const String& vm_name = String::Handle(name()); |
| 7574 AddNameProperties(&jsobj, user_name, vm_name); | 7537 AddNameProperties(&jsobj, user_name, vm_name); |
| 7575 if (cls.IsTopLevel()) { | 7538 if (cls.IsTopLevel()) { |
| 7576 const Library& library = Library::Handle(cls.library()); | 7539 const Library& library = Library::Handle(cls.library()); |
| 7577 jsobj.AddProperty("owner", library); | 7540 jsobj.AddProperty("owner", library); |
| 7578 } else { | 7541 } else { |
| 7579 jsobj.AddProperty("owner", cls); | 7542 jsobj.AddProperty("owner", cls); |
| 7580 } | 7543 } |
| 7581 | 7544 |
| (...skipping 14325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21907 return tag_label.ToCString(); | 21870 return tag_label.ToCString(); |
| 21908 } | 21871 } |
| 21909 | 21872 |
| 21910 | 21873 |
| 21911 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21874 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 21912 Instance::PrintJSONImpl(stream, ref); | 21875 Instance::PrintJSONImpl(stream, ref); |
| 21913 } | 21876 } |
| 21914 | 21877 |
| 21915 | 21878 |
| 21916 } // namespace dart | 21879 } // namespace dart |
| OLD | NEW |