Chromium Code Reviews| 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" |