Dart VM本身在`dart:mirrors`中实现`eval`,开发人员使用它。是否计划将此方法公之于众?

时间:2014-02-07 15:44:36

标签: dart eval dynamic-compilation dart-mirrors dart-sdk

以下是在Dart平台中使用此eval方法的代码。

这是通过反思完成的。

runtime/lib/mirrors_impl.dart

_getFieldSlow(unwrapped) {
      // ..... Skipped  
      var atPosition = unwrapped.indexOf('@');
      if (atPosition == -1) {
        // Public symbol.
        f = _eval('(x) => x.$unwrapped', null);
      } else {
        // Private symbol.
        var withoutKey = unwrapped.substring(0, atPosition);
        var privateKey = unwrapped.substring(atPosition);
        f = _eval('(x) => x.$withoutKey', privateKey);
      }
      // ..... Skipped
  }
  static _eval(expression, privateKey)
      native "Mirrors_evalInLibraryWithPrivateKey";

runtime/lib/mirrors.cc

DEFINE_NATIVE_ENTRY(Mirrors_evalInLibraryWithPrivateKey, 2) {
  GET_NON_NULL_NATIVE_ARGUMENT(String, expression, arguments->NativeArgAt(0));
  GET_NATIVE_ARGUMENT(String, private_key, arguments->NativeArgAt(1));

  const GrowableObjectArray& libraries =
      GrowableObjectArray::Handle(isolate->object_store()->libraries());
  const int num_libraries = libraries.Length();
  Library& each_library = Library::Handle();
  Library& ctxt_library = Library::Handle();
  String& library_key = String::Handle();

  if (library_key.IsNull()) {
    ctxt_library = Library::CoreLibrary();
  } else {
    for (int i = 0; i < num_libraries; i++) {
      each_library ^= libraries.At(i);
      library_key = each_library.private_key();
      if (library_key.Equals(private_key)) {
        ctxt_library = each_library.raw();
        break;
      }
    }
  }
  ASSERT(!ctxt_library.IsNull());
  return ctxt_library.Evaluate(expression);

runtime/vm/bootstrap_natives.h

V(Mirrors_evalInLibraryWithPrivateKey, 2)                                    \

P.S。

我在这里问问题,因为我不能在Dart邮件列表中问它。

P.S。

我们可以在static private method中看到mirrors_impl.dart

static _eval(expression, privateKey) native "Mirrors_evalInLibraryWithPrivateKey";

是否有人希望此方法应该公开? (this is not a question but just a thought aloud)。

1 个答案:

答案 0 :(得分:6)

根据Dart FAQ,类似的纯字符串eval不太可能使其成为语言,即使可能会添加其他动态功能:

  

因此,例如,Dart不太可能支持将字符串评估为   当前上下文中的代码,但它可能支持加载该代码   动态地进入一个新的孤立。 Dart不太可能支持添加   字段到一个值,但它可以(通过镜像系统)支持添加   字段到一个类,你可以有效地添加方法   noSuchMethod()。使用这些功能将产生运行时成本;它的   对我们来说最重要的是尽量减少不使用它们的程序的成本。

     

这个领域仍在开发中,所以我们欢迎你的想法   你需要从运行时动态。