support slice utf8 for str

add test for slice utf-8
This commit is contained in:
pikastech 2022-09-15 16:19:10 +08:00
parent 8acef2efde
commit d3026c7c99
6 changed files with 60 additions and 8 deletions

View File

@ -78,6 +78,9 @@ Arg *PikaStdData_String___next__(PikaObj *self)
Arg *PikaStdData_String___getitem__(PikaObj *self, Arg *__key)
{
int key_i = arg_getInt(__key);
if (key_i < 0){
key_i = PikaStdData_String___len__(self) + key_i;
}
char *str = obj_getStr(self, "str");
uint16_t len = strGetSize(str);
#if PIKA_STRING_UTF8_ENABLE

View File

@ -11,7 +11,7 @@
"program": "${workspaceFolder}/build/test/pikascript_test",
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
"args": [
// "--gtest_filter=vm.test64"
// "--gtest_filter=except.dict"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",

View File

@ -78,6 +78,9 @@ Arg *PikaStdData_String___next__(PikaObj *self)
Arg *PikaStdData_String___getitem__(PikaObj *self, Arg *__key)
{
int key_i = arg_getInt(__key);
if (key_i < 0){
key_i = PikaStdData_String___len__(self) + key_i;
}
char *str = obj_getStr(self, "str");
uint16_t len = strGetSize(str);
#if PIKA_STRING_UTF8_ENABLE

View File

@ -244,3 +244,29 @@ TEST(string, str_issue1) {
EXPECT_EQ(pikaMemNow(), 0);
}
#endif
#if PIKA_STRING_UTF8_ENABLE
TEST(string, utf8_1) {
/* init */
pikaMemInfo.heapUsedMax = 0;
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
/* run */
__platform_printf("BEGIN\r\n");
obj_run(pikaMain,
"s = '你好Hello, Halo, Hi.'\n"
"s1 = s[0:9]\n"
"s2 = s[0:2]\n"
"s1\n"
"s2\n");
/* collect */
char* s1 = obj_getStr(pikaMain, "s1");
char* s2 = obj_getStr(pikaMain, "s2");
/* assert */
EXPECT_STREQ(s1, "你好Hello,");
EXPECT_STREQ(s2, "你好");
/* deinit */
obj_deinit(pikaMain);
EXPECT_EQ(pikaMemNow(), 0);
}
#endif

View File

@ -307,7 +307,7 @@ void* obj_getStruct(PikaObj* self, char* name);
while (1)
char* obj_cacheStr(PikaObj* self, char* str);
PikaObj* _arg_to_obj(Arg* self, PIKA_BOOL* is_convert);
PikaObj* _arg_to_obj(Arg* self, PIKA_BOOL* pIsTemp);
char* __printBytes(PikaObj* self, Arg* arg);
#define PIKASCRIPT_VERSION_TO_NUM(majer, minor, micro) \

View File

@ -278,12 +278,18 @@ static Arg* VM_instruction_handler_NON(PikaObj* self,
}
Arg* __vm_get(PikaObj* self, Arg* key, Arg* obj) {
ArgType obj_type = arg_getType(obj);
ArgType type = arg_getType(obj);
Arg* obj_new = NULL;
int index = 0;
if (ARG_TYPE_INT == arg_getType(key)) {
index = arg_getInt(key);
}
if (ARG_TYPE_STRING == obj_type) {
if (ARG_TYPE_STRING == type) {
#if PIKA_STRING_UTF8_ENABLE
PIKA_BOOL is_temp = 0;
obj_new = arg_newObj(_arg_to_obj(obj, &is_temp));
type = arg_getType(obj_new);
#else
char* str_pyload = arg_getStr(obj);
char char_buff[] = " ";
if (index < 0) {
@ -291,8 +297,9 @@ Arg* __vm_get(PikaObj* self, Arg* key, Arg* obj) {
}
char_buff[0] = str_pyload[index];
return arg_newStr(char_buff);
#endif
}
if (ARG_TYPE_BYTES == obj_type) {
if (ARG_TYPE_BYTES == type) {
uint8_t* bytes_pyload = arg_getBytes(obj);
uint8_t byte_buff[] = " ";
if (index < 0) {
@ -301,8 +308,13 @@ Arg* __vm_get(PikaObj* self, Arg* key, Arg* obj) {
byte_buff[0] = bytes_pyload[index];
return arg_newBytes(byte_buff, 1);
}
if (argType_isObject(obj_type)) {
PikaObj* arg_obj = arg_getPtr(obj);
if (argType_isObject(type)) {
PikaObj* arg_obj = NULL;
if (obj_new != NULL) {
arg_obj = arg_getPtr(obj_new);
} else {
arg_obj = arg_getPtr(obj);
}
obj_setArg(arg_obj, "__key", key);
/* clang-format off */
PIKA_PYTHON(
@ -322,9 +334,17 @@ Arg* __vm_get(PikaObj* self, Arg* key, Arg* obj) {
};
pikaVM_runByteCode(arg_obj, (uint8_t*)bytes);
Arg* __res = args_getArg(arg_obj->list, "__res");
Arg* res = NULL;
if (NULL != __res) {
return arg_copy(__res);
res = arg_copy(__res);
}
if (NULL != obj_new) {
arg_deinit(obj_new);
}
if (NULL == res) {
return arg_newNull();
}
return res;
}
return arg_newNull();
}