support add and build

This commit is contained in:
lyon 2023-02-22 21:59:28 +08:00
parent 8172d50e13
commit 6c6be65db6
10 changed files with 145 additions and 70 deletions

View File

@ -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__);

View File

@ -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}",

View File

@ -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__);

View File

@ -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 */

View File

@ -122,6 +122,7 @@ size_t strGetSize(char* pData) {
return strlen(pData);
}
char* strPointToLastToken(char* strIn, char sign) {
if (!strIsContain(strIn, sign)) {
return strIn;

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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"

View File

@ -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