core核心模块
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核心模块的更多相关文章
- Angular项目中核心模块core Module只加载一次的实现
核心模块CoreModule在整个系统中只加载一次,如何实现? 创建core Modele:ng g m core 既然CoreModule是类,就有构造函数,在构造函数中进行依赖注入. export ...
- Material使用11 核心模块和共享模块、 如何使用@angular/material
1 创建项目 1.1 版本说明 1.2 创建模块 1.2.1 核心模块 该模块只加载一次,主要存放一些核心的组件及服务 ng g m core 1.2.1.1 创建一些核心组件 页眉组件:header ...
- [转]ASP.NET 核心模块配置参考
本文转自:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore ...
- 一头扎进Spring之---------Spring七大核心模块
Spring七大核心模块 核心容器(Spring Core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系.Spring使用BeanF ...
- 高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用指令
1. error_log 含义:指定存储错误日志的文件 语法:error_log <file> [debug|info|notice|warn|error|crit] 缺省:${prefi ...
- Linux学习-核心与核心模块
谈完了整个开机的流程,您应该会知道,在整个开机的过程当中,是否能够成功的驱动我们主机的硬 件配备, 是核心 (kernel) 的工作!而核心一般都是压缩文件,因此在使用核心之前,就得要将他解 压缩后, ...
- 6. [mmc subsystem] mmc core(第六章)——mmc core主模块
一.说明 1.mmc core概述 mmc core主模块是mmc core的实现核心.也是本章的重点内容. 对应代码位置drivers/mmc/core/core.c. 其主要负责如下功能: mmc ...
- spring的核心模块有哪些?
Spring的七个核心模块,供大家参考,具体内容如下 1.Spring core:核心容器 核心容器提供spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关 ...
- Nodejs进阶:核心模块net入门与实例讲解
模块概览 net模块是同样是nodejs的核心模块.在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net. ...
随机推荐
- django修改数据库连接
settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'domain', 'USER ...
- 【bzoj4872】[Shoi2017]分手是祝愿 期望dp
Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ...
- BZOJ4650/UOJ219 [Noi2016]优秀的拆分
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- avascript的匿名函数
一.什么是匿名函数? 在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量( ...
- java集合类学习笔记之LinkList
1.简述 LinkList的底层其实就是一个双向链表,所谓的链表就是一个LinkList内部静态静态类(Node),对LinkList的所有操作本质上就是通过对LinkList中新建的Node对象 进 ...
- vue-i18n.esm.js?a925:14 [vue-i18n] Value of key '图标管理' is not a string!
解决方案:在项目的index.js文件中修改配置,让在创建 i18n 示例的时候加上参数去掉这些 warning const i18n = new VueI18n({ locale: lang, // ...
- 最小圆覆盖 [模板] BZOJ 1337&1336
题目描述 给出N个点,让你画一个最小的包含所有点的圆. 输入输出格式 输入格式: 先给出点的个数N,2<=N<=100000,再给出坐标Xi,Yi.(-10000.0<=xi,yi& ...
- 4、numpy+pandas速查手册
<Python数据分析常用手册>一.NumPy和Pandas篇 一.常用链接: 1.Python官网:https://www.python.org/2.各种库的whl离线安装包:http: ...
- bootstrap的使用2
表单控件: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- PHP 中 快捷的三元运算...
a!=null ? a: 123 当 a 不为空时,返回 123, 可简写为 a ?: 123(a 不为null 不为 '','0',0 时,返回它本身,否则返回123...)