| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <rtthread.h>
- #include <finsh.h>
- #include <jerryscript.h>
- #include <jerry_util.h>
- #include <jerry_module.h>
- #include <jerry_callbacks.h>
- #define malloc rt_malloc
- #define free rt_free
- extern void jerry_port_set_default_context(jerry_context_t *context);
- static rt_mq_t _js_mq = NULL;
- #define JERRY_EXIT 1
- static void *context_alloc(size_t size, void *cb_data_p)
- {
- return rt_malloc_align(size, 32);
- }
- rt_bool_t js_mq_send(void *parameter)
- {
- rt_err_t ret = -RT_ERROR;
- if (_js_mq)
- {
- ret = rt_mq_send(_js_mq, (void *)¶meter, sizeof(void *));
- }
- if (ret == RT_EOK)
- {
- return RT_TRUE;
- }
- else
- {
- return RT_FALSE;
- }
- }
- static void _jerry_exit(void)
- {
- void *exit = (void *)JERRY_EXIT;
- js_mq_send(exit);
- }
- MSH_CMD_EXPORT_ALIAS(_jerry_exit, jerry_exit, jerryScript Demo exit);
- jerry_value_t
- jerry_exit(const jerry_value_t func_obj_val, /**< function object */
- const jerry_value_t this_p, /**< this arg */
- const jerry_value_t args_p[], /**< function arguments */
- const jerry_length_t args_cnt) /**< number of function arguments */
- {
- _jerry_exit();
- return jerry_create_undefined();
- }
- static void jerry_thread_entry(void* parameter)
- {
- char *script;
- size_t length;
- if (parameter == NULL)
- {
- printf("jerry_thread_entry (parameter == NULL)\n");
- return;
- }
- length = js_read_file((const char*)parameter, &script);
- printf("jerry read file : %s\n", (const char*)parameter);
- if (length > 0)
- {
- /* JERRY_ENABLE_EXTERNAL_CONTEXT */
- jerry_port_set_default_context(jerry_create_context(PKG_JMEM_HEAP_SIZE * 1024, context_alloc, NULL));
- /* Initialize engine */
- jerry_init(JERRY_INIT_EMPTY);
- /* Register 'print' function from the extensions */
- jerryx_handler_register_global((const jerry_char_t *)"print", jerryx_handler_print);
- jerryx_handler_register_global((const jerry_char_t *)"exit", jerry_exit);
- js_util_init();
- /* add __filename, __dirname */
- jerry_value_t global_obj = jerry_get_global_object();
- char *full_path = NULL;
- char *full_dir = NULL;
- full_path = js_module_normalize_path(NULL, (const char*)parameter);
- full_dir = js_module_dirname(full_path);
- js_set_string_property(global_obj, "__dirname", full_dir);
- js_set_string_property(global_obj, "__filename", full_path);
- jerry_release_value(global_obj);
- /* Setup Global scope code */
- jerry_value_t parsed_code = jerry_parse(NULL, 0, (jerry_char_t*)script, length, JERRY_PARSE_NO_OPTS);
- if (jerry_value_is_error(parsed_code))
- {
- printf("jerry parse failed!\n");
- }
- else
- {
- _js_mq = rt_mq_create("js_mq", sizeof(void *), 128, RT_IPC_FLAG_FIFO);
- if (_js_mq)
- {
- js_mq_func_init(js_mq_send);
- /* Execute the parsed source code in the Global scope */
- jerry_value_t ret = jerry_run(parsed_code);
- if (jerry_value_is_error(ret))
- {
- printf("jerry run err!!!\n");
- }
- else
- {
- while (1)
- {
- void *buffer = 0;
- if (rt_mq_recv(_js_mq, &buffer, sizeof(void *), RT_WAITING_FOREVER) == RT_EOK)
- {
- if ((int)(buffer) == JERRY_EXIT)
- {
- printf("jerry exit!!!\n");
- break;
- }
- else if (buffer)
- {
- struct js_mq_callback *jmc = (struct js_mq_callback *)buffer;
- js_call_callback(jmc->callback, jmc->args, jmc->size);
- }
- }
- rt_thread_delay(rt_tick_from_millisecond(10));
- }
- }
- rt_mq_delete(_js_mq);
- js_mq_func_deinit();
- /* Returned value must be freed */
- jerry_release_value(ret);
- }
- }
- /* Parsed source code must be freed */
- jerry_release_value(parsed_code);
- rt_free(script);
- js_util_cleanup();
- /* Cleanup engine */
- jerry_cleanup();
- rt_free_align((void *)jerry_port_get_current_context());
- }
- }
- int jerry_main(int argc, char** argv)
- {
- rt_thread_t tid;
- if (argc != 2) return -1;
- tid = rt_thread_create("jerry", jerry_thread_entry, (void*)rt_strdup((const char*)argv[1]), 1024 * 32, 20, 10);
- if (tid)
- {
- rt_thread_startup(tid);
- }
- return 0;
- }
- MSH_CMD_EXPORT(jerry_main, jerryScript Demo);
|