Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index f674cd4b80669a4b9a64444e12601acb5135aed4..cc0c756c2f01ebec25c599fe6f7cf688d625778b 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -7387,6 +7387,39 @@ void Field::PrintJSONImpl(JSONStream* stream, bool ref) const { |
} |
+RawInstance* Field::GetterClosure() const { |
+ ASSERT(is_static()); |
+ const Class& field_owner = Class::Handle(owner()); |
+ const char* field_name = String::Handle(name()).ToCString(); |
+ String& expr_src = String::Handle( |
+ String::NewFormatted("() { return %s; }", field_name)); |
+ Object& result = |
+ Object::Handle(field_owner.Evaluate(expr_src, |
+ Object::empty_array(), |
+ Object::empty_array())); |
+ ASSERT(result.IsInstance()); |
+ result = Object::Clone(result, Heap::kOld); |
+ return Instance::RawCast(result.raw()); |
+} |
+ |
+ |
+RawInstance* Field::SetterClosure() const { |
+ ASSERT(is_static()); |
+ const Class& field_owner = Class::Handle(owner()); |
+ const char* field_name = String::Handle(name()).ToCString(); |
+ // TODO(hausner): Ensure that parameter name does not hide field name. |
+ String& expr_src = String::Handle( |
+ String::NewFormatted("(xxx) { return %s = xxx; }", field_name)); |
Florian Schneider
2015/07/20 07:00:16
s/xxx/value/
to have a name that is already in ou
hausner
2015/07/21 17:18:36
Done.
|
+ Object& result = |
+ Object::Handle(field_owner.Evaluate(expr_src, |
+ Object::empty_array(), |
+ Object::empty_array())); |
+ ASSERT(result.IsInstance()); |
+ result = Object::Clone(result, Heap::kOld); |
+ return Instance::RawCast(result.raw()); |
+} |
+ |
+ |
RawArray* Field::dependent_code() const { |
return raw_ptr()->dependent_code_; |
} |