1. evm_val_t

虚拟机通过evm_val_t来表示最基本的数据类型。

  1. typedef uint64_t evm_val_t;
  • evm_val_t相当于一个64位的整型数据,通常在单片机领域,大部分数据都是32位,包括指针地址。
  • EVM将外部数据包装成evm_val_t,通过标记方式,对数据进行分类。

2. EVM虚拟机支持的数据类型

  • 基础类型
  1. TYPE_NUMBER = 0, //数字类型
  2. TYPE_HEAP_STRING,//堆字符串
  3. TYPE_FOREIGN_STRING, //外部字符串
  4. TYPE_BOOLEAN,//布尔
  5. TYPE_FUNCTION,//函数
  6. TYPE_NATIVE,//内置函数
  7. TYPE_NULL,//空类
  8. TYPE_UNDEFINED,//未定义类型
  9. TYPE_NAN,//非法数字类型
  10. TYPE_LIST,//数组类型
  11. TYPE_BUFFER,//字节数组类型
  12. TYPE_OBJECT,//对象类型
  13. TYPE_CLASS,//类
  14. TYPE_INT,//整数类型
  15. TYPE_FRAME,//(虚拟机专用)
  16. TYPE_FOREIGN,//(虚拟机专用)
  • 扩展类型
  1. TYPE_HEAP_STRING,
  2. TYPE_LIST,
  3. TYPE_BUFFER,
  4. TYPE_OBJECT,
  5. TYPE_CLASS,
  • 垃圾回收标记类型
  1. GC_NONE, 非法类型
  2. GC_ROOT, 根作用域
  3. GC_OBJECT, 对象
  4. GC_NATIVE_OBJECT, 内置对象
  5. GC_DICT, 字典
  6. GC_CLASS,
  7. GC_SET, 集合
  8. GC_FUNC, 函数
  9. GC_CLOSURE_FUNC, 闭包
  10. GC_STATIC_FUNC, 静态函数
  11. GC_LIST, 数组
  12. GC_BUFFER, 字节数组
  13. GC_BUFFER16, 16位数组
  14. GC_BUFFER32, 32位数组
  15. GC_BUFFER64, 64位数组
  16. GC_BUFFER16_U, 无符号16位数组
  17. GC_BUFFER32_U, 无符号32位数组
  18. GC_BUFFER64_U, 无符号64位数组
  19. GC_BUFFER_FLOAT, 浮点数组
  20. GC_BUFFER_DOUBLE, 双精度浮点数组
  21. GC_STRING, 堆字符串
  22. GC_NUMBER, 数字
  23. GC_BOOLEAN, 布尔
  24. GC_TUPLE, 元组
  25. GC_MODULE, 模块
  26. GC_MEMBER, (虚拟机专用)
  27. GC_MEMBER_KEYS, (虚拟机专用)
  28. GC_MEMBER_VALS, (虚拟机专用)

3. evm_t

虚拟机对象

  1. typedef struct evm_t{
  2. uint8_t err;
  3. const char * err_arg;
  4. char * file_name;
  5. uint32_t file_name_len;
  6. char * var_name;
  7. int var_name_len;
  8. heap_t * heap;
  9. evm_val_t * sp;
  10. evm_val_t * sp_base;
  11. int stack_size;
  12. evm_val_t root;
  13. evm_val_t scope;
  14. int32_t native_cnt;
  15. intptr_t * native_symbals;
  16. evm_val_t * native_tbl;
  17. int32_t module_size;
  18. int32_t module_cnt;
  19. intptr_t * module_symbals;
  20. evm_val_t * module_tbl;
  21. evm_const_pool_t * string_pool;
  22. evm_const_pool_t * number_pool;
  23. evm_val_t number_object;
  24. }evm_t;

4. 常量

EVM虚拟机常量定义分为两种,一种是字符串常量,另外一种是数字常量。在虚拟机中,常量被分别保存在全局的常量池中:

  1. evm_const_pool_t * string_pool; //字符串常量池
  2. evm_const_pool_t * number_pool; //数字常量池

数字常量池是按添加顺序进行存储的,常量池中不会出现重复的数字。而字符串常量是按哈希表方式进行存储的,EVM虚拟机针对哈希表算法进行了优化,不仅提高的存取速度,同时满足了轻量化的哈希表扩容算法。


5. key值

EVM虚拟机访问字符串常量不是采用记录字符串在内存的地址值,而是通过获取key值而获取到字符串内容。所谓的key值是字符串在常量池中的值,为16位整型值。如果需要访问字符串内容,则需要通过下面的方法来获取:

  1. char *evm_string_get(evm_t * e, uint16_t key);

如果要向常量池中增加字符串或者数字,可以使用下面的方法:

  1. int evm_str_insert(evm_t *e, const char *str, int alloc);//添加字符串,返回key值
  2. int evm_number_insert(evm_t *e, double num);//添加数字常量,返回key值

返回-1表示添加失败。