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代码 转换为 低级中间代码 或者 机器能够理解的机器代码 ;

2. 执行转换后的代码并输出执行结果;

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. 解释器解释执行字节码
生成字节码之后,解释器就登场了,它会 按照顺序 解释执行字节码,并输出执行结果;
 

Logo

智屏生态联盟致力于大屏生态发展,利用大屏快应用技术降低开发者开发、发布大屏应用门槛

更多推荐