Parcourir la source

Add jerry_uitl file

BernardXiong il y a 8 ans
Parent
commit
027cea5200
4 fichiers modifiés avec 174 ajouts et 122 suppressions
  1. 1 0
      SConscript
  2. 0 122
      rtthread-port/jerry_main.c
  3. 136 0
      rtthread-port/jerry_util.c
  4. 37 0
      rtthread-port/jerry_util.h

+ 1 - 0
SConscript

@@ -49,6 +49,7 @@ jerry_ext = SOURCE_EXT_ARG + SOURCE_EXT_HANDLER + SOURCE_EXT_INCLUDE + SOURCE_EX
 src = jerry_core + jerry_ext
 
 path = [cwd]
+path += [cwd + '/rtthread-port']
 path += [jerry_core_dir]
 path += [jerry_core_dir + '/ecma/base']
 path += [jerry_core_dir + '/ecma/builtin-objects']

+ 0 - 122
rtthread-port/jerry_main.c

@@ -256,125 +256,3 @@ int jerry_main(int argc, char *argv[])
 } /* main */
 MSH_CMD_EXPORT(jerry_main, jerryScript Demo);
 
-/* JerryScript CMD Line Interpreter */
-#define DECLARE_HANDLER(NAME) \
-    static jerry_value_t \
-    NAME ## _handler (const jerry_value_t func_value, \
-                        const jerry_value_t this_value, \
-                        const jerry_value_t args[], \
-                        const jerry_length_t args_cnt )
-
-#define REGISTER_HANDLER(NAME) \
-    register_native_function ( # NAME, NAME ## _handler)
-
-DECLARE_HANDLER(assert)
-{
-    if (args_cnt == 1 && jerry_value_is_boolean(args[0]) && jerry_get_boolean_value(args[0]))
-    {
-        jerry_port_log(JERRY_LOG_LEVEL_DEBUG, ">> Jerry assert true\r\n");
-        return jerry_create_boolean(true);
-    }
-
-    jerry_port_log(JERRY_LOG_LEVEL_ERROR, "ERROR: Script assertion failed\n");
-
-    return jerry_create_boolean(false);
-}
-
-static bool register_native_function(const char* name, jerry_external_handler_t handler)
-{
-    jerry_value_t global_object_val = jerry_get_global_object();
-    jerry_value_t reg_function = jerry_create_external_function(handler);
-
-    bool is_ok = true;
-
-    if (!(jerry_value_is_function(reg_function) && jerry_value_is_constructor(reg_function)))
-    {
-        is_ok = false;
-        jerry_port_log(JERRY_LOG_LEVEL_ERROR,
-                "Error: create_external_function failed !!!\r\n");
-        jerry_release_value(global_object_val);
-        jerry_release_value(reg_function);
-        return is_ok;
-    }
-
-    if (jerry_value_has_error_flag(reg_function))
-    {
-        is_ok = false;
-        jerry_port_log(JERRY_LOG_LEVEL_ERROR,
-                "Error: create_external_function has error flag! \n\r");
-        jerry_release_value(global_object_val);
-        jerry_release_value(reg_function);
-        return is_ok;
-    }
-
-    jerry_value_t jerry_name = jerry_create_string((jerry_char_t *) name);
-
-    jerry_value_t set_result = jerry_set_property(global_object_val, jerry_name, reg_function);
-
-    if (jerry_value_has_error_flag(set_result))
-    {
-        is_ok = false;
-        jerry_port_log(JERRY_LOG_LEVEL_ERROR,
-                "Error: register_native_function failed: [%s]\r\n", name);
-    }
-
-    jerry_release_value(jerry_name);
-    jerry_release_value(global_object_val);
-    jerry_release_value(reg_function);
-    jerry_release_value(set_result);
-
-    return is_ok;
-}
-
-void js_register_functions(void)
-{
-    REGISTER_HANDLER(assert);
-}
-
-static void _jerry_thread(void* parameter)
-{
-    char *source_p;
-    size_t source_size;
-
-    jerry_init(JERRY_INIT_EMPTY);
-    js_register_functions();
-
-    while (1)
-    {
-#if 0
-        jerry_value_t ret_val = jerry_eval((jerry_char_t *) source_p, source_size, false);
-
-        if (jerry_value_has_error_flag(ret_val))
-        {
-            jerry_port_log(JERRY_LOG_LEVEL_ERROR, "Error: jerry_eval failed!\r\n");
-        }
-
-        jerry_release_value(ret_val);
-#else
-        jerry_port_log(JERRY_LOG_LEVEL_ERROR, "Error: Jerryscript CMD Line Interpreter Not Implementation\r\n");
-        rt_thread_delay(RT_TICK_PER_SECOND);
-#endif
-
-    }
-}
-
-int js_run(int argc, char *argv[])
-{
-    rt_thread_t thread;
-
-    thread = rt_thread_create("jsth", _jerry_thread, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX / 3, 20);
-
-    if (thread != RT_NULL)
-    {
-        rt_thread_startup(thread);
-
-        return 0;
-    }
-    else
-    {
-        rt_kprintf("JerryScript Thread Create Failure\n");
-        return -1;
-    }
-}
-// MSH_CMD_EXPORT(js_run, JerryScript Cmd Interpreter);
-

+ 136 - 0
rtthread-port/jerry_util.c

@@ -0,0 +1,136 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <rtthread.h>
+
+#include "jerry_util.h"
+
+void js_set_property(const jerry_value_t obj, const char *name,
+    const jerry_value_t prop)
+{
+    jerry_value_t str = jerry_create_string((const jerry_char_t *)name);
+    jerry_set_property(obj, str, prop);
+    jerry_release_value (str);
+}
+
+jerry_value_t js_get_property(const jerry_value_t obj, const char *name)
+{
+    jerry_value_t ret;
+
+    const jerry_value_t str = jerry_create_string ((const jerry_char_t*)name);
+    ret = jerry_get_property(obj, str);
+    jerry_release_value (str);
+
+    return ret;
+}
+
+void js_add_function(const jerry_value_t obj, const char *name, 
+    jerry_external_handler_t func)
+{
+    jerry_value_t str = jerry_create_string((const jerry_char_t *)name);
+    jerry_value_t jfunc = jerry_create_external_function(func);
+
+    jerry_set_property(obj, str, jfunc);
+    jerry_release_value(str);
+}
+
+bool object_dump_foreach(const jerry_value_t property_name,
+    const jerry_value_t property_value, void *user_data_p)
+{
+    char *str;
+    int str_size;
+    int *first_property;
+
+    first_property = (int *)user_data_p;
+
+    // if (*first_property) first_property = 0;
+    // else
+    {
+        printf(",");
+    }
+
+    if (jerry_value_is_string(property_name))
+    {
+        str_size = jerry_get_string_size(property_name);
+        str = (char*) malloc (str_size + 1);
+        RT_ASSERT(str != NULL);
+
+        jerry_string_to_char_buffer(property_name, (jerry_char_t*)str, str_size);
+        str[str_size] = '\0';
+        printf("%s : ", str);
+        free(str);
+    }
+    js_value_dump(property_value);
+
+    return true;
+}
+
+void js_value_dump(jerry_value_t value)
+{
+    if (jerry_value_is_undefined(value))
+    {
+        printf("undefined");
+    }
+    else if (jerry_value_is_boolean(value))
+    {
+        printf("%s", jerry_get_boolean_value(value)? "true" : "false");
+    }
+    else if (jerry_value_is_number(value))
+    {
+        printf("%f\n", jerry_get_number_value(value));
+    }
+    else if (jerry_value_is_null(value))
+    {
+        printf("null");
+    }
+    else if (jerry_value_is_string(value))
+    {
+        char *str;
+        int str_size;
+
+        str_size = jerry_get_string_size(value);
+        str = (char*) malloc (str_size + 1);
+        RT_ASSERT(str != NULL);
+
+        jerry_string_to_char_buffer(value, (jerry_char_t*)str, str_size);
+        str[str_size] = '\0';
+        printf("\"%s\"", str);
+        free(str);
+    }
+    else if (jerry_value_is_promise(value))
+    {
+        printf("promise??");
+    }
+    else if (jerry_value_is_function(value))
+    {
+        printf("function");
+    }
+    else if (jerry_value_is_constructor(value))
+    {
+        printf("constructor");
+    }
+    else if (jerry_value_is_array(value))
+    {
+        int index;
+        printf("[");
+        for (index = 0; index < jerry_get_array_length(value); index ++)
+        {
+            jerry_value_t item = jerry_get_property_by_index(value, index);
+            js_value_dump(item);
+            jerry_release_value(item);
+        }
+        printf("]\n");
+    }
+    else if (jerry_value_is_object(value))
+    {
+        int first_property = 1;
+        printf("{");
+        jerry_foreach_object_property(value, object_dump_foreach, &first_property);
+        printf("}\n");
+    }
+    else
+    {
+        printf("what?");
+    }
+}

+ 37 - 0
rtthread-port/jerry_util.h

@@ -0,0 +1,37 @@
+#ifndef JERRY_UTIL_H__
+#define JERRY_UTIL_H__
+
+#include <jerryscript-ext/handler.h>
+
+#define DECLARE_HANDLER(NAME) \
+    static jerry_value_t \
+    NAME ## _handler (const jerry_value_t func_value, \
+                        const jerry_value_t this_value, \
+                        const jerry_value_t args[], \
+                        const jerry_length_t args_cnt )
+
+#define REGISTER_HANDLER(NAME) \
+    jerryx_handler_register_global ( (jerry_char_t *)# NAME, NAME ## _handler)
+#define REGISTER_METHOD(OBJ, NAME) \
+    js_add_function (OBJ, # NAME, NAME ## _handler)
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+void js_set_property(const jerry_value_t obj, const char *name,
+    const jerry_value_t prop);
+
+jerry_value_t js_get_property(const jerry_value_t obj, const char *name);
+
+void js_add_function(const jerry_value_t obj, const char *name, 
+    jerry_external_handler_t func);
+
+void js_value_dump(const jerry_value_t value);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif