jerry_util.c 6.2 KB

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