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

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

Issue 10827288: - Support for patching of class methods and fields. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 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 | Annotate | Revision Log
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/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 RawClass* Object::null_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 67 RawClass* Object::null_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
68 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 68 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
69 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 69 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
70 RawClass* Object::unresolved_class_class_ = 70 RawClass* Object::unresolved_class_class_ =
71 reinterpret_cast<RawClass*>(RAW_NULL); 71 reinterpret_cast<RawClass*>(RAW_NULL);
72 RawClass* Object::type_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 72 RawClass* Object::type_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
73 RawClass* Object::type_parameter_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 73 RawClass* Object::type_parameter_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
74 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 74 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
75 RawClass* Object::instantiated_type_arguments_class_ = 75 RawClass* Object::instantiated_type_arguments_class_ =
76 reinterpret_cast<RawClass*>(RAW_NULL); 76 reinterpret_cast<RawClass*>(RAW_NULL);
77 RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
77 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 78 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
78 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 79 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
79 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 80 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
80 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 81 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
81 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 82 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
82 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 83 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
83 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 84 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
84 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 85 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
85 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 86 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
86 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 87 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 282
282 cls = Class::New<TypeParameter>(); 283 cls = Class::New<TypeParameter>();
283 type_parameter_class_ = cls.raw(); 284 type_parameter_class_ = cls.raw();
284 285
285 cls = Class::New<TypeArguments>(); 286 cls = Class::New<TypeArguments>();
286 type_arguments_class_ = cls.raw(); 287 type_arguments_class_ = cls.raw();
287 288
288 cls = Class::New<InstantiatedTypeArguments>(); 289 cls = Class::New<InstantiatedTypeArguments>();
289 instantiated_type_arguments_class_ = cls.raw(); 290 instantiated_type_arguments_class_ = cls.raw();
290 291
292 cls = Class::New<PatchClass>();
293 patch_class_class_ = cls.raw();
294
291 cls = Class::New<Function>(); 295 cls = Class::New<Function>();
292 function_class_ = cls.raw(); 296 function_class_ = cls.raw();
293 297
294 cls = Class::New<Field>(); 298 cls = Class::New<Field>();
295 field_class_ = cls.raw(); 299 field_class_ = cls.raw();
296 300
297 cls = Class::New<LiteralToken>(); 301 cls = Class::New<LiteralToken>();
298 literal_token_class_ = cls.raw(); 302 literal_token_class_ = cls.raw();
299 303
300 cls = Class::New<TokenStream>(); 304 cls = Class::New<TokenStream>();
(...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after
1223 } 1227 }
1224 1228
1225 void Class::SetFunctions(const Array& value) const { 1229 void Class::SetFunctions(const Array& value) const {
1226 ASSERT(!value.IsNull()); 1230 ASSERT(!value.IsNull());
1227 #if defined(DEBUG) 1231 #if defined(DEBUG)
1228 // Verify that all the functions in the array have this class as owner. 1232 // Verify that all the functions in the array have this class as owner.
1229 Function& func = Function::Handle(); 1233 Function& func = Function::Handle();
1230 intptr_t len = value.Length(); 1234 intptr_t len = value.Length();
1231 for (intptr_t i = 0; i < len; i++) { 1235 for (intptr_t i = 0; i < len; i++) {
1232 func ^= value.At(i); 1236 func ^= value.At(i);
1233 ASSERT(func.owner() == raw()); 1237 ASSERT(func.Owner() == raw());
1234 } 1238 }
1235 #endif 1239 #endif
1236 StorePointer(&raw_ptr()->functions_, value.raw()); 1240 StorePointer(&raw_ptr()->functions_, value.raw());
1237 } 1241 }
1238 1242
1239 1243
1240 void Class::AddClosureFunction(const Function& function) const { 1244 void Class::AddClosureFunction(const Function& function) const {
1241 GrowableObjectArray& closures = 1245 GrowableObjectArray& closures =
1242 GrowableObjectArray::Handle(raw_ptr()->closure_functions_); 1246 GrowableObjectArray::Handle(raw_ptr()->closure_functions_);
1243 if (closures.IsNull()) { 1247 if (closures.IsNull()) {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1313 1317
1314 1318
1315 intptr_t Class::NumTypeArguments() const { 1319 intptr_t Class::NumTypeArguments() const {
1316 // To work properly, this call requires the super class of this class to be 1320 // To work properly, this call requires the super class of this class to be
1317 // resolved, which is checked by the SuperClass() call. 1321 // resolved, which is checked by the SuperClass() call.
1318 Class& cls = Class::Handle(raw()); 1322 Class& cls = Class::Handle(raw());
1319 if (IsSignatureClass()) { 1323 if (IsSignatureClass()) {
1320 const Function& signature_fun = Function::Handle(signature_function()); 1324 const Function& signature_fun = Function::Handle(signature_function());
1321 if (!signature_fun.is_static() && 1325 if (!signature_fun.is_static() &&
1322 !signature_fun.HasInstantiatedSignature()) { 1326 !signature_fun.HasInstantiatedSignature()) {
1323 cls = signature_fun.owner(); 1327 cls = signature_fun.Owner();
1324 } 1328 }
1325 } 1329 }
1326 intptr_t num_type_args = NumTypeParameters(); 1330 intptr_t num_type_args = NumTypeParameters();
1327 const Class& superclass = Class::Handle(cls.SuperClass()); 1331 const Class& superclass = Class::Handle(cls.SuperClass());
1328 // Object is its own super class during bootstrap. 1332 // Object is its own super class during bootstrap.
1329 if (!superclass.IsNull() && (superclass.raw() != raw())) { 1333 if (!superclass.IsNull() && (superclass.raw() != raw())) {
1330 num_type_args += superclass.NumTypeArguments(); 1334 num_type_args += superclass.NumTypeArguments();
1331 } 1335 }
1332 return num_type_args; 1336 return num_type_args;
1333 } 1337 }
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1473 // Prefinalized classes have a VM internal representation and no Dart fields. 1477 // Prefinalized classes have a VM internal representation and no Dart fields.
1474 // Their instance size is precomputed and field offsets are known. 1478 // Their instance size is precomputed and field offsets are known.
1475 if (!is_prefinalized()) { 1479 if (!is_prefinalized()) {
1476 // Compute offsets of instance fields and instance size. 1480 // Compute offsets of instance fields and instance size.
1477 CalculateFieldOffsets(); 1481 CalculateFieldOffsets();
1478 } 1482 }
1479 set_is_finalized(); 1483 set_is_finalized();
1480 } 1484 }
1481 1485
1482 1486
1487 void Class::ApplyPatch(const Class& with) const {
1488 ASSERT(!is_finalized());
1489 const Script& patch_script = Script::Handle(with.script());
1490 const String& str = String::Handle(patch_script.Source());
1491 OS::PrintErr("patch_script: %s\n", str.ToCString());
Ivan Posva 2012/08/14 01:21:49 Debug print removed...
1492 const PatchClass& patch = PatchClass::Handle(
1493 PatchClass::New(*this, patch_script));
1494
1495 const Array& orig_functions = Array::Handle(functions());
1496 intptr_t orig_len = orig_functions.Length();
1497
1498 const Array& patch_functions = Array::Handle(with.functions());
1499 intptr_t patch_len = patch_functions.Length();
1500
1501 // TODO(iposva): Verify that only patching existing methods and adding only
1502 // new private methods.
1503 Function& func = Function::Handle();
1504 const Array& new_functions = Array::Handle(Array::New(patch_len + orig_len));
siva 2012/08/15 00:16:04 I think you should add a comment here that current
Ivan Posva 2012/08/15 06:50:39 I attempted to address the second part of your sug
1505 for (intptr_t i = 0; i < patch_len; i++) {
1506 func ^= patch_functions.At(i);
1507 func.set_owner(patch);
1508 new_functions.SetAt(i, func);
1509 }
1510 for (intptr_t i = 0; i < orig_len; i++) {
1511 func ^= orig_functions.At(i);
1512 new_functions.SetAt(patch_len + i, func);
1513 }
1514 SetFunctions(new_functions);
1515
1516 const Array& orig_fields = Array::Handle(fields());
1517 orig_len = orig_fields.Length();
1518
1519 const Array& patch_fields = Array::Handle(with.fields());
1520 patch_len = patch_fields.Length();
siva 2012/08/15 00:16:04 why not call the array handle variables orig_list,
Ivan Posva 2012/08/15 06:50:39 ditto
1521
1522 // TODO(iposva): Verify that no duplicate fields are entered.
1523 Field& field = Field::Handle();
1524 const Array& new_fields = Array::Handle(Array::New(patch_len + orig_len));
1525 for (intptr_t i = 0; i < patch_len; i++) {
1526 field ^= patch_fields.At(i);
1527 field.set_owner(*this);
1528 new_fields.SetAt(i, field);
1529 }
1530 for (intptr_t i = 0; i < orig_len; i++) {
1531 field ^= orig_fields.At(i);
1532 new_fields.SetAt(patch_len + i, field);
1533 }
1534 SetFields(new_fields);
1535 }
1536
1537
1483 void Class::SetFields(const Array& value) const { 1538 void Class::SetFields(const Array& value) const {
1484 ASSERT(!value.IsNull()); 1539 ASSERT(!value.IsNull());
1485 #if defined(DEBUG) 1540 #if defined(DEBUG)
1486 // Verify that all the fields in the array have this class as owner. 1541 // Verify that all the fields in the array have this class as owner.
1487 Field& field = Field::Handle(); 1542 Field& field = Field::Handle();
1488 intptr_t len = value.Length(); 1543 intptr_t len = value.Length();
1489 for (intptr_t i = 0; i < len; i++) { 1544 for (intptr_t i = 0; i < len; i++) {
1490 field ^= value.At(i); 1545 field ^= value.At(i);
1491 ASSERT(field.owner() == raw()); 1546 ASSERT(field.owner() == raw());
1492 } 1547 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1550 Class& result = Class::Handle(New<Instance>(name, script, token_pos)); 1605 Class& result = Class::Handle(New<Instance>(name, script, token_pos));
1551 result.set_is_interface(); 1606 result.set_is_interface();
1552 return result.raw(); 1607 return result.raw();
1553 } 1608 }
1554 1609
1555 1610
1556 RawClass* Class::NewSignatureClass(const String& name, 1611 RawClass* Class::NewSignatureClass(const String& name,
1557 const Function& signature_function, 1612 const Function& signature_function,
1558 const Script& script) { 1613 const Script& script) {
1559 ASSERT(!signature_function.IsNull()); 1614 ASSERT(!signature_function.IsNull());
1560 const Class& owner_class = Class::Handle(signature_function.owner()); 1615 const Class& owner_class = Class::Handle(signature_function.Owner());
1561 ASSERT(!owner_class.IsNull()); 1616 ASSERT(!owner_class.IsNull());
1562 TypeArguments& type_parameters = TypeArguments::Handle(); 1617 TypeArguments& type_parameters = TypeArguments::Handle();
1563 // A signature class extends class Instance and is parameterized in the same 1618 // A signature class extends class Instance and is parameterized in the same
1564 // way as the owner class of its non-static signature function. 1619 // way as the owner class of its non-static signature function.
1565 // It is not type parameterized if its signature function is static. 1620 // It is not type parameterized if its signature function is static.
1566 if (!signature_function.is_static() && 1621 if (!signature_function.is_static() &&
1567 (owner_class.NumTypeParameters() > 0) && 1622 (owner_class.NumTypeParameters() > 0) &&
1568 !signature_function.HasInstantiatedSignature()) { 1623 !signature_function.HasInstantiatedSignature()) {
1569 type_parameters = owner_class.type_parameters(); 1624 type_parameters = owner_class.type_parameters();
1570 } 1625 }
(...skipping 1924 matching lines...) Expand 10 before | Expand all | Expand 10 after
3495 const char* instantiator_cstr = 3550 const char* instantiator_cstr =
3496 AbstractTypeArguments::Handle(instantiator_type_arguments()).ToCString(); 3551 AbstractTypeArguments::Handle(instantiator_type_arguments()).ToCString();
3497 intptr_t len = 3552 intptr_t len =
3498 OS::SNPrint(NULL, 0, format, arg_cstr, instantiator_cstr) + 1; 3553 OS::SNPrint(NULL, 0, format, arg_cstr, instantiator_cstr) + 1;
3499 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 3554 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
3500 OS::SNPrint(chars, len, format, arg_cstr, instantiator_cstr); 3555 OS::SNPrint(chars, len, format, arg_cstr, instantiator_cstr);
3501 return chars; 3556 return chars;
3502 } 3557 }
3503 3558
3504 3559
3560 const char* PatchClass::ToCString() const {
3561 const char* kFormat = "PatchClass for %s";
3562 const Class& cls = Class::Handle(patched_class());
3563 const char* cls_name = cls.ToCString();
3564 intptr_t len = OS::SNPrint(NULL, 0, kFormat, cls_name) + 1;
3565 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
3566 OS::SNPrint(chars, len, kFormat, cls_name);
3567 return chars;
3568 }
3569
3570
3571 RawPatchClass* PatchClass::New(const Class& patched_class,
3572 const Script& script) {
3573 const PatchClass& result = PatchClass::Handle(PatchClass::New());
3574 result.set_patched_class(patched_class);
3575 result.set_script(script);
3576 return result.raw();
3577 }
3578
3579
3580 RawPatchClass* PatchClass::New() {
3581 ASSERT(Object::patch_class_class() != Class::null());
3582 RawObject* raw = Object::Allocate(PatchClass::kClassId,
3583 PatchClass::InstanceSize(),
3584 Heap::kOld);
3585 return reinterpret_cast<RawPatchClass*>(raw);
3586 }
3587
3588
3589 void PatchClass::set_patched_class(const Class& value) const {
3590 StorePointer(&raw_ptr()->patched_class_, value.raw());
3591 }
3592
3593
3594 void PatchClass::set_script(const Script& value) const {
3595 StorePointer(&raw_ptr()->script_, value.raw());
3596 }
3597
3598
3505 void Function::SetCode(const Code& value) const { 3599 void Function::SetCode(const Code& value) const {
3506 StorePointer(&raw_ptr()->code_, value.raw()); 3600 StorePointer(&raw_ptr()->code_, value.raw());
3507 ASSERT(Function::Handle(value.function()).IsNull() || 3601 ASSERT(Function::Handle(value.function()).IsNull() ||
3508 (value.function() == this->raw())); 3602 (value.function() == this->raw()));
3509 value.set_function(*this); 3603 value.set_function(*this);
3510 } 3604 }
3511 3605
3512 3606
3513 void Function::SwitchToUnoptimizedCode() const { 3607 void Function::SwitchToUnoptimizedCode() const {
3514 ASSERT(HasOptimizedCode()); 3608 ASSERT(HasOptimizedCode());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3562 return outer_function.IsFactory(); 3656 return outer_function.IsFactory();
3563 } 3657 }
3564 3658
3565 3659
3566 void Function::set_name(const String& value) const { 3660 void Function::set_name(const String& value) const {
3567 ASSERT(value.IsSymbol()); 3661 ASSERT(value.IsSymbol());
3568 StorePointer(&raw_ptr()->name_, value.raw()); 3662 StorePointer(&raw_ptr()->name_, value.raw());
3569 } 3663 }
3570 3664
3571 3665
3572 void Function::set_owner(const Class& value) const { 3666 void Function::set_owner(const Object& value) const {
3573 ASSERT(!value.IsNull()); 3667 ASSERT(!value.IsNull());
3574 StorePointer(&raw_ptr()->owner_, value.raw()); 3668 StorePointer(&raw_ptr()->owner_, value.raw());
3575 } 3669 }
3576 3670
3577 3671
3578 void Function::set_result_type(const AbstractType& value) const { 3672 void Function::set_result_type(const AbstractType& value) const {
3579 ASSERT(!value.IsNull()); 3673 ASSERT(!value.IsNull());
3580 StorePointer(&raw_ptr()->result_type_, value.raw()); 3674 StorePointer(&raw_ptr()->result_type_, value.raw());
3581 } 3675 }
3582 3676
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
3806 // Set 'chars' to allocated buffer and return number of written characters. 3900 // Set 'chars' to allocated buffer and return number of written characters.
3807 static intptr_t ConstructFunctionFullyQualifiedCString(const Function& function, 3901 static intptr_t ConstructFunctionFullyQualifiedCString(const Function& function,
3808 char** chars, 3902 char** chars,
3809 intptr_t reserve_len) { 3903 intptr_t reserve_len) {
3810 const char* name = String::Handle(function.name()).ToCString(); 3904 const char* name = String::Handle(function.name()).ToCString();
3811 const char* function_format = (reserve_len == 0) ? "%s" : "%s_"; 3905 const char* function_format = (reserve_len == 0) ? "%s" : "%s_";
3812 reserve_len += OS::SNPrint(NULL, 0, function_format, name); 3906 reserve_len += OS::SNPrint(NULL, 0, function_format, name);
3813 const Function& parent = Function::Handle(function.parent_function()); 3907 const Function& parent = Function::Handle(function.parent_function());
3814 intptr_t written = 0; 3908 intptr_t written = 0;
3815 if (parent.IsNull()) { 3909 if (parent.IsNull()) {
3816 const Class& function_class = Class::Handle(function.owner()); 3910 const Class& function_class = Class::Handle(function.Owner());
3817 ASSERT(!function_class.IsNull()); 3911 ASSERT(!function_class.IsNull());
3818 const char* class_name = String::Handle(function_class.Name()).ToCString(); 3912 const char* class_name = String::Handle(function_class.Name()).ToCString();
3819 ASSERT(class_name != NULL); 3913 ASSERT(class_name != NULL);
3820 const Library& library = Library::Handle(function_class.library()); 3914 const Library& library = Library::Handle(function_class.library());
3821 ASSERT(!library.IsNull()); 3915 ASSERT(!library.IsNull());
3822 const char* library_name = String::Handle(library.url()).ToCString(); 3916 const char* library_name = String::Handle(library.url()).ToCString();
3823 ASSERT(library_name != NULL); 3917 ASSERT(library_name != NULL);
3824 const char* lib_class_format = 3918 const char* lib_class_format =
3825 (library_name[0] == '\0') ? "%s%s_" : "%s_%s_"; 3919 (library_name[0] == '\0') ? "%s%s_" : "%s_%s_";
3826 reserve_len += 3920 reserve_len +=
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
4046 result.set_is_native(false); 4140 result.set_is_native(false);
4047 return result.raw(); 4141 return result.raw();
4048 } 4142 }
4049 4143
4050 4144
4051 RawFunction* Function::NewClosureFunction(const String& name, 4145 RawFunction* Function::NewClosureFunction(const String& name,
4052 const Function& parent, 4146 const Function& parent,
4053 intptr_t token_pos) { 4147 intptr_t token_pos) {
4054 ASSERT(name.IsOneByteString()); 4148 ASSERT(name.IsOneByteString());
4055 ASSERT(!parent.IsNull()); 4149 ASSERT(!parent.IsNull());
4056 const Class& parent_class = Class::Handle(parent.owner()); 4150 const Class& parent_class = Class::Handle(parent.Owner());
4057 ASSERT(!parent_class.IsNull()); 4151 ASSERT(!parent_class.IsNull());
4058 const Function& result = Function::Handle( 4152 const Function& result = Function::Handle(
4059 Function::New(name, 4153 Function::New(name,
4060 RawFunction::kClosureFunction, 4154 RawFunction::kClosureFunction,
4061 /* is_static = */ parent.is_static(), 4155 /* is_static = */ parent.is_static(),
4062 /* is_const = */ false, 4156 /* is_const = */ false,
4063 /* is_abstract = */ false, 4157 /* is_abstract = */ false,
4064 /* is_external = */ false, 4158 /* is_external = */ false,
4065 parent_class, 4159 parent_class,
4066 token_pos)); 4160 token_pos));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4108 String& param_name = String::Handle(); 4202 String& param_name = String::Handle();
4109 for (int i = 0; i < num_params; i++) { 4203 for (int i = 0; i < num_params; i++) {
4110 param_type = ParameterTypeAt(i + has_receiver); 4204 param_type = ParameterTypeAt(i + has_receiver);
4111 closure_function.SetParameterTypeAt(i, param_type); 4205 closure_function.SetParameterTypeAt(i, param_type);
4112 param_name = ParameterNameAt(i + has_receiver); 4206 param_name = ParameterNameAt(i + has_receiver);
4113 closure_function.SetParameterNameAt(i, param_name); 4207 closure_function.SetParameterNameAt(i, param_name);
4114 } 4208 }
4115 4209
4116 // Lookup or create a new signature class for the closure function in the 4210 // Lookup or create a new signature class for the closure function in the
4117 // library of the owner class. 4211 // library of the owner class.
4118 const Class& owner_class = Class::Handle(owner()); 4212 const Class& owner_class = Class::Handle(Owner());
4119 ASSERT(!owner_class.IsNull() && (owner() == closure_function.owner())); 4213 ASSERT(!owner_class.IsNull() && (Owner() == closure_function.Owner()));
4120 const Library& library = Library::Handle(owner_class.library()); 4214 const Library& library = Library::Handle(owner_class.library());
4121 ASSERT(!library.IsNull()); 4215 ASSERT(!library.IsNull());
4122 const String& signature = String::Handle(closure_function.Signature()); 4216 const String& signature = String::Handle(closure_function.Signature());
4123 Class& signature_class = Class::ZoneHandle( 4217 Class& signature_class = Class::ZoneHandle(
4124 library.LookupLocalClass(signature)); 4218 library.LookupLocalClass(signature));
4125 if (signature_class.IsNull()) { 4219 if (signature_class.IsNull()) {
4126 const Script& script = Script::Handle(owner_class.script()); 4220 const Script& script = Script::Handle(this->script());
4127 signature_class = Class::NewSignatureClass(signature, 4221 signature_class = Class::NewSignatureClass(signature,
4128 closure_function, 4222 closure_function,
4129 script); 4223 script);
4130 library.AddClass(signature_class); 4224 library.AddClass(signature_class);
4131 } else { 4225 } else {
4132 closure_function.set_signature_class(signature_class); 4226 closure_function.set_signature_class(signature_class);
4133 } 4227 }
4134 const Type& signature_type = Type::Handle(signature_class.SignatureType()); 4228 const Type& signature_type = Type::Handle(signature_class.SignatureType());
4135 if (!signature_type.IsFinalized()) { 4229 if (!signature_type.IsFinalized()) {
4136 ClassFinalizer::FinalizeType( 4230 ClassFinalizer::FinalizeType(
(...skipping 19 matching lines...) Expand all
4156 const String& kLBracket = String::Handle(Symbols::New("[")); 4250 const String& kLBracket = String::Handle(Symbols::New("["));
4157 const String& kRBracket = String::Handle(Symbols::New("]")); 4251 const String& kRBracket = String::Handle(Symbols::New("]"));
4158 String& name = String::Handle(); 4252 String& name = String::Handle();
4159 if (!instantiate && !is_static()) { 4253 if (!instantiate && !is_static()) {
4160 // Prefix the signature with its type parameters, if any (e.g. "<K, V>"). 4254 // Prefix the signature with its type parameters, if any (e.g. "<K, V>").
4161 // The signature of static functions cannot be type parameterized. 4255 // The signature of static functions cannot be type parameterized.
4162 const String& kSpaceExtendsSpace = 4256 const String& kSpaceExtendsSpace =
4163 String::Handle(Symbols::New(" extends ")); 4257 String::Handle(Symbols::New(" extends "));
4164 const String& kLAngleBracket = String::Handle(Symbols::New("<")); 4258 const String& kLAngleBracket = String::Handle(Symbols::New("<"));
4165 const String& kRAngleBracket = String::Handle(Symbols::New(">")); 4259 const String& kRAngleBracket = String::Handle(Symbols::New(">"));
4166 const Class& function_class = Class::Handle(owner()); 4260 const Class& function_class = Class::Handle(Owner());
4167 ASSERT(!function_class.IsNull()); 4261 ASSERT(!function_class.IsNull());
4168 const TypeArguments& type_parameters = TypeArguments::Handle( 4262 const TypeArguments& type_parameters = TypeArguments::Handle(
4169 function_class.type_parameters()); 4263 function_class.type_parameters());
4170 if (!type_parameters.IsNull()) { 4264 if (!type_parameters.IsNull()) {
4171 intptr_t num_type_parameters = type_parameters.Length(); 4265 intptr_t num_type_parameters = type_parameters.Length();
4172 pieces.Add(kLAngleBracket); 4266 pieces.Add(kLAngleBracket);
4173 TypeParameter& type_parameter = TypeParameter::Handle(); 4267 TypeParameter& type_parameter = TypeParameter::Handle();
4174 AbstractType& bound = AbstractType::Handle(); 4268 AbstractType& bound = AbstractType::Handle();
4175 for (intptr_t i = 0; i < num_type_parameters; i++) { 4269 for (intptr_t i = 0; i < num_type_parameters; i++) {
4176 type_parameter ^= type_parameters.TypeAt(i); 4270 type_parameter ^= type_parameters.TypeAt(i);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
4247 for (intptr_t i = 0; i < num_parameters; i++) { 4341 for (intptr_t i = 0; i < num_parameters; i++) {
4248 type = ParameterTypeAt(i); 4342 type = ParameterTypeAt(i);
4249 if (!type.IsInstantiated()) { 4343 if (!type.IsInstantiated()) {
4250 return false; 4344 return false;
4251 } 4345 }
4252 } 4346 }
4253 return true; 4347 return true;
4254 } 4348 }
4255 4349
4256 4350
4351 RawClass* Function::Owner() const {
4352 const Object& obj = Object::Handle(raw_ptr()->owner_);
hausner 2012/08/14 18:25:06 It would be nice if you could avoid this extra han
Ivan Posva 2012/08/15 06:50:39 I have seen 0% impact by this change on performanc
4353 if (obj.IsClass()) {
4354 return Class::Cast(obj).raw();
4355 }
4356 ASSERT(obj.IsPatchClass());
4357 return PatchClass::Cast(obj).patched_class();
4358 }
4359
4360
4361 RawScript* Function::script() const {
4362 const Object& obj = Object::Handle(raw_ptr()->owner_);
4363 if (obj.IsClass()) {
4364 return Class::Cast(obj).script();
4365 }
4366 ASSERT(obj.IsPatchClass());
4367 return PatchClass::Cast(obj).script();
4368 }
4369
4370
4257 bool Function::HasOptimizedCode() const { 4371 bool Function::HasOptimizedCode() const {
4258 return HasCode() && Code::Handle(raw_ptr()->code_).is_optimized(); 4372 return HasCode() && Code::Handle(raw_ptr()->code_).is_optimized();
4259 } 4373 }
4260 4374
4261 4375
4262 RawString* Function::UserVisibleName() const { 4376 RawString* Function::UserVisibleName() const {
4263 const String& str = String::Handle(name()); 4377 const String& str = String::Handle(name());
4264 return IdentifierPrettyName(str); 4378 return IdentifierPrettyName(str);
4265 } 4379 }
4266 4380
4267 4381
4268 RawString* Function::QualifiedUserVisibleName() const { 4382 RawString* Function::QualifiedUserVisibleName() const {
4269 String& tmp = String::Handle(); 4383 String& tmp = String::Handle();
4270 String& suffix = String::Handle(); 4384 String& suffix = String::Handle();
4271 const Class& cls = Class::Handle(owner()); 4385 const Class& cls = Class::Handle(Owner());
4272 4386
4273 if (IsClosureFunction()) { 4387 if (IsClosureFunction()) {
4274 if (IsLocalFunction()) { 4388 if (IsLocalFunction()) {
4275 const Function& parent = Function::Handle(parent_function()); 4389 const Function& parent = Function::Handle(parent_function());
4276 tmp = parent.QualifiedUserVisibleName(); 4390 tmp = parent.QualifiedUserVisibleName();
4277 } else { 4391 } else {
4278 return UserVisibleName(); 4392 return UserVisibleName();
4279 } 4393 }
4280 } else { 4394 } else {
4281 if (cls.IsTopLevel()) { 4395 if (cls.IsTopLevel()) {
(...skipping 1210 matching lines...) Expand 10 before | Expand all | Expand 10 after
5492 5606
5493 5607
5494 RawArray* Library::LoadedScripts() const { 5608 RawArray* Library::LoadedScripts() const {
5495 // We compute the list of loaded scripts lazily. The result is 5609 // We compute the list of loaded scripts lazily. The result is
5496 // cached in loaded_scripts_. 5610 // cached in loaded_scripts_.
5497 if (loaded_scripts() == Array::null()) { 5611 if (loaded_scripts() == Array::null()) {
5498 // Iterate over the library dictionary and collect all scripts. 5612 // Iterate over the library dictionary and collect all scripts.
5499 const GrowableObjectArray& scripts = 5613 const GrowableObjectArray& scripts =
5500 GrowableObjectArray::Handle(GrowableObjectArray::New(8)); 5614 GrowableObjectArray::Handle(GrowableObjectArray::New(8));
5501 Object& entry = Object::Handle(); 5615 Object& entry = Object::Handle();
5502 Function& func = Function::Handle();
5503 Field& field = Field::Handle();
5504 Class& cls = Class::Handle(); 5616 Class& cls = Class::Handle();
5505 Script& owner_script = Script::Handle(); 5617 Script& owner_script = Script::Handle();
5506 DictionaryIterator it(*this); 5618 DictionaryIterator it(*this);
5507 Script& script_obj = Script::Handle(); 5619 Script& script_obj = Script::Handle();
5508 while (it.HasNext()) { 5620 while (it.HasNext()) {
5509 entry = it.GetNext(); 5621 entry = it.GetNext();
5510 if (entry.IsClass()) { 5622 if (entry.IsClass()) {
5511 cls ^= entry.raw(); 5623 owner_script = Class::Cast(entry).script();
5512 } else if (entry.IsFunction()) { 5624 } else if (entry.IsFunction()) {
5513 func ^= entry.raw(); 5625 owner_script = Function::Cast(entry).script();
5514 cls = func.owner();
5515 } else if (entry.IsField()) { 5626 } else if (entry.IsField()) {
5516 field ^= entry.raw(); 5627 cls = Field::Cast(entry).owner();
5517 cls = field.owner(); 5628 owner_script = cls.script();
5518 } else { 5629 } else {
5519 continue; 5630 continue;
5520 } 5631 }
5521 owner_script = cls.script();
5522 if (owner_script.IsNull()) { 5632 if (owner_script.IsNull()) {
5523 continue; 5633 continue;
5524 } 5634 }
5525 bool is_unique = true; 5635 bool is_unique = true;
5526 for (int i = 0; i < scripts.Length(); i++) { 5636 for (int i = 0; i < scripts.Length(); i++) {
5527 script_obj ^= scripts.At(i); 5637 script_obj ^= scripts.At(i);
5528 if (script_obj.raw() == owner_script.raw()) { 5638 if (script_obj.raw() == owner_script.raw()) {
5529 // We already have a reference to this script. 5639 // We already have a reference to this script.
5530 is_unique = false; 5640 is_unique = false;
5531 break; 5641 break;
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
5771 // library in which it is defined as it might be defined in one of 5881 // library in which it is defined as it might be defined in one of
5772 // the imported libraries. 5882 // the imported libraries.
5773 Class& cls = Class::Handle(isolate, Class::null()); 5883 Class& cls = Class::Handle(isolate, Class::null());
5774 Function& func = Function::Handle(isolate, Function::null()); 5884 Function& func = Function::Handle(isolate, Function::null());
5775 Field& field = Field::Handle(isolate, Field::null()); 5885 Field& field = Field::Handle(isolate, Field::null());
5776 if (obj.IsClass()) { 5886 if (obj.IsClass()) {
5777 cls ^= obj.raw(); 5887 cls ^= obj.raw();
5778 lib ^= cls.library(); 5888 lib ^= cls.library();
5779 } else if (obj.IsFunction()) { 5889 } else if (obj.IsFunction()) {
5780 func ^= obj.raw(); 5890 func ^= obj.raw();
5781 cls ^= func.owner(); 5891 cls ^= func.Owner();
5782 lib ^= cls.library(); 5892 lib ^= cls.library();
5783 } else if (obj.IsField()) { 5893 } else if (obj.IsField()) {
5784 field ^= obj.raw(); 5894 field ^= obj.raw();
5785 cls ^= field.owner(); 5895 cls ^= field.owner();
5786 lib ^= cls.library(); 5896 lib ^= cls.library();
5787 } 5897 }
5788 return lib.raw(); 5898 return lib.raw();
5789 } 5899 }
5790 } 5900 }
5791 return Library::null(); 5901 return Library::null();
(...skipping 1843 matching lines...) Expand 10 before | Expand all | Expand 10 after
7635 } 7745 }
7636 } 7746 }
7637 return result.raw(); 7747 return result.raw();
7638 } 7748 }
7639 7749
7640 7750
7641 bool ICData::AllTargetsHaveSameOwner(intptr_t owner_cid) const { 7751 bool ICData::AllTargetsHaveSameOwner(intptr_t owner_cid) const {
7642 if (NumberOfChecks() == 0) return false; 7752 if (NumberOfChecks() == 0) return false;
7643 Class& cls = Class::Handle(); 7753 Class& cls = Class::Handle();
7644 for (intptr_t i = 0; i < NumberOfChecks(); i++) { 7754 for (intptr_t i = 0; i < NumberOfChecks(); i++) {
7645 cls = Function::Handle(GetTargetAt(i)).owner(); 7755 cls = Function::Handle(GetTargetAt(i)).Owner();
7646 if (cls.id() != owner_cid) { 7756 if (cls.id() != owner_cid) {
7647 return false; 7757 return false;
7648 } 7758 }
7649 } 7759 }
7650 return true; 7760 return true;
7651 } 7761 }
7652 7762
7653 7763
7654 bool ICData::AllReceiversAreNumbers() const { 7764 bool ICData::AllReceiversAreNumbers() const {
7655 if (NumberOfChecks() == 0) return false; 7765 if (NumberOfChecks() == 0) return false;
7656 Class& cls = Class::Handle(); 7766 Class& cls = Class::Handle();
7657 for (intptr_t i = 0; i < NumberOfChecks(); i++) { 7767 for (intptr_t i = 0; i < NumberOfChecks(); i++) {
7658 cls = Function::Handle(GetTargetAt(i)).owner(); 7768 cls = Function::Handle(GetTargetAt(i)).Owner();
7659 const intptr_t cid = cls.id(); 7769 const intptr_t cid = cls.id();
7660 if ((cid != kSmiCid) && 7770 if ((cid != kSmiCid) &&
7661 (cid != kMintCid) && 7771 (cid != kMintCid) &&
7662 (cid != kBigintCid) && 7772 (cid != kBigintCid) &&
7663 (cid != kDoubleCid)) { 7773 (cid != kDoubleCid)) {
7664 return false; 7774 return false;
7665 } 7775 }
7666 } 7776 }
7667 return true; 7777 return true;
7668 } 7778 }
(...skipping 3262 matching lines...) Expand 10 before | Expand all | Expand 10 after
10931 code_array.SetAt(i, obj); 11041 code_array.SetAt(i, obj);
10932 obj = pc_offset_list.At(j); 11042 obj = pc_offset_list.At(j);
10933 pc_offset_array.SetAt(i, obj); 11043 pc_offset_array.SetAt(i, obj);
10934 } 11044 }
10935 } 11045 }
10936 11046
10937 11047
10938 const char* Stacktrace::ToCString() const { 11048 const char* Stacktrace::ToCString() const {
10939 Function& function = Function::Handle(); 11049 Function& function = Function::Handle();
10940 Code& code = Code::Handle(); 11050 Code& code = Code::Handle();
10941 Class& owner = Class::Handle();
10942 Script& script = Script::Handle(); 11051 Script& script = Script::Handle();
10943 String& function_name = String::Handle(); 11052 String& function_name = String::Handle();
10944 String& url = String::Handle(); 11053 String& url = String::Handle();
10945 11054
10946 // Iterate through the stack frames and create C string description 11055 // Iterate through the stack frames and create C string description
10947 // for each frame. 11056 // for each frame.
10948 intptr_t total_len = 0; 11057 intptr_t total_len = 0;
10949 const char* kFormat = "#%-6d %s (%s:%d:%d)\n"; 11058 const char* kFormat = "#%-6d %s (%s:%d:%d)\n";
10950 GrowableArray<char*> frame_strings; 11059 GrowableArray<char*> frame_strings;
10951 for (intptr_t i = 0; i < Length(); i++) { 11060 for (intptr_t i = 0; i < Length(); i++) {
10952 function = FunctionAtFrame(i); 11061 function = FunctionAtFrame(i);
10953 code = CodeAtFrame(i); 11062 code = CodeAtFrame(i);
10954 uword pc = code.EntryPoint() + Smi::Value(PcOffsetAtFrame(i)); 11063 uword pc = code.EntryPoint() + Smi::Value(PcOffsetAtFrame(i));
10955 intptr_t token_pos = code.GetTokenIndexOfPC(pc); 11064 intptr_t token_pos = code.GetTokenIndexOfPC(pc);
10956 owner = function.owner(); 11065 script = function.script();
10957 script = owner.script();
10958 function_name = function.QualifiedUserVisibleName(); 11066 function_name = function.QualifiedUserVisibleName();
10959 url = script.url(); 11067 url = script.url();
10960 intptr_t line = -1; 11068 intptr_t line = -1;
10961 intptr_t column = -1; 11069 intptr_t column = -1;
10962 if (token_pos >= 0) { 11070 if (token_pos >= 0) {
10963 script.GetTokenLocation(token_pos, &line, &column); 11071 script.GetTokenLocation(token_pos, &line, &column);
10964 } 11072 }
10965 intptr_t len = OS::SNPrint(NULL, 0, kFormat, 11073 intptr_t len = OS::SNPrint(NULL, 0, kFormat,
10966 i, 11074 i,
10967 function_name.ToCString(), 11075 function_name.ToCString(),
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
11081 const char* JSRegExp::ToCString() const { 11189 const char* JSRegExp::ToCString() const {
11082 const String& str = String::Handle(pattern()); 11190 const String& str = String::Handle(pattern());
11083 const char* format = "JSRegExp: pattern=%s flags=%s"; 11191 const char* format = "JSRegExp: pattern=%s flags=%s";
11084 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 11192 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
11085 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); 11193 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
11086 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 11194 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
11087 return chars; 11195 return chars;
11088 } 11196 }
11089 11197
11090 } // namespace dart 11198 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_test.cc » ('j') | runtime/vm/parser.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698