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" |