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)