2014-02-07 38 views
0

這是在Dart平臺中使用此方法eval的代碼。Dart VM本身在`dart:mirrors`中實現`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)         \ 

附:

我問這裏問題因爲我不能在Dart郵件列表中提問。

P.S.

正如我們可以看到它在mirrors_impl.dartstatic private method

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

相關問題