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. ...
随机推荐
- WPF程序开机速度策略
WPF程序开机速度慢是一个很讨厌的问题.具体分析后,可能有以下问题 1.在主线程中加载图像导致 2.初始化各种UserControl导致 3.加载类库导致
- python-判断语句介绍
1.生活中的判断场景 1.1 火车站安检 1.2 上网吧 2.开发中的判断场景 2.1 密码判断 2.2 重要日期判断 if 今天是周六或者周日: 约妹子 if 今天是情人节: 买玫瑰 if 今天发工 ...
- React基础篇 (1)-- render&components
render 基础用法 //1.创建虚拟DOM元素对象 var vDom=<h1>hello wold!</h1> //2.渲染 ReactDOM.render(vDom,do ...
- kali linux之端口扫描
端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入 发现开放的端口,有更具体的攻击面 nmap hping3 scapy都可以 nmap隐蔽扫描 扫描抓包 nmap僵尸扫描 先发现僵尸机,僵尸 ...
- 模块-os.system的两个模块/random模块/datetime模块/写日志
一.获取当前目录的路径 os.path.abspath('.')# 取绝对路径 os.getcwd()# 取当前路径 .代表当前目录 ..上一级目录 ../.. 二.执行操作系统命令1.os.syst ...
- MySQL5.7配置(第一次使用)
MySQL5.7配置(第一次使用) 最近因为工作需要学习mysql的增删改查.用的公司的电脑,之前有人已经安装过mysql5.7,等于使用了免安装版,重新开始配置.参考了以下文章 http://blo ...
- Python正则表达式匹配日期与时间
#!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'Randy' import re from datetime import da ...
- 老男孩Day16作业:登录、注册、后台管理页面(动态)
一.作业需求: 1.后台管理主界面(左边菜单框.(全选.反选)框.返回顶部按钮) 2.老男孩登录.注册页面 二.博客地址:https://www.cnblogs.com/catepython/p/93 ...
- mysql自动备份并上传至git仓库
自动备份 备份需求 数据库备份的重要性再怎么强调也不为过.当你的操作出现差错,但又因为没有作备份导致数据无法还原时,你就能体会到“万念俱灰”的心情了. 数据库备份有多种形式,本文以我的个人网站数据 ...
- Dubbo操作
admin控制台安装 1.控制台下载地址https://github.com/apache/incubator-dubbo/releases 2.找到dubbo-admin 3.修改webapp/WE ...