jerry_main.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <rtthread.h>
  4. #include <finsh.h>
  5. #include <jerryscript.h>
  6. #include <jerry_util.h>
  7. #include <jerry_module.h>
  8. #include <jerry_callbacks.h>
  9. #define malloc rt_malloc
  10. #define free rt_free
  11. extern void jerry_port_set_default_context(jerry_context_t *context);
  12. static rt_mq_t _js_mq = NULL;
  13. #define JERRY_EXIT 1
  14. static void *context_alloc(size_t size, void *cb_data_p)
  15. {
  16. return rt_malloc_align(size, 32);
  17. }
  18. rt_bool_t js_mq_send(void *parameter)
  19. {
  20. rt_err_t ret = -RT_ERROR;
  21. if (_js_mq)
  22. {
  23. ret = rt_mq_send(_js_mq, (void *)&parameter, sizeof(void *));
  24. }
  25. if (ret == RT_EOK)
  26. {
  27. return RT_TRUE;
  28. }
  29. else
  30. {
  31. return RT_FALSE;
  32. }
  33. }
  34. static void _jerry_exit(void)
  35. {
  36. void *exit = (void *)JERRY_EXIT;
  37. js_mq_send(exit);
  38. }
  39. MSH_CMD_EXPORT_ALIAS(_jerry_exit, jerry_exit, jerryScript Demo exit);
  40. jerry_value_t
  41. jerry_exit(const jerry_value_t func_obj_val, /**< function object */
  42. const jerry_value_t this_p, /**< this arg */
  43. const jerry_value_t args_p[], /**< function arguments */
  44. const jerry_length_t args_cnt) /**< number of function arguments */
  45. {
  46. _jerry_exit();
  47. return jerry_create_undefined();
  48. }
  49. static void jerry_thread_entry(void* parameter)
  50. {
  51. char *script;
  52. size_t length;
  53. if (parameter == NULL)
  54. {
  55. printf("jerry_thread_entry (parameter == NULL)\n");
  56. return;
  57. }
  58. length = js_read_file((const char*)parameter, &script);
  59. printf("jerry read file : %s\n", (const char*)parameter);
  60. if (length > 0)
  61. {
  62. /* JERRY_ENABLE_EXTERNAL_CONTEXT */
  63. jerry_port_set_default_context(jerry_create_context(PKG_JMEM_HEAP_SIZE * 1024, context_alloc, NULL));
  64. /* Initialize engine */
  65. jerry_init(JERRY_INIT_EMPTY);
  66. /* Register 'print' function from the extensions */
  67. jerryx_handler_register_global((const jerry_char_t *)"print", jerryx_handler_print);
  68. jerryx_handler_register_global((const jerry_char_t *)"exit", jerry_exit);
  69. js_util_init();
  70. /* add __filename, __dirname */
  71. jerry_value_t global_obj = jerry_get_global_object();
  72. char *full_path = NULL;
  73. char *full_dir = NULL;
  74. full_path = js_module_normalize_path(NULL, (const char*)parameter);
  75. full_dir = js_module_dirname(full_path);
  76. js_set_string_property(global_obj, "__dirname", full_dir);
  77. js_set_string_property(global_obj, "__filename", full_path);
  78. jerry_release_value(global_obj);
  79. /* Setup Global scope code */
  80. jerry_value_t parsed_code = jerry_parse(NULL, 0, (jerry_char_t*)script, length, JERRY_PARSE_NO_OPTS);
  81. if (jerry_value_is_error(parsed_code))
  82. {
  83. printf("jerry parse failed!\n");
  84. }
  85. else
  86. {
  87. _js_mq = rt_mq_create("js_mq", sizeof(void *), 128, RT_IPC_FLAG_FIFO);
  88. if (_js_mq)
  89. {
  90. js_mq_func_init(js_mq_send);
  91. /* Execute the parsed source code in the Global scope */
  92. jerry_value_t ret = jerry_run(parsed_code);
  93. if (jerry_value_is_error(ret))
  94. {
  95. printf("jerry run err!!!\n");
  96. }
  97. else
  98. {
  99. while (1)
  100. {
  101. void *buffer = 0;
  102. if (rt_mq_recv(_js_mq, &buffer, sizeof(void *), RT_WAITING_FOREVER) == RT_EOK)
  103. {
  104. if ((int)(buffer) == JERRY_EXIT)
  105. {
  106. printf("jerry exit!!!\n");
  107. break;
  108. }
  109. else if (buffer)
  110. {
  111. struct js_mq_callback *jmc = (struct js_mq_callback *)buffer;
  112. js_call_callback(jmc->callback, jmc->args, jmc->size);
  113. }
  114. }
  115. rt_thread_delay(rt_tick_from_millisecond(10));
  116. }
  117. }
  118. rt_mq_delete(_js_mq);
  119. js_mq_func_deinit();
  120. /* Returned value must be freed */
  121. jerry_release_value(ret);
  122. }
  123. }
  124. /* Parsed source code must be freed */
  125. jerry_release_value(parsed_code);
  126. rt_free(script);
  127. js_util_cleanup();
  128. /* Cleanup engine */
  129. jerry_cleanup();
  130. rt_free_align((void *)jerry_port_get_current_context());
  131. }
  132. }
  133. int jerry_main(int argc, char** argv)
  134. {
  135. rt_thread_t tid;
  136. if (argc != 2) return -1;
  137. tid = rt_thread_create("jerry", jerry_thread_entry, (void*)rt_strdup((const char*)argv[1]), 1024 * 32, 20, 10);
  138. if (tid)
  139. {
  140. rt_thread_startup(tid);
  141. }
  142. return 0;
  143. }
  144. MSH_CMD_EXPORT(jerry_main, jerryScript Demo);