Виртуальная машина Dart сама реализует `eval` в`dart:mirrors`, и разработчики используют его. Планируется ли сделать этот метод публичным?

Вот код, который использует это eval метод в платформе дартс.

Это делается с помощью отражения.

выполнения / 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";

выполнения / 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);

выполнения / VM / bootstrap_natives.h

V(Mirrors_evalInLibraryWithPrivateKey, 2)                                    \

PS

Я задаю вопрос здесь, потому что я не могу задать его в списках рассылки Dart.

PS

Как мы можем видеть это static private method в mirrors_impl.dart:

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

Кто-нибудь хочет, чтобы этот метод был публичным? (this is not a question but just a thought aloud).

1 ответ

Согласно Dart FAQ, чистый строковый eval вряд ли сделает его языком, даже если будут добавлены другие динамические функции:

Так, например, Dart вряд ли будет поддерживать оценку строки как кода в текущем контексте, но может поддерживать динамическую загрузку этого кода в новый изолят. Dart вряд ли будет поддерживать добавление полей к значению, но может (через зеркальную систему) поддерживать добавление полей в класс, и вы можете эффективно добавлять методы, используя noSuchMethod(). Использование этих функций будет иметь стоимость выполнения; Для нас важно минимизировать стоимость программ, которые их не используют.

Эта область все еще находится в стадии разработки, поэтому мы приветствуем ваши мысли о том, что вам нужно от динамизма во время выполнения.

Другие вопросы по тегам