2014-02-07 12 views
0

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

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

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).

ответ

6

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

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

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

+0

Как правило, речь шла не о знании, а отвечая, что вы могли бы продемонстрировать свои знания над другими людьми. Нет, это был скорее вопрос любопытства. И творческий ответ на него был бы более уместным, чем простая цитата из информации, которая по сути не дает ответов, а скорее заставляет задуматься о том, «какую полезную информацию авторы этого текста (FAQ) в конечном итоге принесут всем». Как и автор этого ответа. – mezoni