blob: 73da1ecfc2f361e4b49054934f0e8c8175de96d7 [file] [log] [blame]
Damien429d7192013-10-04 19:53:11 +01001#include <stdint.h>
2#include <stdio.h>
3#include <string.h>
Damien732407f2013-12-29 19:33:23 +00004#include <malloc.h>
Damien429d7192013-10-04 19:53:11 +01005
Damience89a212013-10-15 22:25:17 +01006#include "nlr.h"
Damien429d7192013-10-04 19:53:11 +01007#include "misc.h"
Damiend99b0522013-12-21 18:17:45 +00008#include "mpconfig.h"
Damien429d7192013-10-04 19:53:11 +01009#include "lexer.h"
Damiena5185f42013-10-20 14:41:27 +010010#include "lexerunix.h"
Damien429d7192013-10-04 19:53:11 +010011#include "parse.h"
12#include "compile.h"
Damien0f082672013-12-17 18:33:53 +000013#include "obj.h"
Damiend99b0522013-12-21 18:17:45 +000014#include "runtime0.h"
15#include "runtime.h"
Damien92c06562013-10-22 22:32:27 +010016#include "repl.h"
Damien429d7192013-10-04 19:53:11 +010017
Damien5ac1b2e2013-10-18 19:58:12 +010018#include <readline/readline.h>
Damien429d7192013-10-04 19:53:11 +010019
Damiend99b0522013-12-21 18:17:45 +000020static char *str_join(const char *s1, int sep_char, const char *s2) {
Damien5ac1b2e2013-10-18 19:58:12 +010021 int l1 = strlen(s1);
22 int l2 = strlen(s2);
23 char *s = m_new(char, l1 + l2 + 2);
24 memcpy(s, s1, l1);
25 if (sep_char != 0) {
26 s[l1] = sep_char;
27 l1 += 1;
28 }
29 memcpy(s + l1, s2, l2);
Damien92c06562013-10-22 22:32:27 +010030 s[l1 + l2] = 0;
Damien5ac1b2e2013-10-18 19:58:12 +010031 return s;
32}
33
Damiend99b0522013-12-21 18:17:45 +000034static void do_repl(void) {
Damien5ac1b2e2013-10-18 19:58:12 +010035 for (;;) {
36 char *line = readline(">>> ");
37 if (line == NULL) {
38 // EOF
39 return;
40 }
Damiend99b0522013-12-21 18:17:45 +000041 if (mp_repl_is_compound_stmt(line)) {
Damien5ac1b2e2013-10-18 19:58:12 +010042 for (;;) {
43 char *line2 = readline("... ");
44 if (line2 == NULL || strlen(line2) == 0) {
45 break;
46 }
47 char *line3 = str_join(line, '\n', line2);
Damien732407f2013-12-29 19:33:23 +000048 free(line);
49 free(line2);
Damien5ac1b2e2013-10-18 19:58:12 +010050 line = line3;
51 }
52 }
Damienfa2162b2013-10-20 17:42:00 +010053
Damiend99b0522013-12-21 18:17:45 +000054 mp_lexer_t *lex = mp_lexer_new_from_str_len("<stdin>", line, strlen(line), false);
55 mp_parse_node_t pn = mp_parse(lex, MP_PARSE_SINGLE_INPUT);
56 mp_lexer_free(lex);
Damienfa2162b2013-10-20 17:42:00 +010057
Damiend99b0522013-12-21 18:17:45 +000058 if (pn != MP_PARSE_NODE_NULL) {
59 //mp_parse_node_show(pn, 0);
60 bool comp_ok = mp_compile(pn, true);
Damien5ac1b2e2013-10-18 19:58:12 +010061 if (comp_ok) {
Damiend99b0522013-12-21 18:17:45 +000062 mp_obj_t module_fun = rt_make_function_from_id(1);
63 if (module_fun != mp_const_none) {
Damien5ac1b2e2013-10-18 19:58:12 +010064 nlr_buf_t nlr;
65 if (nlr_push(&nlr) == 0) {
66 rt_call_function_0(module_fun);
67 nlr_pop();
68 } else {
69 // uncaught exception
Damiend99b0522013-12-21 18:17:45 +000070 mp_obj_print((mp_obj_t)nlr.ret_val);
Damien5ac1b2e2013-10-18 19:58:12 +010071 printf("\n");
72 }
73 }
74 }
75 }
76 }
77}
78
79void do_file(const char *file) {
Damiend99b0522013-12-21 18:17:45 +000080 mp_lexer_t *lex = mp_lexer_new_from_file(file);
Damien429d7192013-10-04 19:53:11 +010081 //const char *pysrc = "def f():\n x=x+1\n print(42)\n";
Damiend99b0522013-12-21 18:17:45 +000082 //mp_lexer_t *lex = mp_lexer_from_str_len("<>", pysrc, strlen(pysrc), false);
Damien429d7192013-10-04 19:53:11 +010083 if (lex == NULL) {
Damien5ac1b2e2013-10-18 19:58:12 +010084 return;
Damien429d7192013-10-04 19:53:11 +010085 }
86
87 if (0) {
Damien5ac1b2e2013-10-18 19:58:12 +010088 // just tokenise
Damiend99b0522013-12-21 18:17:45 +000089 while (!mp_lexer_is_kind(lex, MP_TOKEN_END)) {
90 mp_token_show(mp_lexer_cur(lex));
91 mp_lexer_to_next(lex);
Damien429d7192013-10-04 19:53:11 +010092 }
Damiend99b0522013-12-21 18:17:45 +000093 mp_lexer_free(lex);
Damien5ac1b2e2013-10-18 19:58:12 +010094
Damien429d7192013-10-04 19:53:11 +010095 } else {
Damien5ac1b2e2013-10-18 19:58:12 +010096 // compile
97
Damiend99b0522013-12-21 18:17:45 +000098 mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT);
99 mp_lexer_free(lex);
Damienfa2162b2013-10-20 17:42:00 +0100100
Damiend99b0522013-12-21 18:17:45 +0000101 if (pn != MP_PARSE_NODE_NULL) {
Damien91d387d2013-10-09 15:09:52 +0100102 //printf("----------------\n");
Damiena3977762013-10-09 23:10:10 +0100103 //parse_node_show(pn, 0);
Damien91d387d2013-10-09 15:09:52 +0100104 //printf("----------------\n");
Damiend99b0522013-12-21 18:17:45 +0000105 bool comp_ok = mp_compile(pn, false);
Damien91d387d2013-10-09 15:09:52 +0100106 //printf("----------------\n");
Damien429d7192013-10-04 19:53:11 +0100107
Damiena5185f42013-10-20 14:41:27 +0100108#if MICROPY_EMIT_CPYTHON
109 if (!comp_ok) {
110 printf("compile error\n");
111 }
112#else
Damien5ac1b2e2013-10-18 19:58:12 +0100113 if (1 && comp_ok) {
114 // execute it
Damiend99b0522013-12-21 18:17:45 +0000115 mp_obj_t module_fun = rt_make_function_from_id(1);
116 if (module_fun != mp_const_none) {
Damien5ac1b2e2013-10-18 19:58:12 +0100117 nlr_buf_t nlr;
118 if (nlr_push(&nlr) == 0) {
Damienb86e3f92013-12-29 17:17:43 +0000119 rt_call_function_0(module_fun);
Damien5ac1b2e2013-10-18 19:58:12 +0100120 nlr_pop();
121 } else {
122 // uncaught exception
Damiend99b0522013-12-21 18:17:45 +0000123 mp_obj_print((mp_obj_t)nlr.ret_val);
Damien5ac1b2e2013-10-18 19:58:12 +0100124 printf("\n");
125 }
126 }
Damience89a212013-10-15 22:25:17 +0100127 }
Damien5ac1b2e2013-10-18 19:58:12 +0100128#endif
Damien429d7192013-10-04 19:53:11 +0100129 }
130 }
Damien5ac1b2e2013-10-18 19:58:12 +0100131}
Damien429d7192013-10-04 19:53:11 +0100132
Damiend99b0522013-12-21 18:17:45 +0000133typedef struct _test_obj_t {
134 mp_obj_base_t base;
135 bool value;
136} test_obj_t;
137
138static void test_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in) {
139 test_obj_t *self = self_in;
140 print(env, "<test %d>", self->value);
Damiena53f6942013-11-02 23:58:38 +0000141}
142
Damiend99b0522013-12-21 18:17:45 +0000143static mp_obj_t test_get(mp_obj_t self_in) {
144 test_obj_t *self = self_in;
145 return mp_obj_new_int(self->value);
Damiena53f6942013-11-02 23:58:38 +0000146}
147
Damiend99b0522013-12-21 18:17:45 +0000148static mp_obj_t test_set(mp_obj_t self_in, mp_obj_t arg) {
149 test_obj_t *self = self_in;
150 self->value = mp_obj_get_int(arg);
151 return mp_const_none;
Damiena53f6942013-11-02 23:58:38 +0000152}
153
Damiend99b0522013-12-21 18:17:45 +0000154static MP_DEFINE_CONST_FUN_OBJ_1(test_get_obj, test_get);
155static MP_DEFINE_CONST_FUN_OBJ_2(test_set_obj, test_set);
156
157static const mp_obj_type_t test_type = {
158 { &mp_const_type },
Damiena53f6942013-11-02 23:58:38 +0000159 "Test",
Damiend99b0522013-12-21 18:17:45 +0000160 test_print, // print
161 NULL, // call_n
162 NULL, // unary_op
163 NULL, // binary_op
164 NULL, // getiter
165 NULL, // iternext
166 { // method list
167 { "get", &test_get_obj },
168 { "set", &test_set_obj },
169 { NULL, NULL },
Damiena53f6942013-11-02 23:58:38 +0000170 }
171};
172
Damiend99b0522013-12-21 18:17:45 +0000173mp_obj_t test_obj_new(int value) {
174 test_obj_t *o = m_new_obj(test_obj_t);
175 o->base.type = &test_type;
176 o->value = value;
177 return o;
178}
179
Damien5ac1b2e2013-10-18 19:58:12 +0100180int main(int argc, char **argv) {
181 qstr_init();
182 rt_init();
183
Damiend99b0522013-12-21 18:17:45 +0000184 rt_store_name(qstr_from_str_static("test"), test_obj_new(42));
Damiena53f6942013-11-02 23:58:38 +0000185
Damien5ac1b2e2013-10-18 19:58:12 +0100186 if (argc == 1) {
187 do_repl();
188 } else if (argc == 2) {
189 do_file(argv[1]);
190 } else {
191 printf("usage: py [<file>]\n");
192 return 1;
193 }
Damien429d7192013-10-04 19:53:11 +0100194 rt_deinit();
195
196 //printf("total bytes = %d\n", m_get_total_bytes_allocated());
197 return 0;
198}
Damien087d2182013-11-09 20:14:30 +0000199
200// for sqrt
201#include <math.h>
202machine_float_t machine_sqrt(machine_float_t x) {
203 return sqrt(x);
204}