nodejs c++启动过程3

原创 2013年12月03日 12:04:21


Persistent<Context> v8::Context::New(
    v8::ExtensionConfiguration* extensions,
    v8::Handle<ObjectTemplate> global_template,
    v8::Handle<Value> global_object) {
  i::Isolate::EnsureDefaultIsolate();
  i::Isolate* isolate = i::Isolate::Current();
  EnsureInitializedForIsolate(isolate, "v8::Context::New()");
  LOG_API(isolate, "Context::New");
  ON_BAILOUT(isolate, "v8::Context::New()", return Persistent<Context>());


// 下面的内容,上接博客1
  // Enter V8 via an ENTER_V8 scope.
  i::Handle<i::Context> env;

  {

// 这个是进入引擎,使用VMState类,在析构的时候,离开引擎

    ENTER_V8(isolate);
    v8::Handle<ObjectTemplate> proxy_template = global_template;
    i::Handle<i::FunctionTemplateInfo> proxy_constructor;
    i::Handle<i::FunctionTemplateInfo> global_constructor;




    if (!global_template.IsEmpty()) {
      // Make sure that the global_template has a constructor.
      global_constructor =
          EnsureConstructor(Utils::OpenHandle(*global_template));




      // Create a fresh template for the global proxy object.
      proxy_template = ObjectTemplate::New();
      proxy_constructor =
          EnsureConstructor(Utils::OpenHandle(*proxy_template));




      // Set the global template to be the prototype template of
      // global proxy template.
      proxy_constructor->set_prototype_template(
          *Utils::OpenHandle(*global_template));




      // Migrate security handlers from global_template to
      // proxy_template.  Temporarily removing access check
      // information from the global template.
      if (!global_constructor->access_check_info()->IsUndefined()) {
        proxy_constructor->set_access_check_info(
            global_constructor->access_check_info());
        proxy_constructor->set_needs_access_check(
            global_constructor->needs_access_check());
        global_constructor->set_needs_access_check(false);
        global_constructor->set_access_check_info(
            isolate->heap()->undefined_value());
      }
    }




    // Create the environment.
    env = isolate->bootstrapper()->CreateEnvironment(
        isolate,
        Utils::OpenHandle(*global_object, true),
        proxy_template,
        extensions);




    // Restore the access check info on the global template.
    if (!global_template.IsEmpty()) {
      ASSERT(!global_constructor.is_null());
      ASSERT(!proxy_constructor.is_null());
      global_constructor->set_access_check_info(
          proxy_constructor->access_check_info());
      global_constructor->set_needs_access_check(
          proxy_constructor->needs_access_check());
    }
    isolate->runtime_profiler()->Reset();
  }
  // Leave V8.




  if (env.is_null()) {
    return Persistent<Context>();
  }
  return Persistent<Context>(Utils::ToLocal(env));
}

相关文章推荐

nodejs c++启动过程1

在isolate文件中中: struct StaticInitializer {   StaticInitializer() {     Isolate::EnsureDefaultIsolate()...

nodejs 启动过程2

水电费是否 2-5 Isolate::Init bool Isolate::Init(Deserializer* des) {   ASSERT(state_ != INITIALIZED);  ...

C++第十二周【任务3】 运用虚基类享受开摩托车的过程

/* * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:C++第十二周【任务3】 ...

深入探索c/c++函数(3)---虚成员函数调用的基本过程

学过c++一段时间都会知道,c++是依靠虚函数实现多态的,如下代码: view plain #include    using namespace  std;...

c++thread学习(3)并发多线程系统开发过程

在实现一个规模较大的工程时,需要多个线程之间互相传递数据,因此,点对点的通信机制已经不能满足需要,设定一个比较合理的通信架构会提高工程开发、维护的效率以及代码的复用性,可读性。 了解ROS的小伙伴都知...

Nodejs Win8 安装过程

现在才开始着手写点Nodejs 东西.之前都是在ubuntu系统和centos系统下进行编程的,现在来了点兴趣, 搞下windows下的Nodejs 编程开发.主要是为了方便. Don`t sha...

nodejs 开发指南 azw3 kindel

  • 2015年02月11日 10:36
  • 6.82MB
  • 下载

nodejs调用C++代码

  • 2016年10月26日 14:41
  • 3.53MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nodejs c++启动过程3
举报原因:
原因补充:

(最多只允许输入30个字)