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

Unified Diff: runtime/vm/object.cc

Issue 1234883005: Implement tear-off closure operator # (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Address review comments Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
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_;
}
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.h » ('j') | runtime/vm/parser.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698