Added Windows port (see #233)

This commit is contained in:
Markus Siemens 2014-01-27 22:53:28 +01:00
parent 9b00dad7bb
commit 19ccc6bdc7
8 changed files with 153 additions and 46 deletions

View File

@ -1,3 +1,4 @@
#include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>

View File

@ -5,9 +5,14 @@
.text .text
/* uint nlr_push(4(%esp)=nlr_buf_t *nlr) */ /* uint nlr_push(4(%esp)=nlr_buf_t *nlr) */
#ifdef __apple_build_version__
.globl nlr_push .globl nlr_push
.type nlr_push, @function .type nlr_push, @function
nlr_push: nlr_push:
#else
.globl _nlr_push
_nlr_push:
#endif
mov 4(%esp), %edx # load nlr_buf mov 4(%esp), %edx # load nlr_buf
mov (%esp), %eax # load return %ip mov (%esp), %eax # load return %ip
mov %eax, 8(%edx) # store %ip into nlr_buf+8 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) mov %edx, nlr_top # stor new nlr_buf (to make linked list)
xor %eax, %eax # return 0, normal return xor %eax, %eax # return 0, normal return
ret # return ret # return
#ifdef __apple_build_version__
.size nlr_push, .-nlr_push .size nlr_push, .-nlr_push
#endif
/* void nlr_pop() */ /* void nlr_pop() */
#ifdef __apple_build_version__
.globl nlr_pop .globl nlr_pop
.type nlr_pop, @function .type nlr_pop, @function
nlr_pop: nlr_pop:
#else
.globl _nlr_pop
_nlr_pop:
#endif
mov nlr_top, %eax # load nlr_top mov nlr_top, %eax # load nlr_top
mov (%eax), %eax # load prev nlr_buf mov (%eax), %eax # load prev nlr_buf
mov %eax, nlr_top # store nlr_top (to unlink list) mov %eax, nlr_top # store nlr_top (to unlink list)
ret # return ret # return
#ifdef __apple_build_version__
.size nlr_pop, .-nlr_pop .size nlr_pop, .-nlr_pop
#endif
/* void nlr_jump(4(%esp)=uint val) */ /* void nlr_jump(4(%esp)=uint val) */
#ifdef __apple_build_version__
.globl nlr_jump .globl nlr_jump
.type nlr_jump, @function .type nlr_jump, @function
nlr_jump: nlr_jump:
#else
.globl _nlr_jump
_nlr_jump:
#endif
mov nlr_top, %edx # load nlr_top mov nlr_top, %edx # load nlr_top
mov 4(%esp), %eax # load return value mov 4(%esp), %eax # load return value
mov %eax, 4(%edx) # store return value mov %eax, 4(%edx) # store return value
@ -52,8 +71,12 @@ nlr_jump:
xor %eax, %eax # clear return register xor %eax, %eax # clear return register
inc %al # increase to make 1, non-local return inc %al # increase to make 1, non-local return
ret # return ret # return
#ifdef __apple_build_version__
.size nlr_jump, .-nlr_jump .size nlr_jump, .-nlr_jump
#endif
#ifdef __apple_build_version__
.local nlr_top .local nlr_top
#endif
.comm nlr_top,4,4 .comm nlr_top,4,4
#endif #endif

View File

@ -1,55 +1,51 @@
#!/usr/bin/env bash #! /usr/bin/env python3.3
RM="/bin/rm -f" import os
CPYTHON3=python3.3 import subprocess
MP_PY=../unix/micropython import sys
from glob import glob
numtests=0 if os.name == 'nt':
numtestcases=0 CPYTHON3 = 'python3.3.exe'
numpassed=0 MP_PY = '../windows/micropython.exe'
numfailed=0 else:
namefailed= CPYTHON3 = 'python3.3'
MP_PY = '../unix/micropython'
if [ $# -eq 0 ]
then
tests="basics/*.py io/*.py"
else
tests="$@"
fi
for infile in $tests test_count = 0
do testcase_count = 0
basename=`basename $infile .py` passed_count = 0
outfile=${basename}.out failed_tests = []
expfile=${basename}.exp tests = []
$CPYTHON3 -B $infile > $expfile if not sys.argv[1:]:
$MP_PY $infile > $outfile tests = glob('basics/*.py') + glob('io/*.py')
((numtestcases = numtestcases + $(cat $expfile | wc -l))) 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 ] output_expected = subprocess.check_output([CPYTHON3, '-B', test_file])
then output_mypy = subprocess.check_output([MP_PY, test_file])
echo "pass $infile"
$RM $outfile
$RM $expfile
((numpassed=numpassed + 1))
else
echo "FAIL $infile"
((numfailed=numfailed + 1))
namefailed="$namefailed $basename"
fi
((numtests=numtests + 1)) testcase_count += len(output_expected.splitlines())
done
echo "$numtests tests performed ($numtestcases individual testcases)" if output_expected != output_mypy:
echo "$numpassed tests passed" print("pass ", test_file)
if [[ $numfailed != 0 ]] passed_count += 1
then else:
echo "$numfailed tests failed -$namefailed" print("FAIL ", test_file)
exit 1 failed_tests.append(test_name)
else
exit 0 test_count += 1
fi
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)

36
windows/Makefile Normal file
View File

@ -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

2
windows/file.c Normal file
View File

@ -0,0 +1,2 @@
#include <stdio.h>
#include "../unix/file.c"

5
windows/main.c Normal file
View File

@ -0,0 +1,5 @@
#include "../unix/main.c"
void rawsocket_init() {
// Do nothing here
}

36
windows/mpconfigport.h Normal file
View File

@ -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);

8
windows/qstrdefsport.h Normal file
View File

@ -0,0 +1,8 @@
// qstrs specific to this port
Q(sys)
Q(argv)
Q(open)
Q(stdin)
Q(stdout)
Q(stderr)