2012
Jan
02




Context 是指 Javascript 中的 this , window 等物件,在 Javascript 中每個 function , object 都會存在一個 this,而這個 this 在 V8 engine中,就是 context 。

每個 Context 都要有一個 Context Scope, Context Scope 又被 Handle Scope 管理,每個 v8 物件都是由 Handle Scope 來管理生命週期。

v8 Context Scope

一個 Context Scope 中,只能存在一個 Context ,而在一個 Handle Scope 中,可以存在 多個 Context Scope ,所以在編譯 Context 時,可以切換 Context ,下面就是一個切換 Context的範例。

  1. HandleScope handle_scope;
  2. //宣告第一個 context
  3. Handle<Context> context= Context::New(NULL);
  4. Context::Scope context_scope(context);
  5. //宣告第二個 context
  6. Handle<Context> context2 = Context::New(NULL);
  7. //指定 handle_scope 回到第一個 context
  8. context->Enter();
  9. //編譯,執行
  10. Handle<Script> script = Script::Compile(source);
  11. Handle<Value> result = script->Run();

Context

Context 是一個 Object ,所以我們得給他定義一些 method 、 properties。

  • 增加 function 的方式 : 定義一個 ObjectFunction 並指定給 Context
context.cc
  1. Handle<Value> getData (const Arguments& args) {
  2. return String::New("testing data");
  3. }
  4.  
  5. int main() {
  6. HandleScope handle_scope;
  7. Handle<ObjectTemplate> global = ObjectTemplate::New();
  8. global->Set(String::New("get_data"), FunctionTemplate::New(getData));
  9. Handle<Context> context= Context::New(NULL, global); //set global object (like window in javascript)
  10.  
  11. Context::Scope context_scope(context);
  12.  
  13. Handle<v8::String> source = ReadFile("context.js");
  14. Handle<Script> script = Script::Compile(source);
  15. Handle<Value> result = script->Run();
  16. cout << *String::Utf8Value(result);
  17. return 0;
  18. }
context.js
  1. var result;
  2. result = this.get_data();
  3. //output testing
Compile command
  1. g++ -lpthread -lv8 -lrt -ldl context.cc -I/usr/local/include/ -I/usr/local/include/node / -DHAVE_CONFIG_H -o ./exe/context.o
  • 切換 Context 執行 Enter , Exit
  1. context->Enter();
  2. ...
  3. context2->Enter();
  4. ...
  5. context2->Exit(); //離開 context2 並回到 context
  • GetCurrent : 取得目前 Handle Scope 中的 Context ,雖然這裡要指定哪一個 Context ,不過 v8 Engine 會自動去 isolate 物件中,尋找目前正在用的 Context,所以指定的 哪個 Context ,並不一定會回傳同一個 Context,另外還有一個 GetEntered 的 Method ,測試後,結果都一樣。
  1. context2->Enter(); //進入 context2
  2. context->GetCurrent(); // 回傳 context2
  3. context2->GetCurrent(); // 回傳 context2

回應 (Leave a comment)