mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
support add and build
This commit is contained in:
parent
8172d50e13
commit
6c6be65db6
@ -1,11 +1,11 @@
|
||||
#include "PikaStdData_String.h"
|
||||
#include "PikaStdData_List.h"
|
||||
#include "PikaStdData_String_Util.h"
|
||||
#include "dataStrs.h"
|
||||
#include "PikaVM.h"
|
||||
#include "dataStrs.h"
|
||||
|
||||
char* _strlwr(char* str);
|
||||
static int string_len(char* str);
|
||||
int strGetSizeUtf8(char* str);
|
||||
|
||||
Arg* PikaStdData_String___iter__(PikaObj* self) {
|
||||
obj_setInt(self, "__iter_i", 0);
|
||||
@ -69,7 +69,7 @@ Arg* PikaStdData_String___next__(PikaObj* self) {
|
||||
static int _str_get(char* str, int key_i, char* char_buff) {
|
||||
uint16_t len = strGetSize(str);
|
||||
if (key_i < 0) {
|
||||
key_i = string_len(str) + key_i;
|
||||
key_i = strGetSizeUtf8(str) + key_i;
|
||||
}
|
||||
#if PIKA_STRING_UTF8_ENABLE
|
||||
return _utf8_get(str, len, key_i, char_buff);
|
||||
@ -84,16 +84,6 @@ static int _str_get(char* str, int key_i, char* char_buff) {
|
||||
|
||||
char* string_slice(Args* outBuffs, char* str, int start, int end) {
|
||||
char* res = args_getBuff(outBuffs, strGetSize(str));
|
||||
if (start < 0) {
|
||||
start += string_len(str);
|
||||
}
|
||||
/* magic code, to the end */
|
||||
if (end == VM_PC_EXIT) {
|
||||
end = string_len(str);
|
||||
}
|
||||
if (end < 0) {
|
||||
end += string_len(str);
|
||||
}
|
||||
for (int i = start; i < end; i++) {
|
||||
char char_buff[5] = {0};
|
||||
int r = _str_get(str, i, char_buff);
|
||||
@ -276,7 +266,7 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
|
||||
return list;
|
||||
}
|
||||
|
||||
static int string_len(char* str) {
|
||||
int strGetSizeUtf8(char* str) {
|
||||
#if PIKA_STRING_UTF8_ENABLE
|
||||
int n = _utf8_strlen(str, -1);
|
||||
return n;
|
||||
@ -287,7 +277,7 @@ static int string_len(char* str) {
|
||||
|
||||
int PikaStdData_String___len__(PikaObj* self) {
|
||||
char* str = obj_getStr(self, "str");
|
||||
int n = string_len(str);
|
||||
int n = strGetSizeUtf8(str);
|
||||
if (n < 0) {
|
||||
obj_setErrorCode(self, __LINE__);
|
||||
__platform_printf("Error. Internal error(%d)\r\n", __LINE__);
|
||||
|
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=except.while_try_while"
|
||||
"--gtest_filter=stddata.list_slice_issue"
|
||||
],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
|
@ -1,11 +1,11 @@
|
||||
#include "PikaStdData_String.h"
|
||||
#include "PikaStdData_List.h"
|
||||
#include "PikaStdData_String_Util.h"
|
||||
#include "dataStrs.h"
|
||||
#include "PikaVM.h"
|
||||
#include "dataStrs.h"
|
||||
|
||||
char* _strlwr(char* str);
|
||||
static int string_len(char* str);
|
||||
int strGetSizeUtf8(char* str);
|
||||
|
||||
Arg* PikaStdData_String___iter__(PikaObj* self) {
|
||||
obj_setInt(self, "__iter_i", 0);
|
||||
@ -69,7 +69,7 @@ Arg* PikaStdData_String___next__(PikaObj* self) {
|
||||
static int _str_get(char* str, int key_i, char* char_buff) {
|
||||
uint16_t len = strGetSize(str);
|
||||
if (key_i < 0) {
|
||||
key_i = string_len(str) + key_i;
|
||||
key_i = strGetSizeUtf8(str) + key_i;
|
||||
}
|
||||
#if PIKA_STRING_UTF8_ENABLE
|
||||
return _utf8_get(str, len, key_i, char_buff);
|
||||
@ -84,16 +84,6 @@ static int _str_get(char* str, int key_i, char* char_buff) {
|
||||
|
||||
char* string_slice(Args* outBuffs, char* str, int start, int end) {
|
||||
char* res = args_getBuff(outBuffs, strGetSize(str));
|
||||
if (start < 0) {
|
||||
start += string_len(str);
|
||||
}
|
||||
/* magic code, to the end */
|
||||
if (end == VM_PC_EXIT) {
|
||||
end = string_len(str);
|
||||
}
|
||||
if (end < 0) {
|
||||
end += string_len(str);
|
||||
}
|
||||
for (int i = start; i < end; i++) {
|
||||
char char_buff[5] = {0};
|
||||
int r = _str_get(str, i, char_buff);
|
||||
@ -276,7 +266,7 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
|
||||
return list;
|
||||
}
|
||||
|
||||
static int string_len(char* str) {
|
||||
int strGetSizeUtf8(char* str) {
|
||||
#if PIKA_STRING_UTF8_ENABLE
|
||||
int n = _utf8_strlen(str, -1);
|
||||
return n;
|
||||
@ -287,7 +277,7 @@ static int string_len(char* str) {
|
||||
|
||||
int PikaStdData_String___len__(PikaObj* self) {
|
||||
char* str = obj_getStr(self, "str");
|
||||
int n = string_len(str);
|
||||
int n = strGetSizeUtf8(str);
|
||||
if (n < 0) {
|
||||
obj_setErrorCode(self, __LINE__);
|
||||
__platform_printf("Error. Internal error(%d)\r\n", __LINE__);
|
||||
|
67
src/PikaVM.c
67
src/PikaVM.c
@ -434,6 +434,37 @@ static void VMState_delLReg(VMState* vm, uint8_t index) {
|
||||
}
|
||||
}
|
||||
|
||||
static int _obj_getLen(PikaObj* self) {
|
||||
PIKA_PYTHON(@l = __len__())
|
||||
/* clang-format on */
|
||||
const uint8_t bytes[] = {
|
||||
0x08, 0x00, 0x00, 0x00, /* instruct array size */
|
||||
0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x09, 0x00, /* instruct
|
||||
array */
|
||||
0x0c, 0x00, 0x00, 0x00, /* const pool size */
|
||||
0x00, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x5f, 0x00,
|
||||
0x40, 0x6c, 0x00, /* const pool */
|
||||
};
|
||||
pikaVM_runByteCode(self, bytes);
|
||||
int len = obj_getInt(self, "@l");
|
||||
obj_removeArg(self, "@l");
|
||||
return len;
|
||||
}
|
||||
|
||||
static int arg_getLen(Arg* self) {
|
||||
if (argType_isObject(arg_getType(self))) {
|
||||
return _obj_getLen(arg_getPtr(self));
|
||||
}
|
||||
if (arg_getType(self) == ARG_TYPE_STRING) {
|
||||
int strGetSizeUtf8(char* str);
|
||||
return strGetSizeUtf8(arg_getStr(self));
|
||||
}
|
||||
if (arg_getType(self) == ARG_TYPE_BYTES) {
|
||||
return arg_getBytesSize(self);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void VMState_initReg(VMState* vm) {
|
||||
for (uint8_t i = 0; i < PIKA_REGIST_SIZE; i++) {
|
||||
vm->lreg[i] = NULL;
|
||||
@ -477,6 +508,12 @@ Arg* __vm_get(VMState* vm, PikaObj* self, Arg* key, Arg* obj) {
|
||||
if (ARG_TYPE_INT == arg_getType(key)) {
|
||||
index = arg_getInt(key);
|
||||
}
|
||||
|
||||
if (index < 0) {
|
||||
index += arg_getLen(obj);
|
||||
arg_setInt(key, "", index);
|
||||
}
|
||||
|
||||
if (ARG_TYPE_STRING == type) {
|
||||
#if PIKA_STRING_UTF8_ENABLE
|
||||
PIKA_BOOL is_temp = PIKA_FALSE;
|
||||
@ -495,9 +532,6 @@ Arg* __vm_get(VMState* vm, PikaObj* self, Arg* key, Arg* obj) {
|
||||
if (ARG_TYPE_BYTES == type) {
|
||||
uint8_t* bytes_pyload = arg_getBytes(obj);
|
||||
uint8_t byte_buff[] = " ";
|
||||
if (index < 0) {
|
||||
index = arg_getBytesSize(obj) + index;
|
||||
}
|
||||
byte_buff[0] = bytes_pyload[index];
|
||||
return arg_newBytes(byte_buff, 1);
|
||||
}
|
||||
@ -567,6 +601,17 @@ Arg* _vm_slice(VMState* vm,
|
||||
int start_i = arg_getInt(start);
|
||||
int end_i = arg_getInt(end);
|
||||
|
||||
if (start_i < 0) {
|
||||
start_i += arg_getLen(obj);
|
||||
}
|
||||
/* magic code, to the end */
|
||||
if (end_i == VM_PC_EXIT) {
|
||||
end_i = arg_getLen(obj);
|
||||
}
|
||||
if (end_i < 0) {
|
||||
end_i += arg_getLen(obj);
|
||||
}
|
||||
|
||||
/* __slice__ is equal to __getitem__ */
|
||||
if (end_i - start_i == 1) {
|
||||
return __vm_get(vm, self, start, obj);
|
||||
@ -1182,21 +1227,7 @@ static int _get_n_input_with_unpack(VMState* vm, int n_used) {
|
||||
if (arg_getIsStarred(call_arg)) {
|
||||
pika_assert(argType_isObject(arg_getType(call_arg)));
|
||||
PikaObj* obj = arg_getPtr(call_arg);
|
||||
/* clang-format off */
|
||||
PIKA_PYTHON(
|
||||
@l = __len__()
|
||||
)
|
||||
/* clang-format on */
|
||||
const uint8_t bytes[] = {
|
||||
0x08, 0x00, 0x00, 0x00, /* instruct array size */
|
||||
0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x09, 0x00, /* instruct
|
||||
array */
|
||||
0x0c, 0x00, 0x00, 0x00, /* const pool size */
|
||||
0x00, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x5f, 0x00,
|
||||
0x40, 0x6c, 0x00, /* const pool */
|
||||
};
|
||||
pikaVM_runByteCode(obj, (uint8_t*)bytes);
|
||||
int len = obj_getInt(obj, "@l");
|
||||
int len = _obj_getLen(obj);
|
||||
for (int i_star_arg = len - 1; i_star_arg >= 0; i_star_arg--) {
|
||||
obj_setInt(obj, "@d", i_star_arg);
|
||||
/* clang-format off */
|
||||
|
@ -122,6 +122,7 @@ size_t strGetSize(char* pData) {
|
||||
return strlen(pData);
|
||||
}
|
||||
|
||||
|
||||
char* strPointToLastToken(char* strIn, char sign) {
|
||||
if (!strIsContain(strIn, sign)) {
|
||||
return strIn;
|
||||
|
@ -6,8 +6,11 @@ core.set_backend(textgui)
|
||||
class Widget(core.Widget):
|
||||
pass
|
||||
|
||||
def Page():
|
||||
return core.Page()
|
||||
def App():
|
||||
return core.App()
|
||||
|
||||
class Page(core.Page):
|
||||
pass
|
||||
|
||||
class Button(core.Button):
|
||||
pass
|
||||
|
@ -15,13 +15,10 @@ _backend = None
|
||||
def set_backend(backend):
|
||||
global _backend
|
||||
global ALIGN
|
||||
global page
|
||||
global app
|
||||
_backend = backend
|
||||
ALIGN = _backend.ALIGN
|
||||
page = _Page()
|
||||
page._setPerent(page)
|
||||
page.isroot = True
|
||||
page.backend = _backend.screen()
|
||||
app = _App()
|
||||
|
||||
|
||||
class Widget:
|
||||
@ -37,10 +34,10 @@ class Widget:
|
||||
_child = []
|
||||
|
||||
def __init__(self,
|
||||
text=None,
|
||||
width=100,
|
||||
height=100,
|
||||
pos=None,
|
||||
text=None,
|
||||
align=ALIGN.TOP_MID):
|
||||
self.width = width
|
||||
self.height = height
|
||||
@ -48,6 +45,9 @@ class Widget:
|
||||
self.align = align
|
||||
self.text = text
|
||||
|
||||
def build(self):
|
||||
pass
|
||||
|
||||
def _setPerent(self, parent):
|
||||
self.parent = weakref.ref(parent)
|
||||
|
||||
@ -99,9 +99,12 @@ class Widget:
|
||||
return self
|
||||
|
||||
|
||||
class _Page(Widget):
|
||||
def _createBackend(self, parent: Widget):
|
||||
return _backend.screen()
|
||||
class Page(Widget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._setPerent(self)
|
||||
self.isroot = True
|
||||
self.backend = _backend.Screen()
|
||||
|
||||
|
||||
class Button(Widget):
|
||||
@ -117,8 +120,38 @@ class Text(Widget):
|
||||
self.backend.set_text(text)
|
||||
|
||||
|
||||
page = _Page()
|
||||
class PageManager:
|
||||
pageThis = None
|
||||
pageList = []
|
||||
|
||||
def open(self, page: Page):
|
||||
self.pageThis = page
|
||||
self.pageList.append(page)
|
||||
page.build()
|
||||
self.update()
|
||||
|
||||
def pop(self):
|
||||
if len(self.pageList) <= 1:
|
||||
return
|
||||
_ = self.pageList.pop()
|
||||
self.pageThis = self.pageList[-1]
|
||||
self.update()
|
||||
|
||||
def update(self):
|
||||
if self.pageThis is None:
|
||||
return
|
||||
self.pageThis.update()
|
||||
|
||||
|
||||
def Page():
|
||||
return page
|
||||
class _App:
|
||||
pageManager = PageManager()
|
||||
|
||||
def update(self):
|
||||
self.pageManager.update()
|
||||
|
||||
|
||||
app = _App()
|
||||
|
||||
|
||||
def App():
|
||||
return app
|
||||
|
@ -1,8 +1,18 @@
|
||||
import PikaUI as ui
|
||||
|
||||
ui.Page().add(
|
||||
ui.Widget(
|
||||
).add(
|
||||
ui.Text()
|
||||
),
|
||||
).update()
|
||||
page1 = ui.Page().add(
|
||||
ui.Text('Hello Page1')
|
||||
)
|
||||
|
||||
|
||||
class Page2(ui.Page):
|
||||
def build(self):
|
||||
self.add(
|
||||
ui.Text('Hello Page2')
|
||||
)
|
||||
|
||||
|
||||
app = ui.App()
|
||||
app.pageManager.open(page1)
|
||||
app.pageManager.open(Page2())
|
||||
app.pageManager.pop()
|
||||
|
@ -19,7 +19,7 @@ class widget:
|
||||
print('%s.set_height(%d)' % (self.name, height))
|
||||
|
||||
def set_text(self, text):
|
||||
print('%s.set_text(%s)' % (self.name, text))
|
||||
print('%s.set_text("%s")' % (self.name, text))
|
||||
|
||||
class Screen:
|
||||
name = "screen"
|
||||
|
@ -529,6 +529,23 @@ TEST(stddata, pikafs_open) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(stddata, list_slice_issue) {
|
||||
/* init */
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
|
||||
/* run */
|
||||
__platform_printf("BEGIN\r\n");
|
||||
obj_run(pikaMain,
|
||||
"l = [1,2,3]\n"
|
||||
"l[-1]\n");
|
||||
/* collect */
|
||||
/* assert */
|
||||
EXPECT_STREQ(log_buff[0], "3\r\n");
|
||||
/* deinit */
|
||||
obj_deinit(pikaMain);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
TEST_END
|
Loading…
x
Reference in New Issue
Block a user