jerry_util.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <rtthread.h>
  5. #include <dfs_posix.h>
  6. #include "jerry_util.h"
  7. #include <jerry_event.h>
  8. #include <jerry_message.h>
  9. extern int js_console_init(void);
  10. extern int js_module_init(void);
  11. extern int js_buffer_init(void);
  12. extern int js_buffer_cleanup(void);
  13. static void _js_value_dump(jerry_value_t value);
  14. static rt_mutex_t _util_lock = NULL;
  15. static js_util_user _user_init = NULL, _user_cleanup = NULL;
  16. void js_set_property(const jerry_value_t obj, const char *name,
  17. const jerry_value_t prop)
  18. {
  19. jerry_value_t str = jerry_create_string((const jerry_char_t *)name);
  20. jerry_set_property(obj, str, prop);
  21. jerry_release_value (str);
  22. }
  23. jerry_value_t js_get_property(const jerry_value_t obj, const char *name)
  24. {
  25. jerry_value_t ret;
  26. const jerry_value_t str = jerry_create_string ((const jerry_char_t*)name);
  27. ret = jerry_get_property(obj, str);
  28. jerry_release_value (str);
  29. return ret;
  30. }
  31. void js_set_string_property(const jerry_value_t obj, const char *name,
  32. char* value)
  33. {
  34. jerry_value_t str = jerry_create_string((const jerry_char_t *)name);
  35. jerry_value_t value_str = jerry_create_string((const jerry_char_t *)value);
  36. jerry_set_property(obj, str, value_str);
  37. jerry_release_value (str);
  38. jerry_release_value (value_str);
  39. }
  40. void js_add_function(const jerry_value_t obj, const char *name,
  41. jerry_external_handler_t func)
  42. {
  43. jerry_value_t str = jerry_create_string((const jerry_char_t *)name);
  44. jerry_value_t jfunc = jerry_create_external_function(func);
  45. jerry_set_property(obj, str, jfunc);
  46. jerry_release_value(str);
  47. jerry_release_value(jfunc);
  48. }
  49. char *js_value_to_string(const jerry_value_t value)
  50. {
  51. int len;
  52. char *str;
  53. len = jerry_get_utf8_string_size(value);
  54. str = (char*)malloc(len + 1);
  55. if (str)
  56. {
  57. jerry_string_to_char_buffer(value, (jerry_char_t*)str, len);
  58. str[len] = '\0';
  59. }
  60. return str;
  61. }
  62. jerry_value_t js_call_func_obj(const jerry_value_t func_obj_val, /**< function object to call */
  63. const jerry_value_t this_val, /**< object for 'this' binding */
  64. const jerry_value_t args_p[], /**< function's call arguments */
  65. jerry_size_t args_count) /**< number of the arguments */
  66. {
  67. jerry_value_t ret;
  68. js_util_lock();
  69. ret = jerry_call_function(func_obj_val, this_val, args_p, args_count);
  70. js_util_unlock();
  71. return ret;
  72. }
  73. jerry_value_t js_call_function(const jerry_value_t obj, const char *name,
  74. const jerry_value_t args[], jerry_size_t args_cnt)
  75. {
  76. jerry_value_t ret;
  77. jerry_value_t function = js_get_property(obj, name);
  78. if (jerry_value_is_function(function))
  79. {
  80. ret = js_call_func_obj(function, obj, args, args_cnt);
  81. }
  82. else
  83. {
  84. ret = jerry_create_null();
  85. }
  86. jerry_release_value(function);
  87. return ret;
  88. }
  89. bool object_dump_foreach(const jerry_value_t property_name,
  90. const jerry_value_t property_value, void *user_data_p)
  91. {
  92. char *str;
  93. int str_size;
  94. int *first_property;
  95. first_property = (int *)user_data_p;
  96. if (*first_property) *first_property = 0;
  97. else
  98. {
  99. printf(", ");
  100. }
  101. if (jerry_value_is_string(property_name))
  102. {
  103. str_size = jerry_get_string_size(property_name);
  104. str = (char*) malloc (str_size + 1);
  105. RT_ASSERT(str != NULL);
  106. jerry_string_to_char_buffer(property_name, (jerry_char_t*)str, str_size);
  107. str[str_size] = '\0';
  108. printf("%s : ", str);
  109. free(str);
  110. }
  111. _js_value_dump(property_value);
  112. return true;
  113. }
  114. static void _js_value_dump(jerry_value_t value)
  115. {
  116. if (jerry_value_is_undefined(value))
  117. {
  118. printf("undefined");
  119. }
  120. else if (jerry_value_is_boolean(value))
  121. {
  122. printf("%s", jerry_get_boolean_value(value)? "true" : "false");
  123. }
  124. else if (jerry_value_is_number(value))
  125. {
  126. printf("%f", jerry_get_number_value(value));
  127. }
  128. else if (jerry_value_is_null(value))
  129. {
  130. printf("null");
  131. }
  132. else if (jerry_value_is_string(value))
  133. {
  134. char *str;
  135. int str_size;
  136. str_size = jerry_get_string_size(value);
  137. str = (char*) malloc (str_size + 1);
  138. RT_ASSERT(str != NULL);
  139. jerry_string_to_char_buffer(value, (jerry_char_t*)str, str_size);
  140. str[str_size] = '\0';
  141. printf("\"%s\"", str);
  142. free(str);
  143. }
  144. else if (jerry_value_is_promise(value))
  145. {
  146. printf("promise??");
  147. }
  148. else if (jerry_value_is_function(value))
  149. {
  150. printf("[function]");
  151. }
  152. else if (jerry_value_is_constructor(value))
  153. {
  154. printf("constructor");
  155. }
  156. else if (jerry_value_is_array(value))
  157. {
  158. int index;
  159. printf("[");
  160. for (index = 0; index < jerry_get_array_length(value); index ++)
  161. {
  162. jerry_value_t item = jerry_get_property_by_index(value, index);
  163. _js_value_dump(item);
  164. printf(", ");
  165. jerry_release_value(item);
  166. }
  167. printf("]");
  168. }
  169. else if (jerry_value_is_object(value))
  170. {
  171. int first_property = 1;
  172. printf("{");
  173. jerry_foreach_object_property(value, object_dump_foreach, &first_property);
  174. printf("}");
  175. }
  176. else
  177. {
  178. printf("what?");
  179. }
  180. }
  181. void js_value_dump(jerry_value_t value)
  182. {
  183. _js_value_dump(value);
  184. printf("\n");
  185. }
  186. int js_read_file(const char* filename, char **script)
  187. {
  188. FILE *fp;
  189. int length = 0;
  190. struct stat statbuf;
  191. if (!filename || !script) return 0;
  192. stat(filename, &statbuf);
  193. length = statbuf.st_size;
  194. if(!length) return 0;
  195. *script = (char *)rt_malloc(length + 1);
  196. if(!(*script)) return 0;
  197. (*script)[length] = '\0';
  198. fp = fopen(filename, "rb");
  199. if(!fp)
  200. {
  201. rt_free(*script);
  202. *script = RT_NULL;
  203. return 0;
  204. }
  205. if(fread(*script, length, 1, fp) != 1)
  206. {
  207. length = 0;
  208. rt_free(*script);
  209. *script = RT_NULL;
  210. printf("read failed!\n");
  211. }
  212. fclose(fp);
  213. return length;
  214. }
  215. int js_util_init(void)
  216. {
  217. if (_util_lock == RT_NULL)
  218. _util_lock = rt_mutex_create("call_func", RT_IPC_FLAG_FIFO);
  219. js_console_init();
  220. js_module_init();
  221. js_buffer_init();
  222. js_event_init();
  223. js_message_init();
  224. if (_user_init != NULL)
  225. {
  226. _user_init();
  227. }
  228. return 0;
  229. }
  230. int js_util_cleanup(void)
  231. {
  232. js_event_deinit();
  233. js_buffer_cleanup();
  234. if (_user_cleanup != NULL)
  235. {
  236. _user_cleanup();
  237. }
  238. return 0;
  239. }
  240. void js_util_user_init(js_util_user func)
  241. {
  242. _user_init = func;
  243. }
  244. void js_util_user_cleanup(js_util_user func)
  245. {
  246. _user_cleanup = func;
  247. }
  248. int js_util_lock(void)
  249. {
  250. return rt_mutex_take(_util_lock, RT_WAITING_FOREVER);
  251. }
  252. int js_util_unlock(void)
  253. {
  254. return rt_mutex_release(_util_lock);
  255. }