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

Unified Diff: runtime/vm/object_test.cc

Issue 16780008: Reified metadata in the VM (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 6 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
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/parser.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object_test.cc
===================================================================
--- runtime/vm/object_test.cc (revision 23883)
+++ runtime/vm/object_test.cc (working copy)
@@ -6,6 +6,7 @@
#include "vm/assembler.h"
#include "vm/bigint_operations.h"
#include "vm/class_finalizer.h"
+#include "vm/dart_api_impl.h"
#include "vm/isolate.h"
#include "vm/object.h"
#include "vm/object_store.h"
@@ -2770,14 +2771,14 @@
"MyException\n"
"#0 baz (dart:test-lib:2:3)\n"
"#1 _OtherClass._OtherClass._named (dart:test-lib:7:8)\n"
- "#2 globalVar= (dart:test-lib:12:3)\n"
+ "#2 globalVar= (dart:test-lib:12:7)\n"
"#3 _bar (dart:test-lib:16:3)\n"
"#4 MyClass.field (dart:test-lib:25:9)\n"
"#5 MyClass.foo.fooHelper (dart:test-lib:30:7)\n"
"#6 MyClass.foo (dart:test-lib:32:14)\n"
"#7 MyClass.MyClass.<anonymous closure> (dart:test-lib:21:15)\n"
"#8 MyClass.MyClass (dart:test-lib:21:18)\n"
- "#9 main.<anonymous closure> (dart:test-lib:37:10)\n"
+ "#9 main.<anonymous closure> (dart:test-lib:37:14)\n"
"#10 main (dart:test-lib:37:24)");
}
@@ -3171,6 +3172,112 @@
}
+static RawField* GetField(const Class& cls, const char* name) {
+ const Field& field =
+ Field::Handle(cls.LookupField(String::Handle(String::New(name))));
+ ASSERT(!field.IsNull());
+ return field.raw();
+}
+
+
+static RawClass* GetClass(const Library& lib, const char* name) {
+ const Class& cls =
+ Class::Handle(lib.LookupClass(String::Handle(Symbols::New(name))));
+ ASSERT(!cls.IsNull());
+ return cls.raw();
+}
+
+
+static void PrintMetadata(const char* name, const Object& data) {
+ if (data.IsError()) {
+ OS::Print("Error in metadata evaluation for %s: '%s'\n",
+ name,
+ Error::Cast(data).ToErrorCString());
+ }
+ ASSERT(data.IsArray());
+ const Array& metadata = Array::Cast(data);
+ OS::Print("Metadata for %s has %"Pd" values:\n", name, metadata.Length());
+ Object& elem = Object::Handle();
+ for (int i = 0; i < metadata.Length(); i++) {
+ elem = metadata.At(i);
+ OS::Print(" %d: %s\n", i, elem.ToCString());
+ }
+}
+
+
+TEST_CASE(Metadata) {
+ const char* kScriptChars =
+ "@metafoo \n"
+ "class Meta { \n"
+ " final m; \n"
+ " const Meta(this.m); \n"
+ "} \n"
+ " \n"
+ "const metafoo = 'metafoo'; \n"
+ "const metabar = 'meta' 'bar'; \n"
+ " \n"
+ "@metafoo \n"
+ "@Meta(0) String gVar; \n"
+ " \n"
+ "@metafoo \n"
+ "get tlGetter => gVar; \n"
+ " \n"
+ "@metabar \n"
+ "class A { \n"
+ " @metafoo \n"
+ " @metabar \n"
+ " @Meta('baz') \n"
+ " var aField; \n"
+ " \n"
+ " @metabar @Meta('baa') \n"
+ " int aFunc(a,b) => a + b; \n"
+ "} \n"
+ " \n"
+ "@Meta('main') \n"
+ "void main() { \n"
+ " return new A(); \n"
+ "} \n";
+
+ Dart_Handle h_lib = TestCase::LoadTestScript(kScriptChars, NULL);
+ EXPECT_VALID(h_lib);
+ Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+ EXPECT_VALID(result);
+ Library& lib = Library::Handle();
+ lib ^= Api::UnwrapHandle(h_lib);
+ ASSERT(!lib.IsNull());
+ const Class& class_a = Class::Handle(GetClass(lib, "A"));
+ Object& res = Object::Handle(lib.GetMetadata(class_a));
+ PrintMetadata("A", res);
+
+ const Class& class_meta = Class::Handle(GetClass(lib, "Meta"));
+ res = lib.GetMetadata(class_meta);
+ PrintMetadata("Meta", res);
+
+ Field& field = Field::Handle(GetField(class_a, "aField"));
+ res = lib.GetMetadata(field);
+ PrintMetadata("A.aField", res);
+
+ Function& func = Function::Handle(GetFunction(class_a, "aFunc"));
+ res = lib.GetMetadata(func);
+ PrintMetadata("A.aFunc", res);
+
+ func = lib.LookupLocalFunction(String::Handle(Symbols::New("main")));
+ ASSERT(!func.IsNull());
+ res = lib.GetMetadata(func);
+ PrintMetadata("main", res);
+
+ func = lib.LookupLocalFunction(String::Handle(Symbols::New("get:tlGetter")));
+ ASSERT(!func.IsNull());
+ res = lib.GetMetadata(func);
+ PrintMetadata("tlGetter", res);
+
+ field = lib.LookupLocalField(String::Handle(Symbols::New("gVar")));
+ ASSERT(!field.IsNull());
+ res = lib.GetMetadata(field);
+ PrintMetadata("gVar", res);
+}
+
+
TEST_CASE(FunctionSourceFingerprint) {
const char* kScriptChars =
"class A {\n"
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698