Skip to content

Commit

Permalink
add some ext function for jerryscript
Browse files Browse the repository at this point in the history
  • Loading branch information
xianjimli committed Aug 8, 2024
1 parent 5308f0f commit 4471e00
Show file tree
Hide file tree
Showing 5 changed files with 270 additions and 0 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,3 +167,6 @@ os.environ['WITH_JS'] = 'true'
* [awtk-mvvm-c-examples](https://github.com/zlgopen/awtk-mvvm-c-examples)

* [无需代码对 sqlite3 进行增删改查](https://github.com/zlgopen/awtk-database-repository)

* [JS 扩展函数](docs/js_ext_api.md)

3 changes: 3 additions & 0 deletions docs/changes.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# 最新动态

* 2024/08/08
* jerryscript 增加了几个扩展函数[JS 扩展函数](docs/js_ext_api.md)

* 2024/06/20
* 增加支持 awtk-web 的文档和示例。

Expand Down
90 changes: 90 additions & 0 deletions docs/js_ext_api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# jerryscript 扩展函数

## 1.调试函数

### 1.1.print 打印调试信息

* 原型

```
print(message)
```

* 示例

```
print('hello');
```

### 1.2 assert 断言

* 原型

```
assert(bool_value)
```

* 示例

```
assert(true);
```

## 2.文件

### 2.1.file_exist 文件是否存在

* 原型

```
file_exist(filename) -> 存在返回 true,否则返回 false
```

* 示例

```
assert(file_exist('test.json'));
```

### 2.2.file_remove 删除文件

* 原型

```
file_remove(filename) -> 成功返回 true,否则返回 false
```

* 示例

```
assert(file_remove('test.json'));
```

### 2.3. text_file_write 写文本文件

* 原型

```
text_file_write(filename, content) -> 成功返回 true,否则返回 false
```

* 示例

```
assert(text_file_write('test.json', '{count:123}'));
```

### 2.4. text_file_read 读文本文件

* 原型

```
text_file_read(filename) -> 成功返回文件内容,失败返回 null。
```

* 示例

```
assert(text_file_read('test.json') == '{count:123}');
```

108 changes: 108 additions & 0 deletions src/mvvm/jerryscript/jerry_script_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
*
*/

#include "tkc/fs.h"
#include "tkc/mem.h"
#include "tkc/utils.h"
#include "tkc/path.h"
Expand Down Expand Up @@ -102,13 +103,120 @@ jerry_value_t wrap_require(const jerry_call_info_t* call_info_p, const jerry_val
return jerry_create_null();
}

jerry_value_t wrap_text_file_read(const jerry_call_info_t* call_info_p, const jerry_value_t argv[],
const jerry_length_t argc) {
char* data = NULL;
jerry_value_t jret = 0;

if (argc == 1) {
char filename[MAX_PATH + 1] = {0};
jerry_size_t size = jerry_get_utf8_string_size(argv[0]);

if (size < MAX_PATH) {
jerry_string_to_utf8_char_buffer(argv[0], (jerry_char_t*)filename, size);
filename[size] = '\0';
data = (char*)file_read(filename, NULL);
}
}

if (data != NULL) {
jret = jerry_create_string((const jerry_char_t*)data);
TKMEM_FREE(data);
} else {
jret = jerry_create_null();
}

return jret;
}

jerry_value_t wrap_text_file_remove(const jerry_call_info_t* call_info_p, const jerry_value_t argv[],
const jerry_length_t argc) {
bool_t ret = FALSE;

if (argc == 1) {
char filename[MAX_PATH + 1] = {0};
jerry_size_t size = jerry_get_utf8_string_size(argv[0]);

if (size < MAX_PATH) {
jerry_string_to_utf8_char_buffer(argv[0], (jerry_char_t*)filename, size);
filename[size] = '\0';
ret = file_remove(filename) == RET_OK;
}
}

return jerry_create_boolean(ret);
}

jerry_value_t wrap_text_file_exist(const jerry_call_info_t* call_info_p, const jerry_value_t argv[],
const jerry_length_t argc) {
bool_t ret = FALSE;

if (argc == 1) {
char filename[MAX_PATH + 1] = {0};
jerry_size_t size = jerry_get_utf8_string_size(argv[0]);

if (size < MAX_PATH) {
jerry_string_to_utf8_char_buffer(argv[0], (jerry_char_t*)filename, size);
filename[size] = '\0';
ret = file_exist(filename);
}
}

return jerry_create_boolean(ret);
}

jerry_value_t wrap_assert(const jerry_call_info_t* call_info_p, const jerry_value_t argv[],
const jerry_length_t argc) {
bool_t p = FALSE;

if (argc == 1) {
assert(jerry_value_is_true(argv[0]));
}

return jerry_create_boolean(TRUE);
}

jerry_value_t wrap_text_file_write(const jerry_call_info_t* call_info_p, const jerry_value_t argv[],
const jerry_length_t argc) {
bool_t ret = FALSE;

if (argc == 2) {
char* data = NULL;
char filename[MAX_PATH + 1];
jerry_size_t size = jerry_get_utf8_string_size(argv[0]);

if (size < MAX_PATH) {
jerry_string_to_utf8_char_buffer(argv[0], (jerry_char_t*)filename, size);
filename[size] = '\0';

size = jerry_get_utf8_string_size(argv[1]);
data = (char*)TKMEM_ALLOC(size + 1);

if (data != NULL) {
jerry_string_to_utf8_char_buffer(argv[1], (jerry_char_t*)data, size);
data[size] = '\0';
ret = file_write(filename, data, size) == RET_OK;
TKMEM_FREE(data);
}
}
}

return jerry_create_boolean(ret);
}

#define STR_BOOT_JS "var exports = {};\nthis." STR_MODULES "={};\nvar console = {log : print}\n\n"

static ret_t jerry_script_register_builtins(void) {
jerryx_handler_register_global((const jerry_char_t*)"gc", jerryx_handler_gc);
jerryx_handler_register_global((const jerry_char_t*)"print", jerryx_handler_print);
jerryx_handler_register_global((const jerry_char_t*)"require", wrap_require);

#ifndef WITH_IOTJS
jerryx_handler_register_global((const jerry_char_t*)"text_file_read", wrap_text_file_read);
jerryx_handler_register_global((const jerry_char_t*)"text_file_write", wrap_text_file_write);
jerryx_handler_register_global((const jerry_char_t*)"file_remove", wrap_text_file_remove);
jerryx_handler_register_global((const jerry_char_t*)"file_exist", wrap_text_file_exist);
jerryx_handler_register_global((const jerry_char_t*)"assert", wrap_assert);
jerry_script_eval_buff(STR_BOOT_JS, strlen(STR_BOOT_JS), "boot.js", TRUE);
#endif /*WITH_IOTJS*/

Expand Down
66 changes: 66 additions & 0 deletions tests/view_model_jerryscript_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -289,3 +289,69 @@ TEST(ModelJerryScript, invalid) {
tk_object_t* obj = TK_OBJECT(view_model);
ASSERT_EQ(obj, TK_OBJECT(NULL));
}

TEST(ModelJerryScript, io) {
const char* code =
"ViewModel('test', {\
data: {count:0},\
onWillMount: function(req) {\
text_file_write('test.txt', 'hello world');\
this.count = req.count;\
this.name = text_file_read('test.txt');\
assert(file_exist('test.txt'));\
assert(file_remove('test.txt'));\
assert(!file_exist('test.txt'));\
this.notifyPropsChanged();\
return 0;\
}\
});";
view_model_t* view_model;
tk_object_t* obj;

navigator_request_t* req = navigator_request_create("test", NULL);

jerry_script_eval_buff(code, strlen(code), "test", TRUE);
view_model = view_model_factory_create_model("test", req);
obj = TK_OBJECT(view_model);
ASSERT_NE(obj, TK_OBJECT(NULL));

ASSERT_EQ(view_model_on_will_mount(view_model, req), RET_OK);
ASSERT_EQ(string(tk_object_get_prop_str(obj, "name")), "hello world");

tk_object_unref(TK_OBJECT(req));
tk_object_unref(TK_OBJECT(view_model));
}

TEST(ModelJerryScript, io_json) {
const char* code =
"ViewModel('test', {\
data: {count:0},\
onWillMount: function(req) {\
var obj = {count : 123}; \
text_file_write('test.json', JSON.stringify(obj));\
var txt = text_file_read('test.json');\
obj = JSON.parse(txt);\
this.count = obj.count;\
assert(file_exist('test.json'));\
assert(file_remove('test.json'));\
assert(!file_exist('test.json'));\
this.notifyPropsChanged();\
return 0;\
}\
});";
view_model_t* view_model;
tk_object_t* obj;

navigator_request_t* req = navigator_request_create("test", NULL);

jerry_script_eval_buff(code, strlen(code), "test", TRUE);
view_model = view_model_factory_create_model("test", req);
obj = TK_OBJECT(view_model);
ASSERT_NE(obj, TK_OBJECT(NULL));

ASSERT_EQ(view_model_on_will_mount(view_model, req), RET_OK);
ASSERT_EQ(tk_object_get_prop_int(obj, "count", 0), 123);

tk_object_unref(TK_OBJECT(req));
tk_object_unref(TK_OBJECT(view_model));
}

0 comments on commit 4471e00

Please sign in to comment.