summaryrefslogtreecommitdiffstatshomepage
path: root/stm
diff options
context:
space:
mode:
Diffstat (limited to 'stm')
-rw-r--r--stm/Makefile2
-rw-r--r--stm/lexerstm.c60
-rw-r--r--stm/lexerstm.h16
-rw-r--r--stm/main.c40
-rw-r--r--stm/std.h1
-rw-r--r--stm/string0.c15
6 files changed, 113 insertions, 21 deletions
diff --git a/stm/Makefile b/stm/Makefile
index b7e565e9aa..a9cba33bdd 100644
--- a/stm/Makefile
+++ b/stm/Makefile
@@ -24,6 +24,7 @@ SRC_C = \
systick.c \
stm32fxxx_it.c \
usb.c \
+ lexerstm.c \
# sd.c \
SRC_S = \
@@ -33,6 +34,7 @@ PY_O = \
nlrthumb.o \
malloc.o \
qstr.o \
+ vstr.o \
misc.o \
lexer.o \
parse.o \
diff --git a/stm/lexerstm.c b/stm/lexerstm.c
new file mode 100644
index 0000000000..9757da09b5
--- /dev/null
+++ b/stm/lexerstm.c
@@ -0,0 +1,60 @@
+#include <stdint.h>
+#include <stdio.h>
+
+#include "ff.h"
+
+#include "misc.h"
+#include "lexer.h"
+#include "lexerstm.h"
+
+unichar str_buf_next_char(py_lexer_str_buf_t *sb) {
+ if (sb->src_cur < sb->src_end) {
+ return *sb->src_cur++;
+ } else {
+ return PY_LEXER_CHAR_EOF;
+ }
+}
+
+void str_buf_free(py_lexer_str_buf_t *sb) {
+ if (sb->free) {
+ m_free((char*)sb->src_beg);
+ }
+}
+
+py_lexer_t *py_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str, py_lexer_str_buf_t *sb) {
+ sb->free = free_str;
+ sb->src_beg = str;
+ sb->src_cur = str;
+ sb->src_end = str + len;
+ return py_lexer_new(src_name, sb, (py_lexer_stream_next_char_t)str_buf_next_char, (py_lexer_stream_close_t)str_buf_free);
+}
+
+unichar file_buf_next_char(py_lexer_file_buf_t *fb) {
+ if (fb->pos >= fb->len) {
+ if (fb->len < sizeof(fb->buf)) {
+ return PY_LEXER_CHAR_EOF;
+ } else {
+ UINT n;
+ f_read(&fb->fp, fb->buf, sizeof(fb->buf), &n);
+ fb->len = n;
+ fb->pos = 0;
+ }
+ }
+ return fb->buf[fb->pos++];
+}
+
+void file_buf_close(py_lexer_file_buf_t *fb) {
+ f_close(&fb->fp);
+}
+
+py_lexer_t *py_lexer_new_from_file(const char *filename, py_lexer_file_buf_t *fb) {
+ FRESULT res = f_open(&fb->fp, filename, FA_READ);
+ if (res != FR_OK) {
+ return NULL;
+ }
+ UINT n;
+ f_read(&fb->fp, fb->buf, sizeof(fb->buf), &n);
+ fb->len = n;
+ fb->pos = 0;
+ return py_lexer_new(filename, fb, (py_lexer_stream_next_char_t)file_buf_next_char, (py_lexer_stream_close_t)file_buf_close);
+}
diff --git a/stm/lexerstm.h b/stm/lexerstm.h
new file mode 100644
index 0000000000..f57d1faa9d
--- /dev/null
+++ b/stm/lexerstm.h
@@ -0,0 +1,16 @@
+typedef struct _py_lexer_str_buf_t {
+ bool free; // free src_beg when done
+ const char *src_beg; // beginning of source
+ const char *src_cur; // current location in source
+ const char *src_end; // end (exclusive) of source
+} py_lexer_str_buf_t;
+
+typedef struct _py_lexer_file_buf_t {
+ FIL fp;
+ char buf[20];
+ uint16_t len;
+ uint16_t pos;
+} py_lexer_file_buf_t;
+
+py_lexer_t *py_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str, py_lexer_str_buf_t *sb);
+py_lexer_t *py_lexer_new_from_file(const char *filename, py_lexer_file_buf_t *fb);
diff --git a/stm/main.c b/stm/main.c
index e06e119a55..90421d5989 100644
--- a/stm/main.c
+++ b/stm/main.c
@@ -11,6 +11,7 @@
#include "storage.h"
#include "mma.h"
#include "usb.h"
+#include "ff.h"
static void impl02_c_version() {
int x = 0;
@@ -63,8 +64,10 @@ void __fatal_error(const char *msg) {
}
}
+#include "nlr.h"
#include "misc.h"
#include "lexer.h"
+#include "lexerstm.h"
#include "mpyconfig.h"
#include "parse.h"
#include "compile.h"
@@ -88,10 +91,8 @@ py_obj_t pyb_sw() {
}
}
-#include "ff.h"
FATFS fatfs0;
-#include "nlr.h"
/*
void g(uint i) {
@@ -293,7 +294,7 @@ int main() {
//sys_tick_delay_ms(1000);
// Python!
- if (0) {
+ if (1) {
//const char *pysrc = "def f():\n x=x+1\nprint(42)\n";
const char *pysrc =
// impl01.py
@@ -323,7 +324,6 @@ int main() {
" x = x + 1\n"
"f()\n";
*/
- /*
"print('in python!')\n"
"x = 0\n"
"while x < 4:\n"
@@ -331,11 +331,10 @@ int main() {
" pyb_delay(201)\n"
" pyb_led(False)\n"
" pyb_delay(201)\n"
- " x = x + 1\n"
+ " x += 1\n"
"print('press me!')\n"
"while True:\n"
" pyb_led(pyb_sw())\n";
- */
/*
// impl16.py
"@micropython.asm_thumb\n"
@@ -372,6 +371,7 @@ int main() {
"except:\n"
" print(x)\n";
*/
+ /*
// impl19.py
"# for loop\n"
"def f():\n"
@@ -380,29 +380,27 @@ int main() {
" for z in range(400):\n"
" pass\n"
"f()\n";
+ */
- py_lexer_t *lex = py_lexer_from_str_len("<>", pysrc, strlen(pysrc), false);
+ py_lexer_str_buf_t py_lexer_str_buf;
+ py_lexer_t *lex = py_lexer_new_from_str_len("<stdin>", pysrc, strlen(pysrc), false, &py_lexer_str_buf);
- if (0) {
- while (!py_lexer_is_kind(lex, PY_TOKEN_END)) {
- py_token_show(py_lexer_cur(lex));
- py_lexer_to_next(lex);
- sys_tick_delay_ms(1000);
- }
- } else {
- // nalloc=1740;6340;6836 -> 140;4600;496 bytes for lexer, parser, compiler
- printf("lex; al=%u\n", m_get_total_bytes_allocated());
- sys_tick_delay_ms(1000);
- py_parse_node_t pn = py_parse(lex, 0);
- //printf("----------------\n");
+ // nalloc=1740;6340;6836 -> 140;4600;496 bytes for lexer, parser, compiler
+ printf("lex; al=%u\n", m_get_total_bytes_allocated());
+ sys_tick_delay_ms(1000);
+ py_parse_node_t pn = py_parse(lex, PY_PARSE_FILE_INPUT);
+ py_lexer_free(lex);
+ if (pn != PY_PARSE_NODE_NULL) {
printf("pars;al=%u\n", m_get_total_bytes_allocated());
sys_tick_delay_ms(1000);
//parse_node_show(pn, 0);
- py_compile(pn, false);
+ bool comp_ok = py_compile(pn, false);
printf("comp;al=%u\n", m_get_total_bytes_allocated());
sys_tick_delay_ms(1000);
- if (1) {
+ if (!comp_ok) {
+ printf("compile error\n");
+ } else {
// execute it!
// add some functions to the python namespace
diff --git a/stm/std.h b/stm/std.h
index 4b370ef28b..2204363660 100644
--- a/stm/std.h
+++ b/stm/std.h
@@ -8,6 +8,7 @@ void *calloc(size_t sz, size_t n);
void *realloc(void *ptr, size_t n);
void *memcpy(void *dest, const void *src, size_t n);
+void *memmove(void *dest, const void *src, size_t n);
void *memset(void *s, int c, size_t n);
int strlen(const char *str);
diff --git a/stm/string0.c b/stm/string0.c
index 6e2c252eaa..2a5f255971 100644
--- a/stm/string0.c
+++ b/stm/string0.c
@@ -11,6 +11,21 @@ void *memcpy(void *dest, const void *src, size_t n) {
return dest;
}
+void *memmove(void *dest, const void *src, size_t n) {
+ if (src < dest && dest < src + n) {
+ // need to copy backwards
+ uint8_t *d = dest + n - 1;
+ const uint8_t *s = src + n - 1;
+ for (; n > 0; n--) {
+ *d-- = *s--;
+ }
+ return dest;
+ } else {
+ // can use normal memcpy
+ return memcpy(dest, src, n);
+ }
+}
+
void *memset(void *s, int c, size_t n) {
uint8_t *s2 = s;
for (; n > 0; n--) {