diff options
Diffstat (limited to 'apps/interpreters/micropython/micropython_main.c')
-rw-r--r-- | apps/interpreters/micropython/micropython_main.c | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/apps/interpreters/micropython/micropython_main.c b/apps/interpreters/micropython/micropython_main.c new file mode 100644 index 000000000..a36bc0528 --- /dev/null +++ b/apps/interpreters/micropython/micropython_main.c @@ -0,0 +1,263 @@ +/**************************************************************************** + * interpreters/micropython/micropython_main.c + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Authors: Gregory Nutt <gnutt@nuttx.org> + * Dave Marples <dave@marples.net> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <sys/types.h> +#include <unistd.h> +#include <string.h> +#include <debug.h> +#include <stdio.h> +#include <math.h> + +#include "mpconfig.h" +#include "nlr.h" +#include "misc.h" +#include "qstr.h" +#include "lexer.h" +#include "parse.h" +#include "obj.h" +#include "parsehelper.h" +#include "compile.h" +#include "runtime0.h" +#include "runtime.h" +#include "repl.h" +#include "pfenv.h" +#include "pyexec.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define FORCE_EVAL(x) do { \ + if (sizeof(x) == sizeof(float)) { \ + volatile float __x; \ + __x = (x); \ + (void)__x; \ + } else if (sizeof(x) == sizeof(double)) { \ + volatile double __x; \ + __x = (x); \ + (void)__x; \ + } else { \ + volatile long double __x; \ + __x = (x); \ + (void)__x; \ + } \ +} while(0); + +/**************************************************************************** + * Private Data +****************************************************************************/ + +/**************************************************************************** + * Private Function +****************************************************************************/ + +void do_str(FAR const char *src) +{ + FAR mp_lexer_t *lex = + mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0); + if (lex == NULL) + { + return; + } + + mp_parse_error_kind_t parse_error_kind; + mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT, &parse_error_kind); + + if (pn == MP_PARSE_NODE_NULL) + { + /* parse error */ + + mp_parse_show_exception(lex, parse_error_kind); + mp_lexer_free(lex); + return; + } + + /* parse okay */ + + qstr source_name = lex->source_name; + mp_lexer_free(lex); + mp_obj_t module_fun = mp_compile(pn, source_name, MP_EMIT_OPT_NONE, true); + + if (mp_obj_is_exception_instance(module_fun)) + { + /* compile error */ + + mp_obj_print_exception(printf_wrapper, NULL, module_fun); + return; + } + + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) + { + mp_call_function_0(module_fun); + nlr_pop(); + } + else + { + /* uncaught exception */ + + mp_obj_print_exception(printf_wrapper, NULL, (mp_obj_t) nlr.ret_val); + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +float nanf(FAR const char *tagp) +{ + (void)tagp; + return 0; +} + +float copysignf(float x, float y) +{ + if (y < 0) + { + return -fabsf(x); + } + + return fabsf(x); +} + +float truncf(float x) +{ + union + { + float f; + uint32_t i; + } u = + { + x}; + int e = (int)(u.i >> 23 & 0xff) - 0x7f + 9; + uint32_t m; + + if (e >= 23 + 9) + { + return x; + } + + if (e < 9) + { + e = 1; + } + + m = -1U >> e; + if ((u.i & m) == 0) + { + return x; + } + + FORCE_EVAL(x + 0x1 p120f); + u.i &= ~m; + return u.f; +} + +/**************************************************************************** + * mp_import_stat + ****************************************************************************/ + +mp_import_stat_t mp_import_stat(FAR const char *path) +{ + return MP_IMPORT_STAT_NO_EXIST; +} + +/**************************************************************************** + * mp_lexer_new_from_file + ****************************************************************************/ + +mp_lexer_t *mp_lexer_new_from_file(FAR const char *filename) +{ + return NULL; +} + +/**************************************************************************** + * mp_builtin_open + ****************************************************************************/ + +mp_obj_t mp_builtin_open(uint 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); + +/**************************************************************************** + * nlr_jump_fail + ****************************************************************************/ + +void nlr_jump_fail(void *val) +{ + fprintf(stderr, "FATAL: uncaught exception %p\n", val); + exit(-1); +} + +/**************************************************************************** + * micropython_main + ****************************************************************************/ + +#ifdef CONFIG_INTERPRETERS_MICROPYTHON +int micropython_main(int argc, char *argv[]) +{ + mp_init(); + for (;;) + { + if (pyexec_mode_kind == PYEXEC_MODE_RAW_REPL) + { + if (pyexec_raw_repl() != 0) + { + break; + } + } + else + { + if (pyexec_friendly_repl() != 0) + { + break; + } + } + } + + mp_deinit(); + return 0; +} +#endif |