Hippy项目源码(九)
2021SC@SDUSCCoreinclude\core\napi\v8\callback_info.h#pragma once#include <stdio.h>#include <memory>#include <vector>#include "base/unicode_string_view.h"#include "core/base/macros.h"
2021SC@SDUSC
Core
include\core\napi\v8\callback_info.h
#pragma once
#include <stdio.h>
#include <memory>
#include <vector>
#include "base/unicode_string_view.h"
#include "core/base/macros.h"
#include "core/napi/js_native_api_types.h"
#include "core/scope.h"
namespace hippy {
namespace napi {
class ReturnValue {
public:
ReturnValue() = default;
void SetUndefined() { value_ = nullptr; }
void Set(std::shared_ptr<CtxValue> value) { value_ = value; }
std::shared_ptr<CtxValue> Get() const { return value_; }
private:
std::shared_ptr<CtxValue> value_;
DISALLOW_COPY_AND_ASSIGN(ReturnValue);
};
class ExceptionValue {
public:
using unicode_string_view = tdf::base::unicode_string_view;
ExceptionValue() = default;
void Set(std::shared_ptr<CtxValue> value) { value_ = value; }
void Set(const std::shared_ptr<Ctx>& context, const unicode_string_view& str);
std::shared_ptr<CtxValue> Get() const { return value_; }
private:
std::shared_ptr<CtxValue> value_;
DISALLOW_COPY_AND_ASSIGN(ExceptionValue);
};
class CallbackInfo {
public:
explicit CallbackInfo(std::shared_ptr<Scope> scope);
void AddValue(const std::shared_ptr<CtxValue>& value);
std::shared_ptr<CtxValue> operator[](int index) const;
size_t Length() const { return values_.size(); }
std::shared_ptr<Scope> GetScope() const { return scope_; }
ReturnValue* GetReturnValue() const { return ret_value_.get(); }
ExceptionValue* GetExceptionValue() const { return exception_value_.get(); }
private:
std::shared_ptr<Scope> scope_;
std::vector<std::shared_ptr<CtxValue>> values_;
std::unique_ptr<ReturnValue> ret_value_;
std::unique_ptr<ExceptionValue> exception_value_;
DISALLOW_COPY_AND_ASSIGN(CallbackInfo);
};
} // namespace napi
} // namespace hippy
v8引擎介绍:
V8是如何执行JavaScript代码的
1. 首先将 JavaScript代码
转换为 低级中间代码
或者 机器能够理解的机器代码
;
V8执行JS代码的具体流程
1. 执行之前,准备所需的基础环境
在 V8 启动执行 JavaScript 之前,它还需要准备执行 JavaScript 时所需要的一些基础环境,这些基础环境包括了 堆空间、栈空间、全局执行上下文、全局作用域、消息循环系统、内置函数 等,这些内容都是在执行 JavaScript 过程中需要使用到的。
比如:
JavaScript 全局执行上下文就包含了执行过程中的全局信息,比如一些内置函数,全局变量等信息;
全局作用域包含了一些全局变量,在执行过程中的数据都需要存放在 内存 中;
由于 V8 采用了经典的堆和栈的管理内存管理模式,所以 V8 还需要初始化了内存中的堆和栈结构;
另外,要我们的 V8 系统活起来,还需要 初始化消息循环系统 ,消息循环系统包含了 消息驱动器 和 消息队列 ,它如同 V8 的心脏,不断接受消息并决策如何处理消息。
2. 准备好基础环境,向V8提交要执行的JS代码
首先,V8 会接收到要执行的 JavaScript 源代码,不过这对 V8 来说只是一堆 字符串,V8 并不能直接理解这段字符串的含义,它需要 结构化 这段字符串;
3. 结构化字符串(JS源代码)
结构化,是指信息经过分析后可 分解成多个互相关联的组成部分。各组成部分间有明确的层次结构,方便使用和维护,并有一定的操作规范;
4. 生成AST、作用域
结构化之后,就生成了 抽象语法树(AST),AST 是便于 V8 理解的结构;在生成 AST 的同时,V8 还会 生成相关的作用域,作用域中存放相关变量;
5. 生成字节码
有了 AST 和 作用域 之后,接下来就可以生成 字节码 了,字节码是介于 AST 和 机器代码 的中间代码。但是与特定类型的机器代码无关,解释器可以直接解释执行字节码 ,或者通过编译器将其编译为二进制的机器代码再执行;
6. 解释器解释执行字节码
生成字节码之后,解释器就登场了,它会 按照顺序 解释执行字节码,并输出执行结果;
更多推荐
所有评论(0)