NVM V8引擎

网络部分暂且放一放

还是setup()的下一步

V8 is Google's open source JavaScript engine.

n.nvm = nvm.NewNebulasVM()

type NebulasVMstruct{}

// NewNebulasVM create new NebulasVM

func NewNebulasVM() core.NVM {

return &NebulasVM{}

}

初始化一个VM

if err = n.nvm.CheckV8Run(); err != nil {

logging.CLog().WithFields(logrus.Fields{

"err": err,

}).Fatal("Failed to setup V8.")

}

看一下V8环境变量是否正确设置

接下来看一下

文件结构

nf/nvm/

lib ____js库

lnvm_____没有用

native_____v8动态链接库以及星云链桥接的c++代码

test————测试代码

v8_______js库和go实现的桥接逻辑

blockchain___blockchain相关函数

context____NVM的context

crypto______加密相关函数

engine_____NVM接口实现

enginev8____smartcontractengine 接口实现

event___事件相关函数

module__模块相关函数

storage____账户储存相关函数

types_____类型相关定义

接下有关V8的几个API

isolate context

isolate有完整的V8实例,有完整的堆和栈。context是一个上下文,js代码都是在一个context中运行的

https://stackoverflow.com/questions/19383724/what-exactly-is-the-difference-between-v8isolate-and-v8context

上边有他们的区别

一个isolate某一时刻只有一个runtime 

包括但不限于一个heap管理器,垃圾回收等

一段时间内,有且只有一个线程能使用此isolate,不过多个线程可以同时使用多个isolate

单独的isolate不足以运行脚本,需要一个全局对象。context就是这样的一个提供全局对象的工具

对于一个给定的isolate不仅可以有多个context,并且这些context可以共享某个对象

handle和handle scope

handle是一个js对象的索引

它指向js对象在v8管理的heap中的位置

handle不存在heap中,而是存在于stack中。只有一个Handle被释放后才能从stack中推出。

有时候需要声明很多handle。未免太麻烦,所以就有了handle scope

template模板

模板(Template)用在定义一个Context下的JS的对象或者函数。Funct ionTemplate将

C++的函数暴露给JS。每个Funct ionTemplate对应- -个0bj ectTemplate。

Funct ionTemplate相当于0bj ectTemp late的构造函数。Template 的示例如下:

创建一个模板实例

v8: :Handle global = v8: :ObjectTemplate: :New();

将我们之前实现的Plus函数模板,与JavaScript的plus函数关联起来,相当于其回调函数

global->Set(v8: :String: :New("plus"), v8:: FunctionTemplate: :New(Plus));

accessor

一个accessor是c++的一个回调函数,当javascript访问一个对象属性时。它被回调并返回一个值。accessor通过object template来设置

accessor需要通过一个object template来设置 使用setAccessor 该方法需要提供一个属性和关联的两个回调作为参数



type  V8Engine  struct {

ctx                                    *Context    //context

modules                                Modules     //模块

v8engine                                *C.V8Engine    //  v8中的V8engine

strictDisallowUsageOfInstructionCounter int    //

enableLimits                            bool

limitsOfExecutionInstructions          uint64

limitsOfTotalMemorySize                uint64

actualCountOfExecutionInstructions      uint64

actualTotalMemorySize                  uint64

lcsHandler                              uint64

gcsHandler                              uint64

innerErrMsg                            string

innerErr                                error

}

你可能感兴趣的:(NVM V8引擎)