Skip to content

Commit d3026c7

Browse files
committed
support slice utf8 for str
add test for slice utf-8
1 parent 8acef2e commit d3026c7

File tree

6 files changed

+60
-8
lines changed

6 files changed

+60
-8
lines changed

package/PikaStdLib/PikaStdData_String.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ Arg *PikaStdData_String___next__(PikaObj *self)
7878
Arg *PikaStdData_String___getitem__(PikaObj *self, Arg *__key)
7979
{
8080
int key_i = arg_getInt(__key);
81+
if (key_i < 0){
82+
key_i = PikaStdData_String___len__(self) + key_i;
83+
}
8184
char *str = obj_getStr(self, "str");
8285
uint16_t len = strGetSize(str);
8386
#if PIKA_STRING_UTF8_ENABLE

port/linux/.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"program": "${workspaceFolder}/build/test/pikascript_test",
1212
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
1313
"args": [
14-
// "--gtest_filter=vm.test64"
14+
// "--gtest_filter=except.dict"
1515
],
1616
"stopAtEntry": false,
1717
"cwd": "${workspaceFolder}",

port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdData_String.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ Arg *PikaStdData_String___next__(PikaObj *self)
7878
Arg *PikaStdData_String___getitem__(PikaObj *self, Arg *__key)
7979
{
8080
int key_i = arg_getInt(__key);
81+
if (key_i < 0){
82+
key_i = PikaStdData_String___len__(self) + key_i;
83+
}
8184
char *str = obj_getStr(self, "str");
8285
uint16_t len = strGetSize(str);
8386
#if PIKA_STRING_UTF8_ENABLE

port/linux/test/string-test.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,3 +244,29 @@ TEST(string, str_issue1) {
244244
EXPECT_EQ(pikaMemNow(), 0);
245245
}
246246
#endif
247+
248+
#if PIKA_STRING_UTF8_ENABLE
249+
TEST(string, utf8_1) {
250+
/* init */
251+
pikaMemInfo.heapUsedMax = 0;
252+
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
253+
/* run */
254+
__platform_printf("BEGIN\r\n");
255+
obj_run(pikaMain,
256+
"s = '你好,Hello, Halo, Hi.'\n"
257+
"s1 = s[0:9]\n"
258+
"s2 = s[0:2]\n"
259+
"s1\n"
260+
"s2\n");
261+
/* collect */
262+
char* s1 = obj_getStr(pikaMain, "s1");
263+
char* s2 = obj_getStr(pikaMain, "s2");
264+
/* assert */
265+
EXPECT_STREQ(s1, "你好,Hello,");
266+
EXPECT_STREQ(s2, "你好");
267+
/* deinit */
268+
obj_deinit(pikaMain);
269+
270+
EXPECT_EQ(pikaMemNow(), 0);
271+
}
272+
#endif

src/PikaObj.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ void* obj_getStruct(PikaObj* self, char* name);
307307
while (1)
308308

309309
char* obj_cacheStr(PikaObj* self, char* str);
310-
PikaObj* _arg_to_obj(Arg* self, PIKA_BOOL* is_convert);
310+
PikaObj* _arg_to_obj(Arg* self, PIKA_BOOL* pIsTemp);
311311
char* __printBytes(PikaObj* self, Arg* arg);
312312

313313
#define PIKASCRIPT_VERSION_TO_NUM(majer, minor, micro) \

src/PikaVM.c

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -278,21 +278,28 @@ static Arg* VM_instruction_handler_NON(PikaObj* self,
278278
}
279279

280280
Arg* __vm_get(PikaObj* self, Arg* key, Arg* obj) {
281-
ArgType obj_type = arg_getType(obj);
281+
ArgType type = arg_getType(obj);
282+
Arg* obj_new = NULL;
282283
int index = 0;
283284
if (ARG_TYPE_INT == arg_getType(key)) {
284285
index = arg_getInt(key);
285286
}
286-
if (ARG_TYPE_STRING == obj_type) {
287+
if (ARG_TYPE_STRING == type) {
288+
#if PIKA_STRING_UTF8_ENABLE
289+
PIKA_BOOL is_temp = 0;
290+
obj_new = arg_newObj(_arg_to_obj(obj, &is_temp));
291+
type = arg_getType(obj_new);
292+
#else
287293
char* str_pyload = arg_getStr(obj);
288294
char char_buff[] = " ";
289295
if (index < 0) {
290296
index = strGetSize(str_pyload) + index;
291297
}
292298
char_buff[0] = str_pyload[index];
293299
return arg_newStr(char_buff);
300+
#endif
294301
}
295-
if (ARG_TYPE_BYTES == obj_type) {
302+
if (ARG_TYPE_BYTES == type) {
296303
uint8_t* bytes_pyload = arg_getBytes(obj);
297304
uint8_t byte_buff[] = " ";
298305
if (index < 0) {
@@ -301,8 +308,13 @@ Arg* __vm_get(PikaObj* self, Arg* key, Arg* obj) {
301308
byte_buff[0] = bytes_pyload[index];
302309
return arg_newBytes(byte_buff, 1);
303310
}
304-
if (argType_isObject(obj_type)) {
305-
PikaObj* arg_obj = arg_getPtr(obj);
311+
if (argType_isObject(type)) {
312+
PikaObj* arg_obj = NULL;
313+
if (obj_new != NULL) {
314+
arg_obj = arg_getPtr(obj_new);
315+
} else {
316+
arg_obj = arg_getPtr(obj);
317+
}
306318
obj_setArg(arg_obj, "__key", key);
307319
/* clang-format off */
308320
PIKA_PYTHON(
@@ -322,9 +334,17 @@ Arg* __vm_get(PikaObj* self, Arg* key, Arg* obj) {
322334
};
323335
pikaVM_runByteCode(arg_obj, (uint8_t*)bytes);
324336
Arg* __res = args_getArg(arg_obj->list, "__res");
337+
Arg* res = NULL;
325338
if (NULL != __res) {
326-
return arg_copy(__res);
339+
res = arg_copy(__res);
340+
}
341+
if (NULL != obj_new) {
342+
arg_deinit(obj_new);
327343
}
344+
if (NULL == res) {
345+
return arg_newNull();
346+
}
347+
return res;
328348
}
329349
return arg_newNull();
330350
}

0 commit comments

Comments
 (0)