2014-02-07 7 views
0

다음은 다트 플랫폼에서이 eval 메서드를 사용하는 코드입니다.다트 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)         \ 

P.S.

다트 메일 목록에서 질문 할 수 없으므로 여기에서 질문드립니다.

P.

우리가 그것을 mirrors_impl.dart에서 static private method을 볼 수 있듯이 :

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

사람이이 방법을 공개해야 원합니까? (this is not a question but just a thought aloud).

답변

6

그런 순수한 문자열 평가는 다른 동적 기능을 가능성이 추가됩니다에도 불구하고, 언어로 만들 가능성이되지 않습니다 Dart FAQ에 따르면

따라서, 예를 들어, 다트 가능성이 없습니다 문자열을 현재 컨텍스트에서 코드로 평가할 수 있도록 지원하지만 코드 을 동적으로 새 격리로로드 할 수 있습니다. 다트는 필드를 값에 추가하는 것을 지원하지 않지만 미러 시스템을 통해 필드를 클래스에 추가 할 수 있으며 noSuchMethod()를 사용하여 효과적으로 메소드를 추가 할 수 있습니다. 이러한 기능을 사용하면 런타임 비용이 발생합니다. 그것들을 사용하지 않는 프로그램의 비용을 최소화하기 위해서는 우리에게 중요한 것이 입니다.

이 영역은 아직 개발 중입니다. 따라서 에 대한 여러분의 생각을 런타임 역 동성에서 필요로하는 것을 환영합니다.

+0

일반적으로 지식에 대한 질문이 아니므로 다른 사람들에 대한 지식을 과시 할 수 있습니다. 아니요, 대부분 호기심에 관한 질문이었습니다. 그리고 그것에 대한 창조적 인 반응은 본질적으로 아무 대답도하지 않고 단순히 "이 텍스트의 저자가 결국 어떤 사람들에게 유용한 정보가 될 것인가?"에 대해 생각해 보려는 단순한 정보 인용보다 더 적절할 것입니다. 이 대답의 저자는 물론. – mezoni