summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/webassembly/Makefile5
-rw-r--r--ports/webassembly/main.c16
-rw-r--r--ports/webassembly/mpconfigport.h10
-rw-r--r--ports/webassembly/mphalport.h23
4 files changed, 53 insertions, 1 deletions
diff --git a/ports/webassembly/Makefile b/ports/webassembly/Makefile
index db3f36ad8..09660cd39 100644
--- a/ports/webassembly/Makefile
+++ b/ports/webassembly/Makefile
@@ -37,7 +37,10 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
JSFLAGS += -s ASYNCIFY
-JSFLAGS += -s EXPORTED_FUNCTIONS="['_mp_js_init', '_mp_js_init_repl', '_mp_js_do_str', '_mp_js_process_char', '_mp_hal_get_interrupt_char', '_mp_sched_keyboard_interrupt']" -s EXPORTED_RUNTIME_METHODS="['ccall', 'cwrap']" -s --memory-init-file 0 --js-library library.js
+JSFLAGS += -s EXPORTED_FUNCTIONS="['_mp_js_init', '_mp_js_init_repl', '_mp_js_do_str', '_mp_js_process_char', '_mp_hal_get_interrupt_char', '_mp_sched_keyboard_interrupt']"
+JSFLAGS += -s EXPORTED_RUNTIME_METHODS="['ccall', 'cwrap', 'FS']"
+JSFLAGS += -s --memory-init-file 0
+JSFLAGS += --js-library library.js
all: $(BUILD)/micropython.js
diff --git a/ports/webassembly/main.c b/ports/webassembly/main.c
index 36ea9e98b..e62732826 100644
--- a/ports/webassembly/main.c
+++ b/ports/webassembly/main.c
@@ -35,6 +35,8 @@
#include "py/repl.h"
#include "py/gc.h"
#include "py/mperrno.h"
+#include "extmod/vfs.h"
+#include "extmod/vfs_posix.h"
#include "shared/runtime/pyexec.h"
#include "emscripten.h"
@@ -92,6 +94,18 @@ void mp_js_init(int heap_size) {
#endif
mp_init();
+
+ #if MICROPY_VFS_POSIX
+ {
+ // Mount the host FS at the root of our internal VFS
+ mp_obj_t args[2] = {
+ MP_OBJ_TYPE_GET_SLOT(&mp_type_vfs_posix, make_new)(&mp_type_vfs_posix, 0, 0, NULL),
+ MP_OBJ_NEW_QSTR(qstr_from_str("/")),
+ };
+ mp_vfs_mount(2, args, (mp_map_t *)&mp_const_empty_map);
+ MP_STATE_VM(vfs_cur) = MP_STATE_VM(vfs_mount_table);
+ }
+ #endif
}
void mp_js_init_repl() {
@@ -109,6 +123,7 @@ void gc_collect(void) {
gc_collect_end();
}
+#if !MICROPY_VFS
mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
mp_raise_OSError(MP_ENOENT);
}
@@ -121,6 +136,7 @@ mp_obj_t mp_builtin_open(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs)
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open);
+#endif
void nlr_jump_fail(void *val) {
while (1) {
diff --git a/ports/webassembly/mpconfigport.h b/ports/webassembly/mpconfigport.h
index 34e231a1f..46335607e 100644
--- a/ports/webassembly/mpconfigport.h
+++ b/ports/webassembly/mpconfigport.h
@@ -37,6 +37,7 @@
#define MICROPY_ENABLE_COMPILER (1)
#define MICROPY_ALLOC_PATH_MAX (256)
+#define MICROPY_READER_VFS (MICROPY_VFS)
#define MICROPY_ENABLE_GC (1)
#define MICROPY_ENABLE_PYSTACK (1)
#define MICROPY_STACK_CHECK (0)
@@ -48,6 +49,10 @@
#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_DOUBLE)
#define MICROPY_USE_INTERNAL_ERRNO (1)
#define MICROPY_USE_INTERNAL_PRINTF (0)
+#ifndef MICROPY_VFS
+#define MICROPY_VFS (1)
+#endif
+#define MICROPY_VFS_POSIX (MICROPY_VFS)
#define MICROPY_PY_UTIME_MP_HAL (1)
#define MICROPY_PY_SYS_PLATFORM "webassembly"
#define MICROPY_PY_SYS_STDFILES (0)
@@ -86,3 +91,8 @@ typedef long mp_off_t;
#define MICROPY_HW_MCU_NAME "Emscripten"
#define MP_STATE_PORT MP_STATE_VM
+
+#if MICROPY_VFS
+// _GNU_SOURCE must be defined to get definitions of DT_xxx symbols from dirent.h.
+#define _GNU_SOURCE
+#endif
diff --git a/ports/webassembly/mphalport.h b/ports/webassembly/mphalport.h
index 3e2c439f3..89efee697 100644
--- a/ports/webassembly/mphalport.h
+++ b/ports/webassembly/mphalport.h
@@ -37,3 +37,26 @@ mp_uint_t mp_hal_ticks_us(void);
mp_uint_t mp_hal_ticks_cpu(void);
int mp_hal_get_interrupt_char(void);
+
+#if MICROPY_VFS_POSIX
+
+#include <errno.h>
+
+// This macro is used to implement PEP 475 to retry specified syscalls on EINTR
+#define MP_HAL_RETRY_SYSCALL(ret, syscall, raise) \
+ { \
+ for (;;) { \
+ ret = syscall; \
+ if (ret == -1) { \
+ int err = errno; \
+ if (err == EINTR) { \
+ mp_handle_pending(true); \
+ continue; \
+ } \
+ raise; \
+ } \
+ break; \
+ } \
+ }
+
+#endif