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

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
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"
@@ -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);
siva 2013/06/12 00:16:52 Instead of PrintMetadata why not convert this to E
+
+ 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"

Powered by Google App Engine
This is Rietveld 408576698