Index: runtime/lib/mirrors.cc |
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc |
index 0b790a78e68d7b3226060756f4582ef1dd8d2c7c..c2325129db87db5fadf8f93e2f33fb4f3e552730 100644 |
--- a/runtime/lib/mirrors.cc |
+++ b/runtime/lib/mirrors.cc |
@@ -242,26 +242,29 @@ static RawInstance* CreateFunctionTypeMirror(const Class& cls, |
static RawInstance* CreateMethodMirror(const Function& func, |
const Instance& owner_mirror, |
const AbstractType& instantiator) { |
- const Array& args = Array::Handle(Array::New(13)); |
+ const Array& args = Array::Handle(Array::New(6)); |
args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); |
String& name = String::Handle(func.name()); |
name = String::IdentifierPrettyNameRetainPrivate(name); |
args.SetAt(1, name); |
- |
args.SetAt(2, owner_mirror); |
args.SetAt(3, instantiator); |
args.SetAt(4, Bool::Get(func.is_static())); |
- args.SetAt(5, Bool::Get(func.is_abstract())); |
- args.SetAt(6, Bool::Get(func.IsGetterFunction())); |
- args.SetAt(7, Bool::Get(func.IsSetterFunction())); |
- bool isConstructor = (func.kind() == RawFunction::kConstructor); |
- args.SetAt(8, Bool::Get(isConstructor)); |
- args.SetAt(9, Bool::Get(isConstructor && func.is_const())); |
- args.SetAt(10, Bool::Get(isConstructor && func.IsGenerativeConstructor())); |
- args.SetAt(11, Bool::Get(isConstructor && func.is_redirecting())); |
- args.SetAt(12, Bool::Get(isConstructor && func.IsFactory())); |
+ intptr_t kind_flags = 0; |
+ kind_flags |= (func.is_abstract() << Mirrors::kAbstract); |
+ kind_flags |= (func.IsGetterFunction() << Mirrors::kGetter); |
+ kind_flags |= (func.IsSetterFunction() << Mirrors::kSetter); |
+ bool is_ctor = (func.kind() == RawFunction::kConstructor); |
+ kind_flags |= (is_ctor << Mirrors::kConstructor); |
+ kind_flags |= ((is_ctor && func.is_const()) << Mirrors::kConstCtor); |
+ kind_flags |= ((is_ctor && func.IsGenerativeConstructor()) |
+ << Mirrors::kGenerativeCtor); |
+ kind_flags |= ((is_ctor && func.is_redirecting()) |
+ << Mirrors::kRedirectingCtor); |
+ kind_flags |= ((is_ctor && func.IsFactory()) << Mirrors::kFactoryCtor); |
+ args.SetAt(5, Smi::Handle(Smi::New(kind_flags))); |
return CreateMirror(Symbols::_LocalMethodMirror(), args); |
} |
@@ -540,7 +543,32 @@ static RawInstance* CreateIsolateMirror() { |
} |
+static void VerifyMethodKindShifts() { |
+#ifdef DEBUG |
+ Isolate* isolate = Isolate::Current(); |
+ const Library& lib = Library::Handle(isolate, Library::MirrorsLibrary()); |
+ const Class& cls = Class::Handle(isolate, |
+ lib.LookupClassAllowPrivate(Symbols::_LocalMethodMirror())); |
+ const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate)); |
+ ASSERT(error.IsNull()); |
+ |
+ Field& field = Field::Handle(); |
+ Smi& value = Smi::Handle(); |
+ |
+ #define CHECK_KIND_SHIFT(name) \ |
+ field = cls.LookupField(String::Handle(String::New(#name))); \ |
+ ASSERT(!field.IsNull()); \ |
+ value ^= field.value(); \ |
+ ASSERT(value.Value() == Mirrors::name); |
+ MIRRORS_KIND_SHIFT_LIST(CHECK_KIND_SHIFT) |
+ #undef CHECK_KIND_SHIFT |
+#endif |
+} |
+ |
+ |
static RawInstance* CreateMirrorSystem() { |
+ VerifyMethodKindShifts(); |
+ |
Isolate* isolate = Isolate::Current(); |
const GrowableObjectArray& libraries = GrowableObjectArray::Handle( |
isolate, isolate->object_store()->libraries()); |
@@ -893,12 +921,12 @@ DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 2) { |
} |
-DEFINE_NATIVE_ENTRY(ClassMirror_library, 1) { |
+DEFINE_NATIVE_ENTRY(ClassMirror_libraryUri, 1) { |
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
const Class& klass = Class::Handle(ref.GetClassReferent()); |
const Library& library = Library::Handle(klass.library()); |
ASSERT(!library.IsNull()); |
- return CreateLibraryMirror(library); |
+ return library.url(); |
} |