1. 什么是虚拟机注册接口

虚拟机注册接口是指用户需要根据自身平台适配的API


1.1 打印接口

用于打印输出调试信息

  • 接口格式
  1. void (*evm_print)(const char *fmt, ...);
  • 注册接口
  1. void evm_register_print(intptr_t fn);

1.2 外部内存申请接口

类似C语言中的malloc接口

  • 接口格式
  1. void * (*evm_malloc)(int size);
  • 注册接口
  1. void evm_register_malloc(intptr_t fn);

1.3 外部内存释放接口

类似C语言中的free接口

  • 接口格式
  1. void * (*evm_free)(int size);
  • 注册接口
  1. void evm_register_free(intptr_t fn);

1.4 虚拟机文件加载接口

用于虚拟机打开对应的脚本语言文件

  • 接口格式
  1. const char * vm_load(evm_t * e, char * path, int type);
  • 注册接口
  1. void evm_register_file_load(intptr_t fn);

2. 用法示例

参考 main.c 中实现


2.1 接口实现

  1. /**
  2. * @brief 加载main运行脚本和加模块脚本
  3. * @param e, 虚拟机对象
  4. * @param path, 脚本路径
  5. * @param type, EVM_LOAD_MAIN代表main运行脚本,非EVM_LOAD_MAIN代表加载模块
  6. * @return
  7. */
  8. const char * vm_load(evm_t * e, char * path, int type)
  9. {
  10. int file_name_len = strlen(path) + 1;
  11. char* buffer = NULL;
  12. if(type == EVM_LOAD_MAIN){
  13. char * module_name = evm_malloc(file_name_len);
  14. if( !module_name ) return NULL;
  15. sprintf(module_name, "%s", path);
  16. sprintf(e->file_name, "%s", path);
  17. buffer = open(e, module_name);
  18. evm_free(module_name);
  19. } else {
  20. for(int i=0; i< modules_paths_count; i++){
  21. int len = strlen(modules_paths[i]) + 1 + file_name_len;
  22. char* modules_path = evm_malloc(len);
  23. sprintf(modules_path, "%s/%s", modules_paths[i], path);
  24. sprintf(e->file_name, "%s", path);
  25. buffer = open(e, modules_path);
  26. evm_free(modules_path);
  27. if (buffer){
  28. break;
  29. }
  30. }
  31. if (!buffer){
  32. const char * module_path = "../../evm/test/eJS/%s";
  33. int file_name_len = strlen(module_path) + strlen(path) + 1;
  34. char * module_name = evm_malloc(file_name_len);
  35. sprintf(module_name, module_path, path);
  36. sprintf(e->file_name, "%s", path);
  37. buffer = open(e, module_name);
  38. evm_free(module_name);
  39. }
  40. }
  41. return buffer;
  42. }
  43. /**
  44. * @brief 外部内存申请接口
  45. * @param size, 申请内存大小
  46. * @return 内存成功分配的对象指针
  47. */
  48. void * vm_malloc(int size)
  49. {
  50. void * m = malloc(size);
  51. if(m) memset(m, 0 ,size);
  52. return m;
  53. }
  54. /**
  55. * @brief 外部内存释放接口
  56. * @param mem, 需要释放的对象指针
  57. * @return
  58. */
  59. void vm_free(void * mem)
  60. {
  61. if(mem) free(mem);
  62. }

2.2 接口注册

  1. int main(int argc, char *argv[])
  2. {
  3. // 注册虚拟机接口
  4. evm_register_free((intptr_t)vm_free);
  5. evm_register_malloc((intptr_t)vm_malloc);
  6. evm_register_print((intptr_t)printf);
  7. evm_register_file_load((intptr_t)vm_load);
  8. ...
  9. }