2016-06-23 30 views
6

Rozumiem ideę v8 :: Isolate, i rozumiem, że wszystko, co działa, działa wewnątrz v8 :: Kontekst, który jest powiązany z izolatem. Konteksty powiązane z różnymi izolatami nie mogą nic udostępniać.Co jest udostępniane/dyskretne w wielu obiektach kontekstowych V8 należących do pojedynczego izolatu?

Moje pytanie brzmi, co to znaczy mieć wiele kontekstów w jednym izolacie? Co jest wspólne dla różnych kontekstów? Co jest między nimi dyskretne? Kiedy możesz zrobić coś w jednym i użyć go w innym? Często w interfejsie API wydaje się prawie dowolne, jeśli coś bierze izolat lub kontekst podczas jego tworzenia.

Również wszelkie sugestie dotyczące użycia przypadków dla wielu kontekstów w jednym izolacie będą mile widziane, aby pomóc mi zacząć je lepiej rozumieć.

Widzę to pytanie: What exactly is the difference between v8::Isolate and v8::Context?, ale tak naprawdę nie zagłębia się w szczegóły, jak/dlaczego używa się wielu kontekstów w jednym izolacie.

Dziękuję.

Odpowiedz

1

Informacje, które otrzymałem z listy mailingowej, to fakt, że prawie wszystko można udostępniać w różnych kontekstach w tym samym izolatorze oprócz funkcji.

To zależy od polityki bezpieczeństwa. Domyślnie wszystko jest udostępniane.

Można włączyć kontroli dostępu z v8 :: ObjectTemplate :: SetAccessCheckCallback(), aby zablokować dostęp na podstawie właściwości lub wyłączyć udostępnianie całkowicie zmieniając token zabezpieczeń z V8 :: Context :: SetSecurityToken ().

Poza tym: Wierzę, że powodem, dla którego musisz przekazać kontekst do v8 :: Object :: Set(), jest ujednoznacznienie przeciążonej funkcji. C++ nie zezwala na przeciążanie tylko dla zwracanego typu.

Jest również nieco szybszy. Wersja bez kontekstu Set() wyszukuje bieżący kontekst i wywołuje kontekstową funkcję Set().

:

Zdefiniuj "wszystko"? Czy mógłbym wziąć dowolny program javascript i wziąć każdą linię i uruchomić ją w innym kontekście (na tym samym izolatorze) i czy byłaby to praca ? Co najmniej teoretycznie, bez fundamentalnych zmian w programie?

:

Niezupełnie. Podstawową jednostką wykonawczą w V8 jest funkcja. Funkcje należą do kontekstu, w którym zostały skompilowane.