mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
support slice utf8 for str
add test for slice utf-8
This commit is contained in:
parent
8acef2efde
commit
d3026c7c99
@ -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
|
||||
|
2
port/linux/.vscode/launch.json
vendored
2
port/linux/.vscode/launch.json
vendored
@ -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}",
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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) \
|
||||
|
32
src/PikaVM.c
32
src/PikaVM.c
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user