Виртуальная машина 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";
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(). Использование этих функций будет иметь стоимость выполнения; Для нас важно минимизировать стоимость программ, которые их не используют.
Эта область все еще находится в стадии разработки, поэтому мы приветствуем ваши мысли о том, что вам нужно от динамизма во время выполнения.