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

Side by Side Diff: runtime/vm/object.cc

Issue 1660063002: Remove many features when building product mode (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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
OLDNEW
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 1706 matching lines...) Expand 10 before | Expand all | Expand 10 after
1717 1717
1718 return Error::null(); 1718 return Error::null();
1719 } 1719 }
1720 1720
1721 1721
1722 void Object::Print() const { 1722 void Object::Print() const {
1723 THR_Print("%s\n", ToCString()); 1723 THR_Print("%s\n", ToCString());
1724 } 1724 }
1725 1725
1726 1726
1727 static void AddNameProperties(JSONObject* jsobj,
1728 const String& name,
1729 const String& vm_name) {
1730 jsobj->AddProperty("name", name.ToCString());
1731 if (!name.Equals(vm_name)) {
1732 jsobj->AddProperty("_vmName", vm_name.ToCString());
1733 }
1734 }
1735
1736
1737 void Object::AddCommonObjectProperties(JSONObject* jsobj,
1738 const char* protocol_type,
1739 bool ref) const {
1740 const char* vm_type = JSONType();
1741 bool same_type = (strcmp(protocol_type, vm_type) == 0);
1742 if (ref) {
1743 jsobj->AddPropertyF("type", "@%s", protocol_type);
1744 } else {
1745 jsobj->AddProperty("type", protocol_type);
1746 }
1747 if (!same_type) {
1748 jsobj->AddProperty("_vmType", vm_type);
1749 }
1750 if (!ref || IsInstance() || IsNull()) {
1751 // TODO(turnidge): Provide the type arguments here too?
1752 const Class& cls = Class::Handle(this->clazz());
1753 jsobj->AddProperty("class", cls);
1754 }
1755 if (!ref) {
1756 if (raw()->IsHeapObject()) {
1757 jsobj->AddProperty("size", raw()->Size());
1758 } else {
1759 jsobj->AddProperty("size", (intptr_t)0);
1760 }
1761 }
1762 }
1763
1764
1765 void Object::PrintJSON(JSONStream* stream, bool ref) const {
1766 if (IsNull()) {
1767 JSONObject jsobj(stream);
1768 AddCommonObjectProperties(&jsobj, "Instance", ref);
1769 jsobj.AddProperty("kind", "Null");
1770 jsobj.AddFixedServiceId("objects/null");
1771 jsobj.AddProperty("valueAsString", "null");
1772 } else {
1773 PrintJSONImpl(stream, ref);
1774 }
1775 }
1776
1777
1778 void Object::PrintJSONImpl(JSONStream* stream, bool ref) const {
1779 JSONObject jsobj(stream);
1780 AddCommonObjectProperties(&jsobj, "Object", ref);
1781 jsobj.AddServiceId(*this);
1782 if (ref) {
1783 return;
1784 }
1785 }
1786
1787
1788 RawString* Object::DictionaryName() const { 1727 RawString* Object::DictionaryName() const {
1789 return String::null(); 1728 return String::null();
1790 } 1729 }
1791 1730
1792 1731
1793 void Object::InitializeObject(uword address, 1732 void Object::InitializeObject(uword address,
1794 intptr_t class_id, 1733 intptr_t class_id,
1795 intptr_t size, 1734 intptr_t size,
1796 bool is_vm_object) { 1735 bool is_vm_object) {
1797 uword initial_value = (class_id == kInstructionsCid) 1736 uword initial_value = (class_id == kInstructionsCid)
(...skipping 2329 matching lines...) Expand 10 before | Expand all | Expand 10 after
4127 const char* Class::ToCString() const { 4066 const char* Class::ToCString() const {
4128 const Library& lib = Library::Handle(library()); 4067 const Library& lib = Library::Handle(library());
4129 const char* library_name = lib.IsNull() ? "" : lib.ToCString(); 4068 const char* library_name = lib.IsNull() ? "" : lib.ToCString();
4130 const char* patch_prefix = is_patch() ? "Patch " : ""; 4069 const char* patch_prefix = is_patch() ? "Patch " : "";
4131 const char* class_name = String::Handle(Name()).ToCString(); 4070 const char* class_name = String::Handle(Name()).ToCString();
4132 return OS::SCreate(Thread::Current()->zone(), 4071 return OS::SCreate(Thread::Current()->zone(),
4133 "%s %sClass: %s", library_name, patch_prefix, class_name); 4072 "%s %sClass: %s", library_name, patch_prefix, class_name);
4134 } 4073 }
4135 4074
4136 4075
4137 void Class::PrintJSONImpl(JSONStream* stream, bool ref) const {
4138 Isolate* isolate = Isolate::Current();
4139 JSONObject jsobj(stream);
4140 if ((raw() == Class::null()) || (id() == kFreeListElement)) {
4141 // TODO(turnidge): This is weird and needs to be changed.
4142 jsobj.AddProperty("type", "null");
4143 return;
4144 }
4145 AddCommonObjectProperties(&jsobj, "Class", ref);
4146 jsobj.AddFixedServiceId("classes/%" Pd "", id());
4147 const String& user_name = String::Handle(PrettyName());
4148 const String& vm_name = String::Handle(Name());
4149 AddNameProperties(&jsobj, user_name, vm_name);
4150 if (ref) {
4151 return;
4152 }
4153
4154 const Error& err = Error::Handle(EnsureIsFinalized(Thread::Current()));
4155 if (!err.IsNull()) {
4156 jsobj.AddProperty("error", err);
4157 }
4158 jsobj.AddProperty("abstract", is_abstract());
4159 jsobj.AddProperty("const", is_const());
4160 jsobj.AddProperty("_finalized", is_finalized());
4161 jsobj.AddProperty("_implemented", is_implemented());
4162 jsobj.AddProperty("_patch", is_patch());
4163 jsobj.AddProperty("_traceAllocations", TraceAllocation(isolate));
4164 const Class& superClass = Class::Handle(SuperClass());
4165 if (!superClass.IsNull()) {
4166 jsobj.AddProperty("super", superClass);
4167 }
4168 jsobj.AddProperty("library", Object::Handle(library()));
4169 const Script& script = Script::Handle(this->script());
4170 if (!script.IsNull()) {
4171 jsobj.AddLocation(script, token_pos(), ComputeEndTokenPos());
4172 }
4173 {
4174 JSONArray interfaces_array(&jsobj, "interfaces");
4175 const Array& interface_array = Array::Handle(interfaces());
4176 Type& interface_type = Type::Handle();
4177 if (!interface_array.IsNull()) {
4178 for (intptr_t i = 0; i < interface_array.Length(); ++i) {
4179 interface_type ^= interface_array.At(i);
4180 interfaces_array.AddValue(interface_type);
4181 }
4182 }
4183 }
4184 {
4185 JSONArray fields_array(&jsobj, "fields");
4186 const Array& field_array = Array::Handle(fields());
4187 Field& field = Field::Handle();
4188 if (!field_array.IsNull()) {
4189 for (intptr_t i = 0; i < field_array.Length(); ++i) {
4190 field ^= field_array.At(i);
4191 fields_array.AddValue(field);
4192 }
4193 }
4194 }
4195 {
4196 JSONArray functions_array(&jsobj, "functions");
4197 const Array& function_array = Array::Handle(functions());
4198 Function& function = Function::Handle();
4199 if (!function_array.IsNull()) {
4200 for (intptr_t i = 0; i < function_array.Length(); i++) {
4201 function ^= function_array.At(i);
4202 functions_array.AddValue(function);
4203 }
4204 }
4205 }
4206 {
4207 JSONArray subclasses_array(&jsobj, "subclasses");
4208 const GrowableObjectArray& subclasses =
4209 GrowableObjectArray::Handle(direct_subclasses());
4210 if (!subclasses.IsNull()) {
4211 Class& subclass = Class::Handle();
4212 for (intptr_t i = 0; i < subclasses.Length(); ++i) {
4213 // TODO(turnidge): Use the Type directly once regis has added
4214 // types to the vmservice.
4215 subclass ^= subclasses.At(i);
4216 subclasses_array.AddValue(subclass);
4217 }
4218 }
4219 }
4220 {
4221 ClassTable* class_table = Isolate::Current()->class_table();
4222 const ClassHeapStats* stats = class_table->StatsWithUpdatedSize(id());
4223 if (stats != NULL) {
4224 JSONObject allocation_stats(&jsobj, "_allocationStats");
4225 stats->PrintToJSONObject(*this, &allocation_stats);
4226 }
4227 }
4228 }
4229
4230
4231 void Class::InsertCanonicalConstant(intptr_t index, 4076 void Class::InsertCanonicalConstant(intptr_t index,
4232 const Instance& constant) const { 4077 const Instance& constant) const {
4233 // The constant needs to be added to the list. Grow the list if it is full. 4078 // The constant needs to be added to the list. Grow the list if it is full.
4234 Array& canonical_list = Array::Handle(constants()); 4079 Array& canonical_list = Array::Handle(constants());
4235 const intptr_t list_len = canonical_list.Length(); 4080 const intptr_t list_len = canonical_list.Length();
4236 if (index >= list_len) { 4081 if (index >= list_len) {
4237 const intptr_t new_length = (list_len == 0) ? 4 : list_len + 4; 4082 const intptr_t new_length = (list_len == 0) ? 4 : list_len + 4;
4238 const Array& new_canonical_list = 4083 const Array& new_canonical_list =
4239 Array::Handle(Array::Grow(canonical_list, new_length, Heap::kOld)); 4084 Array::Handle(Array::Grow(canonical_list, new_length, Heap::kOld));
4240 set_constants(new_canonical_list); 4085 set_constants(new_canonical_list);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
4299 } 4144 }
4300 4145
4301 4146
4302 const char* UnresolvedClass::ToCString() const { 4147 const char* UnresolvedClass::ToCString() const {
4303 const char* cname = String::Handle(Name()).ToCString(); 4148 const char* cname = String::Handle(Name()).ToCString();
4304 return OS::SCreate(Thread::Current()->zone(), 4149 return OS::SCreate(Thread::Current()->zone(),
4305 "unresolved class '%s'", cname); 4150 "unresolved class '%s'", cname);
4306 } 4151 }
4307 4152
4308 4153
4309 void UnresolvedClass::PrintJSONImpl(JSONStream* stream, bool ref) const {
4310 Object::PrintJSONImpl(stream, ref);
4311 }
4312
4313
4314 static uint32_t CombineHashes(uint32_t hash, uint32_t other_hash) { 4154 static uint32_t CombineHashes(uint32_t hash, uint32_t other_hash) {
4315 hash += other_hash; 4155 hash += other_hash;
4316 hash += hash << 10; 4156 hash += hash << 10;
4317 hash ^= hash >> 6; // Logical shift, unsigned hash. 4157 hash ^= hash >> 6; // Logical shift, unsigned hash.
4318 return hash; 4158 return hash;
4319 } 4159 }
4320 4160
4321 4161
4322 static uint32_t FinalizeHash(uint32_t hash) { 4162 static uint32_t FinalizeHash(uint32_t hash) {
4323 hash += hash << 3; 4163 hash += hash << 3;
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
4454 other_type = other.TypeAt(from_index + i); 4294 other_type = other.TypeAt(from_index + i);
4455 ASSERT(!other_type.IsNull()); 4295 ASSERT(!other_type.IsNull());
4456 if (!type.TypeTest(test_kind, other_type, bound_error, space)) { 4296 if (!type.TypeTest(test_kind, other_type, bound_error, space)) {
4457 return false; 4297 return false;
4458 } 4298 }
4459 } 4299 }
4460 return true; 4300 return true;
4461 } 4301 }
4462 4302
4463 4303
4464 void TypeArguments::PrintJSONImpl(JSONStream* stream, bool ref) const {
4465 JSONObject jsobj(stream);
4466 // The index in the canonical_type_arguments table cannot be used as part of
4467 // the object id (as in typearguments/id), because the indices are not
4468 // preserved when the table grows and the entries get rehashed. Use the ring.
4469 Isolate* isolate = Isolate::Current();
4470 ObjectStore* object_store = isolate->object_store();
4471 const Array& table = Array::Handle(object_store->canonical_type_arguments());
4472 ASSERT(table.Length() > 0);
4473 AddCommonObjectProperties(&jsobj, "TypeArguments", ref);
4474 jsobj.AddServiceId(*this);
4475 const String& user_name = String::Handle(PrettyName());
4476 const String& vm_name = String::Handle(Name());
4477 AddNameProperties(&jsobj, user_name, vm_name);
4478 if (ref) {
4479 return;
4480 }
4481 {
4482 JSONArray jsarr(&jsobj, "types");
4483 AbstractType& type_arg = AbstractType::Handle();
4484 for (intptr_t i = 0; i < Length(); i++) {
4485 type_arg = TypeAt(i);
4486 jsarr.AddValue(type_arg);
4487 }
4488 }
4489 if (!IsInstantiated()) {
4490 JSONArray jsarr(&jsobj, "_instantiations");
4491 Array& prior_instantiations = Array::Handle(instantiations());
4492 ASSERT(prior_instantiations.Length() > 0); // Always at least a sentinel.
4493 TypeArguments& type_args = TypeArguments::Handle();
4494 intptr_t i = 0;
4495 while (true) {
4496 if (prior_instantiations.At(i) == Smi::New(StubCode::kNoInstantiator)) {
4497 break;
4498 }
4499 JSONObject instantiation(&jsarr);
4500 type_args ^= prior_instantiations.At(i);
4501 instantiation.AddProperty("instantiator", type_args, true);
4502 type_args ^= prior_instantiations.At(i + 1);
4503 instantiation.AddProperty("instantiated", type_args, true);
4504 i += 2;
4505 }
4506 }
4507 }
4508
4509
4510 bool TypeArguments::HasInstantiations() const { 4304 bool TypeArguments::HasInstantiations() const {
4511 const Array& prior_instantiations = Array::Handle(instantiations()); 4305 const Array& prior_instantiations = Array::Handle(instantiations());
4512 ASSERT(prior_instantiations.Length() > 0); // Always at least a sentinel. 4306 ASSERT(prior_instantiations.Length() > 0); // Always at least a sentinel.
4513 return prior_instantiations.Length() > 1; 4307 return prior_instantiations.Length() > 1;
4514 } 4308 }
4515 4309
4516 4310
4517 intptr_t TypeArguments::NumInstantiations() const { 4311 intptr_t TypeArguments::NumInstantiations() const {
4518 const Array& prior_instantiations = Array::Handle(instantiations()); 4312 const Array& prior_instantiations = Array::Handle(instantiations());
4519 ASSERT(prior_instantiations.Length() > 0); // Always at least a sentinel. 4313 ASSERT(prior_instantiations.Length() > 0); // Always at least a sentinel.
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after
5067 4861
5068 4862
5069 const char* PatchClass::ToCString() const { 4863 const char* PatchClass::ToCString() const {
5070 const Class& cls = Class::Handle(patched_class()); 4864 const Class& cls = Class::Handle(patched_class());
5071 const char* cls_name = cls.ToCString(); 4865 const char* cls_name = cls.ToCString();
5072 return OS::SCreate(Thread::Current()->zone(), 4866 return OS::SCreate(Thread::Current()->zone(),
5073 "PatchClass for %s", cls_name); 4867 "PatchClass for %s", cls_name);
5074 } 4868 }
5075 4869
5076 4870
5077 void PatchClass::PrintJSONImpl(JSONStream* stream, bool ref) const {
5078 Object::PrintJSONImpl(stream, ref);
5079 }
5080
5081
5082 RawPatchClass* PatchClass::New(const Class& patched_class, 4871 RawPatchClass* PatchClass::New(const Class& patched_class,
5083 const Class& origin_class) { 4872 const Class& origin_class) {
5084 const PatchClass& result = PatchClass::Handle(PatchClass::New()); 4873 const PatchClass& result = PatchClass::Handle(PatchClass::New());
5085 result.set_patched_class(patched_class); 4874 result.set_patched_class(patched_class);
5086 result.set_origin_class(origin_class); 4875 result.set_origin_class(origin_class);
5087 result.set_script(Script::Handle(origin_class.script())); 4876 result.set_script(Script::Handle(origin_class.script()));
5088 return result.raw(); 4877 return result.raw();
5089 } 4878 }
5090 4879
5091 4880
(...skipping 25 matching lines...) Expand all
5117 StorePointer(&raw_ptr()->origin_class_, value.raw()); 4906 StorePointer(&raw_ptr()->origin_class_, value.raw());
5118 } 4907 }
5119 4908
5120 4909
5121 void PatchClass::set_script(const Script& value) const { 4910 void PatchClass::set_script(const Script& value) const {
5122 StorePointer(&raw_ptr()->script_, value.raw()); 4911 StorePointer(&raw_ptr()->script_, value.raw());
5123 } 4912 }
5124 4913
5125 4914
5126 bool Function::HasBreakpoint() const { 4915 bool Function::HasBreakpoint() const {
4916 if (!FLAG_support_debugger) {
4917 return false;
4918 }
5127 Thread* thread = Thread::Current(); 4919 Thread* thread = Thread::Current();
5128 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); 4920 return thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone());
5129 } 4921 }
5130 4922
5131 4923
5132 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const { 4924 void Function::InstallOptimizedCode(const Code& code, bool is_osr) const {
5133 DEBUG_ASSERT(IsMutatorOrAtSafepoint()); 4925 DEBUG_ASSERT(IsMutatorOrAtSafepoint());
5134 // We may not have previous code if 'always_optimize' is set. 4926 // We may not have previous code if 'always_optimize' is set.
5135 if (!is_osr && HasCode()) { 4927 if (!is_osr && HasCode()) {
5136 Code::Handle(CurrentCode()).DisableDartCode(); 4928 Code::Handle(CurrentCode()).DisableDartCode();
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after
5777 void Function::SetIsNativeAutoSetupScope(bool value) const { 5569 void Function::SetIsNativeAutoSetupScope(bool value) const {
5778 ASSERT(is_native()); 5570 ASSERT(is_native());
5779 set_is_optimizable(value); 5571 set_is_optimizable(value);
5780 } 5572 }
5781 5573
5782 5574
5783 bool Function::CanBeInlined() const { 5575 bool Function::CanBeInlined() const {
5784 Thread* thread = Thread::Current(); 5576 Thread* thread = Thread::Current();
5785 return is_inlinable() && 5577 return is_inlinable() &&
5786 !is_generated_body() && 5578 !is_generated_body() &&
5787 !thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()); 5579 (!FLAG_support_debugger ||
5580 !thread->isolate()->debugger()->HasBreakpoint(*this, thread->zone()));
5788 } 5581 }
5789 5582
5790 5583
5791 intptr_t Function::NumParameters() const { 5584 intptr_t Function::NumParameters() const {
5792 return num_fixed_parameters() + NumOptionalParameters(); 5585 return num_fixed_parameters() + NumOptionalParameters();
5793 } 5586 }
5794 5587
5795 5588
5796 intptr_t Function::NumImplicitParameters() const { 5589 intptr_t Function::NumImplicitParameters() const {
5797 if (kind() == RawFunction::kConstructor) { 5590 if (kind() == RawFunction::kConstructor) {
(...skipping 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after
7055 default: 6848 default:
7056 UNREACHABLE(); 6849 UNREACHABLE();
7057 } 6850 }
7058 const char* function_name = String::Handle(name()).ToCString(); 6851 const char* function_name = String::Handle(name()).ToCString();
7059 return OS::SCreate(Thread::Current()->zone(), 6852 return OS::SCreate(Thread::Current()->zone(),
7060 "Function '%s':%s%s%s%s.", 6853 "Function '%s':%s%s%s%s.",
7061 function_name, static_str, abstract_str, kind_str, const_str); 6854 function_name, static_str, abstract_str, kind_str, const_str);
7062 } 6855 }
7063 6856
7064 6857
7065 static void AddFunctionServiceId(const JSONObject& jsobj,
7066 const Function& f,
7067 const Class& cls) {
7068 // Special kinds of functions use indices in their respective lists.
7069 intptr_t id = -1;
7070 const char* selector = NULL;
7071 if (f.IsNonImplicitClosureFunction()) {
7072 id = Isolate::Current()->FindClosureIndex(f);
7073 selector = "closures";
7074 } else if (f.IsImplicitClosureFunction()) {
7075 id = cls.FindImplicitClosureFunctionIndex(f);
7076 selector = "implicit_closures";
7077 } else if (f.IsNoSuchMethodDispatcher() || f.IsInvokeFieldDispatcher()) {
7078 id = cls.FindInvocationDispatcherFunctionIndex(f);
7079 selector = "dispatchers";
7080 }
7081 if (id != -1) {
7082 ASSERT(selector != NULL);
7083 jsobj.AddFixedServiceId("classes/%" Pd "/%s/%" Pd "",
7084 cls.id(), selector, id);
7085 return;
7086 }
7087 // Regular functions known to their owner use their name (percent-encoded).
7088 String& name = String::Handle(f.name());
7089 if (cls.LookupFunction(name) == f.raw()) {
7090 name = String::EncodeIRI(name);
7091 jsobj.AddFixedServiceId("classes/%" Pd "/functions/%s",
7092 cls.id(), name.ToCString());
7093 return;
7094 }
7095 // Oddball functions (not known to their owner) fall back to use the object
7096 // id ring. Current known examples are signature functions of closures
7097 // and stubs like 'megamorphic_miss'.
7098 jsobj.AddServiceId(f);
7099 }
7100
7101
7102 void Function::PrintJSONImpl(JSONStream* stream, bool ref) const {
7103 Class& cls = Class::Handle(Owner());
7104 ASSERT(!cls.IsNull());
7105 Error& err = Error::Handle();
7106 err ^= cls.EnsureIsFinalized(Thread::Current());
7107 ASSERT(err.IsNull());
7108 JSONObject jsobj(stream);
7109 AddCommonObjectProperties(&jsobj, "Function", ref);
7110 AddFunctionServiceId(jsobj, *this, cls);
7111 const String& user_name = String::Handle(PrettyName());
7112 const String& vm_name = String::Handle(name());
7113 AddNameProperties(&jsobj, user_name, vm_name);
7114 const Function& parent = Function::Handle(parent_function());
7115 if (!parent.IsNull()) {
7116 jsobj.AddProperty("owner", parent);
7117 } else if (cls.IsTopLevel()) {
7118 const Library& library = Library::Handle(cls.library());
7119 jsobj.AddProperty("owner", library);
7120 } else {
7121 jsobj.AddProperty("owner", cls);
7122 }
7123
7124 const char* kind_string = Function::KindToCString(kind());
7125 jsobj.AddProperty("_kind", kind_string);
7126 jsobj.AddProperty("static", is_static());
7127 jsobj.AddProperty("const", is_const());
7128 jsobj.AddProperty("_intrinsic", is_intrinsic());
7129 jsobj.AddProperty("_native", is_native());
7130 if (ref) {
7131 return;
7132 }
7133 Code& code = Code::Handle(CurrentCode());
7134 if (!code.IsNull()) {
7135 jsobj.AddProperty("code", code);
7136 }
7137 Array& ics = Array::Handle(ic_data_array());
7138 if (!ics.IsNull()) {
7139 jsobj.AddProperty("_icDataArray", ics);
7140 }
7141 jsobj.AddProperty("_optimizable", is_optimizable());
7142 jsobj.AddProperty("_inlinable", is_inlinable());
7143 jsobj.AddProperty("_recognized", IsRecognized());
7144 code = unoptimized_code();
7145 if (!code.IsNull()) {
7146 jsobj.AddProperty("_unoptimizedCode", code);
7147 }
7148 jsobj.AddProperty("_usageCounter", usage_counter());
7149 jsobj.AddProperty("_optimizedCallSiteCount", optimized_call_site_count());
7150 jsobj.AddProperty("_deoptimizations",
7151 static_cast<intptr_t>(deoptimization_counter()));
7152 if ((kind() == RawFunction::kImplicitGetter) ||
7153 (kind() == RawFunction::kImplicitSetter) ||
7154 (kind() == RawFunction::kImplicitStaticFinalGetter)) {
7155 const Field& field = Field::Handle(LookupImplicitGetterSetterField());
7156 if (!field.IsNull()) {
7157 jsobj.AddProperty("_field", field);
7158 }
7159 }
7160
7161 const Script& script = Script::Handle(this->script());
7162 if (!script.IsNull()) {
7163 jsobj.AddLocation(script, token_pos(), end_token_pos());
7164 }
7165 }
7166
7167
7168 void ClosureData::set_context_scope(const ContextScope& value) const { 6858 void ClosureData::set_context_scope(const ContextScope& value) const {
7169 StorePointer(&raw_ptr()->context_scope_, value.raw()); 6859 StorePointer(&raw_ptr()->context_scope_, value.raw());
7170 } 6860 }
7171 6861
7172 6862
7173 void ClosureData::set_implicit_static_closure(const Instance& closure) const { 6863 void ClosureData::set_implicit_static_closure(const Instance& closure) const {
7174 ASSERT(!closure.IsNull()); 6864 ASSERT(!closure.IsNull());
7175 ASSERT(raw_ptr()->closure_ == Instance::null()); 6865 ASSERT(raw_ptr()->closure_ == Instance::null());
7176 StorePointer(&raw_ptr()->closure_, closure.raw()); 6866 StorePointer(&raw_ptr()->closure_, closure.raw());
7177 } 6867 }
(...skipping 16 matching lines...) Expand all
7194 Heap::kOld); 6884 Heap::kOld);
7195 return reinterpret_cast<RawClosureData*>(raw); 6885 return reinterpret_cast<RawClosureData*>(raw);
7196 } 6886 }
7197 6887
7198 6888
7199 const char* ClosureData::ToCString() const { 6889 const char* ClosureData::ToCString() const {
7200 return "ClosureData class"; 6890 return "ClosureData class";
7201 } 6891 }
7202 6892
7203 6893
7204 void ClosureData::PrintJSONImpl(JSONStream* stream, bool ref) const {
7205 Object::PrintJSONImpl(stream, ref);
7206 }
7207
7208
7209 void RedirectionData::set_type(const Type& value) const { 6894 void RedirectionData::set_type(const Type& value) const {
7210 ASSERT(!value.IsNull()); 6895 ASSERT(!value.IsNull());
7211 StorePointer(&raw_ptr()->type_, value.raw()); 6896 StorePointer(&raw_ptr()->type_, value.raw());
7212 } 6897 }
7213 6898
7214 6899
7215 void RedirectionData::set_identifier(const String& value) const { 6900 void RedirectionData::set_identifier(const String& value) const {
7216 StorePointer(&raw_ptr()->identifier_, value.raw()); 6901 StorePointer(&raw_ptr()->identifier_, value.raw());
7217 } 6902 }
7218 6903
(...skipping 10 matching lines...) Expand all
7229 Heap::kOld); 6914 Heap::kOld);
7230 return reinterpret_cast<RawRedirectionData*>(raw); 6915 return reinterpret_cast<RawRedirectionData*>(raw);
7231 } 6916 }
7232 6917
7233 6918
7234 const char* RedirectionData::ToCString() const { 6919 const char* RedirectionData::ToCString() const {
7235 return "RedirectionData class"; 6920 return "RedirectionData class";
7236 } 6921 }
7237 6922
7238 6923
7239 void RedirectionData::PrintJSONImpl(JSONStream* stream, bool ref) const {
7240 Object::PrintJSONImpl(stream, ref);
7241 }
7242
7243
7244 RawString* Field::GetterName(const String& field_name) { 6924 RawString* Field::GetterName(const String& field_name) {
7245 return String::Concat(Symbols::GetterPrefix(), field_name); 6925 return String::Concat(Symbols::GetterPrefix(), field_name);
7246 } 6926 }
7247 6927
7248 6928
7249 RawString* Field::GetterSymbol(const String& field_name) { 6929 RawString* Field::GetterSymbol(const String& field_name) {
7250 return Symbols::FromConcat(Symbols::GetterPrefix(), field_name); 6930 return Symbols::FromConcat(Symbols::GetterPrefix(), field_name);
7251 } 6931 }
7252 6932
7253 6933
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
7479 const char* kF1 = is_final() ? " final" : ""; 7159 const char* kF1 = is_final() ? " final" : "";
7480 const char* kF2 = is_const() ? " const" : ""; 7160 const char* kF2 = is_const() ? " const" : "";
7481 const char* field_name = String::Handle(name()).ToCString(); 7161 const char* field_name = String::Handle(name()).ToCString();
7482 const Class& cls = Class::Handle(owner()); 7162 const Class& cls = Class::Handle(owner());
7483 const char* cls_name = String::Handle(cls.Name()).ToCString(); 7163 const char* cls_name = String::Handle(cls.Name()).ToCString();
7484 return OS::SCreate(Thread::Current()->zone(), 7164 return OS::SCreate(Thread::Current()->zone(),
7485 "Field <%s.%s>:%s%s%s", cls_name, field_name, kF0, kF1, kF2); 7165 "Field <%s.%s>:%s%s%s", cls_name, field_name, kF0, kF1, kF2);
7486 } 7166 }
7487 7167
7488 7168
7489 void Field::PrintJSONImpl(JSONStream* stream, bool ref) const {
7490 JSONObject jsobj(stream);
7491 Class& cls = Class::Handle(owner());
7492 String& field_name = String::Handle(name());
7493 field_name = String::EncodeIRI(field_name);
7494 AddCommonObjectProperties(&jsobj, "Field", ref);
7495 jsobj.AddFixedServiceId("classes/%" Pd "/fields/%s",
7496 cls.id(), field_name.ToCString());
7497
7498 const String& user_name = String::Handle(PrettyName());
7499 const String& vm_name = String::Handle(name());
7500 AddNameProperties(&jsobj, user_name, vm_name);
7501 if (cls.IsTopLevel()) {
7502 const Library& library = Library::Handle(cls.library());
7503 jsobj.AddProperty("owner", library);
7504 } else {
7505 jsobj.AddProperty("owner", cls);
7506 }
7507
7508 AbstractType& declared_type = AbstractType::Handle(type());
7509 jsobj.AddProperty("declaredType", declared_type);
7510 jsobj.AddProperty("static", is_static());
7511 jsobj.AddProperty("final", is_final());
7512 jsobj.AddProperty("const", is_const());
7513 if (ref) {
7514 return;
7515 }
7516 if (is_static()) {
7517 const Instance& valueObj = Instance::Handle(StaticValue());
7518 jsobj.AddProperty("staticValue", valueObj);
7519 }
7520
7521 jsobj.AddProperty("_guardNullable", is_nullable());
7522 if (guarded_cid() == kIllegalCid) {
7523 jsobj.AddProperty("_guardClass", "unknown");
7524 } else if (guarded_cid() == kDynamicCid) {
7525 jsobj.AddProperty("_guardClass", "dynamic");
7526 } else {
7527 ClassTable* table = Isolate::Current()->class_table();
7528 ASSERT(table->IsValidIndex(guarded_cid()));
7529 cls ^= table->At(guarded_cid());
7530 jsobj.AddProperty("_guardClass", cls);
7531 }
7532 if (guarded_list_length() == kUnknownFixedLength) {
7533 jsobj.AddProperty("_guardLength", "unknown");
7534 } else if (guarded_list_length() == kNoFixedLength) {
7535 jsobj.AddProperty("_guardLength", "variable");
7536 } else {
7537 jsobj.AddProperty("_guardLength", guarded_list_length());
7538 }
7539 const Class& origin_cls = Class::Handle(origin());
7540 const Script& script = Script::Handle(origin_cls.script());
7541 if (!script.IsNull()) {
7542 jsobj.AddLocation(script, token_pos());
7543 }
7544 }
7545
7546
7547 // Build a closure object that gets (or sets) the contents of a static 7169 // Build a closure object that gets (or sets) the contents of a static
7548 // field f and cache the closure in a newly created static field 7170 // field f and cache the closure in a newly created static field
7549 // named #f (or #f= in case of a setter). 7171 // named #f (or #f= in case of a setter).
7550 RawInstance* Field::AccessorClosure(bool make_setter) const { 7172 RawInstance* Field::AccessorClosure(bool make_setter) const {
7551 ASSERT(is_static()); 7173 ASSERT(is_static());
7552 const Class& field_owner = Class::Handle(owner()); 7174 const Class& field_owner = Class::Handle(owner());
7553 7175
7554 String& closure_name = String::Handle(this->name()); 7176 String& closure_name = String::Handle(this->name());
7555 closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name); 7177 closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name);
7556 if (make_setter) { 7178 if (make_setter) {
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
7938 return result.raw(); 7560 return result.raw();
7939 } 7561 }
7940 7562
7941 7563
7942 const char* LiteralToken::ToCString() const { 7564 const char* LiteralToken::ToCString() const {
7943 const String& token = String::Handle(literal()); 7565 const String& token = String::Handle(literal());
7944 return token.ToCString(); 7566 return token.ToCString();
7945 } 7567 }
7946 7568
7947 7569
7948 void LiteralToken::PrintJSONImpl(JSONStream* stream, bool ref) const {
7949 Object::PrintJSONImpl(stream, ref);
7950 }
7951
7952
7953 RawGrowableObjectArray* TokenStream::TokenObjects() const { 7570 RawGrowableObjectArray* TokenStream::TokenObjects() const {
7954 return raw_ptr()->token_objects_; 7571 return raw_ptr()->token_objects_;
7955 } 7572 }
7956 7573
7957 7574
7958 void TokenStream::SetTokenObjects(const GrowableObjectArray& value) const { 7575 void TokenStream::SetTokenObjects(const GrowableObjectArray& value) const {
7959 StorePointer(&raw_ptr()->token_objects_, value.raw()); 7576 StorePointer(&raw_ptr()->token_objects_, value.raw());
7960 } 7577 }
7961 7578
7962 7579
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
8423 isolate->object_store()->set_token_objects(GrowableObjectArray::Handle()); 8040 isolate->object_store()->set_token_objects(GrowableObjectArray::Handle());
8424 isolate->object_store()->set_token_objects_map(Array::null_array()); 8041 isolate->object_store()->set_token_objects_map(Array::null_array());
8425 } 8042 }
8426 8043
8427 8044
8428 const char* TokenStream::ToCString() const { 8045 const char* TokenStream::ToCString() const {
8429 return "TokenStream"; 8046 return "TokenStream";
8430 } 8047 }
8431 8048
8432 8049
8433 void TokenStream::PrintJSONImpl(JSONStream* stream, bool ref) const {
8434 JSONObject jsobj(stream);
8435 AddCommonObjectProperties(&jsobj, "Object", ref);
8436 // TODO(johnmccutchan): Generate a stable id. TokenStreams hang off
8437 // a Script object but do not have a back reference to generate a stable id.
8438 jsobj.AddServiceId(*this);
8439 if (ref) {
8440 return;
8441 }
8442 const String& private_key = String::Handle(PrivateKey());
8443 jsobj.AddProperty("privateKey", private_key);
8444 // TODO(johnmccutchan): Add support for printing LiteralTokens and add
8445 // them to members array.
8446 JSONArray members(&jsobj, "members");
8447 }
8448
8449
8450 TokenStream::Iterator::Iterator(const TokenStream& tokens, 8050 TokenStream::Iterator::Iterator(const TokenStream& tokens,
8451 TokenPosition token_pos, 8051 TokenPosition token_pos,
8452 Iterator::StreamType stream_type) 8052 Iterator::StreamType stream_type)
8453 : tokens_(TokenStream::Handle(tokens.raw())), 8053 : tokens_(TokenStream::Handle(tokens.raw())),
8454 data_(ExternalTypedData::Handle(tokens.GetStream())), 8054 data_(ExternalTypedData::Handle(tokens.GetStream())),
8455 stream_(reinterpret_cast<uint8_t*>(data_.DataAddr(0)), data_.Length()), 8055 stream_(reinterpret_cast<uint8_t*>(data_.DataAddr(0)), data_.Length()),
8456 token_objects_(Array::Handle( 8056 token_objects_(Array::Handle(
8457 GrowableObjectArray::Handle(tokens.TokenObjects()).data())), 8057 GrowableObjectArray::Handle(tokens.TokenObjects()).data())),
8458 obj_(Object::Handle()), 8058 obj_(Object::Handle()),
8459 cur_token_pos_(token_pos.Pos()), 8059 cur_token_pos_(token_pos.Pos()),
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after
8998 for (intptr_t j = 0; j < scripts.Length(); j++) { 8598 for (intptr_t j = 0; j < scripts.Length(); j++) {
8999 if (scripts.At(j) == raw()) { 8599 if (scripts.At(j) == raw()) {
9000 return lib.raw(); 8600 return lib.raw();
9001 } 8601 }
9002 } 8602 }
9003 } 8603 }
9004 return Library::null(); 8604 return Library::null();
9005 } 8605 }
9006 8606
9007 8607
9008 // See also Dart_ScriptGetTokenInfo.
9009 void Script::PrintJSONImpl(JSONStream* stream, bool ref) const {
9010 JSONObject jsobj(stream);
9011 AddCommonObjectProperties(&jsobj, "Script", ref);
9012 const String& uri = String::Handle(url());
9013 ASSERT(!uri.IsNull());
9014 const String& encoded_uri = String::Handle(String::EncodeIRI(uri));
9015 ASSERT(!encoded_uri.IsNull());
9016 const Library& lib = Library::Handle(FindLibrary());
9017 if (kind() == RawScript::kEvaluateTag) {
9018 jsobj.AddServiceId(*this);
9019 } else {
9020 ASSERT(!lib.IsNull());
9021 jsobj.AddFixedServiceId("libraries/%" Pd "/scripts/%s",
9022 lib.index(), encoded_uri.ToCString());
9023 }
9024 jsobj.AddPropertyStr("uri", uri);
9025 jsobj.AddProperty("_kind", GetKindAsCString());
9026 if (ref) {
9027 return;
9028 }
9029 if (!lib.IsNull()) {
9030 jsobj.AddProperty("library", lib);
9031 }
9032 const String& source = String::Handle(Source());
9033 jsobj.AddProperty("lineOffset", line_offset());
9034 jsobj.AddProperty("columnOffset", col_offset());
9035 if (!source.IsNull()) {
9036 jsobj.AddPropertyStr("source", source);
9037 }
9038
9039 // Print the line number table
9040 if (!source.IsNull()) {
9041 JSONArray tokenPosTable(&jsobj, "tokenPosTable");
9042
9043 const GrowableObjectArray& lineNumberArray =
9044 GrowableObjectArray::Handle(GenerateLineNumberArray());
9045 Object& value = Object::Handle();
9046 intptr_t pos = 0;
9047
9048 // Skip leading null.
9049 ASSERT(lineNumberArray.Length() > 0);
9050 value = lineNumberArray.At(pos);
9051 ASSERT(value.IsNull());
9052 pos++;
9053
9054 while (pos < lineNumberArray.Length()) {
9055 JSONArray lineInfo(&tokenPosTable);
9056 while (pos < lineNumberArray.Length()) {
9057 value = lineNumberArray.At(pos);
9058 pos++;
9059 if (value.IsNull()) {
9060 break;
9061 }
9062 const Smi& smi = Smi::Cast(value);
9063 lineInfo.AddValue(smi.Value());
9064 }
9065 }
9066 }
9067 }
9068
9069
9070 DictionaryIterator::DictionaryIterator(const Library& library) 8608 DictionaryIterator::DictionaryIterator(const Library& library)
9071 : array_(Array::Handle(library.dictionary())), 8609 : array_(Array::Handle(library.dictionary())),
9072 // Last element in array is a Smi indicating the number of entries used. 8610 // Last element in array is a Smi indicating the number of entries used.
9073 size_(Array::Handle(library.dictionary()).Length() - 1), 8611 size_(Array::Handle(library.dictionary()).Length() - 1),
9074 next_ix_(0) { 8612 next_ix_(0) {
9075 MoveToNextObject(); 8613 MoveToNextObject();
9076 } 8614 }
9077 8615
9078 8616
9079 RawObject* DictionaryIterator::GetNext() { 8617 RawObject* DictionaryIterator::GetNext() {
(...skipping 1379 matching lines...) Expand 10 before | Expand all | Expand 10 after
10459 } 9997 }
10460 9998
10461 9999
10462 const char* Library::ToCString() const { 10000 const char* Library::ToCString() const {
10463 const String& name = String::Handle(url()); 10001 const String& name = String::Handle(url());
10464 return OS::SCreate(Thread::Current()->zone(), 10002 return OS::SCreate(Thread::Current()->zone(),
10465 "Library:'%s'", name.ToCString()); 10003 "Library:'%s'", name.ToCString());
10466 } 10004 }
10467 10005
10468 10006
10469 void Library::PrintJSONImpl(JSONStream* stream, bool ref) const {
10470 intptr_t id = index();
10471 ASSERT(id >= 0);
10472 JSONObject jsobj(stream);
10473 AddCommonObjectProperties(&jsobj, "Library", ref);
10474 jsobj.AddFixedServiceId("libraries/%" Pd "", id);
10475 const String& vm_name = String::Handle(name());
10476 const String& user_name =
10477 String::Handle(String::IdentifierPrettyName(vm_name));
10478 AddNameProperties(&jsobj, user_name, vm_name);
10479 const String& library_url = String::Handle(url());
10480 jsobj.AddPropertyStr("uri", library_url);
10481 if (ref) {
10482 return;
10483 }
10484 jsobj.AddProperty("debuggable", IsDebuggable());
10485 {
10486 JSONArray jsarr(&jsobj, "classes");
10487 ClassDictionaryIterator class_iter(*this);
10488 Class& klass = Class::Handle();
10489 while (class_iter.HasNext()) {
10490 klass = class_iter.GetNextClass();
10491 if (!klass.IsMixinApplication()) {
10492 jsarr.AddValue(klass);
10493 }
10494 }
10495 }
10496 {
10497 JSONArray jsarr(&jsobj, "dependencies");
10498
10499 Array& ports = Array::Handle();
10500 Namespace& ns = Namespace::Handle();
10501 Library& target = Library::Handle();
10502
10503 // Unprefixed imports.
10504 ports = imports();
10505 for (intptr_t i = 0; i < ports.Length(); i++) {
10506 ns ^= ports.At(i);
10507 if (ns.IsNull()) continue;
10508
10509 JSONObject jsdep(&jsarr);
10510 jsdep.AddProperty("isDeferred", false);
10511 jsdep.AddProperty("isExport", false);
10512 jsdep.AddProperty("isImport", true);
10513 target = ns.library();
10514 jsdep.AddProperty("target", target);
10515 }
10516
10517 // Exports.
10518 ports = exports();
10519 for (intptr_t i = 0; i < ports.Length(); i++) {
10520 ns ^= ports.At(i);
10521 if (ns.IsNull()) continue;
10522
10523 JSONObject jsdep(&jsarr);
10524 jsdep.AddProperty("isDeferred", false);
10525 jsdep.AddProperty("isExport", true);
10526 jsdep.AddProperty("isImport", false);
10527 target = ns.library();
10528 jsdep.AddProperty("target", target);
10529 }
10530
10531 // Prefixed imports.
10532 DictionaryIterator entries(*this);
10533 Object& entry = Object::Handle();
10534 LibraryPrefix& prefix = LibraryPrefix::Handle();
10535 String& prefixName = String::Handle();
10536 while (entries.HasNext()) {
10537 entry = entries.GetNext();
10538 if (entry.IsLibraryPrefix()) {
10539 prefix ^= entry.raw();
10540 ports = prefix.imports();
10541 for (intptr_t i = 0; i < ports.Length(); i++) {
10542 ns ^= ports.At(i);
10543 if (ns.IsNull()) continue;
10544
10545 JSONObject jsdep(&jsarr);
10546 jsdep.AddProperty("isDeferred", prefix.is_deferred_load());
10547 jsdep.AddProperty("isExport", false);
10548 jsdep.AddProperty("isImport", true);
10549 prefixName = prefix.name();
10550 ASSERT(!prefixName.IsNull());
10551 jsdep.AddProperty("prefix", prefixName.ToCString());
10552 target = ns.library();
10553 jsdep.AddProperty("target", target);
10554 }
10555 }
10556 }
10557 }
10558 {
10559 JSONArray jsarr(&jsobj, "variables");
10560 DictionaryIterator entries(*this);
10561 Object& entry = Object::Handle();
10562 while (entries.HasNext()) {
10563 entry = entries.GetNext();
10564 if (entry.IsField()) {
10565 jsarr.AddValue(entry);
10566 }
10567 }
10568 }
10569 {
10570 JSONArray jsarr(&jsobj, "functions");
10571 DictionaryIterator entries(*this);
10572 Object& entry = Object::Handle();
10573 while (entries.HasNext()) {
10574 entry = entries.GetNext();
10575 if (entry.IsFunction()) {
10576 const Function& func = Function::Cast(entry);
10577 if (func.kind() == RawFunction::kRegularFunction ||
10578 func.kind() == RawFunction::kGetterFunction ||
10579 func.kind() == RawFunction::kSetterFunction) {
10580 jsarr.AddValue(func);
10581 }
10582 }
10583 }
10584 }
10585 {
10586 JSONArray jsarr(&jsobj, "scripts");
10587 Array& scripts = Array::Handle(LoadedScripts());
10588 Script& script = Script::Handle();
10589 for (intptr_t i = 0; i < scripts.Length(); i++) {
10590 script ^= scripts.At(i);
10591 jsarr.AddValue(script);
10592 }
10593 }
10594 }
10595
10596
10597 RawLibrary* LibraryPrefix::GetLibrary(int index) const { 10007 RawLibrary* LibraryPrefix::GetLibrary(int index) const {
10598 if ((index >= 0) || (index < num_imports())) { 10008 if ((index >= 0) || (index < num_imports())) {
10599 const Array& imports = Array::Handle(this->imports()); 10009 const Array& imports = Array::Handle(this->imports());
10600 Namespace& import = Namespace::Handle(); 10010 Namespace& import = Namespace::Handle();
10601 import ^= imports.At(index); 10011 import ^= imports.At(index);
10602 return import.library(); 10012 return import.library();
10603 } 10013 }
10604 return Library::null(); 10014 return Library::null();
10605 } 10015 }
10606 10016
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
10881 } 10291 }
10882 10292
10883 10293
10884 const char* LibraryPrefix::ToCString() const { 10294 const char* LibraryPrefix::ToCString() const {
10885 const String& prefix = String::Handle(name()); 10295 const String& prefix = String::Handle(name());
10886 return OS::SCreate(Thread::Current()->zone(), 10296 return OS::SCreate(Thread::Current()->zone(),
10887 "LibraryPrefix:'%s'", prefix.ToCString()); 10297 "LibraryPrefix:'%s'", prefix.ToCString());
10888 } 10298 }
10889 10299
10890 10300
10891 void LibraryPrefix::PrintJSONImpl(JSONStream* stream, bool ref) const {
10892 Object::PrintJSONImpl(stream, ref);
10893 }
10894
10895
10896 void Namespace::set_metadata_field(const Field& value) const { 10301 void Namespace::set_metadata_field(const Field& value) const {
10897 StorePointer(&raw_ptr()->metadata_field_, value.raw()); 10302 StorePointer(&raw_ptr()->metadata_field_, value.raw());
10898 } 10303 }
10899 10304
10900 10305
10901 void Namespace::AddMetadata(const Object& owner, TokenPosition token_pos) { 10306 void Namespace::AddMetadata(const Object& owner, TokenPosition token_pos) {
10902 ASSERT(Field::Handle(metadata_field()).IsNull()); 10307 ASSERT(Field::Handle(metadata_field()).IsNull());
10903 Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(), 10308 Field& field = Field::Handle(Field::NewTopLevel(Symbols::TopLevel(),
10904 false, // is_final 10309 false, // is_final
10905 false, // is_const 10310 false, // is_const
(...skipping 25 matching lines...) Expand all
10931 } 10336 }
10932 10337
10933 10338
10934 const char* Namespace::ToCString() const { 10339 const char* Namespace::ToCString() const {
10935 const Library& lib = Library::Handle(library()); 10340 const Library& lib = Library::Handle(library());
10936 return OS::SCreate(Thread::Current()->zone(), 10341 return OS::SCreate(Thread::Current()->zone(),
10937 "Namespace for library '%s'", lib.ToCString()); 10342 "Namespace for library '%s'", lib.ToCString());
10938 } 10343 }
10939 10344
10940 10345
10941 void Namespace::PrintJSONImpl(JSONStream* stream, bool ref) const {
10942 Object::PrintJSONImpl(stream, ref);
10943 }
10944
10945
10946 bool Namespace::HidesName(const String& name) const { 10346 bool Namespace::HidesName(const String& name) const {
10947 // Quick check for common case with no combinators. 10347 // Quick check for common case with no combinators.
10948 if (hide_names() == show_names()) { 10348 if (hide_names() == show_names()) {
10949 ASSERT(hide_names() == Array::null()); 10349 ASSERT(hide_names() == Array::null());
10950 return false; 10350 return false;
10951 } 10351 }
10952 const String* plain_name = &name; 10352 const String* plain_name = &name;
10953 if (Field::IsGetterName(name)) { 10353 if (Field::IsGetterName(name)) {
10954 plain_name = &String::Handle(Field::NameFromGetter(name)); 10354 plain_name = &String::Handle(Field::NameFromGetter(name));
10955 } else if (Field::IsSetterName(name)) { 10355 } else if (Field::IsSetterName(name)) {
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
11207 } 10607 }
11208 return result.raw(); 10608 return result.raw();
11209 } 10609 }
11210 10610
11211 10611
11212 const char* Instructions::ToCString() const { 10612 const char* Instructions::ToCString() const {
11213 return "Instructions"; 10613 return "Instructions";
11214 } 10614 }
11215 10615
11216 10616
11217 void Instructions::PrintJSONImpl(JSONStream* stream, bool ref) const {
11218 JSONObject jsobj(stream);
11219 AddCommonObjectProperties(&jsobj, "Object", ref);
11220 jsobj.AddServiceId(*this);
11221 if (ref) {
11222 return;
11223 }
11224 }
11225
11226
11227 // Encode integer |value| in SLEB128 format and store into |data|. 10617 // Encode integer |value| in SLEB128 format and store into |data|.
11228 static void EncodeSLEB128(GrowableArray<uint8_t>* data, 10618 static void EncodeSLEB128(GrowableArray<uint8_t>* data,
11229 intptr_t value) { 10619 intptr_t value) {
11230 bool is_last_part = false; 10620 bool is_last_part = false;
11231 while (!is_last_part) { 10621 while (!is_last_part) {
11232 uint8_t part = value & 0x7f; 10622 uint8_t part = value & 0x7f;
11233 value >>= 7; 10623 value >>= 7;
11234 if ((value == 0 && (part & 0x40) == 0) || 10624 if ((value == 0 && (part & 0x40) == 0) ||
11235 (value == static_cast<intptr_t>(-1) && (part & 0x40) != 0)) { 10625 (value == static_cast<intptr_t>(-1) && (part & 0x40) != 0)) {
11236 is_last_part = true; 10626 is_last_part = true;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
11314 return static_cast<EntryType>(array.GetInt8(index)); 10704 return static_cast<EntryType>(array.GetInt8(index));
11315 } 10705 }
11316 10706
11317 10707
11318 const char* ObjectPool::ToCString() const { 10708 const char* ObjectPool::ToCString() const {
11319 Zone* zone = Thread::Current()->zone(); 10709 Zone* zone = Thread::Current()->zone();
11320 return zone->PrintToString("ObjectPool len:%" Pd, Length()); 10710 return zone->PrintToString("ObjectPool len:%" Pd, Length());
11321 } 10711 }
11322 10712
11323 10713
11324 void ObjectPool::PrintJSONImpl(JSONStream* stream, bool ref) const {
11325 JSONObject jsobj(stream);
11326 AddCommonObjectProperties(&jsobj, "Object", ref);
11327 jsobj.AddServiceId(*this);
11328 jsobj.AddProperty("length", Length());
11329 if (ref) {
11330 return;
11331 }
11332
11333 {
11334 JSONArray jsarr(&jsobj, "_entries");
11335 uword imm;
11336 Object& obj = Object::Handle();
11337 for (intptr_t i = 0; i < Length(); i++) {
11338 JSONObject jsentry(stream);
11339 jsentry.AddProperty("offset", OffsetFromIndex(i));
11340 switch (InfoAt(i)) {
11341 case ObjectPool::kTaggedObject:
11342 obj = ObjectAt(i);
11343 jsentry.AddProperty("kind", "Object");
11344 jsentry.AddProperty("value", obj);
11345 break;
11346 case ObjectPool::kImmediate:
11347 imm = RawValueAt(i);
11348 jsentry.AddProperty("kind", "Immediate");
11349 jsentry.AddProperty64("value", imm);
11350 break;
11351 case ObjectPool::kNativeEntry:
11352 imm = RawValueAt(i);
11353 jsentry.AddProperty("kind", "NativeEntry");
11354 jsentry.AddProperty64("value", imm);
11355 break;
11356 default:
11357 UNREACHABLE();
11358 }
11359 }
11360 }
11361 }
11362
11363
11364 void ObjectPool::DebugPrint() const { 10714 void ObjectPool::DebugPrint() const {
11365 THR_Print("Object Pool: {\n"); 10715 THR_Print("Object Pool: {\n");
11366 for (intptr_t i = 0; i < Length(); i++) { 10716 for (intptr_t i = 0; i < Length(); i++) {
11367 intptr_t offset = OffsetFromIndex(i); 10717 intptr_t offset = OffsetFromIndex(i);
11368 THR_Print(" %" Pd " PP+0x%" Px ": ", i, offset); 10718 THR_Print(" %" Pd " PP+0x%" Px ": ", i, offset);
11369 if (InfoAt(i) == kTaggedObject) { 10719 if (InfoAt(i) == kTaggedObject) {
11370 RawObject* obj = ObjectAt(i); 10720 RawObject* obj = ObjectAt(i);
11371 THR_Print("0x%" Px " %s (obj)\n", 10721 THR_Print("0x%" Px " %s (obj)\n",
11372 reinterpret_cast<uword>(obj), 10722 reinterpret_cast<uword>(obj),
11373 Object::Handle(obj).ToCString()); 10723 Object::Handle(obj).ToCString());
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
11497 KindAsStr(iter.Kind()), 10847 KindAsStr(iter.Kind()),
11498 iter.DeoptId(), 10848 iter.DeoptId(),
11499 iter.TokenPos().ToCString(), 10849 iter.TokenPos().ToCString(),
11500 iter.TryIndex()); 10850 iter.TryIndex());
11501 } 10851 }
11502 return buffer; 10852 return buffer;
11503 #undef FORMAT 10853 #undef FORMAT
11504 } 10854 }
11505 10855
11506 10856
11507 void PcDescriptors::PrintToJSONObject(JSONObject* jsobj, bool ref) const {
11508 AddCommonObjectProperties(jsobj, "Object", ref);
11509 // TODO(johnmccutchan): Generate a stable id. PcDescriptors hang off a Code
11510 // object but do not have a back reference to generate an ID.
11511 jsobj->AddServiceId(*this);
11512 if (ref) {
11513 return;
11514 }
11515 JSONArray members(jsobj, "members");
11516 Iterator iter(*this, RawPcDescriptors::kAnyKind);
11517 while (iter.MoveNext()) {
11518 JSONObject descriptor(&members);
11519 descriptor.AddPropertyF("pcOffset", "%" Px "", iter.PcOffset());
11520 descriptor.AddProperty("kind", KindAsStr(iter.Kind()));
11521 descriptor.AddProperty("deoptId", iter.DeoptId());
11522 // TODO(turnidge): Use AddLocation instead.
11523 descriptor.AddProperty("tokenPos", iter.TokenPos());
11524 descriptor.AddProperty("tryIndex", iter.TryIndex());
11525 }
11526 }
11527
11528
11529 void PcDescriptors::PrintJSONImpl(JSONStream* stream, bool ref) const {
11530 JSONObject jsobj(stream);
11531 PrintToJSONObject(&jsobj, ref);
11532 }
11533
11534
11535 // Verify assumptions (in debug mode only). 10857 // Verify assumptions (in debug mode only).
11536 // - No two deopt descriptors have the same deoptimization id. 10858 // - No two deopt descriptors have the same deoptimization id.
11537 // - No two ic-call descriptors have the same deoptimization id (type feedback). 10859 // - No two ic-call descriptors have the same deoptimization id (type feedback).
11538 // A function without unique ids is marked as non-optimizable (e.g., because of 10860 // A function without unique ids is marked as non-optimizable (e.g., because of
11539 // finally blocks). 10861 // finally blocks).
11540 void PcDescriptors::Verify(const Function& function) const { 10862 void PcDescriptors::Verify(const Function& function) const {
11541 #if defined(DEBUG) 10863 #if defined(DEBUG)
11542 // Only check ids for unoptimized code that is optimizable. 10864 // Only check ids for unoptimized code that is optimizable.
11543 if (!function.IsOptimizable()) { 10865 if (!function.IsOptimizable()) {
11544 return; 10866 return;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
11623 size, 10945 size,
11624 Heap::kOld); 10946 Heap::kOld);
11625 NoSafepointScope no_safepoint; 10947 NoSafepointScope no_safepoint;
11626 result ^= raw; 10948 result ^= raw;
11627 result.SetLength(length); 10949 result.SetLength(length);
11628 } 10950 }
11629 return result.raw(); 10951 return result.raw();
11630 } 10952 }
11631 10953
11632 10954
11633 void CodeSourceMap::PrintJSONImpl(JSONStream* stream, bool ref) const {
11634 Object::PrintJSONImpl(stream, ref);
11635 }
11636
11637
11638 const char* CodeSourceMap::ToCString() const { 10955 const char* CodeSourceMap::ToCString() const {
11639 // "*" in a printf format specifier tells it to read the field width from 10956 // "*" in a printf format specifier tells it to read the field width from
11640 // the printf argument list. 10957 // the printf argument list.
11641 #define FORMAT "%#-*" Px "\t%s\n" 10958 #define FORMAT "%#-*" Px "\t%s\n"
11642 if (Length() == 0) { 10959 if (Length() == 0) {
11643 return "empty CodeSourceMap\n"; 10960 return "empty CodeSourceMap\n";
11644 } 10961 }
11645 // 4 bits per hex digit. 10962 // 4 bits per hex digit.
11646 const int addr_width = kBitsPerWord / 4; 10963 const int addr_width = kBitsPerWord / 4;
11647 // First compute the buffer size required. 10964 // First compute the buffer size required.
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
11802 for (intptr_t i = 0; i < Length(); i++) { 11119 for (intptr_t i = 0; i < Length(); i++) {
11803 chars[index++] = IsObject(i) ? '1' : '0'; 11120 chars[index++] = IsObject(i) ? '1' : '0';
11804 } 11121 }
11805 chars[index] = '\0'; 11122 chars[index] = '\0';
11806 return chars; 11123 return chars;
11807 } 11124 }
11808 #undef FORMAT 11125 #undef FORMAT
11809 } 11126 }
11810 11127
11811 11128
11812 void Stackmap::PrintJSONImpl(JSONStream* stream, bool ref) const {
11813 Object::PrintJSONImpl(stream, ref);
11814 }
11815
11816
11817 RawString* LocalVarDescriptors::GetName(intptr_t var_index) const { 11129 RawString* LocalVarDescriptors::GetName(intptr_t var_index) const {
11818 ASSERT(var_index < Length()); 11130 ASSERT(var_index < Length());
11819 ASSERT(Object::Handle(*raw()->nameAddrAt(var_index)).IsString()); 11131 ASSERT(Object::Handle(*raw()->nameAddrAt(var_index)).IsString());
11820 return *raw()->nameAddrAt(var_index); 11132 return *raw()->nameAddrAt(var_index);
11821 } 11133 }
11822 11134
11823 11135
11824 void LocalVarDescriptors::SetVar(intptr_t var_index, 11136 void LocalVarDescriptors::SetVar(intptr_t var_index,
11825 const String& name, 11137 const String& name,
11826 RawLocalVarDescriptors::VarInfo* info) const { 11138 RawLocalVarDescriptors::VarInfo* info) const {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
11903 var_name = GetName(i); 11215 var_name = GetName(i);
11904 GetInfo(i, &info); 11216 GetInfo(i, &info);
11905 num_chars += PrintVarInfo((buffer + num_chars), 11217 num_chars += PrintVarInfo((buffer + num_chars),
11906 (len - num_chars), 11218 (len - num_chars),
11907 i, var_name, info); 11219 i, var_name, info);
11908 } 11220 }
11909 return buffer; 11221 return buffer;
11910 } 11222 }
11911 11223
11912 11224
11913 void LocalVarDescriptors::PrintJSONImpl(JSONStream* stream,
11914 bool ref) const {
11915 JSONObject jsobj(stream);
11916 AddCommonObjectProperties(&jsobj, "Object", ref);
11917 // TODO(johnmccutchan): Generate a stable id. LocalVarDescriptors hang off
11918 // a Code object but do not have a back reference to generate an ID.
11919 jsobj.AddServiceId(*this);
11920 if (ref) {
11921 return;
11922 }
11923 JSONArray members(&jsobj, "members");
11924 String& var_name = String::Handle();
11925 for (intptr_t i = 0; i < Length(); i++) {
11926 RawLocalVarDescriptors::VarInfo info;
11927 var_name = GetName(i);
11928 GetInfo(i, &info);
11929 JSONObject var(&members);
11930 var.AddProperty("name", var_name.ToCString());
11931 var.AddProperty("index", static_cast<intptr_t>(info.index()));
11932 var.AddProperty("beginPos", info.begin_pos);
11933 var.AddProperty("endPos", info.end_pos);
11934 var.AddProperty("scopeId", static_cast<intptr_t>(info.scope_id));
11935 var.AddProperty("kind", KindToCString(info.kind()));
11936 }
11937 }
11938
11939
11940 const char* LocalVarDescriptors::KindToCString( 11225 const char* LocalVarDescriptors::KindToCString(
11941 RawLocalVarDescriptors::VarInfoKind kind) { 11226 RawLocalVarDescriptors::VarInfoKind kind) {
11942 switch (kind) { 11227 switch (kind) {
11943 case RawLocalVarDescriptors::kStackVar: 11228 case RawLocalVarDescriptors::kStackVar:
11944 return "StackVar"; 11229 return "StackVar";
11945 case RawLocalVarDescriptors::kContextVar: 11230 case RawLocalVarDescriptors::kContextVar:
11946 return "ContextVar"; 11231 return "ContextVar";
11947 case RawLocalVarDescriptors::kContextLevel: 11232 case RawLocalVarDescriptors::kContextLevel:
11948 return "ContextLevel"; 11233 return "ContextLevel";
11949 case RawLocalVarDescriptors::kSavedCurrentContext: 11234 case RawLocalVarDescriptors::kSavedCurrentContext:
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
12159 (len - num_chars), 11444 (len - num_chars),
12160 FORMAT2, k, type.ToCString()); 11445 FORMAT2, k, type.ToCString());
12161 } 11446 }
12162 } 11447 }
12163 return buffer; 11448 return buffer;
12164 #undef FORMAT1 11449 #undef FORMAT1
12165 #undef FORMAT2 11450 #undef FORMAT2
12166 } 11451 }
12167 11452
12168 11453
12169 void ExceptionHandlers::PrintJSONImpl(JSONStream* stream,
12170 bool ref) const {
12171 Object::PrintJSONImpl(stream, ref);
12172 }
12173
12174
12175 intptr_t DeoptInfo::FrameSize(const TypedData& packed) { 11454 intptr_t DeoptInfo::FrameSize(const TypedData& packed) {
12176 NoSafepointScope no_safepoint; 11455 NoSafepointScope no_safepoint;
12177 typedef ReadStream::Raw<sizeof(intptr_t), intptr_t> Reader; 11456 typedef ReadStream::Raw<sizeof(intptr_t), intptr_t> Reader;
12178 ReadStream read_stream(reinterpret_cast<uint8_t*>(packed.DataAddr(0)), 11457 ReadStream read_stream(reinterpret_cast<uint8_t*>(packed.DataAddr(0)),
12179 packed.LengthInBytes()); 11458 packed.LengthInBytes());
12180 return Reader::Read(&read_stream); 11459 return Reader::Read(&read_stream);
12181 } 11460 }
12182 11461
12183 11462
12184 intptr_t DeoptInfo::NumMaterializations( 11463 intptr_t DeoptInfo::NumMaterializations(
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after
12984 from.deopt_id(), 12263 from.deopt_id(),
12985 from.NumArgsTested())); 12264 from.NumArgsTested()));
12986 // Preserve entry array. 12265 // Preserve entry array.
12987 result.set_ic_data_array(Array::Handle(zone, from.ic_data())); 12266 result.set_ic_data_array(Array::Handle(zone, from.ic_data()));
12988 // Copy deoptimization reasons. 12267 // Copy deoptimization reasons.
12989 result.SetDeoptReasons(from.DeoptReasons()); 12268 result.SetDeoptReasons(from.DeoptReasons());
12990 return result.raw(); 12269 return result.raw();
12991 } 12270 }
12992 12271
12993 12272
12994 void ICData::PrintJSONImpl(JSONStream* stream, bool ref) const {
12995 JSONObject jsobj(stream);
12996 AddCommonObjectProperties(&jsobj, "Object", ref);
12997 jsobj.AddServiceId(*this);
12998 jsobj.AddProperty("_owner", Object::Handle(Owner()));
12999 jsobj.AddProperty("_selector", String::Handle(target_name()).ToCString());
13000 if (ref) {
13001 return;
13002 }
13003 jsobj.AddProperty("_argumentsDescriptor",
13004 Object::Handle(arguments_descriptor()));
13005 jsobj.AddProperty("_entries", Object::Handle(ic_data()));
13006 }
13007
13008
13009 void ICData::PrintToJSONArray(const JSONArray& jsarray,
13010 TokenPosition token_pos,
13011 bool is_static_call) const {
13012 Isolate* isolate = Isolate::Current();
13013 Class& cls = Class::Handle();
13014 Function& func = Function::Handle();
13015
13016 JSONObject jsobj(&jsarray);
13017 jsobj.AddProperty("name", String::Handle(target_name()).ToCString());
13018 jsobj.AddProperty("tokenPos", token_pos);
13019 // TODO(rmacnak): Figure out how to stringify DeoptReasons().
13020 // jsobj.AddProperty("deoptReasons", ...);
13021
13022 JSONArray cache_entries(&jsobj, "cacheEntries");
13023 for (intptr_t i = 0; i < NumberOfChecks(); i++) {
13024 func = GetTargetAt(i);
13025 if (is_static_call) {
13026 cls ^= func.Owner();
13027 } else {
13028 intptr_t cid = GetReceiverClassIdAt(i);
13029 cls ^= isolate->class_table()->At(cid);
13030 }
13031 intptr_t count = GetCountAt(i);
13032 JSONObject cache_entry(&cache_entries);
13033 if (cls.IsTopLevel()) {
13034 cache_entry.AddProperty("receiverContainer",
13035 Library::Handle(cls.library()));
13036 } else {
13037 cache_entry.AddProperty("receiverContainer", cls);
13038 }
13039 cache_entry.AddProperty("count", count);
13040 cache_entry.AddProperty("target", func);
13041 }
13042 }
13043
13044
13045 void ICData::PrintToJSONArrayNew(const JSONArray& jsarray,
13046 TokenPosition token_pos,
13047 bool is_static_call) const {
13048 Isolate* isolate = Isolate::Current();
13049 Class& cls = Class::Handle();
13050 Function& func = Function::Handle();
13051
13052 JSONObject jsobj(&jsarray);
13053 jsobj.AddProperty("name", String::Handle(target_name()).ToCString());
13054 jsobj.AddProperty("tokenPos", token_pos.value());
13055 // TODO(rmacnak): Figure out how to stringify DeoptReasons().
13056 // jsobj.AddProperty("deoptReasons", ...);
13057
13058 JSONArray cache_entries(&jsobj, "cacheEntries");
13059 for (intptr_t i = 0; i < NumberOfChecks(); i++) {
13060 JSONObject cache_entry(&cache_entries);
13061 func = GetTargetAt(i);
13062 intptr_t count = GetCountAt(i);
13063 if (!is_static_call) {
13064 intptr_t cid = GetReceiverClassIdAt(i);
13065 cls ^= isolate->class_table()->At(cid);
13066 cache_entry.AddProperty("receiver", cls);
13067 }
13068 cache_entry.AddProperty("target", func);
13069 cache_entry.AddProperty("count", count);
13070 }
13071 }
13072
13073
13074 static Token::Kind RecognizeArithmeticOp(const String& name) { 12273 static Token::Kind RecognizeArithmeticOp(const String& name) {
13075 ASSERT(name.IsSymbol()); 12274 ASSERT(name.IsSymbol());
13076 if (name.raw() == Symbols::Plus().raw()) { 12275 if (name.raw() == Symbols::Plus().raw()) {
13077 return Token::kADD; 12276 return Token::kADD;
13078 } else if (name.raw() == Symbols::Minus().raw()) { 12277 } else if (name.raw() == Symbols::Minus().raw()) {
13079 return Token::kSUB; 12278 return Token::kSUB;
13080 } else if (name.raw() == Symbols::Star().raw()) { 12279 } else if (name.raw() == Symbols::Star().raw()) {
13081 return Token::kMUL; 12280 return Token::kMUL;
13082 } else if (name.raw() == Symbols::Slash().raw()) { 12281 } else if (name.raw() == Symbols::Slash().raw()) {
13083 return Token::kDIV; 12282 return Token::kDIV;
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
13265 for (intptr_t i = kSCallTableEntryLength; 12464 for (intptr_t i = kSCallTableEntryLength;
13266 i < value.Length(); 12465 i < value.Length();
13267 i += kSCallTableEntryLength) { 12466 i += kSCallTableEntryLength) {
13268 ASSERT(value.At(i - kSCallTableEntryLength) < value.At(i)); 12467 ASSERT(value.At(i - kSCallTableEntryLength) < value.At(i));
13269 } 12468 }
13270 #endif // DEBUG 12469 #endif // DEBUG
13271 } 12470 }
13272 12471
13273 12472
13274 bool Code::HasBreakpoint() const { 12473 bool Code::HasBreakpoint() const {
12474 if (!FLAG_support_debugger) {
12475 return false;
12476 }
13275 return Isolate::Current()->debugger()->HasBreakpoint(*this); 12477 return Isolate::Current()->debugger()->HasBreakpoint(*this);
13276 } 12478 }
13277 12479
13278 12480
13279 RawTypedData* Code::GetDeoptInfoAtPc(uword pc, 12481 RawTypedData* Code::GetDeoptInfoAtPc(uword pc,
13280 ICData::DeoptReasonId* deopt_reason, 12482 ICData::DeoptReasonId* deopt_reason,
13281 uint32_t* deopt_flags) const { 12483 uint32_t* deopt_flags) const {
13282 ASSERT(is_optimized()); 12484 ASSERT(is_optimized());
13283 const Instructions& instrs = Instructions::Handle(instructions()); 12485 const Instructions& instrs = Instructions::Handle(instructions());
13284 uword code_entry = instrs.EntryPoint(); 12486 uword code_entry = instrs.EntryPoint();
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
13811 DEBUG_ASSERT(IsMutatorOrAtSafepoint() || !is_alive()); 13013 DEBUG_ASSERT(IsMutatorOrAtSafepoint() || !is_alive());
13812 // RawInstructions are never allocated in New space and hence a 13014 // RawInstructions are never allocated in New space and hence a
13813 // store buffer update is not needed here. 13015 // store buffer update is not needed here.
13814 StorePointer(&raw_ptr()->active_instructions_, instructions); 13016 StorePointer(&raw_ptr()->active_instructions_, instructions);
13815 StoreNonPointer(&raw_ptr()->entry_point_, 13017 StoreNonPointer(&raw_ptr()->entry_point_,
13816 reinterpret_cast<uword>(instructions->ptr()) + 13018 reinterpret_cast<uword>(instructions->ptr()) +
13817 Instructions::HeaderSize()); 13019 Instructions::HeaderSize());
13818 } 13020 }
13819 13021
13820 13022
13821 void Code::PrintJSONImpl(JSONStream* stream, bool ref) const {
13822 JSONObject jsobj(stream);
13823 AddCommonObjectProperties(&jsobj, "Code", ref);
13824 jsobj.AddFixedServiceId("code/%" Px64"-%" Px "",
13825 compile_timestamp(),
13826 EntryPoint());
13827 const String& user_name = String::Handle(PrettyName());
13828 const String& vm_name = String::Handle(Name());
13829 AddNameProperties(&jsobj, user_name, vm_name);
13830 const bool is_stub = IsStubCode() || IsAllocationStubCode();
13831 if (is_stub) {
13832 jsobj.AddProperty("kind", "Stub");
13833 } else {
13834 jsobj.AddProperty("kind", "Dart");
13835 }
13836 jsobj.AddProperty("_optimized", is_optimized());
13837 const Object& obj = Object::Handle(owner());
13838 if (obj.IsFunction()) {
13839 const Function& func = Function::Cast(obj);
13840 jsobj.AddProperty("_intrinsic", func.is_intrinsic());
13841 jsobj.AddProperty("_native", func.is_native());
13842 } else {
13843 jsobj.AddProperty("_intrinsic", false);
13844 jsobj.AddProperty("_native", false);
13845 }
13846 if (ref) {
13847 return;
13848 }
13849 if (obj.IsFunction()) {
13850 jsobj.AddProperty("function", obj);
13851 } else {
13852 // Generate a fake function reference.
13853 JSONObject func(&jsobj, "function");
13854 func.AddProperty("type", "@Function");
13855 func.AddProperty("_kind", "Stub");
13856 func.AddProperty("name", user_name.ToCString());
13857 AddNameProperties(&func, user_name, vm_name);
13858 }
13859 jsobj.AddPropertyF("_startAddress", "%" Px "", EntryPoint());
13860 jsobj.AddPropertyF("_endAddress", "%" Px "", EntryPoint() + Size());
13861 jsobj.AddProperty("_alive", is_alive());
13862 const ObjectPool& object_pool = ObjectPool::Handle(GetObjectPool());
13863 jsobj.AddProperty("_objectPool", object_pool);
13864 {
13865 JSONArray jsarr(&jsobj, "_disassembly");
13866 if (is_alive()) {
13867 // Only disassemble alive code objects.
13868 DisassembleToJSONStream formatter(jsarr);
13869 Disassemble(&formatter);
13870 }
13871 }
13872 const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
13873 if (!descriptors.IsNull()) {
13874 JSONObject desc(&jsobj, "_descriptors");
13875 descriptors.PrintToJSONObject(&desc, false);
13876 }
13877 const Array& inlined_function_table = Array::Handle(GetInlinedIdToFunction());
13878 if (!inlined_function_table.IsNull() &&
13879 (inlined_function_table.Length() > 0)) {
13880 JSONArray inlined_functions(&jsobj, "_inlinedFunctions");
13881 Function& function = Function::Handle();
13882 for (intptr_t i = 0; i < inlined_function_table.Length(); i++) {
13883 function ^= inlined_function_table.At(i);
13884 ASSERT(!function.IsNull());
13885 inlined_functions.AddValue(function);
13886 }
13887 }
13888 const Array& intervals = Array::Handle(GetInlinedIntervals());
13889 if (!intervals.IsNull() && (intervals.Length() > 0)) {
13890 Smi& start = Smi::Handle();
13891 Smi& end = Smi::Handle();
13892 Smi& temp_smi = Smi::Handle();
13893 JSONArray inline_intervals(&jsobj, "_inlinedIntervals");
13894 for (intptr_t i = 0; i < intervals.Length() - Code::kInlIntNumEntries;
13895 i += Code::kInlIntNumEntries) {
13896 start ^= intervals.At(i + Code::kInlIntStart);
13897 if (start.IsNull()) {
13898 continue;
13899 }
13900 end ^= intervals.At(i + Code::kInlIntNumEntries + Code::kInlIntStart);
13901
13902 // Format: [start, end, inline functions...]
13903 JSONArray inline_interval(&inline_intervals);
13904 inline_interval.AddValue(start.Value());
13905 inline_interval.AddValue(end.Value());
13906
13907 temp_smi ^= intervals.At(i + Code::kInlIntInliningId);
13908 intptr_t inlining_id = temp_smi.Value();
13909 ASSERT(inlining_id >= 0);
13910 intptr_t caller_id = GetCallerId(inlining_id);
13911 while (inlining_id >= 0) {
13912 inline_interval.AddValue(inlining_id);
13913 inlining_id = caller_id;
13914 caller_id = GetCallerId(inlining_id);
13915 }
13916 }
13917 }
13918 }
13919
13920
13921 uword Code::GetLazyDeoptPc() const { 13023 uword Code::GetLazyDeoptPc() const {
13922 return (lazy_deopt_pc_offset() != kInvalidPc) 13024 return (lazy_deopt_pc_offset() != kInvalidPc)
13923 ? EntryPoint() + lazy_deopt_pc_offset() : 0; 13025 ? EntryPoint() + lazy_deopt_pc_offset() : 0;
13924 } 13026 }
13925 13027
13926 13028
13927 RawStackmap* Code::GetStackmap( 13029 RawStackmap* Code::GetStackmap(
13928 uint32_t pc_offset, Array* maps, Stackmap* map) const { 13030 uint32_t pc_offset, Array* maps, Stackmap* map) const {
13929 // This code is used during iterating frames during a GC and hence it 13031 // This code is used during iterating frames during a GC and hence it
13930 // should not in turn start a GC. 13032 // should not in turn start a GC.
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
14121 13223
14122 const Context& parent_ctx = Context::Handle(parent()); 13224 const Context& parent_ctx = Context::Handle(parent());
14123 if (!parent_ctx.IsNull()) { 13225 if (!parent_ctx.IsNull()) {
14124 parent_ctx.Dump(indent + 2); 13226 parent_ctx.Dump(indent + 2);
14125 } 13227 }
14126 IndentN(indent); 13228 IndentN(indent);
14127 THR_Print("}\n"); 13229 THR_Print("}\n");
14128 } 13230 }
14129 13231
14130 13232
14131 void Context::PrintJSONImpl(JSONStream* stream, bool ref) const {
14132 JSONObject jsobj(stream);
14133 // TODO(turnidge): Should the user level type for Context be Context
14134 // or Object?
14135 AddCommonObjectProperties(&jsobj, "Context", ref);
14136 jsobj.AddServiceId(*this);
14137
14138 jsobj.AddProperty("length", num_variables());
14139
14140 if (ref) {
14141 return;
14142 }
14143
14144 const Context& parent_context = Context::Handle(parent());
14145 if (!parent_context.IsNull()) {
14146 jsobj.AddProperty("parent", parent_context);
14147 }
14148
14149 JSONArray jsarr(&jsobj, "variables");
14150 Object& var = Object::Handle();
14151 for (intptr_t index = 0; index < num_variables(); index++) {
14152 var = At(index);
14153 JSONObject jselement(&jsarr);
14154 jselement.AddProperty("value", var);
14155 }
14156 }
14157
14158
14159 RawContextScope* ContextScope::New(intptr_t num_variables, bool is_implicit) { 13233 RawContextScope* ContextScope::New(intptr_t num_variables, bool is_implicit) {
14160 ASSERT(Object::context_scope_class() != Class::null()); 13234 ASSERT(Object::context_scope_class() != Class::null());
14161 if (num_variables < 0 || num_variables > kMaxElements) { 13235 if (num_variables < 0 || num_variables > kMaxElements) {
14162 // This should be caught before we reach here. 13236 // This should be caught before we reach here.
14163 FATAL1("Fatal error in ContextScope::New: invalid num_variables %" Pd "\n", 13237 FATAL1("Fatal error in ContextScope::New: invalid num_variables %" Pd "\n",
14164 num_variables); 13238 num_variables);
14165 } 13239 }
14166 intptr_t size = ContextScope::InstanceSize(num_variables); 13240 intptr_t size = ContextScope::InstanceSize(num_variables);
14167 ContextScope& result = ContextScope::Handle(); 13241 ContextScope& result = ContextScope::Handle();
14168 { 13242 {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
14282 intptr_t lvl = ContextLevelAt(i); 13356 intptr_t lvl = ContextLevelAt(i);
14283 char* chars = OS::SCreate(Thread::Current()->zone(), 13357 char* chars = OS::SCreate(Thread::Current()->zone(),
14284 "%s\nvar %s token-pos %s ctx lvl %" Pd " index %" Pd "", 13358 "%s\nvar %s token-pos %s ctx lvl %" Pd " index %" Pd "",
14285 prev_cstr, cname, pos.ToCString(), lvl, idx); 13359 prev_cstr, cname, pos.ToCString(), lvl, idx);
14286 prev_cstr = chars; 13360 prev_cstr = chars;
14287 } 13361 }
14288 return prev_cstr; 13362 return prev_cstr;
14289 } 13363 }
14290 13364
14291 13365
14292 void ContextScope::PrintJSONImpl(JSONStream* stream, bool ref) const {
14293 Object::PrintJSONImpl(stream, ref);
14294 }
14295
14296
14297 RawArray* MegamorphicCache::buckets() const { 13366 RawArray* MegamorphicCache::buckets() const {
14298 return raw_ptr()->buckets_; 13367 return raw_ptr()->buckets_;
14299 } 13368 }
14300 13369
14301 13370
14302 void MegamorphicCache::set_buckets(const Array& buckets) const { 13371 void MegamorphicCache::set_buckets(const Array& buckets) const {
14303 StorePointer(&raw_ptr()->buckets_, buckets.raw()); 13372 StorePointer(&raw_ptr()->buckets_, buckets.raw());
14304 } 13373 }
14305 13374
14306 13375
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
14427 } 13496 }
14428 13497
14429 13498
14430 const char* MegamorphicCache::ToCString() const { 13499 const char* MegamorphicCache::ToCString() const {
14431 const String& name = String::Handle(target_name()); 13500 const String& name = String::Handle(target_name());
14432 return OS::SCreate(Thread::Current()->zone(), 13501 return OS::SCreate(Thread::Current()->zone(),
14433 "MegamorphicCache(%s)", name.ToCString()); 13502 "MegamorphicCache(%s)", name.ToCString());
14434 } 13503 }
14435 13504
14436 13505
14437 void MegamorphicCache::PrintJSONImpl(JSONStream* stream, bool ref) const {
14438 JSONObject jsobj(stream);
14439 AddCommonObjectProperties(&jsobj, "Object", ref);
14440 jsobj.AddServiceId(*this);
14441 jsobj.AddProperty("_selector", String::Handle(target_name()).ToCString());
14442 if (ref) {
14443 return;
14444 }
14445 jsobj.AddProperty("_buckets", Object::Handle(buckets()));
14446 jsobj.AddProperty("_mask", mask());
14447 jsobj.AddProperty("_argumentsDescriptor",
14448 Object::Handle(arguments_descriptor()));
14449 }
14450
14451
14452 RawSubtypeTestCache* SubtypeTestCache::New() { 13506 RawSubtypeTestCache* SubtypeTestCache::New() {
14453 ASSERT(Object::subtypetestcache_class() != Class::null()); 13507 ASSERT(Object::subtypetestcache_class() != Class::null());
14454 SubtypeTestCache& result = SubtypeTestCache::Handle(); 13508 SubtypeTestCache& result = SubtypeTestCache::Handle();
14455 { 13509 {
14456 // SubtypeTestCache objects are long living objects, allocate them in the 13510 // SubtypeTestCache objects are long living objects, allocate them in the
14457 // old generation. 13511 // old generation.
14458 RawObject* raw = Object::Allocate(SubtypeTestCache::kClassId, 13512 RawObject* raw = Object::Allocate(SubtypeTestCache::kClassId,
14459 SubtypeTestCache::InstanceSize(), 13513 SubtypeTestCache::InstanceSize(),
14460 Heap::kOld); 13514 Heap::kOld);
14461 NoSafepointScope no_safepoint; 13515 NoSafepointScope no_safepoint;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
14513 data.At(data_pos + kInstantiatorTypeArguments); 13567 data.At(data_pos + kInstantiatorTypeArguments);
14514 *test_result ^= data.At(data_pos + kTestResult); 13568 *test_result ^= data.At(data_pos + kTestResult);
14515 } 13569 }
14516 13570
14517 13571
14518 const char* SubtypeTestCache::ToCString() const { 13572 const char* SubtypeTestCache::ToCString() const {
14519 return "SubtypeTestCache"; 13573 return "SubtypeTestCache";
14520 } 13574 }
14521 13575
14522 13576
14523 void SubtypeTestCache::PrintJSONImpl(JSONStream* stream, bool ref) const {
14524 Object::PrintJSONImpl(stream, ref);
14525 }
14526
14527
14528 const char* Error::ToErrorCString() const { 13577 const char* Error::ToErrorCString() const {
14529 UNREACHABLE(); 13578 UNREACHABLE();
14530 return "Internal Error"; 13579 return "Internal Error";
14531 } 13580 }
14532 13581
14533 13582
14534 const char* Error::ToCString() const { 13583 const char* Error::ToCString() const {
14535 // Error is an abstract class. We should never reach here. 13584 // Error is an abstract class. We should never reach here.
14536 UNREACHABLE(); 13585 UNREACHABLE();
14537 return "Error"; 13586 return "Error";
14538 } 13587 }
14539 13588
14540 13589
14541 void Error::PrintJSONImpl(JSONStream* stream, bool ref) const {
14542 UNREACHABLE();
14543 }
14544
14545
14546 RawApiError* ApiError::New() { 13590 RawApiError* ApiError::New() {
14547 ASSERT(Object::api_error_class() != Class::null()); 13591 ASSERT(Object::api_error_class() != Class::null());
14548 RawObject* raw = Object::Allocate(ApiError::kClassId, 13592 RawObject* raw = Object::Allocate(ApiError::kClassId,
14549 ApiError::InstanceSize(), 13593 ApiError::InstanceSize(),
14550 Heap::kOld); 13594 Heap::kOld);
14551 return reinterpret_cast<RawApiError*>(raw); 13595 return reinterpret_cast<RawApiError*>(raw);
14552 } 13596 }
14553 13597
14554 13598
14555 RawApiError* ApiError::New(const String& message, Heap::Space space) { 13599 RawApiError* ApiError::New(const String& message, Heap::Space space) {
(...skipping 20 matching lines...) Expand all
14576 const String& msg_str = String::Handle(message()); 13620 const String& msg_str = String::Handle(message());
14577 return msg_str.ToCString(); 13621 return msg_str.ToCString();
14578 } 13622 }
14579 13623
14580 13624
14581 const char* ApiError::ToCString() const { 13625 const char* ApiError::ToCString() const {
14582 return "ApiError"; 13626 return "ApiError";
14583 } 13627 }
14584 13628
14585 13629
14586 void ApiError::PrintJSONImpl(JSONStream* stream, bool ref) const {
14587 JSONObject jsobj(stream);
14588 AddCommonObjectProperties(&jsobj, "Error", ref);
14589 jsobj.AddProperty("kind", "InternalError");
14590 jsobj.AddServiceId(*this);
14591 jsobj.AddProperty("message", ToErrorCString());
14592 }
14593
14594
14595 RawLanguageError* LanguageError::New() { 13630 RawLanguageError* LanguageError::New() {
14596 ASSERT(Object::language_error_class() != Class::null()); 13631 ASSERT(Object::language_error_class() != Class::null());
14597 RawObject* raw = Object::Allocate(LanguageError::kClassId, 13632 RawObject* raw = Object::Allocate(LanguageError::kClassId,
14598 LanguageError::InstanceSize(), 13633 LanguageError::InstanceSize(),
14599 Heap::kOld); 13634 Heap::kOld);
14600 return reinterpret_cast<RawLanguageError*>(raw); 13635 return reinterpret_cast<RawLanguageError*>(raw);
14601 } 13636 }
14602 13637
14603 13638
14604 RawLanguageError* LanguageError::NewFormattedV(const Error& prev_error, 13639 RawLanguageError* LanguageError::NewFormattedV(const Error& prev_error,
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
14726 const String& msg_str = String::Handle(FormatMessage()); 13761 const String& msg_str = String::Handle(FormatMessage());
14727 return msg_str.ToCString(); 13762 return msg_str.ToCString();
14728 } 13763 }
14729 13764
14730 13765
14731 const char* LanguageError::ToCString() const { 13766 const char* LanguageError::ToCString() const {
14732 return "LanguageError"; 13767 return "LanguageError";
14733 } 13768 }
14734 13769
14735 13770
14736 void LanguageError::PrintJSONImpl(JSONStream* stream, bool ref) const {
14737 JSONObject jsobj(stream);
14738 AddCommonObjectProperties(&jsobj, "Error", ref);
14739 jsobj.AddProperty("kind", "LanguageError");
14740 jsobj.AddServiceId(*this);
14741 jsobj.AddProperty("message", ToErrorCString());
14742 }
14743
14744
14745 RawUnhandledException* UnhandledException::New(const Instance& exception, 13771 RawUnhandledException* UnhandledException::New(const Instance& exception,
14746 const Instance& stacktrace, 13772 const Instance& stacktrace,
14747 Heap::Space space) { 13773 Heap::Space space) {
14748 ASSERT(Object::unhandled_exception_class() != Class::null()); 13774 ASSERT(Object::unhandled_exception_class() != Class::null());
14749 UnhandledException& result = UnhandledException::Handle(); 13775 UnhandledException& result = UnhandledException::Handle();
14750 { 13776 {
14751 RawObject* raw = Object::Allocate(UnhandledException::kClassId, 13777 RawObject* raw = Object::Allocate(UnhandledException::kClassId,
14752 UnhandledException::InstanceSize(), 13778 UnhandledException::InstanceSize(),
14753 space); 13779 space);
14754 NoSafepointScope no_safepoint; 13780 NoSafepointScope no_safepoint;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
14815 return OS::SCreate(thread->zone(), 13841 return OS::SCreate(thread->zone(),
14816 "Unhandled exception:\n%s\n%s", exc_str, stack_str); 13842 "Unhandled exception:\n%s\n%s", exc_str, stack_str);
14817 } 13843 }
14818 13844
14819 13845
14820 const char* UnhandledException::ToCString() const { 13846 const char* UnhandledException::ToCString() const {
14821 return "UnhandledException"; 13847 return "UnhandledException";
14822 } 13848 }
14823 13849
14824 13850
14825
14826 void UnhandledException::PrintJSONImpl(JSONStream* stream,
14827 bool ref) const {
14828 JSONObject jsobj(stream);
14829 AddCommonObjectProperties(&jsobj, "Error", ref);
14830 jsobj.AddProperty("kind", "UnhandledException");
14831 jsobj.AddServiceId(*this);
14832 jsobj.AddProperty("message", ToErrorCString());
14833 if (ref) {
14834 return;
14835 }
14836 Instance& instance = Instance::Handle();
14837 instance = exception();
14838 jsobj.AddProperty("exception", instance);
14839 instance = stacktrace();
14840 jsobj.AddProperty("stacktrace", instance);
14841 }
14842
14843
14844 RawUnwindError* UnwindError::New(const String& message, Heap::Space space) { 13851 RawUnwindError* UnwindError::New(const String& message, Heap::Space space) {
14845 ASSERT(Object::unwind_error_class() != Class::null()); 13852 ASSERT(Object::unwind_error_class() != Class::null());
14846 UnwindError& result = UnwindError::Handle(); 13853 UnwindError& result = UnwindError::Handle();
14847 { 13854 {
14848 RawObject* raw = Object::Allocate(UnwindError::kClassId, 13855 RawObject* raw = Object::Allocate(UnwindError::kClassId,
14849 UnwindError::InstanceSize(), 13856 UnwindError::InstanceSize(),
14850 space); 13857 space);
14851 NoSafepointScope no_safepoint; 13858 NoSafepointScope no_safepoint;
14852 result ^= raw; 13859 result ^= raw;
14853 } 13860 }
(...skipping 23 matching lines...) Expand all
14877 const String& msg_str = String::Handle(message()); 13884 const String& msg_str = String::Handle(message());
14878 return msg_str.ToCString(); 13885 return msg_str.ToCString();
14879 } 13886 }
14880 13887
14881 13888
14882 const char* UnwindError::ToCString() const { 13889 const char* UnwindError::ToCString() const {
14883 return "UnwindError"; 13890 return "UnwindError";
14884 } 13891 }
14885 13892
14886 13893
14887 void UnwindError::PrintJSONImpl(JSONStream* stream, bool ref) const {
14888 JSONObject jsobj(stream);
14889 AddCommonObjectProperties(&jsobj, "Error", ref);
14890 jsobj.AddProperty("kind", "TerminationError");
14891 jsobj.AddServiceId(*this);
14892 jsobj.AddProperty("message", ToErrorCString());
14893 jsobj.AddProperty("_is_user_initiated", is_user_initiated());
14894 jsobj.AddProperty("_is_vm_restart", is_vm_restart());
14895 }
14896
14897
14898 RawObject* Instance::Evaluate(const String& expr, 13894 RawObject* Instance::Evaluate(const String& expr,
14899 const Array& param_names, 13895 const Array& param_names,
14900 const Array& param_values) const { 13896 const Array& param_values) const {
14901 const Class& cls = Class::Handle(clazz()); 13897 const Class& cls = Class::Handle(clazz());
14902 const Function& eval_func = 13898 const Function& eval_func =
14903 Function::Handle(EvaluateHelper(cls, expr, param_names, false)); 13899 Function::Handle(EvaluateHelper(cls, expr, param_names, false));
14904 const Array& args = Array::Handle(Array::New(1 + param_values.Length())); 13900 const Array& args = Array::Handle(Array::New(1 + param_values.Length()));
14905 PassiveObject& param = PassiveObject::Handle(); 13901 PassiveObject& param = PassiveObject::Handle();
14906 args.SetAt(0, *this); 13902 args.SetAt(0, *this);
14907 for (intptr_t i = 0; i < param_values.Length(); i++) { 13903 for (intptr_t i = 0; i < param_values.Length(); i++) {
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after
15430 } 14426 }
15431 const Type& type = Type::Handle( 14427 const Type& type = Type::Handle(
15432 Type::New(cls, type_arguments, TokenPosition::kNoSource)); 14428 Type::New(cls, type_arguments, TokenPosition::kNoSource));
15433 const String& type_name = String::Handle(type.UserVisibleName()); 14429 const String& type_name = String::Handle(type.UserVisibleName());
15434 return OS::SCreate(Thread::Current()->zone(), 14430 return OS::SCreate(Thread::Current()->zone(),
15435 "Instance of '%s'", type_name.ToCString()); 14431 "Instance of '%s'", type_name.ToCString());
15436 } 14432 }
15437 } 14433 }
15438 14434
15439 14435
15440 void Instance::PrintSharedInstanceJSON(JSONObject* jsobj,
15441 bool ref) const {
15442 AddCommonObjectProperties(jsobj, "Instance", ref);
15443 if (ref) {
15444 return;
15445 }
15446
15447 // Walk the superclass chain, adding all instance fields.
15448 Class& cls = Class::Handle(this->clazz());
15449 {
15450 Instance& fieldValue = Instance::Handle();
15451 JSONArray jsarr(jsobj, "fields");
15452 while (!cls.IsNull()) {
15453 const Array& field_array = Array::Handle(cls.fields());
15454 Field& field = Field::Handle();
15455 if (!field_array.IsNull()) {
15456 for (intptr_t i = 0; i < field_array.Length(); i++) {
15457 field ^= field_array.At(i);
15458 if (!field.is_static()) {
15459 fieldValue ^= GetField(field);
15460 JSONObject jsfield(&jsarr);
15461 jsfield.AddProperty("type", "BoundField");
15462 jsfield.AddProperty("decl", field);
15463 jsfield.AddProperty("value", fieldValue);
15464 }
15465 }
15466 }
15467 cls = cls.SuperClass();
15468 }
15469 }
15470
15471 if (NumNativeFields() > 0) {
15472 JSONArray jsarr(jsobj, "_nativeFields");
15473 for (intptr_t i = 0; i < NumNativeFields(); i++) {
15474 intptr_t value = GetNativeField(i);
15475 JSONObject jsfield(&jsarr);
15476 jsfield.AddProperty("index", i);
15477 jsfield.AddProperty("value", value);
15478 }
15479 }
15480 }
15481
15482
15483 void Instance::PrintJSONImpl(JSONStream* stream, bool ref) const {
15484 JSONObject jsobj(stream);
15485
15486 // Handle certain special instance values.
15487 if (raw() == Object::sentinel().raw()) {
15488 jsobj.AddProperty("type", "Sentinel");
15489 jsobj.AddProperty("kind", "NotInitialized");
15490 jsobj.AddProperty("valueAsString", "<not initialized>");
15491 return;
15492 } else if (raw() == Object::transition_sentinel().raw()) {
15493 jsobj.AddProperty("type", "Sentinel");
15494 jsobj.AddProperty("kind", "BeingInitialized");
15495 jsobj.AddProperty("valueAsString", "<being initialized>");
15496 return;
15497 }
15498
15499 PrintSharedInstanceJSON(&jsobj, ref);
15500 if (IsClosure()) {
15501 jsobj.AddProperty("kind", "Closure");
15502 } else {
15503 jsobj.AddProperty("kind", "PlainInstance");
15504 }
15505 jsobj.AddServiceId(*this);
15506 if (IsClosure()) {
15507 jsobj.AddProperty("closureFunction",
15508 Function::Handle(Closure::Cast(*this).function()));
15509 jsobj.AddProperty("closureContext",
15510 Context::Handle(Closure::Cast(*this).context()));
15511 }
15512 if (ref) {
15513 return;
15514 }
15515 if (IsClosure()) {
15516 Debugger* debugger = Isolate::Current()->debugger();
15517 Breakpoint* bpt = debugger->BreakpointAtActivation(*this);
15518 if (bpt != NULL) {
15519 jsobj.AddProperty("_activationBreakpoint", bpt);
15520 }
15521 }
15522 }
15523
15524
15525 bool AbstractType::IsResolved() const { 14436 bool AbstractType::IsResolved() const {
15526 // AbstractType is an abstract class. 14437 // AbstractType is an abstract class.
15527 UNREACHABLE(); 14438 UNREACHABLE();
15528 return false; 14439 return false;
15529 } 14440 }
15530 14441
15531 14442
15532 void AbstractType::SetIsResolved() const { 14443 void AbstractType::SetIsResolved() const {
15533 // AbstractType is an abstract class. 14444 // AbstractType is an abstract class.
15534 UNREACHABLE(); 14445 UNREACHABLE();
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
16066 } 14977 }
16067 14978
16068 14979
16069 const char* AbstractType::ToCString() const { 14980 const char* AbstractType::ToCString() const {
16070 // AbstractType is an abstract class. 14981 // AbstractType is an abstract class.
16071 UNREACHABLE(); 14982 UNREACHABLE();
16072 return "AbstractType"; 14983 return "AbstractType";
16073 } 14984 }
16074 14985
16075 14986
16076 void AbstractType::PrintJSONImpl(JSONStream* stream, bool ref) const {
16077 UNREACHABLE();
16078 }
16079
16080
16081 RawType* Type::NullType() { 14987 RawType* Type::NullType() {
16082 return Isolate::Current()->object_store()->null_type(); 14988 return Isolate::Current()->object_store()->null_type();
16083 } 14989 }
16084 14990
16085 14991
16086 RawType* Type::DynamicType() { 14992 RawType* Type::DynamicType() {
16087 return Object::dynamic_type().raw(); 14993 return Object::dynamic_type().raw();
16088 } 14994 }
16089 14995
16090 14996
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
16667 "Type: (@%p H%" Px ") class '%s', args:[%s]", 15573 "Type: (@%p H%" Px ") class '%s', args:[%s]",
16668 raw(), hash, class_name, args_cstr); 15574 raw(), hash, class_name, args_cstr);
16669 } else { 15575 } else {
16670 const char* args_cstr = TypeArguments::Handle(arguments()).ToCString(); 15576 const char* args_cstr = TypeArguments::Handle(arguments()).ToCString();
16671 return OS::SCreate(Thread::Current()->zone(), 15577 return OS::SCreate(Thread::Current()->zone(),
16672 "%sType: class '%s', args:[%s]", unresolved, class_name, args_cstr); 15578 "%sType: class '%s', args:[%s]", unresolved, class_name, args_cstr);
16673 } 15579 }
16674 } 15580 }
16675 15581
16676 15582
16677 void Type::PrintJSONImpl(JSONStream* stream, bool ref) const {
16678 JSONObject jsobj(stream);
16679 PrintSharedInstanceJSON(&jsobj, ref);
16680 jsobj.AddProperty("kind", "Type");
16681 if (IsCanonical()) {
16682 const Class& type_cls = Class::Handle(type_class());
16683 intptr_t id = type_cls.FindCanonicalTypeIndex(*this);
16684 ASSERT(id >= 0);
16685 intptr_t cid = type_cls.id();
16686 jsobj.AddFixedServiceId("classes/%" Pd "/types/%" Pd "", cid, id);
16687 jsobj.AddProperty("typeClass", type_cls);
16688 } else {
16689 jsobj.AddServiceId(*this);
16690 }
16691 const String& user_name = String::Handle(PrettyName());
16692 const String& vm_name = String::Handle(Name());
16693 AddNameProperties(&jsobj, user_name, vm_name);
16694 if (ref) {
16695 return;
16696 }
16697 const TypeArguments& typeArgs = TypeArguments::Handle(arguments());
16698 if (!typeArgs.IsNull()) {
16699 jsobj.AddProperty("typeArguments", typeArgs);
16700 }
16701 }
16702
16703
16704 void FunctionType::SetIsFinalized() const { 15583 void FunctionType::SetIsFinalized() const {
16705 ASSERT(!IsFinalized()); 15584 ASSERT(!IsFinalized());
16706 if (IsInstantiated()) { 15585 if (IsInstantiated()) {
16707 set_type_state(RawFunctionType::kFinalizedInstantiated); 15586 set_type_state(RawFunctionType::kFinalizedInstantiated);
16708 } else { 15587 } else {
16709 set_type_state(RawFunctionType::kFinalizedUninstantiated); 15588 set_type_state(RawFunctionType::kFinalizedUninstantiated);
16710 } 15589 }
16711 } 15590 }
16712 15591
16713 15592
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
17213 return OS::SCreate( 16092 return OS::SCreate(
17214 Thread::Current()->zone(), 16093 Thread::Current()->zone(),
17215 "%s FunctionType: %s (scope_cls: %s, args: %s)", 16094 "%s FunctionType: %s (scope_cls: %s, args: %s)",
17216 unresolved, 16095 unresolved,
17217 signature_string.ToCString(), 16096 signature_string.ToCString(),
17218 class_name, 16097 class_name,
17219 args_cstr); 16098 args_cstr);
17220 } 16099 }
17221 16100
17222 16101
17223 void FunctionType::PrintJSONImpl(JSONStream* stream, bool ref) const {
17224 JSONObject jsobj(stream);
17225 PrintSharedInstanceJSON(&jsobj, ref);
17226 jsobj.AddProperty("kind", "FunctionType");
17227 if (IsCanonical()) {
17228 const Class& scope_cls = Class::Handle(scope_class());
17229 intptr_t id = scope_cls.FindCanonicalTypeIndex(*this);
17230 ASSERT(id >= 0);
17231 intptr_t cid = scope_cls.id();
17232 jsobj.AddFixedServiceId("classes/%" Pd "/types/%" Pd "", cid, id);
17233 jsobj.AddProperty("scopeClass", scope_cls);
17234 } else {
17235 jsobj.AddServiceId(*this);
17236 }
17237 const String& user_name = String::Handle(PrettyName());
17238 const String& vm_name = String::Handle(Name());
17239 AddNameProperties(&jsobj, user_name, vm_name);
17240 if (ref) {
17241 return;
17242 }
17243 const TypeArguments& typeArgs = TypeArguments::Handle(arguments());
17244 if (!typeArgs.IsNull()) {
17245 jsobj.AddProperty("typeArguments", typeArgs);
17246 }
17247 }
17248
17249
17250 bool TypeRef::IsInstantiated(TrailPtr trail) const { 16102 bool TypeRef::IsInstantiated(TrailPtr trail) const {
17251 if (TestAndAddToTrail(&trail)) { 16103 if (TestAndAddToTrail(&trail)) {
17252 return true; 16104 return true;
17253 } 16105 }
17254 return AbstractType::Handle(type()).IsInstantiated(trail); 16106 return AbstractType::Handle(type()).IsInstantiated(trail);
17255 } 16107 }
17256 16108
17257 16109
17258 bool TypeRef::IsEquivalent(const Instance& other, TrailPtr trail) const { 16110 bool TypeRef::IsEquivalent(const Instance& other, TrailPtr trail) const {
17259 if (raw() == other.raw()) { 16111 if (raw() == other.raw()) {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
17400 const intptr_t hash = ref_type.Hash(); 16252 const intptr_t hash = ref_type.Hash();
17401 return OS::SCreate(Thread::Current()->zone(), 16253 return OS::SCreate(Thread::Current()->zone(),
17402 "TypeRef: %s<...> (@%p H%" Px ")", type_cstr, ref_type.raw(), hash); 16254 "TypeRef: %s<...> (@%p H%" Px ")", type_cstr, ref_type.raw(), hash);
17403 } else { 16255 } else {
17404 return OS::SCreate(Thread::Current()->zone(), 16256 return OS::SCreate(Thread::Current()->zone(),
17405 "TypeRef: %s<...>", type_cstr); 16257 "TypeRef: %s<...>", type_cstr);
17406 } 16258 }
17407 } 16259 }
17408 16260
17409 16261
17410 void TypeRef::PrintJSONImpl(JSONStream* stream, bool ref) const {
17411 JSONObject jsobj(stream);
17412 PrintSharedInstanceJSON(&jsobj, ref);
17413 jsobj.AddProperty("kind", "TypeRef");
17414 jsobj.AddServiceId(*this);
17415 const String& user_name = String::Handle(PrettyName());
17416 const String& vm_name = String::Handle(Name());
17417 AddNameProperties(&jsobj, user_name, vm_name);
17418 if (ref) {
17419 return;
17420 }
17421 jsobj.AddProperty("targetType", AbstractType::Handle(type()));
17422 }
17423
17424
17425 void TypeParameter::SetIsFinalized() const { 16262 void TypeParameter::SetIsFinalized() const {
17426 ASSERT(!IsFinalized()); 16263 ASSERT(!IsFinalized());
17427 set_type_state(RawTypeParameter::kFinalizedUninstantiated); 16264 set_type_state(RawTypeParameter::kFinalizedUninstantiated);
17428 } 16265 }
17429 16266
17430 16267
17431 bool TypeParameter::IsEquivalent(const Instance& other, TrailPtr trail) const { 16268 bool TypeParameter::IsEquivalent(const Instance& other, TrailPtr trail) const {
17432 if (raw() == other.raw()) { 16269 if (raw() == other.raw()) {
17433 return true; 16270 return true;
17434 } 16271 }
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
17636 const AbstractType& upper_bound = AbstractType::Handle(bound()); 16473 const AbstractType& upper_bound = AbstractType::Handle(bound());
17637 const char* bound_cstr = String::Handle(upper_bound.Name()).ToCString(); 16474 const char* bound_cstr = String::Handle(upper_bound.Name()).ToCString();
17638 intptr_t len = OS::SNPrint( 16475 intptr_t len = OS::SNPrint(
17639 NULL, 0, format, name_cstr, index(), cls_cstr, bound_cstr) + 1; 16476 NULL, 0, format, name_cstr, index(), cls_cstr, bound_cstr) + 1;
17640 char* chars = Thread::Current()->zone()->Alloc<char>(len); 16477 char* chars = Thread::Current()->zone()->Alloc<char>(len);
17641 OS::SNPrint(chars, len, format, name_cstr, index(), cls_cstr, bound_cstr); 16478 OS::SNPrint(chars, len, format, name_cstr, index(), cls_cstr, bound_cstr);
17642 return chars; 16479 return chars;
17643 } 16480 }
17644 16481
17645 16482
17646 void TypeParameter::PrintJSONImpl(JSONStream* stream, bool ref) const {
17647 JSONObject jsobj(stream);
17648 PrintSharedInstanceJSON(&jsobj, ref);
17649 jsobj.AddProperty("kind", "TypeParameter");
17650 jsobj.AddServiceId(*this);
17651 const String& user_name = String::Handle(PrettyName());
17652 const String& vm_name = String::Handle(Name());
17653 AddNameProperties(&jsobj, user_name, vm_name);
17654 const Class& param_cls = Class::Handle(parameterized_class());
17655 jsobj.AddProperty("parameterizedClass", param_cls);
17656 if (ref) {
17657 return;
17658 }
17659 jsobj.AddProperty("parameterIndex", index());
17660 const AbstractType& upper_bound = AbstractType::Handle(bound());
17661 jsobj.AddProperty("bound", upper_bound);
17662 }
17663
17664
17665 bool BoundedType::IsMalformed() const { 16483 bool BoundedType::IsMalformed() const {
17666 return AbstractType::Handle(type()).IsMalformed(); 16484 return AbstractType::Handle(type()).IsMalformed();
17667 } 16485 }
17668 16486
17669 16487
17670 bool BoundedType::IsMalbounded() const { 16488 bool BoundedType::IsMalbounded() const {
17671 return AbstractType::Handle(type()).IsMalbounded(); 16489 return AbstractType::Handle(type()).IsMalbounded();
17672 } 16490 }
17673 16491
17674 16492
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
17867 const char* cls_cstr = String::Handle(cls.Name()).ToCString(); 16685 const char* cls_cstr = String::Handle(cls.Name()).ToCString();
17868 intptr_t len = OS::SNPrint( 16686 intptr_t len = OS::SNPrint(
17869 NULL, 0, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr) + 1; 16687 NULL, 0, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr) + 1;
17870 char* chars = Thread::Current()->zone()->Alloc<char>(len); 16688 char* chars = Thread::Current()->zone()->Alloc<char>(len);
17871 OS::SNPrint( 16689 OS::SNPrint(
17872 chars, len, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr); 16690 chars, len, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr);
17873 return chars; 16691 return chars;
17874 } 16692 }
17875 16693
17876 16694
17877 void BoundedType::PrintJSONImpl(JSONStream* stream, bool ref) const {
17878 JSONObject jsobj(stream);
17879 PrintSharedInstanceJSON(&jsobj, ref);
17880 jsobj.AddProperty("kind", "BoundedType");
17881 jsobj.AddServiceId(*this);
17882 const String& user_name = String::Handle(PrettyName());
17883 const String& vm_name = String::Handle(Name());
17884 AddNameProperties(&jsobj, user_name, vm_name);
17885 if (ref) {
17886 return;
17887 }
17888 jsobj.AddProperty("targetType", AbstractType::Handle(type()));
17889 jsobj.AddProperty("bound", AbstractType::Handle(bound()));
17890 }
17891
17892
17893 TokenPosition MixinAppType::token_pos() const { 16695 TokenPosition MixinAppType::token_pos() const {
17894 return AbstractType::Handle(MixinTypeAt(0)).token_pos(); 16696 return AbstractType::Handle(MixinTypeAt(0)).token_pos();
17895 } 16697 }
17896 16698
17897 16699
17898 intptr_t MixinAppType::Depth() const { 16700 intptr_t MixinAppType::Depth() const {
17899 return Array::Handle(mixin_types()).Length(); 16701 return Array::Handle(mixin_types()).Length();
17900 } 16702 }
17901 16703
17902 16704
17903 RawString* MixinAppType::Name() const { 16705 RawString* MixinAppType::Name() const {
17904 return String::New("MixinAppType"); 16706 return String::New("MixinAppType");
17905 } 16707 }
17906 16708
17907 16709
17908 const char* MixinAppType::ToCString() const { 16710 const char* MixinAppType::ToCString() const {
17909 const char* format = "MixinAppType: super type: %s; first mixin type: %s"; 16711 const char* format = "MixinAppType: super type: %s; first mixin type: %s";
17910 const char* super_type_cstr = String::Handle(AbstractType::Handle( 16712 const char* super_type_cstr = String::Handle(AbstractType::Handle(
17911 super_type()).Name()).ToCString(); 16713 super_type()).Name()).ToCString();
17912 const char* first_mixin_type_cstr = String::Handle(AbstractType::Handle( 16714 const char* first_mixin_type_cstr = String::Handle(AbstractType::Handle(
17913 MixinTypeAt(0)).Name()).ToCString(); 16715 MixinTypeAt(0)).Name()).ToCString();
17914 intptr_t len = OS::SNPrint( 16716 intptr_t len = OS::SNPrint(
17915 NULL, 0, format, super_type_cstr, first_mixin_type_cstr) + 1; 16717 NULL, 0, format, super_type_cstr, first_mixin_type_cstr) + 1;
17916 char* chars = Thread::Current()->zone()->Alloc<char>(len); 16718 char* chars = Thread::Current()->zone()->Alloc<char>(len);
17917 OS::SNPrint(chars, len, format, super_type_cstr, first_mixin_type_cstr); 16719 OS::SNPrint(chars, len, format, super_type_cstr, first_mixin_type_cstr);
17918 return chars; 16720 return chars;
17919 } 16721 }
17920 16722
17921 16723
17922 void MixinAppType::PrintJSONImpl(JSONStream* stream, bool ref) const {
17923 UNREACHABLE();
17924 }
17925
17926
17927 RawAbstractType* MixinAppType::MixinTypeAt(intptr_t depth) const { 16724 RawAbstractType* MixinAppType::MixinTypeAt(intptr_t depth) const {
17928 return AbstractType::RawCast(Array::Handle(mixin_types()).At(depth)); 16725 return AbstractType::RawCast(Array::Handle(mixin_types()).At(depth));
17929 } 16726 }
17930 16727
17931 16728
17932 void MixinAppType::set_super_type(const AbstractType& value) const { 16729 void MixinAppType::set_super_type(const AbstractType& value) const {
17933 StorePointer(&raw_ptr()->super_type_, value.raw()); 16730 StorePointer(&raw_ptr()->super_type_, value.raw());
17934 } 16731 }
17935 16732
17936 16733
(...skipping 21 matching lines...) Expand all
17958 } 16755 }
17959 16756
17960 16757
17961 const char* Number::ToCString() const { 16758 const char* Number::ToCString() const {
17962 // Number is an interface. No instances of Number should exist. 16759 // Number is an interface. No instances of Number should exist.
17963 UNREACHABLE(); 16760 UNREACHABLE();
17964 return "Number"; 16761 return "Number";
17965 } 16762 }
17966 16763
17967 16764
17968 void Number::PrintJSONImpl(JSONStream* stream, bool ref) const {
17969 UNREACHABLE();
17970 }
17971
17972
17973 const char* Integer::ToCString() const { 16765 const char* Integer::ToCString() const {
17974 // Integer is an interface. No instances of Integer should exist except null. 16766 // Integer is an interface. No instances of Integer should exist except null.
17975 ASSERT(IsNull()); 16767 ASSERT(IsNull());
17976 return "NULL Integer"; 16768 return "NULL Integer";
17977 } 16769 }
17978 16770
17979 16771
17980 void Integer::PrintJSONImpl(JSONStream* stream, bool ref) const {
17981 JSONObject jsobj(stream);
17982 PrintSharedInstanceJSON(&jsobj, ref);
17983 jsobj.AddProperty("kind", "Int");
17984 jsobj.AddServiceId(*this);
17985 jsobj.AddProperty("valueAsString", ToCString());
17986 }
17987
17988
17989 // Throw JavascriptIntegerOverflow exception. 16772 // Throw JavascriptIntegerOverflow exception.
17990 static void ThrowJavascriptIntegerOverflow(const Integer& i) { 16773 static void ThrowJavascriptIntegerOverflow(const Integer& i) {
17991 const Array& exc_args = Array::Handle(Array::New(1)); 16774 const Array& exc_args = Array::Handle(Array::New(1));
17992 const String& i_str = String::Handle(String::New(i.ToCString())); 16775 const String& i_str = String::Handle(String::New(i.ToCString()));
17993 exc_args.SetAt(0, i_str); 16776 exc_args.SetAt(0, i_str);
17994 Exceptions::ThrowByType(Exceptions::kJavascriptIntegerOverflowError, 16777 Exceptions::ThrowByType(Exceptions::kJavascriptIntegerOverflowError,
17995 exc_args); 16778 exc_args);
17996 } 16779 }
17997 16780
17998 16781
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
18398 UNREACHABLE(); 17181 UNREACHABLE();
18399 return 0; 17182 return 0;
18400 } 17183 }
18401 17184
18402 17185
18403 const char* Smi::ToCString() const { 17186 const char* Smi::ToCString() const {
18404 return OS::SCreate(Thread::Current()->zone(), "%" Pd "", Value()); 17187 return OS::SCreate(Thread::Current()->zone(), "%" Pd "", Value());
18405 } 17188 }
18406 17189
18407 17190
18408 void Smi::PrintJSONImpl(JSONStream* stream, bool ref) const {
18409 JSONObject jsobj(stream);
18410 PrintSharedInstanceJSON(&jsobj, ref);
18411 jsobj.AddProperty("kind", "Int");
18412 jsobj.AddFixedServiceId("objects/int-%" Pd "", Value());
18413 jsobj.AddPropertyF("valueAsString", "%" Pd "", Value());
18414 }
18415
18416
18417 RawClass* Smi::Class() { 17191 RawClass* Smi::Class() {
18418 return Isolate::Current()->object_store()->smi_class(); 17192 return Isolate::Current()->object_store()->smi_class();
18419 } 17193 }
18420 17194
18421 17195
18422 void Mint::set_value(int64_t value) const { 17196 void Mint::set_value(int64_t value) const {
18423 StoreNonPointer(&raw_ptr()->value_, value); 17197 StoreNonPointer(&raw_ptr()->value_, value);
18424 } 17198 }
18425 17199
18426 17200
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
18524 } 17298 }
18525 return this->IsNegative() ? -1 : 1; 17299 return this->IsNegative() ? -1 : 1;
18526 } 17300 }
18527 17301
18528 17302
18529 const char* Mint::ToCString() const { 17303 const char* Mint::ToCString() const {
18530 return OS::SCreate(Thread::Current()->zone(), "%" Pd64 "", value()); 17304 return OS::SCreate(Thread::Current()->zone(), "%" Pd64 "", value());
18531 } 17305 }
18532 17306
18533 17307
18534 void Mint::PrintJSONImpl(JSONStream* stream, bool ref) const {
18535 Integer::PrintJSONImpl(stream, ref);
18536 }
18537
18538
18539 void Double::set_value(double value) const { 17308 void Double::set_value(double value) const {
18540 StoreNonPointer(&raw_ptr()->value_, value); 17309 StoreNonPointer(&raw_ptr()->value_, value);
18541 } 17310 }
18542 17311
18543 17312
18544 bool Double::BitwiseEqualsToDouble(double value) const { 17313 bool Double::BitwiseEqualsToDouble(double value) const {
18545 intptr_t value_offset = Double::value_offset(); 17314 intptr_t value_offset = Double::value_offset();
18546 void* this_addr = reinterpret_cast<void*>( 17315 void* this_addr = reinterpret_cast<void*>(
18547 reinterpret_cast<uword>(this->raw_ptr()) + value_offset); 17316 reinterpret_cast<uword>(this->raw_ptr()) + value_offset);
18548 void* other_addr = reinterpret_cast<void*>(&value); 17317 void* other_addr = reinterpret_cast<void*>(&value);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
18656 return value() < 0 ? "-Infinity" : "Infinity"; 17425 return value() < 0 ? "-Infinity" : "Infinity";
18657 } 17426 }
18658 const int kBufferSize = 128; 17427 const int kBufferSize = 128;
18659 char* buffer = Thread::Current()->zone()->Alloc<char>(kBufferSize); 17428 char* buffer = Thread::Current()->zone()->Alloc<char>(kBufferSize);
18660 buffer[kBufferSize - 1] = '\0'; 17429 buffer[kBufferSize - 1] = '\0';
18661 DoubleToCString(value(), buffer, kBufferSize); 17430 DoubleToCString(value(), buffer, kBufferSize);
18662 return buffer; 17431 return buffer;
18663 } 17432 }
18664 17433
18665 17434
18666 void Double::PrintJSONImpl(JSONStream* stream, bool ref) const {
18667 JSONObject jsobj(stream);
18668 PrintSharedInstanceJSON(&jsobj, ref);
18669 jsobj.AddProperty("kind", "Double");
18670 jsobj.AddServiceId(*this);
18671 jsobj.AddProperty("valueAsString", ToCString());
18672 }
18673
18674
18675 bool Bigint::Neg() const { 17435 bool Bigint::Neg() const {
18676 return Bool::Handle(neg()).value(); 17436 return Bool::Handle(neg()).value();
18677 } 17437 }
18678 17438
18679 17439
18680 void Bigint::SetNeg(bool value) const { 17440 void Bigint::SetNeg(bool value) const {
18681 StorePointer(&raw_ptr()->neg_, Bool::Get(value).raw()); 17441 StorePointer(&raw_ptr()->neg_, Bool::Get(value).raw());
18682 } 17442 }
18683 17443
18684 17444
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after
19412 Zone* zone = Thread::Current()->zone(); 18172 Zone* zone = Thread::Current()->zone();
19413 return zone->AllocUnsafe(size); 18173 return zone->AllocUnsafe(size);
19414 } 18174 }
19415 18175
19416 18176
19417 const char* Bigint::ToCString() const { 18177 const char* Bigint::ToCString() const {
19418 return ToDecCString(&BigintAllocator); 18178 return ToDecCString(&BigintAllocator);
19419 } 18179 }
19420 18180
19421 18181
19422 void Bigint::PrintJSONImpl(JSONStream* stream, bool ref) const {
19423 Integer::PrintJSONImpl(stream, ref);
19424 }
19425
19426
19427 // Synchronize with implementation in compiler (intrinsifier). 18182 // Synchronize with implementation in compiler (intrinsifier).
19428 class StringHasher : ValueObject { 18183 class StringHasher : ValueObject {
19429 public: 18184 public:
19430 StringHasher() : hash_(0) {} 18185 StringHasher() : hash_(0) {}
19431 void Add(int32_t ch) { 18186 void Add(int32_t ch) {
19432 hash_ = CombineHashes(hash_, ch); 18187 hash_ = CombineHashes(hash_, ch);
19433 } 18188 }
19434 void Add(const String& str, intptr_t begin_index, intptr_t len); 18189 void Add(const String& str, intptr_t begin_index, intptr_t len);
19435 18190
19436 // Return a non-zero hash of at most 'bits' bits. 18191 // Return a non-zero hash of at most 'bits' bits.
(...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after
20247 } 19002 }
20248 const intptr_t len = Utf8::Length(*this); 19003 const intptr_t len = Utf8::Length(*this);
20249 Zone* zone = Thread::Current()->zone(); 19004 Zone* zone = Thread::Current()->zone();
20250 uint8_t* result = zone->Alloc<uint8_t>(len + 1); 19005 uint8_t* result = zone->Alloc<uint8_t>(len + 1);
20251 ToUTF8(result, len); 19006 ToUTF8(result, len);
20252 result[len] = 0; 19007 result[len] = 0;
20253 return reinterpret_cast<const char*>(result); 19008 return reinterpret_cast<const char*>(result);
20254 } 19009 }
20255 19010
20256 19011
20257 void String::PrintJSONImpl(JSONStream* stream, bool ref) const {
20258 JSONObject jsobj(stream);
20259 if (raw() == Symbols::OptimizedOut().raw()) {
20260 // TODO(turnidge): This is a hack. The user could have this
20261 // special string in their program. Fixing this involves updating
20262 // the debugging api a bit.
20263 jsobj.AddProperty("type", "Sentinel");
20264 jsobj.AddProperty("kind", "OptimizedOut");
20265 jsobj.AddProperty("valueAsString", "<optimized out>");
20266 return;
20267 }
20268 PrintSharedInstanceJSON(&jsobj, ref);
20269 jsobj.AddProperty("kind", "String");
20270 jsobj.AddServiceId(*this);
20271 jsobj.AddProperty("length", Length());
20272 if (ref) {
20273 // String refs always truncate to a fixed count;
20274 const intptr_t kFixedCount = 128;
20275 if (jsobj.AddPropertyStr("valueAsString", *this, 0, kFixedCount)) {
20276 jsobj.AddProperty("count", kFixedCount);
20277 jsobj.AddProperty("valueAsStringIsTruncated", true);
20278 }
20279 return;
20280 }
20281
20282 intptr_t offset;
20283 intptr_t count;
20284 stream->ComputeOffsetAndCount(Length(), &offset, &count);
20285 if (offset > 0) {
20286 jsobj.AddProperty("offset", offset);
20287 }
20288 if (count < Length()) {
20289 jsobj.AddProperty("count", count);
20290 }
20291 jsobj.AddPropertyStr("valueAsString", *this, offset, count);
20292 }
20293
20294
20295 void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const { 19012 void String::ToUTF8(uint8_t* utf8_array, intptr_t array_len) const {
20296 ASSERT(array_len >= Utf8::Length(*this)); 19013 ASSERT(array_len >= Utf8::Length(*this));
20297 Utf8::Encode(*this, reinterpret_cast<char*>(utf8_array), array_len); 19014 Utf8::Encode(*this, reinterpret_cast<char*>(utf8_array), array_len);
20298 } 19015 }
20299 19016
20300 19017
20301 static FinalizablePersistentHandle* AddFinalizer( 19018 static FinalizablePersistentHandle* AddFinalizer(
20302 const Object& referent, 19019 const Object& referent,
20303 void* peer, 19020 void* peer,
20304 Dart_WeakPersistentHandleFinalizer callback) { 19021 Dart_WeakPersistentHandleFinalizer callback) {
(...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after
21174 result.SetCanonical(); 19891 result.SetCanonical();
21175 return result.raw(); 19892 return result.raw();
21176 } 19893 }
21177 19894
21178 19895
21179 const char* Bool::ToCString() const { 19896 const char* Bool::ToCString() const {
21180 return value() ? "true" : "false"; 19897 return value() ? "true" : "false";
21181 } 19898 }
21182 19899
21183 19900
21184 void Bool::PrintJSONImpl(JSONStream* stream, bool ref) const {
21185 const char* str = ToCString();
21186 JSONObject jsobj(stream);
21187 PrintSharedInstanceJSON(&jsobj, ref);
21188 jsobj.AddProperty("kind", "Bool");
21189 jsobj.AddFixedServiceId("objects/bool-%s", str);
21190 jsobj.AddPropertyF("valueAsString", "%s", str);
21191 }
21192
21193
21194 bool Array::CanonicalizeEquals(const Instance& other) const { 19901 bool Array::CanonicalizeEquals(const Instance& other) const {
21195 if (this->raw() == other.raw()) { 19902 if (this->raw() == other.raw()) {
21196 // Both handles point to the same raw instance. 19903 // Both handles point to the same raw instance.
21197 return true; 19904 return true;
21198 } 19905 }
21199 19906
21200 // An Array may be compared to an ImmutableArray. 19907 // An Array may be compared to an ImmutableArray.
21201 if (!other.IsArray() || other.IsNull()) { 19908 if (!other.IsArray() || other.IsNull()) {
21202 return false; 19909 return false;
21203 } 19910 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
21286 if (IsNull()) { 19993 if (IsNull()) {
21287 return IsImmutable() ? "_ImmutableList NULL" : "_List NULL"; 19994 return IsImmutable() ? "_ImmutableList NULL" : "_List NULL";
21288 } 19995 }
21289 Zone* zone = Thread::Current()->zone(); 19996 Zone* zone = Thread::Current()->zone();
21290 const char* format = IsImmutable() ? "_ImmutableList len:%" Pd 19997 const char* format = IsImmutable() ? "_ImmutableList len:%" Pd
21291 : "_List len:%" Pd; 19998 : "_List len:%" Pd;
21292 return zone->PrintToString(format, Length()); 19999 return zone->PrintToString(format, Length());
21293 } 20000 }
21294 20001
21295 20002
21296 void Array::PrintJSONImpl(JSONStream* stream, bool ref) const {
21297 JSONObject jsobj(stream);
21298 PrintSharedInstanceJSON(&jsobj, ref);
21299 jsobj.AddProperty("kind", "List");
21300 jsobj.AddServiceId(*this);
21301 jsobj.AddProperty("length", Length());
21302 if (ref) {
21303 return;
21304 }
21305 intptr_t offset;
21306 intptr_t count;
21307 stream->ComputeOffsetAndCount(Length(), &offset, &count);
21308 if (offset > 0) {
21309 jsobj.AddProperty("offset", offset);
21310 }
21311 if (count < Length()) {
21312 jsobj.AddProperty("count", count);
21313 }
21314 intptr_t limit = offset + count;
21315 ASSERT(limit <= Length());
21316 {
21317 JSONArray jsarr(&jsobj, "elements");
21318 Object& element = Object::Handle();
21319 for (intptr_t index = offset; index < limit; index++) {
21320 element = At(index);
21321 jsarr.AddValue(element);
21322 }
21323 }
21324 }
21325
21326
21327 RawArray* Array::Grow(const Array& source, 20003 RawArray* Array::Grow(const Array& source,
21328 intptr_t new_length, 20004 intptr_t new_length,
21329 Heap::Space space) { 20005 Heap::Space space) {
21330 Zone* zone = Thread::Current()->zone(); 20006 Zone* zone = Thread::Current()->zone();
21331 const Array& result = Array::Handle(zone, Array::New(new_length, space)); 20007 const Array& result = Array::Handle(zone, Array::New(new_length, space));
21332 intptr_t len = 0; 20008 intptr_t len = 0;
21333 if (!source.IsNull()) { 20009 if (!source.IsNull()) {
21334 len = source.Length(); 20010 len = source.Length();
21335 result.SetTypeArguments( 20011 result.SetTypeArguments(
21336 TypeArguments::Handle(zone, source.GetTypeArguments())); 20012 TypeArguments::Handle(zone, source.GetTypeArguments()));
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
21534 20210
21535 const char* GrowableObjectArray::ToCString() const { 20211 const char* GrowableObjectArray::ToCString() const {
21536 if (IsNull()) { 20212 if (IsNull()) {
21537 return "_GrowableList NULL"; 20213 return "_GrowableList NULL";
21538 } 20214 }
21539 return OS::SCreate(Thread::Current()->zone(), 20215 return OS::SCreate(Thread::Current()->zone(),
21540 "Instance(length:%" Pd ") of '_GrowableList'", Length()); 20216 "Instance(length:%" Pd ") of '_GrowableList'", Length());
21541 } 20217 }
21542 20218
21543 20219
21544 void GrowableObjectArray::PrintJSONImpl(JSONStream* stream,
21545 bool ref) const {
21546 JSONObject jsobj(stream);
21547 PrintSharedInstanceJSON(&jsobj, ref);
21548 jsobj.AddProperty("kind", "List");
21549 jsobj.AddServiceId(*this);
21550 jsobj.AddProperty("length", Length());
21551 if (ref) {
21552 return;
21553 }
21554 intptr_t offset;
21555 intptr_t count;
21556 stream->ComputeOffsetAndCount(Length(), &offset, &count);
21557 if (offset > 0) {
21558 jsobj.AddProperty("offset", offset);
21559 }
21560 if (count < Length()) {
21561 jsobj.AddProperty("count", count);
21562 }
21563 intptr_t limit = offset + count;
21564 ASSERT(limit <= Length());
21565 {
21566 JSONArray jsarr(&jsobj, "elements");
21567 Object& element = Object::Handle();
21568 for (intptr_t index = offset; index < limit; index++) {
21569 element = At(index);
21570 jsarr.AddValue(element);
21571 }
21572 }
21573 }
21574
21575
21576 // Equivalent to Dart's operator "==" and hashCode. 20220 // Equivalent to Dart's operator "==" and hashCode.
21577 class DefaultHashTraits { 20221 class DefaultHashTraits {
21578 public: 20222 public:
21579 static bool IsMatch(const Object& a, const Object& b) { 20223 static bool IsMatch(const Object& a, const Object& b) {
21580 if (a.IsNull() || b.IsNull()) { 20224 if (a.IsNull() || b.IsNull()) {
21581 return (a.IsNull() && b.IsNull()); 20225 return (a.IsNull() && b.IsNull());
21582 } else { 20226 } else {
21583 return Instance::Cast(a).OperatorEquals(Instance::Cast(b)); 20227 return Instance::Cast(a).OperatorEquals(Instance::Cast(b));
21584 } 20228 }
21585 } 20229 }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
21652 return result.raw(); 20296 return result.raw();
21653 } 20297 }
21654 20298
21655 20299
21656 const char* LinkedHashMap::ToCString() const { 20300 const char* LinkedHashMap::ToCString() const {
21657 Zone* zone = Thread::Current()->zone(); 20301 Zone* zone = Thread::Current()->zone();
21658 return zone->PrintToString("_LinkedHashMap len:%" Pd, Length()); 20302 return zone->PrintToString("_LinkedHashMap len:%" Pd, Length());
21659 } 20303 }
21660 20304
21661 20305
21662 void LinkedHashMap::PrintJSONImpl(JSONStream* stream, bool ref) const {
21663 JSONObject jsobj(stream);
21664 PrintSharedInstanceJSON(&jsobj, ref);
21665 jsobj.AddProperty("kind", "Map");
21666 jsobj.AddServiceId(*this);
21667 jsobj.AddProperty("length", Length());
21668 if (ref) {
21669 return;
21670 }
21671 intptr_t offset;
21672 intptr_t count;
21673 stream->ComputeOffsetAndCount(Length(), &offset, &count);
21674 if (offset > 0) {
21675 jsobj.AddProperty("offset", offset);
21676 }
21677 if (count < Length()) {
21678 jsobj.AddProperty("count", count);
21679 }
21680 intptr_t limit = offset + count;
21681 ASSERT(limit <= Length());
21682 {
21683 JSONArray jsarr(&jsobj, "associations");
21684 Object& object = Object::Handle();
21685 LinkedHashMap::Iterator iterator(*this);
21686 int i = 0;
21687 while (iterator.MoveNext() && i < limit) {
21688 if (i >= offset) {
21689 JSONObject jsassoc(&jsarr);
21690 object = iterator.CurrentKey();
21691 jsassoc.AddProperty("key", object);
21692 object = iterator.CurrentValue();
21693 jsassoc.AddProperty("value", object);
21694 }
21695 i++;
21696 }
21697 }
21698 }
21699
21700
21701 RawFloat32x4* Float32x4::New(float v0, float v1, float v2, float v3, 20306 RawFloat32x4* Float32x4::New(float v0, float v1, float v2, float v3,
21702 Heap::Space space) { 20307 Heap::Space space) {
21703 ASSERT(Isolate::Current()->object_store()->float32x4_class() != 20308 ASSERT(Isolate::Current()->object_store()->float32x4_class() !=
21704 Class::null()); 20309 Class::null());
21705 Float32x4& result = Float32x4::Handle(); 20310 Float32x4& result = Float32x4::Handle();
21706 { 20311 {
21707 RawObject* raw = Object::Allocate(Float32x4::kClassId, 20312 RawObject* raw = Object::Allocate(Float32x4::kClassId,
21708 Float32x4::InstanceSize(), 20313 Float32x4::InstanceSize(),
21709 space); 20314 space);
21710 NoSafepointScope no_safepoint; 20315 NoSafepointScope no_safepoint;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
21787 const char* Float32x4::ToCString() const { 20392 const char* Float32x4::ToCString() const {
21788 float _x = x(); 20393 float _x = x();
21789 float _y = y(); 20394 float _y = y();
21790 float _z = z(); 20395 float _z = z();
21791 float _w = w(); 20396 float _w = w();
21792 return OS::SCreate(Thread::Current()->zone(), 20397 return OS::SCreate(Thread::Current()->zone(),
21793 "[%f, %f, %f, %f]", _x, _y, _z, _w); 20398 "[%f, %f, %f, %f]", _x, _y, _z, _w);
21794 } 20399 }
21795 20400
21796 20401
21797 void Float32x4::PrintJSONImpl(JSONStream* stream, bool ref) const {
21798 JSONObject jsobj(stream);
21799 PrintSharedInstanceJSON(&jsobj, ref);
21800 jsobj.AddProperty("kind", "Float32x4");
21801 jsobj.AddServiceId(*this);
21802 jsobj.AddProperty("valueAsString", ToCString());
21803 }
21804
21805
21806 RawInt32x4* Int32x4::New(int32_t v0, int32_t v1, int32_t v2, int32_t v3, 20402 RawInt32x4* Int32x4::New(int32_t v0, int32_t v1, int32_t v2, int32_t v3,
21807 Heap::Space space) { 20403 Heap::Space space) {
21808 ASSERT(Isolate::Current()->object_store()->int32x4_class() != 20404 ASSERT(Isolate::Current()->object_store()->int32x4_class() !=
21809 Class::null()); 20405 Class::null());
21810 Int32x4& result = Int32x4::Handle(); 20406 Int32x4& result = Int32x4::Handle();
21811 { 20407 {
21812 RawObject* raw = Object::Allocate(Int32x4::kClassId, 20408 RawObject* raw = Object::Allocate(Int32x4::kClassId,
21813 Int32x4::InstanceSize(), 20409 Int32x4::InstanceSize(),
21814 space); 20410 space);
21815 NoSafepointScope no_safepoint; 20411 NoSafepointScope no_safepoint;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
21892 const char* Int32x4::ToCString() const { 20488 const char* Int32x4::ToCString() const {
21893 int32_t _x = x(); 20489 int32_t _x = x();
21894 int32_t _y = y(); 20490 int32_t _y = y();
21895 int32_t _z = z(); 20491 int32_t _z = z();
21896 int32_t _w = w(); 20492 int32_t _w = w();
21897 return OS::SCreate(Thread::Current()->zone(), 20493 return OS::SCreate(Thread::Current()->zone(),
21898 "[%08x, %08x, %08x, %08x]", _x, _y, _z, _w); 20494 "[%08x, %08x, %08x, %08x]", _x, _y, _z, _w);
21899 } 20495 }
21900 20496
21901 20497
21902 void Int32x4::PrintJSONImpl(JSONStream* stream, bool ref) const {
21903 JSONObject jsobj(stream);
21904 PrintSharedInstanceJSON(&jsobj, ref);
21905 jsobj.AddProperty("kind", "Int32x4");
21906 jsobj.AddServiceId(*this);
21907 jsobj.AddProperty("valueAsString", ToCString());
21908 }
21909
21910
21911 RawFloat64x2* Float64x2::New(double value0, double value1, Heap::Space space) { 20498 RawFloat64x2* Float64x2::New(double value0, double value1, Heap::Space space) {
21912 ASSERT(Isolate::Current()->object_store()->float64x2_class() != 20499 ASSERT(Isolate::Current()->object_store()->float64x2_class() !=
21913 Class::null()); 20500 Class::null());
21914 Float64x2& result = Float64x2::Handle(); 20501 Float64x2& result = Float64x2::Handle();
21915 { 20502 {
21916 RawObject* raw = Object::Allocate(Float64x2::kClassId, 20503 RawObject* raw = Object::Allocate(Float64x2::kClassId,
21917 Float64x2::InstanceSize(), 20504 Float64x2::InstanceSize(),
21918 space); 20505 space);
21919 NoSafepointScope no_safepoint; 20506 NoSafepointScope no_safepoint;
21920 result ^= raw; 20507 result ^= raw;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
21971 } 20558 }
21972 20559
21973 20560
21974 const char* Float64x2::ToCString() const { 20561 const char* Float64x2::ToCString() const {
21975 double _x = x(); 20562 double _x = x();
21976 double _y = y(); 20563 double _y = y();
21977 return OS::SCreate(Thread::Current()->zone(), "[%f, %f]", _x, _y); 20564 return OS::SCreate(Thread::Current()->zone(), "[%f, %f]", _x, _y);
21978 } 20565 }
21979 20566
21980 20567
21981 void Float64x2::PrintJSONImpl(JSONStream* stream, bool ref) const {
21982 JSONObject jsobj(stream);
21983 PrintSharedInstanceJSON(&jsobj, ref);
21984 jsobj.AddProperty("kind", "Float64x2");
21985 jsobj.AddServiceId(*this);
21986 jsobj.AddProperty("valueAsString", ToCString());
21987 }
21988
21989
21990 const intptr_t TypedData::element_size_table[TypedData::kNumElementSizes] = { 20568 const intptr_t TypedData::element_size_table[TypedData::kNumElementSizes] = {
21991 1, // kTypedDataInt8ArrayCid. 20569 1, // kTypedDataInt8ArrayCid.
21992 1, // kTypedDataUint8ArrayCid. 20570 1, // kTypedDataUint8ArrayCid.
21993 1, // kTypedDataUint8ClampedArrayCid. 20571 1, // kTypedDataUint8ClampedArrayCid.
21994 2, // kTypedDataInt16ArrayCid. 20572 2, // kTypedDataInt16ArrayCid.
21995 2, // kTypedDataUint16ArrayCid. 20573 2, // kTypedDataUint16ArrayCid.
21996 4, // kTypedDataInt32ArrayCid. 20574 4, // kTypedDataInt32ArrayCid.
21997 4, // kTypedDataUint32ArrayCid. 20575 4, // kTypedDataUint32ArrayCid.
21998 8, // kTypedDataInt64ArrayCid. 20576 8, // kTypedDataInt64ArrayCid.
21999 8, // kTypedDataUint64ArrayCid. 20577 8, // kTypedDataUint64ArrayCid.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
22068 isolate->object_store()->set_empty_uint32_array(array); 20646 isolate->object_store()->set_empty_uint32_array(array);
22069 return array.raw(); 20647 return array.raw();
22070 } 20648 }
22071 20649
22072 20650
22073 const char* TypedData::ToCString() const { 20651 const char* TypedData::ToCString() const {
22074 return "TypedData"; 20652 return "TypedData";
22075 } 20653 }
22076 20654
22077 20655
22078 void TypedData::PrintJSONImpl(JSONStream* stream, bool ref) const {
22079 JSONObject jsobj(stream);
22080 PrintSharedInstanceJSON(&jsobj, ref);
22081 const Class& cls = Class::Handle(clazz());
22082 const String& kind = String::Handle(cls.UserVisibleName());
22083 jsobj.AddProperty("kind", kind.ToCString());
22084 jsobj.AddServiceId(*this);
22085 jsobj.AddProperty("length", Length());
22086 if (ref) {
22087 return;
22088 }
22089 intptr_t offset;
22090 intptr_t count;
22091 stream->ComputeOffsetAndCount(Length(), &offset, &count);
22092 if (offset > 0) {
22093 jsobj.AddProperty("offset", offset);
22094 }
22095 if (count < Length()) {
22096 jsobj.AddProperty("count", count);
22097 }
22098 if (count == 0) {
22099 jsobj.AddProperty("bytes", "");
22100 } else {
22101 NoSafepointScope no_safepoint;
22102 jsobj.AddPropertyBase64("bytes",
22103 reinterpret_cast<const uint8_t*>(
22104 DataAddr(offset * ElementSizeInBytes())),
22105 count * ElementSizeInBytes());
22106 }
22107 }
22108
22109
22110 FinalizablePersistentHandle* ExternalTypedData::AddFinalizer( 20656 FinalizablePersistentHandle* ExternalTypedData::AddFinalizer(
22111 void* peer, Dart_WeakPersistentHandleFinalizer callback) const { 20657 void* peer, Dart_WeakPersistentHandleFinalizer callback) const {
22112 return dart::AddFinalizer(*this, peer, callback); 20658 return dart::AddFinalizer(*this, peer, callback);
22113 } 20659 }
22114 20660
22115 20661
22116 RawExternalTypedData* ExternalTypedData::New(intptr_t class_id, 20662 RawExternalTypedData* ExternalTypedData::New(intptr_t class_id,
22117 uint8_t* data, 20663 uint8_t* data,
22118 intptr_t len, 20664 intptr_t len,
22119 Heap::Space space) { 20665 Heap::Space space) {
22120 ExternalTypedData& result = ExternalTypedData::Handle(); 20666 ExternalTypedData& result = ExternalTypedData::Handle();
22121 { 20667 {
22122 RawObject* raw = Object::Allocate(class_id, 20668 RawObject* raw = Object::Allocate(class_id,
22123 ExternalTypedData::InstanceSize(), 20669 ExternalTypedData::InstanceSize(),
22124 space); 20670 space);
22125 NoSafepointScope no_safepoint; 20671 NoSafepointScope no_safepoint;
22126 result ^= raw; 20672 result ^= raw;
22127 result.SetLength(len); 20673 result.SetLength(len);
22128 result.SetData(data); 20674 result.SetData(data);
22129 } 20675 }
22130 return result.raw(); 20676 return result.raw();
22131 } 20677 }
22132 20678
22133 20679
22134 const char* ExternalTypedData::ToCString() const { 20680 const char* ExternalTypedData::ToCString() const {
22135 return "ExternalTypedData"; 20681 return "ExternalTypedData";
22136 } 20682 }
22137 20683
22138 20684
22139 void ExternalTypedData::PrintJSONImpl(JSONStream* stream,
22140 bool ref) const {
22141 JSONObject jsobj(stream);
22142 PrintSharedInstanceJSON(&jsobj, ref);
22143 const Class& cls = Class::Handle(clazz());
22144 const String& kind = String::Handle(cls.UserVisibleName());
22145 jsobj.AddProperty("kind", kind.ToCString());
22146 jsobj.AddServiceId(*this);
22147 jsobj.AddProperty("length", Length());
22148 if (ref) {
22149 return;
22150 }
22151 intptr_t offset;
22152 intptr_t count;
22153 stream->ComputeOffsetAndCount(Length(), &offset, &count);
22154 if (offset > 0) {
22155 jsobj.AddProperty("offset", offset);
22156 }
22157 if (count < Length()) {
22158 jsobj.AddProperty("count", count);
22159 }
22160 if (count == 0) {
22161 jsobj.AddProperty("bytes", "");
22162 } else {
22163 NoSafepointScope no_safepoint;
22164 jsobj.AddPropertyBase64("bytes",
22165 reinterpret_cast<const uint8_t*>(
22166 DataAddr(offset * ElementSizeInBytes())),
22167 count * ElementSizeInBytes());
22168 }
22169 }
22170
22171
22172 RawCapability* Capability::New(uint64_t id, Heap::Space space) { 20685 RawCapability* Capability::New(uint64_t id, Heap::Space space) {
22173 Capability& result = Capability::Handle(); 20686 Capability& result = Capability::Handle();
22174 { 20687 {
22175 RawObject* raw = Object::Allocate(Capability::kClassId, 20688 RawObject* raw = Object::Allocate(Capability::kClassId,
22176 Capability::InstanceSize(), 20689 Capability::InstanceSize(),
22177 space); 20690 space);
22178 NoSafepointScope no_safepoint; 20691 NoSafepointScope no_safepoint;
22179 result ^= raw; 20692 result ^= raw;
22180 result.StoreNonPointer(&result.raw_ptr()->id_, id); 20693 result.StoreNonPointer(&result.raw_ptr()->id_, id);
22181 } 20694 }
22182 return result.raw(); 20695 return result.raw();
22183 } 20696 }
22184 20697
22185 20698
22186 const char* Capability::ToCString() const { 20699 const char* Capability::ToCString() const {
22187 return "Capability"; 20700 return "Capability";
22188 } 20701 }
22189 20702
22190 20703
22191 void Capability::PrintJSONImpl(JSONStream* stream, bool ref) const {
22192 Instance::PrintJSONImpl(stream, ref);
22193 }
22194
22195
22196 RawReceivePort* ReceivePort::New(Dart_Port id, 20704 RawReceivePort* ReceivePort::New(Dart_Port id,
22197 bool is_control_port, 20705 bool is_control_port,
22198 Heap::Space space) { 20706 Heap::Space space) {
22199 ASSERT(id != ILLEGAL_PORT); 20707 ASSERT(id != ILLEGAL_PORT);
22200 Thread* thread = Thread::Current(); 20708 Thread* thread = Thread::Current();
22201 Zone* zone = thread->zone(); 20709 Zone* zone = thread->zone();
22202 const SendPort& send_port = 20710 const SendPort& send_port =
22203 SendPort::Handle(zone, SendPort::New(id, thread->isolate()->origin_id())); 20711 SendPort::Handle(zone, SendPort::New(id, thread->isolate()->origin_id()));
22204 20712
22205 ReceivePort& result = ReceivePort::Handle(zone); 20713 ReceivePort& result = ReceivePort::Handle(zone);
(...skipping 12 matching lines...) Expand all
22218 } 20726 }
22219 return result.raw(); 20727 return result.raw();
22220 } 20728 }
22221 20729
22222 20730
22223 const char* ReceivePort::ToCString() const { 20731 const char* ReceivePort::ToCString() const {
22224 return "ReceivePort"; 20732 return "ReceivePort";
22225 } 20733 }
22226 20734
22227 20735
22228 void ReceivePort::PrintJSONImpl(JSONStream* stream, bool ref) const {
22229 Instance::PrintJSONImpl(stream, ref);
22230 }
22231
22232
22233 RawSendPort* SendPort::New(Dart_Port id, Heap::Space space) { 20736 RawSendPort* SendPort::New(Dart_Port id, Heap::Space space) {
22234 return New(id, Isolate::Current()->origin_id(), space); 20737 return New(id, Isolate::Current()->origin_id(), space);
22235 } 20738 }
22236 20739
22237 20740
22238 RawSendPort* SendPort::New(Dart_Port id, 20741 RawSendPort* SendPort::New(Dart_Port id,
22239 Dart_Port origin_id, 20742 Dart_Port origin_id,
22240 Heap::Space space) { 20743 Heap::Space space) {
22241 ASSERT(id != ILLEGAL_PORT); 20744 ASSERT(id != ILLEGAL_PORT);
22242 SendPort& result = SendPort::Handle(); 20745 SendPort& result = SendPort::Handle();
22243 { 20746 {
22244 RawObject* raw = Object::Allocate(SendPort::kClassId, 20747 RawObject* raw = Object::Allocate(SendPort::kClassId,
22245 SendPort::InstanceSize(), 20748 SendPort::InstanceSize(),
22246 space); 20749 space);
22247 NoSafepointScope no_safepoint; 20750 NoSafepointScope no_safepoint;
22248 result ^= raw; 20751 result ^= raw;
22249 result.StoreNonPointer(&result.raw_ptr()->id_, id); 20752 result.StoreNonPointer(&result.raw_ptr()->id_, id);
22250 result.StoreNonPointer(&result.raw_ptr()->origin_id_, origin_id); 20753 result.StoreNonPointer(&result.raw_ptr()->origin_id_, origin_id);
22251 } 20754 }
22252 return result.raw(); 20755 return result.raw();
22253 } 20756 }
22254 20757
22255 20758
22256 const char* SendPort::ToCString() const { 20759 const char* SendPort::ToCString() const {
22257 return "SendPort"; 20760 return "SendPort";
22258 } 20761 }
22259 20762
22260 20763
22261 void SendPort::PrintJSONImpl(JSONStream* stream, bool ref) const {
22262 Instance::PrintJSONImpl(stream, ref);
22263 }
22264
22265
22266 const char* Closure::ToCString() const { 20764 const char* Closure::ToCString() const {
22267 const Function& fun = Function::Handle(function()); 20765 const Function& fun = Function::Handle(function());
22268 const bool is_implicit_closure = fun.IsImplicitClosureFunction(); 20766 const bool is_implicit_closure = fun.IsImplicitClosureFunction();
22269 const char* fun_sig = String::Handle(fun.UserVisibleSignature()).ToCString(); 20767 const char* fun_sig = String::Handle(fun.UserVisibleSignature()).ToCString();
22270 const char* from = is_implicit_closure ? " from " : ""; 20768 const char* from = is_implicit_closure ? " from " : "";
22271 const char* fun_desc = is_implicit_closure ? fun.ToCString() : ""; 20769 const char* fun_desc = is_implicit_closure ? fun.ToCString() : "";
22272 return OS::SCreate(Thread::Current()->zone(), 20770 return OS::SCreate(Thread::Current()->zone(),
22273 "Closure: %s%s%s", fun_sig, from, fun_desc); 20771 "Closure: %s%s%s", fun_sig, from, fun_desc);
22274 } 20772 }
22275 20773
22276 20774
22277 void Closure::PrintJSONImpl(JSONStream* stream, bool ref) const {
22278 Instance::PrintJSONImpl(stream, ref);
22279 }
22280
22281
22282 RawClosure* Closure::New(const Function& function, 20775 RawClosure* Closure::New(const Function& function,
22283 const Context& context, 20776 const Context& context,
22284 Heap::Space space) { 20777 Heap::Space space) {
22285 Closure& result = Closure::Handle(); 20778 Closure& result = Closure::Handle();
22286 { 20779 {
22287 RawObject* raw = Object::Allocate(Closure::kClassId, 20780 RawObject* raw = Object::Allocate(Closure::kClassId,
22288 Closure::InstanceSize(), 20781 Closure::InstanceSize(),
22289 space); 20782 space);
22290 NoSafepointScope no_safepoint; 20783 NoSafepointScope no_safepoint;
22291 result ^= raw; 20784 result ^= raw;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
22379 return result.raw(); 20872 return result.raw();
22380 } 20873 }
22381 20874
22382 20875
22383 const char* Stacktrace::ToCString() const { 20876 const char* Stacktrace::ToCString() const {
22384 intptr_t idx = 0; 20877 intptr_t idx = 0;
22385 return ToCStringInternal(&idx); 20878 return ToCStringInternal(&idx);
22386 } 20879 }
22387 20880
22388 20881
22389 void Stacktrace::PrintJSONImpl(JSONStream* stream, bool ref) const {
22390 JSONObject jsobj(stream);
22391 PrintSharedInstanceJSON(&jsobj, ref);
22392 jsobj.AddProperty("kind", "StackTrace");
22393 jsobj.AddServiceId(*this);
22394 intptr_t idx = 0;
22395 jsobj.AddProperty("valueAsString", ToCStringInternal(&idx));
22396 }
22397
22398
22399 static intptr_t PrintOneStacktrace(Zone* zone, 20882 static intptr_t PrintOneStacktrace(Zone* zone,
22400 GrowableArray<char*>* frame_strings, 20883 GrowableArray<char*>* frame_strings,
22401 uword pc, 20884 uword pc,
22402 const Function& function, 20885 const Function& function,
22403 const Code& code, 20886 const Code& code,
22404 intptr_t frame_index) { 20887 intptr_t frame_index) {
22405 const TokenPosition token_pos = code.GetTokenIndexOfPC(pc); 20888 const TokenPosition token_pos = code.GetTokenIndexOfPC(pc);
22406 const Script& script = Script::Handle(zone, function.script()); 20889 const Script& script = Script::Handle(zone, function.script());
22407 const String& function_name = 20890 const String& function_name =
22408 String::Handle(zone, function.QualifiedUserVisibleName()); 20891 String::Handle(zone, function.QualifiedUserVisibleName());
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
22638 } 21121 }
22639 21122
22640 21123
22641 const char* JSRegExp::ToCString() const { 21124 const char* JSRegExp::ToCString() const {
22642 const String& str = String::Handle(pattern()); 21125 const String& str = String::Handle(pattern());
22643 return OS::SCreate(Thread::Current()->zone(), 21126 return OS::SCreate(Thread::Current()->zone(),
22644 "JSRegExp: pattern=%s flags=%s", str.ToCString(), Flags()); 21127 "JSRegExp: pattern=%s flags=%s", str.ToCString(), Flags());
22645 } 21128 }
22646 21129
22647 21130
22648 void JSRegExp::PrintJSONImpl(JSONStream* stream, bool ref) const {
22649 JSONObject jsobj(stream);
22650 PrintSharedInstanceJSON(&jsobj, ref);
22651 jsobj.AddProperty("kind", "RegExp");
22652 jsobj.AddServiceId(*this);
22653
22654 jsobj.AddProperty("pattern", String::Handle(pattern()));
22655
22656 if (ref) {
22657 return;
22658 }
22659
22660 jsobj.AddProperty("isCaseSensitive", !is_ignore_case());
22661 jsobj.AddProperty("isMultiLine", is_multi_line());
22662
22663 Function& func = Function::Handle();
22664 func = function(kOneByteStringCid);
22665 jsobj.AddProperty("_oneByteFunction", func);
22666 func = function(kTwoByteStringCid);
22667 jsobj.AddProperty("_twoByteFunction", func);
22668 func = function(kExternalOneByteStringCid);
22669 jsobj.AddProperty("_externalOneByteFunction", func);
22670 func = function(kExternalTwoByteStringCid);
22671 jsobj.AddProperty("_externalTwoByteFunction", func);
22672 }
22673
22674
22675 RawWeakProperty* WeakProperty::New(Heap::Space space) { 21131 RawWeakProperty* WeakProperty::New(Heap::Space space) {
22676 ASSERT(Isolate::Current()->object_store()->weak_property_class() 21132 ASSERT(Isolate::Current()->object_store()->weak_property_class()
22677 != Class::null()); 21133 != Class::null());
22678 RawObject* raw = Object::Allocate(WeakProperty::kClassId, 21134 RawObject* raw = Object::Allocate(WeakProperty::kClassId,
22679 WeakProperty::InstanceSize(), 21135 WeakProperty::InstanceSize(),
22680 space); 21136 space);
22681 return reinterpret_cast<RawWeakProperty*>(raw); 21137 return reinterpret_cast<RawWeakProperty*>(raw);
22682 } 21138 }
22683 21139
22684 21140
22685 const char* WeakProperty::ToCString() const { 21141 const char* WeakProperty::ToCString() const {
22686 return "_WeakProperty"; 21142 return "_WeakProperty";
22687 } 21143 }
22688 21144
22689 21145
22690 void WeakProperty::PrintJSONImpl(JSONStream* stream, bool ref) const {
22691 JSONObject jsobj(stream);
22692 PrintSharedInstanceJSON(&jsobj, ref);
22693 jsobj.AddProperty("kind", "WeakProperty");
22694 jsobj.AddServiceId(*this);
22695 if (ref) {
22696 return;
22697 }
22698
22699 const Object& key_handle = Object::Handle(key());
22700 jsobj.AddProperty("propertyKey", key_handle);
22701 const Object& value_handle = Object::Handle(value());
22702 jsobj.AddProperty("propertyValue", value_handle);
22703 }
22704
22705 RawAbstractType* MirrorReference::GetAbstractTypeReferent() const { 21146 RawAbstractType* MirrorReference::GetAbstractTypeReferent() const {
22706 ASSERT(Object::Handle(referent()).IsAbstractType()); 21147 ASSERT(Object::Handle(referent()).IsAbstractType());
22707 return AbstractType::Cast(Object::Handle(referent())).raw(); 21148 return AbstractType::Cast(Object::Handle(referent())).raw();
22708 } 21149 }
22709 21150
22710 21151
22711 RawClass* MirrorReference::GetClassReferent() const { 21152 RawClass* MirrorReference::GetClassReferent() const {
22712 ASSERT(Object::Handle(referent()).IsClass()); 21153 ASSERT(Object::Handle(referent()).IsClass());
22713 return Class::Cast(Object::Handle(referent())).raw(); 21154 return Class::Cast(Object::Handle(referent())).raw();
22714 } 21155 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
22751 result.set_referent(referent); 21192 result.set_referent(referent);
22752 return result.raw(); 21193 return result.raw();
22753 } 21194 }
22754 21195
22755 21196
22756 const char* MirrorReference::ToCString() const { 21197 const char* MirrorReference::ToCString() const {
22757 return "_MirrorReference"; 21198 return "_MirrorReference";
22758 } 21199 }
22759 21200
22760 21201
22761 void MirrorReference::PrintJSONImpl(JSONStream* stream, bool ref) const {
22762 JSONObject jsobj(stream);
22763 PrintSharedInstanceJSON(&jsobj, ref);
22764 jsobj.AddProperty("kind", "MirrorReference");
22765 jsobj.AddServiceId(*this);
22766
22767 if (ref) {
22768 return;
22769 }
22770
22771 const Object& referent_handle = Object::Handle(referent());
22772 jsobj.AddProperty("mirrorReferent", referent_handle);
22773 }
22774
22775
22776 void UserTag::MakeActive() const { 21202 void UserTag::MakeActive() const {
22777 Isolate* isolate = Isolate::Current(); 21203 Isolate* isolate = Isolate::Current();
22778 ASSERT(isolate != NULL); 21204 ASSERT(isolate != NULL);
22779 isolate->set_current_tag(*this); 21205 isolate->set_current_tag(*this);
22780 } 21206 }
22781 21207
22782 21208
22783 RawUserTag* UserTag::New(const String& label, Heap::Space space) { 21209 RawUserTag* UserTag::New(const String& label, Heap::Space space) {
22784 Thread* thread = Thread::Current(); 21210 Thread* thread = Thread::Current();
22785 Isolate* isolate = thread->isolate(); 21211 Isolate* isolate = thread->isolate();
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
22903 } 21329 }
22904 return UserTag::null(); 21330 return UserTag::null();
22905 } 21331 }
22906 21332
22907 21333
22908 const char* UserTag::ToCString() const { 21334 const char* UserTag::ToCString() const {
22909 const String& tag_label = String::Handle(label()); 21335 const String& tag_label = String::Handle(label());
22910 return tag_label.ToCString(); 21336 return tag_label.ToCString();
22911 } 21337 }
22912 21338
22913
22914 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
22915 Instance::PrintJSONImpl(stream, ref);
22916 }
22917
22918
22919 } // namespace dart 21339 } // namespace dart
OLDNEW
« runtime/vm/isolate.cc ('K') | « runtime/vm/object.h ('k') | runtime/vm/object_id_ring.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698