5. core核心模块

  • 核心模块会通过compiler模块提供的调用compiler的功能, 将用户的输入转为VM直接的输入

  • 编译模块用来编译, 而核心模块用来执行

  • 在core.h文件中

// 不需要任何参数, 因为核心模块是在VM内部的, 在buildCore中会将核心模块注册到VM的allModule map中, 并且创建内部的objectclass, objectmetaclass, classofclass类对象, 并为他们绑定方法
void buildCore(VM *vm);
VMResult executeModule(VM *vm, Value moduleName, const char *modcode);
  • 在core.c文件中(在core.c中实现内部类的方法, 并定义bindMethod的函数并定到class中),方法的参数都是(VM *vm, Value *args), 其中args[0]存的是this或者cls, 方法都会返回值, 在方法中将返回值存放到args[0]中, 这个是脚本语言层面上的返回值表现, 但是在C语言中, 最后一步返回的是bool类型的, true表示没有出错, false表示出错了, 需要切换线程
// 这些有你自己决定, 可以参考Java的实现
Object的方法
PrimObjectNot
PrimObjectEquals
PrimObjectToString
PrimObjectNotEquals
PrimObjectIs Class的方法
PrimClassToString
PrimClassName
PrimClassSuperType
PrimClassMetaSame // 还要封装defineModuleVar, 实现defineClass函数来定义函数
// 在哪个模块中, 定义什么名字的变量:-)
Class *defineClass(vm, module, name) {
Class *class = newRawClass();
defineModule(vm, class, ...);
return class;
} // 除了定义方法之外还定义了函数绑定bindMethod, 程序中所有的方法名都注册到vm的方法符号表中
// 为了方便使用prim_method_bind封装一下bindMethod, bindMethod不管三七二十一就绑定了, 这样显然是不合理的, 使用prim_method_bind封装该函数, 先在vm的methodNames中找, 如果没有则添加进去, 接着在调用bindMethod绑定, --> 伪代码
// Primitive函数指针的原型为void (Primitive *)(VM *vm, Value *args[0])
void prim_method_bind(VM *vm, classPtr, const char *method_name, Primitive func) {
ObjString *objString = newObjString(vm, method_name, strlen(method_name));
int idx = getIndexFromSymbolTableInVM(vm, objString);
// 没有找到, 则添加
if (idx == -1) {
addSymbolTableInVM(vm, objString);
}
Method method;
method.type = PRIMI_TYPE; // 原生方法
method.primFn = func;
bindMethod(vm, classPtr, index, method);
} // bindMethod伪代码
void bindMethod(VM *vm, classPtr, index, method) {
int idx = index;
while (idx > classPtr.methodbuffer.count) {
fillNone(classPtr.methodbuffer, (Value){ValueTypeNull, {0}});
++idx;
}
classPtr.methodbuffer[idx] = method;
} // 关于方法的绑定还要考虑到继承, 继承时需要经父类的methodbuffer拷贝过来
void bindSuperClass(VM *vm, Class *subclass, Class *superclass) {
subclass->superclass = superclass;
subclass->fieldNum += superclass.fieldNum;
int index = 0;
while (index < superclass.methodbuffer.count) {
bindMethod
++index;
}
}
  • 在core.c文件中还要定义其他函数

    • buildCore-> VM在调用newVM的时候就会调用, 该函数会创建coreModule并添加到vm的allModule Map中, 接着创建ObjectClass, ObjectMetaClass, ClassOfClass类对象, 并为他们绑定方法(prim_bind_method)以及绑定父类(bindSuperClass), 这些函数都在上面提到了

    • executeModule->为什么要放在这里, 因为core模块用于执行, 所以executeModule在这里合理, 在executeModule中调用loadModule返回ObjThread, 在loadModule中调compileModule返回ObjFunc对象, 他们都是在core模块运行的, 在compileModule中又会调用compiler模块的compileProgram接口编译

