/**************************************************************************** * interpreters/micropython/micropython_main.c * * Copyright (C) 2015 Gregory Nutt. All rights reserved. * Authors: Gregory Nutt * Dave Marples * * 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 #include #include #include #include #include #include #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 + 0x1p120f); 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