From 670a0345ca722c2c56c4aceda5a70c74ea9f6ffd Mon Sep 17 00:00:00 2001 From: "rmacnak@google.com" Date: Thu, 25 Jul 2013 20:49:59 +0000 Subject: [PATCH] Wrap lazy compilation errors when parsing metadata. Addresses the poor error reporting in issue 12027. R=asiva@google.com Review URL: https://codereview.chromium.org//20458002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@25498 260f80e4-7a28-3924-810f-c04153c831b5 --- runtime/lib/mirrors.cc | 60 ++++++++++--------- .../vm/dart/isolate_mirror_local_test.dart | 2 + 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc index 0d1a4aff997..c9c6817889a 100644 --- a/runtime/lib/mirrors.cc +++ b/runtime/lib/mirrors.cc @@ -981,34 +981,6 @@ void NATIVE_ENTRY_FUNCTION(Mirrors_makeLocalClassMirror)( } -DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) { - const MirrorReference& decl_ref = - MirrorReference::CheckedHandle(arguments->NativeArgAt(0)); - const Object& decl = Object::Handle(decl_ref.referent()); - - Class& klass = Class::Handle(); - if (decl.IsClass()) { - klass ^= decl.raw(); - } else if (decl.IsFunction()) { - klass = Function::Cast(decl).origin(); - } else if (decl.IsField()) { - klass = Field::Cast(decl).origin(); - } else { - return Object::empty_array().raw(); - } - - const Library& library = Library::Handle(klass.library()); - return library.GetMetadata(decl); -} - - -void HandleMirrorsMessage(Isolate* isolate, - Dart_Port reply_port, - const Instance& message) { - UNIMPLEMENTED(); -} - - static void ThrowMirroredCompilationError(const String& message) { Array& args = Array::Handle(Array::New(1)); args.SetAt(0, message); @@ -1031,6 +1003,38 @@ static void ThrowInvokeError(const Error& error) { } +DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) { + const MirrorReference& decl_ref = + MirrorReference::CheckedHandle(arguments->NativeArgAt(0)); + const Object& decl = Object::Handle(decl_ref.referent()); + + Class& klass = Class::Handle(); + if (decl.IsClass()) { + klass ^= decl.raw(); + } else if (decl.IsFunction()) { + klass = Function::Cast(decl).origin(); + } else if (decl.IsField()) { + klass = Field::Cast(decl).origin(); + } else { + return Object::empty_array().raw(); + } + + const Library& library = Library::Handle(klass.library()); + const Object& metadata = Object::Handle(library.GetMetadata(decl)); + if (metadata.IsError()) { + ThrowInvokeError(Error::Cast(metadata)); + } + return metadata.raw(); +} + + +void HandleMirrorsMessage(Isolate* isolate, + Dart_Port reply_port, + const Instance& message) { + UNIMPLEMENTED(); +} + + static bool FieldIsUninitialized(const Field& field) { ASSERT(!field.IsNull()); diff --git a/runtime/tests/vm/dart/isolate_mirror_local_test.dart b/runtime/tests/vm/dart/isolate_mirror_local_test.dart index cc7d3e6f783..54241c4ca17 100644 --- a/runtime/tests/vm/dart/isolate_mirror_local_test.dart +++ b/runtime/tests/vm/dart/isolate_mirror_local_test.dart @@ -407,6 +407,7 @@ class MySuperClass { class MyInterface { } +@notDefined class MyClass extends MySuperClass implements MyInterface { MyClass(this.value) {} MyClass.named() {} @@ -445,6 +446,7 @@ void testCustomInstanceMirror(InstanceMirror mirror) { Expect.equals(const Symbol('isolate_mirror_local_test'), cls.owner.simpleName); Expect.isTrue(cls.isClass); Expect.equals(const Symbol('MyInterface'), cls.superinterfaces[0].simpleName); + Expect.throws(() => cls.metadata, (e) => e is MirroredCompilationError, 'Bad metadata'); // TODO(ahe): toString() test disabled for now as Symbols are 100% opaque. // Expect.equals("ClassMirror on 'MyClass'", cls.toString());