Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/object.h" | 5 #include "vm/object.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 7369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7380 jsobj.AddProperty("_guardLength", guarded_list_length()); | 7380 jsobj.AddProperty("_guardLength", guarded_list_length()); |
| 7381 } | 7381 } |
| 7382 const Class& origin_cls = Class::Handle(origin()); | 7382 const Class& origin_cls = Class::Handle(origin()); |
| 7383 const Script& script = Script::Handle(origin_cls.script()); | 7383 const Script& script = Script::Handle(origin_cls.script()); |
| 7384 if (!script.IsNull()) { | 7384 if (!script.IsNull()) { |
| 7385 jsobj.AddLocation(script, token_pos()); | 7385 jsobj.AddLocation(script, token_pos()); |
| 7386 } | 7386 } |
| 7387 } | 7387 } |
| 7388 | 7388 |
| 7389 | 7389 |
| 7390 // Build a closure object that gets the contents of a static field f | |
| 7391 // and cache the closure in a newly created static field named #f. | |
| 7392 RawInstance* Field::GetterClosure() const { | |
| 7393 ASSERT(is_static()); | |
| 7394 const Class& field_owner = Class::Handle(owner()); | |
| 7395 | |
| 7396 String& closure_name = String::Handle(); | |
|
Florian Schneider
2015/07/22 08:25:53
String& closure_name = String::Handle(this->name()
hausner
2015/07/22 18:41:09
vertigo prevented :)
| |
| 7397 closure_name = this->name(); | |
| 7398 closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name); | |
| 7399 | |
| 7400 Field& closure_field = Field::Handle(); | |
| 7401 closure_field = field_owner.LookupStaticField(closure_name); | |
| 7402 if (!closure_field.IsNull()) { | |
| 7403 ASSERT(closure_field.is_static()); | |
| 7404 const Instance& closure = Instance::Handle(closure_field.value()); | |
| 7405 ASSERT(!closure.IsNull()); | |
| 7406 ASSERT(closure.IsClosure()); | |
| 7407 return closure.raw(); | |
| 7408 } | |
| 7409 | |
| 7410 // This is the first time a getter closure for this field is requested. | |
| 7411 // Create the closure and a new static field in which the closure is | |
| 7412 // stored. | |
| 7413 const char* field_name = String::Handle(name()).ToCString(); | |
| 7414 String& expr_src = String::Handle( | |
| 7415 String::NewFormatted("() { return %s; }", field_name)); | |
| 7416 Object& result = | |
| 7417 Object::Handle(field_owner.Evaluate(expr_src, | |
| 7418 Object::empty_array(), | |
| 7419 Object::empty_array())); | |
| 7420 ASSERT(result.IsInstance()); | |
| 7421 // The caller may expect the closure to be allocated in old space. Copy | |
| 7422 // the result here, since Object::Clone() is a private method. | |
| 7423 result = Object::Clone(result, Heap::kOld); | |
| 7424 | |
| 7425 closure_field = Field::New(closure_name, | |
| 7426 true, // is_static | |
| 7427 true, // is_final | |
| 7428 true, // is_const | |
| 7429 true, // is_synthetic | |
| 7430 field_owner, | |
| 7431 this->token_pos()); | |
| 7432 closure_field.set_value(Instance::Cast(result)); | |
| 7433 closure_field.set_type(Type::Handle(Type::DynamicType())); | |
| 7434 field_owner.AddField(closure_field); | |
| 7435 | |
| 7436 return Instance::RawCast(result.raw()); | |
| 7437 } | |
| 7438 | |
| 7439 | |
| 7440 // Build a closure object that sets the contents of a static field f | |
| 7441 // and cache the closure in a newly created static field named #f=. | |
| 7442 RawInstance* Field::SetterClosure() const { | |
| 7443 ASSERT(is_static()); | |
| 7444 const Class& field_owner = Class::Handle(owner()); | |
| 7445 | |
| 7446 String& closure_name = String::Handle(); | |
|
Florian Schneider
2015/07/22 08:25:53
String& closure_name = String::Handle(this->name()
hausner
2015/07/22 18:41:09
Done.
| |
| 7447 closure_name = this->name(); | |
| 7448 closure_name = String::Concat(closure_name, Symbols::Equals()); | |
| 7449 closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name); | |
| 7450 | |
| 7451 Field& closure_field = Field::Handle(); | |
| 7452 closure_field = field_owner.LookupStaticField(closure_name); | |
| 7453 if (!closure_field.IsNull()) { | |
| 7454 ASSERT(closure_field.is_static()); | |
| 7455 const Instance& closure = Instance::Handle(closure_field.value()); | |
| 7456 ASSERT(!closure.IsNull()); | |
| 7457 ASSERT(closure.IsClosure()); | |
| 7458 return closure.raw(); | |
| 7459 } | |
| 7460 | |
| 7461 // This is the first time a getter closure for this field is requested. | |
|
Florian Schneider
2015/07/22 08:25:53
Update comment for setter closure.
hausner
2015/07/22 18:41:09
Done.
| |
| 7462 // Create the closure and a new static field in which the closure is | |
| 7463 // stored. | |
| 7464 const String& field_name = String::Handle(name()); | |
| 7465 String& expr_src = String::Handle(); | |
| 7466 if (field_owner.IsTopLevel()) { | |
|
Florian Schneider
2015/07/22 08:25:54
Why is the top-level case needed here, and not for
hausner
2015/07/22 18:41:09
The class name is added to avoid name conflicts wh
| |
| 7467 expr_src = String::NewFormatted("(value) { return %s = value; }", | |
| 7468 field_name.ToCString()); | |
| 7469 } else { | |
| 7470 const String& owner_name = String::Handle(field_owner.Name()); | |
| 7471 expr_src = String::NewFormatted("(value) { return %s.%s = value; }", | |
| 7472 owner_name.ToCString(), | |
| 7473 field_name.ToCString()); | |
| 7474 } | |
| 7475 Object& result = | |
| 7476 Object::Handle(field_owner.Evaluate(expr_src, | |
| 7477 Object::empty_array(), | |
| 7478 Object::empty_array())); | |
| 7479 ASSERT(result.IsInstance()); | |
| 7480 // The caller may expect the closure to be allocated in old space. Copy | |
| 7481 // the result here, since Object::Clone() is a private method. | |
| 7482 result = Object::Clone(result, Heap::kOld); | |
| 7483 | |
| 7484 closure_field = Field::New(closure_name, | |
| 7485 true, // is_static | |
| 7486 true, // is_final | |
| 7487 true, // is_const | |
| 7488 true, // is_synthetic | |
| 7489 field_owner, | |
| 7490 this->token_pos()); | |
| 7491 closure_field.set_value(Instance::Cast(result)); | |
| 7492 closure_field.set_type(Type::Handle(Type::DynamicType())); | |
| 7493 field_owner.AddField(closure_field); | |
|
Florian Schneider
2015/07/22 08:25:54
Maybe factor the creation of the field into a file
hausner
2015/07/22 18:41:09
Factoring out 4 lines of code that would require 3
| |
| 7494 | |
| 7495 return Instance::RawCast(result.raw()); | |
| 7496 } | |
| 7497 | |
| 7498 | |
| 7390 RawArray* Field::dependent_code() const { | 7499 RawArray* Field::dependent_code() const { |
| 7391 return raw_ptr()->dependent_code_; | 7500 return raw_ptr()->dependent_code_; |
| 7392 } | 7501 } |
| 7393 | 7502 |
| 7394 | 7503 |
| 7395 void Field::set_dependent_code(const Array& array) const { | 7504 void Field::set_dependent_code(const Array& array) const { |
| 7396 StorePointer(&raw_ptr()->dependent_code_, array.raw()); | 7505 StorePointer(&raw_ptr()->dependent_code_, array.raw()); |
| 7397 } | 7506 } |
| 7398 | 7507 |
| 7399 | 7508 |
| (...skipping 13810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 21210 return tag_label.ToCString(); | 21319 return tag_label.ToCString(); |
| 21211 } | 21320 } |
| 21212 | 21321 |
| 21213 | 21322 |
| 21214 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21323 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 21215 Instance::PrintJSONImpl(stream, ref); | 21324 Instance::PrintJSONImpl(stream, ref); |
| 21216 } | 21325 } |
| 21217 | 21326 |
| 21218 | 21327 |
| 21219 } // namespace dart | 21328 } // namespace dart |
| OLD | NEW |