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

Unified Diff: runtime/lib/mirrors.cc

Issue 19512003: Implement VariableMirror creation with non-API code. To break circular initialization, have them fi… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 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
« no previous file with comments | « no previous file | runtime/lib/mirrors_impl.dart » ('j') | runtime/lib/mirrors_impl.dart » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/lib/mirrors.cc
===================================================================
--- runtime/lib/mirrors.cc (revision 25315)
+++ runtime/lib/mirrors.cc (working copy)
@@ -600,44 +600,23 @@
return mirror;
}
+static RawInstance* CreateVariableMirror(const Field& field,
+ const Instance& owner_mirror) {
+ const MirrorReference& field_ref =
+ MirrorReference::Handle(MirrorReference::New());
+ field_ref.set_referent(field);
-static Dart_Handle CreateVariableMirror(Dart_Handle var,
- Dart_Handle var_name,
- Dart_Handle owner_mirror) {
- ASSERT(Dart_IsVariable(var));
- Dart_Handle cls_name = NewString("_LocalVariableMirrorImpl");
- Dart_Handle type = Dart_GetType(MirrorLib(), cls_name, 0, NULL);
- if (Dart_IsError(type)) {
- return type;
- }
+ const String& name = String::Handle(field.UserVisibleName());
- bool is_static = false;
- bool is_final = false;
+ const Array& args = Array::Handle(Array::New(6));
+ args.SetAt(0, field_ref);
+ args.SetAt(1, name);
+ args.SetAt(2, owner_mirror);
+ args.SetAt(3, Instance::Handle()); // Null for type.
+ args.SetAt(4, field.is_static() ? Bool::True() : Bool::False());
+ args.SetAt(5, field.is_final() ? Bool::True() : Bool::False());
- Dart_Handle result = Dart_VariableIsStatic(var, &is_static);
- if (Dart_IsError(result)) {
- return result;
- }
- result = Dart_VariableIsFinal(var, &is_final);
- if (Dart_IsError(result)) {
- return result;
- }
-
- Dart_Handle var_type = Dart_VariableType(var);
- if (Dart_IsError(var_type)) {
- return var_type;
- }
-
- Dart_Handle args[] = {
- CreateMirrorReference(var),
- var_name,
- owner_mirror,
- CreateLazyMirror(var_type),
- Dart_NewBoolean(is_static),
- Dart_NewBoolean(is_final),
- };
- Dart_Handle mirror = Dart_New(type, Dart_Null(), ARRAY_SIZE(args), args);
- return mirror;
+ return CreateMirror(Symbols::_LocalVariableMirrorImpl(), args);
}
@@ -766,6 +745,7 @@
static Dart_Handle AddMemberVariables(Dart_Handle map,
Dart_Handle owner,
Dart_Handle owner_mirror) {
+ Isolate* isolate = Isolate::Current();
Dart_Handle result;
Dart_Handle names = Dart_GetVariableNames(owner);
if (Dart_IsError(names)) {
@@ -783,10 +763,14 @@
return var;
}
ASSERT(!Dart_IsNull(var));
- Dart_Handle var_mirror = CreateVariableMirror(var, var_name, owner_mirror);
- if (Dart_IsError(var_mirror)) {
- return var_mirror;
- }
+ ASSERT(Dart_IsVariable(var));
+ const Field& field = Api::UnwrapFieldHandle(isolate, var);
+ const Instance& owner_mirror_inst =
+ Api::UnwrapInstanceHandle(isolate, owner_mirror);
+ const Instance& var_mirror_inst =
+ Instance::Handle(CreateVariableMirror(field, owner_mirror_inst));
+ Dart_Handle var_mirror = Api::NewHandle(isolate, var_mirror_inst.raw());
+
result = MapAdd(map, var_name, var_mirror);
if (Dart_IsError(result)) {
return result;
@@ -1863,4 +1847,13 @@
return CreateTypeMirror(return_type);
}
+
+DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
+ const Field& field = Field::Handle(ref.GetFieldReferent());
+
+ const AbstractType& type = AbstractType::Handle(field.type());
+ return CreateTypeMirror(type);
+}
+
} // namespace dart
« no previous file with comments | « no previous file | runtime/lib/mirrors_impl.dart » ('j') | runtime/lib/mirrors_impl.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698