首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dart VM本身在`dart:mirrors`中实现了`eval`,开发者可以使用它。计划将此方法公之于众?

Dart VM本身在`dart:mirrors`中实现了`eval`,开发者可以使用它。计划将此方法公之于众?
EN

Stack Overflow用户
提问于 2014-02-07 23:44:36
回答 1查看 516关注 0票数 0

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

这是通过反射完成的。

runtime/lib/mirrors_impl.dart

代码语言:javascript
复制
_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
  }
代码语言:javascript
复制
  static _eval(expression, privateKey)
      native "Mirrors_evalInLibraryWithPrivateKey";

runtime/lib/mirrors.cc

代码语言:javascript
复制
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

代码语言:javascript
复制
V(Mirrors_evalInLibraryWithPrivateKey, 2)                                    \

附注:

我在这里提问是因为我不能在Dart邮件列表中提问。

附注:

正如我们在mirrors_impl.dart中看到的static private method

代码语言:javascript
复制
static _eval(expression, privateKey) native "Mirrors_evalInLibraryWithPrivateKey";

有没有人希望这个方法是公开的?(this is not a question but just a thought aloud)。

EN

回答 1

Stack Overflow用户

发布于 2014-02-07 23:53:33

根据Dart FAQ的说法,像这样的纯字符串eval不太可能进入语言,即使可能会添加其他动态功能:

例如,Dart不太可能支持将字符串作为当前上下文中的代码进行计算,但它可能支持将该代码动态加载到新的

中。Dart不太可能支持向值添加字段,但它可能(通过镜像系统)支持向类添加字段,并且您可以使用noSuchMethod()有效地添加方法。使用这些功能会有运行时成本;对我们来说,最大限度地减少不使用它们的程序的成本是很重要的。

这一领域仍在开发中,因此我们欢迎您对运行时dynamism有何需求的想法。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21631974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档