core核心模块的更多相关文章

  1. Angular项目中核心模块core Module只加载一次的实现

    核心模块CoreModule在整个系统中只加载一次,如何实现? 创建core Modele:ng g m core 既然CoreModule是类,就有构造函数,在构造函数中进行依赖注入. export ...

  2. Material使用11 核心模块和共享模块、 如何使用@angular/material

    1 创建项目 1.1 版本说明 1.2 创建模块 1.2.1 核心模块 该模块只加载一次,主要存放一些核心的组件及服务 ng g m core 1.2.1.1 创建一些核心组件 页眉组件:header ...

  3. [转]ASP.NET 核心模块配置参考

    本文转自:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore ...

  4. 一头扎进Spring之---------Spring七大核心模块

    Spring七大核心模块 核心容器(Spring Core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系.Spring使用BeanF ...

  5. 高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用指令

    1. error_log 含义:指定存储错误日志的文件 语法:error_log <file> [debug|info|notice|warn|error|crit] 缺省:${prefi ...

  6. Linux学习-核心与核心模块

    谈完了整个开机的流程,您应该会知道,在整个开机的过程当中,是否能够成功的驱动我们主机的硬 件配备, 是核心 (kernel) 的工作!而核心一般都是压缩文件,因此在使用核心之前,就得要将他解 压缩后, ...

  7. 6. [mmc subsystem] mmc core(第六章)——mmc core主模块

    一.说明 1.mmc core概述 mmc core主模块是mmc core的实现核心.也是本章的重点内容. 对应代码位置drivers/mmc/core/core.c. 其主要负责如下功能: mmc ...

  8. spring的核心模块有哪些?

    Spring的七个核心模块,供大家参考,具体内容如下 1.Spring core:核心容器 核心容器提供spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关 ...

  9. Nodejs进阶:核心模块net入门与实例讲解

    模块概览 net模块是同样是nodejs的核心模块.在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net. ...

随机推荐

  1. Dapper 简单封装

    using System; using System.Collections.Generic; using System.Text; using Dapper; using System.Data; ...

  2. javascript js函数重名后面的覆盖前面的

    js 函数重名后面的覆盖前面的   var x = 1;    var y = 0;    var z = 0;    function add(n) { return n = n + 1; }    ...

  3. 《C#多线程编程实战》1.10 lock关键字

    lock关键字是锁定资源用的. 书上的代码解释很好. /// <summary> /// 抽象类 加减法 /// </summary> abstract class Count ...

  4. Kotlin if else判断

    Kotlin的if相对与java,有着较为灵活的用法. if是用来判断. if在Kotlin里面可以作为表达式来使用. 如果熟悉C java C#等 A>B:A?B这个判断应该是很熟悉,而Kot ...

  5. 后置处理器----JSON提取器

    JSON提取器可以很方便的让你从JSON响应格式中提取数据. 1)Name:JSON提取器的名称. 2)Apply to:应用范围,有些采样器还嵌套子采样器,可以在此处设置JSON提取器是作用与主采样 ...

  6. GN算法---《Community structure in social and biological networks》这篇论文讲了什么?

    用中文记下这篇论文的大致意思,以防止忘了.好记性不如烂笔头! 摘要:最近的一些研究在研究社交网络或WWW.研究者都集中于研究网络的“小世界性”,“幂率分布特性”,“网络传递性”(聚类性吧).本文提出网 ...

  7. JDBC_PreparedStatement用法_占位符_参数处理

    import java.sql.Connection; import java.sql.Date;import java.sql.DriverManager;import java.sql.Prepa ...

  8. 最小圆覆盖 [模板] BZOJ 1337&1336

    题目描述 给出N个点,让你画一个最小的包含所有点的圆. 输入输出格式 输入格式: 先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi& ...

  9. TX2 上使用opencv 调用板载mipi摄像头

    使用命令测试 gst-launch-1.0 nvcamerasrc ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, fo ...

  10. 获取HTML代码用 像阿里巴巴

         public string GetHtml(string url)         {               string html = String .Empty;          ...