Added Windows port (see #233)
This commit is contained in:
parent
9b00dad7bb
commit
19ccc6bdc7
|
@ -1,3 +1,4 @@
|
|||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
|
23
py/nlrx86.S
23
py/nlrx86.S
|
@ -5,9 +5,14 @@
|
|||
.text
|
||||
|
||||
/* uint nlr_push(4(%esp)=nlr_buf_t *nlr) */
|
||||
#ifdef __apple_build_version__
|
||||
.globl nlr_push
|
||||
.type nlr_push, @function
|
||||
nlr_push:
|
||||
#else
|
||||
.globl _nlr_push
|
||||
_nlr_push:
|
||||
#endif
|
||||
mov 4(%esp), %edx # load nlr_buf
|
||||
mov (%esp), %eax # load return %ip
|
||||
mov %eax, 8(%edx) # store %ip into nlr_buf+8
|
||||
|
@ -21,22 +26,36 @@ nlr_push:
|
|||
mov %edx, nlr_top # stor new nlr_buf (to make linked list)
|
||||
xor %eax, %eax # return 0, normal return
|
||||
ret # return
|
||||
#ifdef __apple_build_version__
|
||||
.size nlr_push, .-nlr_push
|
||||
#endif
|
||||
|
||||
/* void nlr_pop() */
|
||||
#ifdef __apple_build_version__
|
||||
.globl nlr_pop
|
||||
.type nlr_pop, @function
|
||||
nlr_pop:
|
||||
#else
|
||||
.globl _nlr_pop
|
||||
_nlr_pop:
|
||||
#endif
|
||||
mov nlr_top, %eax # load nlr_top
|
||||
mov (%eax), %eax # load prev nlr_buf
|
||||
mov %eax, nlr_top # store nlr_top (to unlink list)
|
||||
ret # return
|
||||
#ifdef __apple_build_version__
|
||||
.size nlr_pop, .-nlr_pop
|
||||
#endif
|
||||
|
||||
/* void nlr_jump(4(%esp)=uint val) */
|
||||
#ifdef __apple_build_version__
|
||||
.globl nlr_jump
|
||||
.type nlr_jump, @function
|
||||
nlr_jump:
|
||||
#else
|
||||
.globl _nlr_jump
|
||||
_nlr_jump:
|
||||
#endif
|
||||
mov nlr_top, %edx # load nlr_top
|
||||
mov 4(%esp), %eax # load return value
|
||||
mov %eax, 4(%edx) # store return value
|
||||
|
@ -52,8 +71,12 @@ nlr_jump:
|
|||
xor %eax, %eax # clear return register
|
||||
inc %al # increase to make 1, non-local return
|
||||
ret # return
|
||||
#ifdef __apple_build_version__
|
||||
.size nlr_jump, .-nlr_jump
|
||||
#endif
|
||||
|
||||
#ifdef __apple_build_version__
|
||||
.local nlr_top
|
||||
#endif
|
||||
.comm nlr_top,4,4
|
||||
#endif
|
||||
|
|
|
@ -1,55 +1,51 @@
|
|||
#!/usr/bin/env bash
|
||||
#! /usr/bin/env python3.3
|
||||
|
||||
RM="/bin/rm -f"
|
||||
CPYTHON3=python3.3
|
||||
MP_PY=../unix/micropython
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from glob import glob
|
||||
|
||||
numtests=0
|
||||
numtestcases=0
|
||||
numpassed=0
|
||||
numfailed=0
|
||||
namefailed=
|
||||
if os.name == 'nt':
|
||||
CPYTHON3 = 'python3.3.exe'
|
||||
MP_PY = '../windows/micropython.exe'
|
||||
else:
|
||||
CPYTHON3 = 'python3.3'
|
||||
MP_PY = '../unix/micropython'
|
||||
|
||||
if [ $# -eq 0 ]
|
||||
then
|
||||
tests="basics/*.py io/*.py"
|
||||
else
|
||||
tests="$@"
|
||||
fi
|
||||
|
||||
for infile in $tests
|
||||
do
|
||||
basename=`basename $infile .py`
|
||||
outfile=${basename}.out
|
||||
expfile=${basename}.exp
|
||||
test_count = 0
|
||||
testcase_count = 0
|
||||
passed_count = 0
|
||||
failed_tests = []
|
||||
tests = []
|
||||
|
||||
$CPYTHON3 -B $infile > $expfile
|
||||
$MP_PY $infile > $outfile
|
||||
((numtestcases = numtestcases + $(cat $expfile | wc -l)))
|
||||
if not sys.argv[1:]:
|
||||
tests = glob('basics/*.py') + glob('io/*.py')
|
||||
else:
|
||||
tests = sys.argv[1:]
|
||||
|
||||
diff --brief $expfile $outfile > /dev/null
|
||||
for test_file in tests:
|
||||
test_name = os.path.splitext(os.path.basename(test_file))[0]
|
||||
|
||||
if [ $? -eq 0 ]
|
||||
then
|
||||
echo "pass $infile"
|
||||
$RM $outfile
|
||||
$RM $expfile
|
||||
((numpassed=numpassed + 1))
|
||||
else
|
||||
echo "FAIL $infile"
|
||||
((numfailed=numfailed + 1))
|
||||
namefailed="$namefailed $basename"
|
||||
fi
|
||||
output_expected = subprocess.check_output([CPYTHON3, '-B', test_file])
|
||||
output_mypy = subprocess.check_output([MP_PY, test_file])
|
||||
|
||||
((numtests=numtests + 1))
|
||||
done
|
||||
testcase_count += len(output_expected.splitlines())
|
||||
|
||||
echo "$numtests tests performed ($numtestcases individual testcases)"
|
||||
echo "$numpassed tests passed"
|
||||
if [[ $numfailed != 0 ]]
|
||||
then
|
||||
echo "$numfailed tests failed -$namefailed"
|
||||
exit 1
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
if output_expected != output_mypy:
|
||||
print("pass ", test_file)
|
||||
passed_count += 1
|
||||
else:
|
||||
print("FAIL ", test_file)
|
||||
failed_tests.append(test_name)
|
||||
|
||||
test_count += 1
|
||||
|
||||
print("{} tests performed ({} individual testcases)".format(test_count,
|
||||
testcase_count))
|
||||
print("{} tests passed".format(passed_count))
|
||||
|
||||
if len(failed_tests) > 0:
|
||||
print("{} tests failed: {}".format(len(failed_tests),
|
||||
' '.join(failed_tests)))
|
||||
sys.exit(1)
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
include ../py/mkenv.mk
|
||||
|
||||
# define main target
|
||||
PROG = micropython.exe
|
||||
|
||||
# qstr definitions (must come before including py.mk)
|
||||
QSTR_DEFS = qstrdefsport.h
|
||||
|
||||
# include py core make definitions
|
||||
include ../py/py.mk
|
||||
|
||||
# compiler settings
|
||||
CFLAGS = -I. -I$(PY_SRC) -Wall -Werror -ansi -std=gnu99 -DUNIX
|
||||
LDFLAGS = -lm
|
||||
|
||||
# Debugging/Optimization
|
||||
ifdef DEBUG
|
||||
CFLAGS += -O0 -g
|
||||
else
|
||||
CFLAGS += -Os #-DNDEBUG
|
||||
endif
|
||||
|
||||
# source files
|
||||
SRC_C = \
|
||||
main.c \
|
||||
file.c \
|
||||
|
||||
OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
|
||||
LIB = -lreadline
|
||||
LIB += -lws2_32
|
||||
LIB += -lmman
|
||||
# the following is needed for BSD
|
||||
#LIB += -ltermcap
|
||||
|
||||
include ../py/mkrules.mk
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
#include <stdio.h>
|
||||
#include "../unix/file.c"
|
|
@ -0,0 +1,5 @@
|
|||
#include "../unix/main.c"
|
||||
|
||||
void rawsocket_init() {
|
||||
// Do nothing here
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
// options to control how Micro Python is built
|
||||
|
||||
// Linking with GNU readline causes binary to be licensed under GPL
|
||||
#ifndef MICROPY_USE_READLINE
|
||||
#define MICROPY_USE_READLINE (1)
|
||||
#endif
|
||||
|
||||
#define MICROPY_EMIT_X64 (1)
|
||||
#define MICROPY_EMIT_THUMB (0)
|
||||
#define MICROPY_EMIT_INLINE_THUMB (0)
|
||||
#define MICROPY_MEM_STATS (1)
|
||||
#define MICROPY_DEBUG_PRINTERS (1)
|
||||
#define MICROPY_ENABLE_REPL_HELPERS (1)
|
||||
#define MICROPY_ENABLE_LEXER_UNIX (1)
|
||||
#define MICROPY_ENABLE_FLOAT (1)
|
||||
#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_LONGLONG)
|
||||
|
||||
// type definitions for the specific machine
|
||||
|
||||
#ifdef __LP64__
|
||||
typedef long machine_int_t; // must be pointer size
|
||||
typedef unsigned long machine_uint_t; // must be pointer size
|
||||
#else
|
||||
// These are definitions for machines where sizeof(int) == sizeof(void*),
|
||||
// regardless for actual size.
|
||||
typedef int machine_int_t; // must be pointer size
|
||||
typedef unsigned int machine_uint_t; // must be pointer size
|
||||
#endif
|
||||
|
||||
#define BYTES_PER_WORD sizeof(machine_int_t)
|
||||
|
||||
typedef void *machine_ptr_t; // must be of pointer size
|
||||
typedef const void *machine_const_ptr_t; // must be of pointer size
|
||||
typedef double machine_float_t;
|
||||
|
||||
machine_float_t machine_sqrt(machine_float_t x);
|
|
@ -0,0 +1,8 @@
|
|||
// qstrs specific to this port
|
||||
|
||||
Q(sys)
|
||||
Q(argv)
|
||||
Q(open)
|
||||
Q(stdin)
|
||||
Q(stdout)
|
||||
Q(stderr)
|
Loading…
Reference in New Issue