summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2009-05-26 20:59:55 +0000
committerBram Moolenaar <Bram@vim.org>2009-05-26 20:59:55 +0000
commit9e70cf192e0957e7e8e1e83f3f9f64822a7a96ee (patch)
tree0f3719130b48bcb33d4f012f6389215bdcf9006c /src
parent42b9436cf88929bf176d3a812b2840d530c5d522 (diff)
updated for version 7.2-191v7.2.191
Diffstat (limited to 'src')
-rw-r--r--src/Make_ming.mak26
-rw-r--r--src/Make_mvc.mak27
-rw-r--r--src/Makefile8
-rwxr-xr-xsrc/auto/configure74
-rw-r--r--src/config.mk.in2
-rw-r--r--src/configure.in63
-rw-r--r--src/eval.c2
-rw-r--r--src/if_mzsch.c1341
-rw-r--r--src/if_mzsch.h28
-rw-r--r--src/main.c6
-rw-r--r--src/proto/if_mzsch.pro8
-rw-r--r--src/version.c2
12 files changed, 1093 insertions, 494 deletions
diff --git a/src/Make_ming.mak b/src/Make_ming.mak
index 6d28e46685..e0717b62ae 100644
--- a/src/Make_ming.mak
+++ b/src/Make_ming.mak
@@ -115,8 +115,21 @@ ifndef MZSCHEME_VER
MZSCHEME_VER=205_000
endif
+ifndef MZSCHEME_PRECISE_GC
+MZSCHEME_PRECISE_GC=no
+endif
+
+# for version 4.x we need to generate byte-code for Scheme base
+ifndef MZSCHEME_GENERATE_BASE
+MZSCHEME_GENERATE_BASE=no
+endif
+
ifeq (no,$(DYNAMIC_MZSCHEME))
+ifeq (yes,$(MZSCHEME_PRECISE_GC))
+MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER)
+else
MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
+endif
# the modern MinGW can dynamically link to dlls directly.
# point MZSCHEME_DLLS to where you put libmzschXXXXXXX.dll and libgcXXXXXXX.dll
ifndef MZSCHEME_DLLS
@@ -410,6 +423,13 @@ endif
ifdef MZSCHEME
OBJ += $(OUTDIR)/if_mzsch.o
MZSCHEME_INCL = if_mzsch.h
+ifeq (yes,$(MZSCHEME_GENERATE_BASE))
+CFLAGS += -DINCLUDE_MZSCHEME_BASE
+MZ_EXTRA_DEP += mzscheme_base.c
+endif
+ifeq (yes,$(MZSCHEME_PRECISE_GC))
+CFLAGS += -DMZ_PRECISE_GC
+endif
endif
ifdef PYTHON
OBJ += $(OUTDIR)/if_python.o
@@ -588,6 +608,12 @@ if_perl.c: if_perl.xs typemap
$(OUTDIR)/netbeans.o: netbeans.c $(INCL) $(NBDEBUG_INCL) $(NBDEBUG_SRC)
$(CC) -c $(CFLAGS) netbeans.c -o $(OUTDIR)/netbeans.o
+$(OUTDIR)/if_mzsch.o: if_mzsch.c $(INCL) if_mzsch.h $(MZ_EXTRA_DEP)
+ $(CC) -c $(CFLAGS) if_mzsch.c -o $(OUTDIR)/if_mzsch.o
+
+mzscheme_base.c:
+ $(MZSCHEME)/mzc --c-mods mzscheme_base.c ++lib scheme/base
+
pathdef.c: $(INCL)
ifneq (sh.exe, $(SHELL))
@echo creating pathdef.c
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 545c94d341..1782586960 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -34,6 +34,7 @@
# MZSCHEME=[Path to MzScheme directory]
# DYNAMIC_MZSCHEME=yes (to load the MzScheme DLLs dynamically)
# MZSCHEME_VER=[version, 205_000, ...]
+# MZSCHEME_DEBUG=no
#
# Perl interface:
# PERL=[Path to Perl directory]
@@ -621,15 +622,37 @@ PYTHON_LIB = $(PYTHON)\libs\python$(PYTHON_VER).lib
MZSCHEME_VER = 205_000
!endif
CFLAGS = $(CFLAGS) -DFEAT_MZSCHEME -I $(MZSCHEME)\include
+!if EXIST("$(MZSCHEME)\collects\scheme\base.ss")
+# for MzScheme 4.x we need to include byte code for basic Scheme stuff
+MZSCHEME_EXTRA_DEP = mzscheme_base.c
+CFLAGS = $(CFLAGS) -DINCLUDE_MZSCHEME_BASE
+!endif
+!if EXIST("$(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib") \
+ && !EXIST("$(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib")
+!message Building with Precise GC
+MZSCHEME_PRECISE_GC = yes
+CFLAGS = $(CFLAGS) -DMZ_PRECISE_GC
+!endif
!if "$(DYNAMIC_MZSCHEME)" == "yes"
+!if "$(MZSCHEME_PRECISE_GC)" == "yes"
+!error MzScheme with Precise GC cannot be loaded dynamically
+!endif
!message MzScheme DLLs will be loaded dynamically
CFLAGS = $(CFLAGS) -DDYNAMIC_MZSCHEME \
-DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" \
-DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
!else
+!if "$(MZSCHEME_DEBUG)" == "yes"
+CFLAGS = $(CFLAGS) -DMZSCHEME_FORCE_GC
+!endif
+!if "$(MZSCHEME_PRECISE_GC)" == "yes"
+# Precise GC does not use separate dll
+MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
+!else
MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib \
$(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
!endif
+!endif
MZSCHEME_OBJ = $(OUTDIR)\if_mzsch.obj
!endif
@@ -930,9 +953,11 @@ $(OUTDIR)/if_perl.obj: $(OUTDIR) if_perl.c $(INCL)
$(OUTDIR)/if_perlsfio.obj: $(OUTDIR) if_perlsfio.c $(INCL)
$(CC) $(CFLAGS) $(PERL_INC) if_perlsfio.c
-$(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c $(INCL)
+$(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c $(INCL) $(MZSCHEME_EXTRA_DEP)
$(CC) $(CFLAGS) if_mzsch.c \
-DMZSCHEME_COLLECTS=\"$(MZSCHEME:\=\\)\\collects\"
+mzscheme_base.c:
+ $(MZSCHEME)\mzc --c-mods mzscheme_base.c ++lib scheme/base
$(OUTDIR)/if_python.obj: $(OUTDIR) if_python.c $(INCL)
$(CC) $(CFLAGS) $(PYTHON_INC) if_python.c
diff --git a/src/Makefile b/src/Makefile
index e6d26b1641..02b8d6cb82 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -536,7 +536,7 @@ CClink = $(CC)
# Use this with GCC to check for mistakes, unused arguments, etc.
#CFLAGS = -g -Wall -Wextra -Wmissing-prototypes -Wunreachable-code
#PYTHON_CFLAGS_EXTRA = -Wno-missing-field-initializers
-#MZSCHEME_CFLAGS_EXTRA = -Wno-unreachable-code
+#MZSCHEME_CFLAGS_EXTRA = -Wno-unreachable-code -Wno-unused-parameter
# EFENCE - Electric-Fence malloc debugging: catches memory accesses beyond
# allocated memory (and makes every malloc()/free() very slow).
@@ -2200,6 +2200,7 @@ clean celan: testclean
-rm -f $(TOOLS) auto/osdef.h auto/pathdef.c auto/if_perl.c
-rm -f conftest* *~ auto/link.sed
-rm -rf $(APPDIR)
+ -rm -rf mzscheme_base.c
if test -d $(PODIR); then \
cd $(PODIR); $(MAKE) prefix=$(DESTDIR)$(prefix) clean; \
fi
@@ -2433,8 +2434,11 @@ objects/if_cscope.o: if_cscope.c
objects/if_xcmdsrv.o: if_xcmdsrv.c
$(CCC) -o $@ if_xcmdsrv.c
-objects/if_mzsch.o: if_mzsch.c
+objects/if_mzsch.o: if_mzsch.c $(MZSCHEME_EXTRA)
$(CCC) -o $@ $(MZSCHEME_CFLAGS_EXTRA) if_mzsch.c
+
+mzscheme_base.c:
+ $(MZSCHEME_MZC) --c-mods mzscheme_base.c ++lib scheme/base
objects/if_perl.o: auto/if_perl.c
$(CCC) -o $@ auto/if_perl.c
diff --git a/src/auto/configure b/src/auto/configure
index 596e0349d5..42f4784ddc 100755
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -701,6 +701,8 @@ PERL_SRC
shrpenv
vi_cv_perllib
vi_cv_path_perl
+MZSCHEME_MZC
+MZSCHEME_EXTRA
MZSCHEME_CFLAGS
MZSCHEME_LIBS
MZSCHEME_PRO
@@ -4641,8 +4643,8 @@ $as_echo_n "checking PLTHOME environment var... " >&6; }
$as_echo "\"$PLTHOME\"" >&6; }
vi_cv_path_mzscheme_pfx="$PLTHOME"
else
- { $as_echo "$as_me:$LINENO: result: \"not set\"" >&5
-$as_echo "\"not set\"" >&6; }
+ { $as_echo "$as_me:$LINENO: result: not set" >&5
+$as_echo "not set" >&6; }
# Extract the first word of "mzscheme", so it can be a program name with args.
set dummy mzscheme; ac_word=$2
{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
@@ -4697,16 +4699,16 @@ $as_echo_n "checking MzScheme install prefix... " >&6; }
if test "${vi_cv_path_mzscheme_pfx+set}" = set; then
$as_echo_n "(cached) " >&6
else
- vi_cv_path_mzscheme_pfx=`
- ${vi_cv_path_mzscheme} -evm \
- "(display (simplify-path \
+ echo "(display (simplify-path \
(build-path (call-with-values \
(lambda () (split-path (find-system-path (quote exec-file)))) \
- (lambda (base name must-be-dir?) base)) (quote up))))"`
+ (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm
+ vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \
+ sed -e 's+/$++'`
fi
{ $as_echo "$as_me:$LINENO: result: $vi_cv_path_mzscheme_pfx" >&5
$as_echo "$vi_cv_path_mzscheme_pfx" >&6; }
- vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'`
+ rm -f mzdirs.scm
fi
fi
fi
@@ -4716,21 +4718,32 @@ $as_echo "$vi_cv_path_mzscheme_pfx" >&6; }
{ $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include" >&5
$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include... " >&6; }
if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
- { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5
-$as_echo "\"yes\"" >&6; }
+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
else
- { $as_echo "$as_me:$LINENO: result: \"no\"" >&5
-$as_echo "\"no\"" >&6; }
- { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include" >&5
-$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include... " >&6; }
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt" >&5
+$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt... " >&6; }
if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
- { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5
-$as_echo "\"yes\"" >&6; }
- SCHEME_INC=/plt
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
else
- { $as_echo "$as_me:$LINENO: result: \"no\"" >&5
-$as_echo "\"no\"" >&6; }
- vi_cv_path_mzscheme_pfx=
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in /usr/include/plt/" >&5
+$as_echo_n "checking if scheme.h can be found in /usr/include/plt/... " >&6; }
+ if test -f /usr/include/plt/scheme.h; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ SCHEME_INC=/usr/include/plt
+ else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ vi_cv_path_mzscheme_pfx=
+ fi
fi
fi
fi
@@ -4738,21 +4751,34 @@ $as_echo "\"no\"" >&6; }
if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
if test "x$MACOSX" = "xyes"; then
MZSCHEME_LIBS="-framework PLT_MzScheme"
+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
else
- MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
+ if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
+ else
+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
+ fi
if test "$GCC" = yes; then
- MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
+ MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
elif test "`(uname) 2>/dev/null`" = SunOS &&
uname -r | grep '^5' >/dev/null; then
- MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib"
+ MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib"
fi
fi
if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
SCHEME_COLLECTS=lib/plt/
fi
- MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC} \
+ if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
+ MZSCHEME_EXTRA="mzscheme_base.c"
+ MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
+ MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
+ fi
+ MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
-DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
MZSCHEME_SRC="if_mzsch.c"
MZSCHEME_OBJ="objects/if_mzsch.o"
@@ -4767,6 +4793,8 @@ _ACEOF
+
+
fi
diff --git a/src/config.mk.in b/src/config.mk.in
index 9590d445a1..f36e676c19 100644
--- a/src/config.mk.in
+++ b/src/config.mk.in
@@ -41,6 +41,8 @@ MZSCHEME_SRC = @MZSCHEME_SRC@
MZSCHEME_OBJ = @MZSCHEME_OBJ@
MZSCHEME_CFLAGS = @MZSCHEME_CFLAGS@
MZSCHEME_PRO = @MZSCHEME_PRO@
+MZSCHEME_EXTRA = @MZSCHEME_EXTRA@
+MZSCHEME_MZC = @MZSCHEME_MZC@
PERL = @vi_cv_path_perl@
PERLLIB = @vi_cv_perllib@
diff --git a/src/configure.in b/src/configure.in
index a644d941fc..eb7db76747 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -414,7 +414,7 @@ if test "$enable_mzschemeinterp" = "yes"; then
AC_MSG_RESULT("$PLTHOME")
vi_cv_path_mzscheme_pfx="$PLTHOME"
else
- AC_MSG_RESULT("not set")
+ AC_MSG_RESULT(not set)
dnl -- try to find MzScheme executable
AC_PATH_PROG(vi_cv_path_mzscheme, mzscheme)
@@ -430,14 +430,16 @@ if test "$enable_mzschemeinterp" = "yes"; then
if test "X$vi_cv_path_mzscheme" != "X"; then
dnl -- find where MzScheme thinks it was installed
AC_CACHE_CHECK(MzScheme install prefix,vi_cv_path_mzscheme_pfx,
- [ vi_cv_path_mzscheme_pfx=`
- ${vi_cv_path_mzscheme} -evm \
- "(display (simplify-path \
+ dnl different versions of MzScheme differ in command line processing
+ dnl use universal approach
+ echo "(display (simplify-path \
(build-path (call-with-values \
(lambda () (split-path (find-system-path (quote exec-file)))) \
- (lambda (base name must-be-dir?) base)) (quote up))))"` ])
- dnl Remove a trailing slash.
- vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'`
+ (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm
+ dnl Remove a trailing slash
+ [ vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \
+ sed -e 's+/$++'` ])
+ rm -f mzdirs.scm
fi
fi
fi
@@ -446,16 +448,24 @@ if test "$enable_mzschemeinterp" = "yes"; then
if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include)
if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then
- AC_MSG_RESULT("yes")
+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include
+ AC_MSG_RESULT(yes)
else
- AC_MSG_RESULT("no")
- AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include)
+ AC_MSG_RESULT(no)
+ AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt)
if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then
- AC_MSG_RESULT("yes")
- SCHEME_INC=/plt
+ AC_MSG_RESULT(yes)
+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
else
- AC_MSG_RESULT("no")
- vi_cv_path_mzscheme_pfx=
+ AC_MSG_RESULT(no)
+ AC_MSG_CHECKING(if scheme.h can be found in /usr/include/plt/)
+ if test -f /usr/include/plt/scheme.h; then
+ AC_MSG_RESULT(yes)
+ SCHEME_INC=/usr/include/plt
+ else
+ AC_MSG_RESULT(no)
+ vi_cv_path_mzscheme_pfx=
+ fi
fi
fi
fi
@@ -463,23 +473,38 @@ if test "$enable_mzschemeinterp" = "yes"; then
if test "X$vi_cv_path_mzscheme_pfx" != "X"; then
if test "x$MACOSX" = "xyes"; then
MZSCHEME_LIBS="-framework PLT_MzScheme"
+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
else
- MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
+ dnl Using shared objects
+ if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
+ else
+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
+ fi
if test "$GCC" = yes; then
dnl Make Vim remember the path to the library. For when it's not in
dnl $LD_LIBRARY_PATH.
- MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
+ MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib"
elif test "`(uname) 2>/dev/null`" = SunOS &&
uname -r | grep '^5' >/dev/null; then
- MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib"
+ MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib"
fi
fi
if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
SCHEME_COLLECTS=lib/plt/
fi
- MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC} \
+ if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
+ dnl need to generate bytecode for MzScheme base
+ MZSCHEME_EXTRA="mzscheme_base.c"
+ MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
+ MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
+ fi
+ MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
-DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'"
MZSCHEME_SRC="if_mzsch.c"
MZSCHEME_OBJ="objects/if_mzsch.o"
@@ -491,6 +516,8 @@ if test "$enable_mzschemeinterp" = "yes"; then
AC_SUBST(MZSCHEME_PRO)
AC_SUBST(MZSCHEME_LIBS)
AC_SUBST(MZSCHEME_CFLAGS)
+ AC_SUBST(MZSCHEME_EXTRA)
+ AC_SUBST(MZSCHEME_MZC)
fi
diff --git a/src/eval.c b/src/eval.c
index 2e3d9fd772..bf0c3030f7 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -5866,7 +5866,7 @@ list_equal(l1, l2, ic)
return item1 == NULL && item2 == NULL;
}
-#if defined(FEAT_PYTHON) || defined(PROTO)
+#if defined(FEAT_PYTHON) || defined(FEAT_MZSCHEME) || defined(PROTO)
/*
* Return the dictitem that an entry in a hashtable points to.
*/
diff --git a/src/if_mzsch.c b/src/if_mzsch.c
index 7f43cab6ed..017f8041ed 100644
--- a/src/if_mzsch.c
+++ b/src/if_mzsch.c
@@ -4,6 +4,8 @@
* Original work by Brent Fulgham <bfulgham@debian.org>
* (Based on lots of help from Matthew Flatt)
*
+ * TODO Convert byte-strings to char strings?
+ *
* This consists of six parts:
* 1. MzScheme interpreter main program
* 2. Routines that handle the external interface between MzScheme and
@@ -18,7 +20,7 @@
* garbage collector will do it self
* 2. Requires at least NORMAL features. I can't imagine why one may want
* to build with SMALL or TINY features but with MzScheme interface.
- * 3. I don't use K&R-style functions. Anyway, MzScheme headers are ANSI.
+ * 3. I don't use K&R-style functions. Anyways, MzScheme headers are ANSI.
*/
#include "vim.h"
@@ -29,14 +31,15 @@
* depend". */
#if defined(FEAT_MZSCHEME) || defined(PROTO)
+#include <assert.h>
+
/* Base data structures */
#define SCHEME_VIMBUFFERP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_buffer_type)
#define SCHEME_VIMWINDOWP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_window_type)
typedef struct
{
- Scheme_Type tag;
- Scheme_Env *env;
+ Scheme_Object so;
buf_T *buf;
} vim_mz_buffer;
@@ -44,7 +47,7 @@ typedef struct
typedef struct
{
- Scheme_Type tag;
+ Scheme_Object so;
win_T *win;
} vim_mz_window;
@@ -67,19 +70,6 @@ typedef struct
Scheme_Object *port;
} Port_Info;
-/* info for closed prim */
-/*
- * data have different means:
- * for do_eval it is char*
- * for do_apply is Apply_Onfo*
- * for do_load is Port_Info*
- */
-typedef struct
-{
- void *data;
- Scheme_Env *env;
-} Cmd_Info;
-
/* info for do_apply */
typedef struct
{
@@ -122,7 +112,6 @@ static Scheme_Object *set_buffer_line_list(void *, int, Scheme_Object **);
static Scheme_Object *insert_buffer_line_list(void *, int, Scheme_Object **);
static Scheme_Object *get_range_start(void *, int, Scheme_Object **);
static Scheme_Object *get_range_end(void *, int, Scheme_Object **);
-static Scheme_Object *get_buffer_namespace(void *, int, Scheme_Object **);
static vim_mz_buffer *get_vim_curr_buffer(void);
/* Window-related commands */
@@ -163,8 +152,6 @@ static int vim_error_check(void);
static int do_mzscheme_command(exarg_T *, void *, Scheme_Closed_Prim *what);
static void startup_mzscheme(void);
static char *string_to_line(Scheme_Object *obj);
-static int mzscheme_io_init(void);
-static void mzscheme_interface_init(vim_mz_buffer *self);
static void do_output(char *mesg, long len);
static void do_printf(char *format, ...);
static void do_flush(void);
@@ -174,19 +161,52 @@ static Scheme_Object *extract_exn_message(Scheme_Object *v);
static Scheme_Object *do_eval(void *, int noargc, Scheme_Object **noargv);
static Scheme_Object *do_load(void *, int noargc, Scheme_Object **noargv);
static Scheme_Object *do_apply(void *, int noargc, Scheme_Object **noargv);
-static void register_vim_exn(Scheme_Env *env);
+static void register_vim_exn(void);
static vim_mz_buffer *get_buffer_arg(const char *fname, int argnum,
int argc, Scheme_Object **argv);
static vim_mz_window *get_window_arg(const char *fname, int argnum,
int argc, Scheme_Object **argv);
-static void add_vim_exn(Scheme_Env *env);
static int line_in_range(linenr_T, buf_T *);
static void check_line_range(linenr_T, buf_T *);
static void mz_fix_cursor(int lo, int hi, int extra);
-static int eval_in_namespace(void *, Scheme_Closed_Prim *, Scheme_Env *,
- Scheme_Object **ret);
-static void make_modules(Scheme_Env *);
+static int eval_with_exn_handling(void *, Scheme_Closed_Prim *,
+ Scheme_Object **ret);
+static void make_modules(void);
+static void init_exn_catching_apply(void);
+static int mzscheme_env_main(Scheme_Env *env, int argc, char **argv);
+static int mzscheme_init(void);
+#ifdef FEAT_EVAL
+static Scheme_Object *vim_to_mzscheme(typval_T *vim_value, int depth,
+ Scheme_Hash_Table *visited);
+#endif
+
+#ifdef MZ_PRECISE_GC
+static int buffer_size_proc(void *obj)
+{
+ return gcBYTES_TO_WORDS(sizeof(vim_mz_buffer));
+}
+static int buffer_mark_proc(void *obj)
+{
+ return buffer_size_proc(obj);
+}
+static int buffer_fixup_proc(void *obj)
+{
+ return buffer_size_proc(obj);
+}
+static int window_size_proc(void *obj)
+{
+ return gcBYTES_TO_WORDS(sizeof(vim_mz_window));
+}
+static int window_mark_proc(void *obj)
+{
+ return window_size_proc(obj);
+}
+static int window_fixup_proc(void *obj)
+{
+ return window_size_proc(obj);
+}
+#endif
#ifdef DYNAMIC_MZSCHEME
@@ -260,8 +280,6 @@ static Scheme_Object *(*dll_scheme_make_closed_prim_w_arity)
(Scheme_Closed_Prim *prim, void *data, const char *name, mzshort mina,
mzshort maxa);
static Scheme_Object *(*dll_scheme_make_integer_value)(long i);
-static Scheme_Object *(*dll_scheme_make_namespace)(int argc,
- Scheme_Object *argv[]);
static Scheme_Object *(*dll_scheme_make_pair)(Scheme_Object *car,
Scheme_Object *cdr);
static Scheme_Object *(*dll_scheme_make_prim_w_arity)(Scheme_Prim *prim,
@@ -311,6 +329,17 @@ static Scheme_Object *(*dll_scheme_char_string_to_byte_string)
static Scheme_Object *(*dll_scheme_char_string_to_path)
(Scheme_Object *s);
# endif
+static Scheme_Hash_Table *(*dll_scheme_make_hash_table)(int type);
+static void (*dll_scheme_hash_set)(Scheme_Hash_Table *table,
+ Scheme_Object *key, Scheme_Object *value);
+static Scheme_Object *(*dll_scheme_hash_get)(Scheme_Hash_Table *table,
+ Scheme_Object *key);
+static Scheme_Object *(*dll_scheme_make_double)(double d);
+# ifdef INCLUDE_MZSCHEME_BASE
+static Scheme_Object *(*dll_scheme_make_sized_byte_string)(char *chars,
+ long len, int copy);
+static Scheme_Object *(*dll_scheme_namespace_require)(Scheme_Object *req);
+# endif
/* arrays are imported directly */
# define scheme_eof dll_scheme_eof
@@ -368,7 +397,6 @@ static Scheme_Object *(*dll_scheme_char_string_to_path)
# define scheme_lookup_global dll_scheme_lookup_global
# define scheme_make_closed_prim_w_arity dll_scheme_make_closed_prim_w_arity
# define scheme_make_integer_value dll_scheme_make_integer_value
-# define scheme_make_namespace dll_scheme_make_namespace
# define scheme_make_pair dll_scheme_make_pair
# define scheme_make_prim_w_arity dll_scheme_make_prim_w_arity
# if MZSCHEME_VERSION_MAJOR < 299
@@ -403,6 +431,14 @@ static Scheme_Object *(*dll_scheme_char_string_to_path)
# define scheme_char_string_to_path \
dll_scheme_char_string_to_path
# endif
+# define scheme_make_hash_table dll_scheme_make_hash_table
+# define scheme_hash_set dll_scheme_hash_set
+# define scheme_hash_get dll_scheme_hash_get
+# define scheme_make_double dll_scheme_make_double
+# ifdef INCLUDE_MZSCHEME_BASE
+# define scheme_make_sized_byte_string dll_scheme_make_sized_byte_string
+# define scheme_namespace_require dll_scheme_namespace_require
+# endif
typedef struct
{
@@ -468,7 +504,6 @@ static Thunk_Info mzsch_imports[] = {
{"scheme_make_closed_prim_w_arity",
(void **)&dll_scheme_make_closed_prim_w_arity},
{"scheme_make_integer_value", (void **)&dll_scheme_make_integer_value},
- {"scheme_make_namespace", (void **)&dll_scheme_make_namespace},
{"scheme_make_pair", (void **)&dll_scheme_make_pair},
{"scheme_make_prim_w_arity", (void **)&dll_scheme_make_prim_w_arity},
# if MZSCHEME_VERSION_MAJOR < 299
@@ -502,9 +537,16 @@ static Thunk_Info mzsch_imports[] = {
{"scheme_current_config", (void **)&dll_scheme_current_config},
{"scheme_char_string_to_byte_string",
(void **)&dll_scheme_char_string_to_byte_string},
- {"scheme_char_string_to_path",
- (void **)&dll_scheme_char_string_to_path},
+ {"scheme_char_string_to_path", (void **)&dll_scheme_char_string_to_path},
# endif
+ {"scheme_make_hash_table", (void **)&dll_scheme_make_hash_table},
+ {"scheme_hash_set", (void **)&dll_scheme_hash_set},
+ {"scheme_hash_get", (void **)&dll_scheme_hash_get},
+ {"scheme_make_double", (void **)&dll_scheme_make_double},
+# ifdef INCLUDE_MZSCHEME_BASE
+ {"scheme_make_sized_byte_string", (void **)&dll_scheme_make_sized_byte_string},
+ {"scheme_namespace_require", (void **)&dll_scheme_namespace_require},
+#endif
{NULL, NULL}};
static HINSTANCE hMzGC = 0;
@@ -592,6 +634,11 @@ dynamic_mzscheme_end(void)
}
#endif /* DYNAMIC_MZSCHEME */
+/* need to put it here for dynamic stuff to work */
+#ifdef INCLUDE_MZSCHEME_BASE
+# include "mzscheme_base.c"
+#endif
+
/*
*========================================================================
* 1. MzScheme interpreter startup
@@ -601,21 +648,22 @@ dynamic_mzscheme_end(void)
static Scheme_Type mz_buffer_type;
static Scheme_Type mz_window_type;
-static int initialized = 0;
+static int initialized = FALSE;
/* global environment */
static Scheme_Env *environment = NULL;
/* output/error handlers */
static Scheme_Object *curout = NULL;
static Scheme_Object *curerr = NULL;
-/* vim:exn exception */
+/* exn:vim exception */
static Scheme_Object *exn_catching_apply = NULL;
static Scheme_Object *exn_p = NULL;
static Scheme_Object *exn_message = NULL;
static Scheme_Object *vim_exn = NULL; /* Vim Error exception */
- /* values for exn:vim - constructor, predicate, accessors etc */
-static Scheme_Object *vim_exn_names = NULL;
-static Scheme_Object *vim_exn_values = NULL;
+
+#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
+static void *stack_base = NULL;
+#endif
static long range_start;
static long range_end;
@@ -668,10 +716,10 @@ static void remove_timer(void);
timer_proc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
# elif defined(FEAT_GUI_GTK)
static gint
-timer_proc(gpointer data UNUSED)
+timer_proc(gpointer data)
# elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)
static void
-timer_proc(XtPointer timed_out UNUSED, XtIntervalId *interval_id UNUSED)
+timer_proc(XtPointer timed_out, XtIntervalId *interval_id)
# elif defined(FEAT_GUI_MAC)
pascal void
timer_proc(EventLoopTimerRef theTimer, void *userData)
@@ -751,12 +799,64 @@ mzscheme_end(void)
#endif
}
+ void
+mzscheme_main(void)
+{
+#if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR >= 400
+ /* use trampoline for precise GC in MzScheme >= 4.x */
+ scheme_main_setup(TRUE, mzscheme_env_main, 0, NULL);
+#else
+ mzscheme_env_main(NULL, 0, NULL);
+#endif
+}
+
+ static int
+mzscheme_env_main(Scheme_Env *env, int argc, char **argv)
+{
+ /* neither argument nor return values are used */
+#ifdef MZ_PRECISE_GC
+# if MZSCHEME_VERSION_MAJOR < 400
+ /*
+ * Starting from version 4.x, embedding applications must use
+ * scheme_main_setup/scheme_main_stack_setup trampolines
+ * rather than setting stack base directly with scheme_set_stack_base
+ */
+ Scheme_Object *dummy = NULL;
+ MZ_GC_DECL_REG(1);
+ MZ_GC_VAR_IN_REG(0, dummy);
+
+ stack_base = &__gc_var_stack__;
+# else
+ /* environment has been created by us by Scheme */
+ environment = env;
+# endif
+ /*
+ * In 4.x, all activities must be performed inside trampoline
+ * so we are forced to initialise GC immediately
+ * This can be postponed in 3.x but I see no point in implementing
+ * a feature which will work in older versions only.
+ * One would better use conservative GC if he needs dynamic MzScheme
+ */
+ mzscheme_init();
+#else
+ int dummy = 0;
+ stack_base = (void *)&dummy;
+#endif
+ main_loop(FALSE, FALSE);
+#if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR < 400
+ /* releasing dummy */
+ MZ_GC_REG();
+ MZ_GC_UNREG();
+#endif
+ return 0;
+}
+
static void
startup_mzscheme(void)
{
- Scheme_Object *proc_make_security_guard;
-
- scheme_set_stack_base(NULL, 1);
+#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
+ scheme_set_stack_base(stack_base, 1);
+#endif
MZ_REGISTER_STATIC(environment);
MZ_REGISTER_STATIC(curout);
@@ -765,10 +865,35 @@ startup_mzscheme(void)
MZ_REGISTER_STATIC(exn_p);
MZ_REGISTER_STATIC(exn_message);
MZ_REGISTER_STATIC(vim_exn);
- MZ_REGISTER_STATIC(vim_exn_names);
- MZ_REGISTER_STATIC(vim_exn_values);
+#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400
+ /* in newer versions of precise GC the initial env has been created */
environment = scheme_basic_env();
+#endif
+ MZ_GC_CHECK();
+
+#ifdef INCLUDE_MZSCHEME_BASE
+ {
+ /*
+ * versions 4.x do not provide Scheme bindings by defaults
+ * we need to add them explicitly
+ */
+ Scheme_Object *scheme_base_symbol = NULL;
+ MZ_GC_DECL_REG(1);
+ MZ_GC_VAR_IN_REG(0, scheme_base_symbol);
+ MZ_GC_REG();
+ /* invoke function from generated and included base.c */
+ declare_modules(environment);
+ scheme_base_symbol = scheme_intern_symbol("scheme/base");
+ MZ_GC_CHECK();
+ scheme_namespace_require(scheme_base_symbol);
+ MZ_GC_CHECK();
+ MZ_GC_UNREG();
+ }
+#endif
+ register_vim_exn();
+ /* use new environment to initialise exception handling */
+ init_exn_catching_apply();
/* redirect output */
scheme_console_output = do_output;
@@ -776,48 +901,131 @@ startup_mzscheme(void)
#ifdef MZSCHEME_COLLECTS
/* setup 'current-library-collection-paths' parameter */
- scheme_set_param(scheme_config, MZCONFIG_COLLECTION_PATHS,
- scheme_make_pair(
# if MZSCHEME_VERSION_MAJOR >= 299
- scheme_char_string_to_path(
- scheme_byte_string_to_char_string(
- scheme_make_byte_string(MZSCHEME_COLLECTS))),
+ {
+ Scheme_Object *coll_byte_string = NULL;
+ Scheme_Object *coll_char_string = NULL;
+ Scheme_Object *coll_path = NULL;
+ Scheme_Object *coll_pair = NULL;
+ Scheme_Config *config = NULL;
+
+ MZ_GC_DECL_REG(5);
+ MZ_GC_VAR_IN_REG(0, coll_byte_string);
+ MZ_GC_VAR_IN_REG(1, coll_char_string);
+ MZ_GC_VAR_IN_REG(2, coll_path);
+ MZ_GC_VAR_IN_REG(3, coll_pair);
+ MZ_GC_VAR_IN_REG(4, config);
+ MZ_GC_REG();
+ coll_byte_string = scheme_make_byte_string(MZSCHEME_COLLECTS);
+ MZ_GC_CHECK();
+ coll_char_string = scheme_byte_string_to_char_string(coll_byte_string);
+ MZ_GC_CHECK();
+ coll_path = scheme_char_string_to_path(coll_char_string);
+ MZ_GC_CHECK();
+ coll_pair = scheme_make_pair(coll_path, scheme_null);
+ MZ_GC_CHECK();
+ config = scheme_config;
+ MZ_GC_CHECK();
+ scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair);
+ MZ_GC_CHECK();
+ MZ_GC_UNREG();
+ }
# else
- scheme_make_string(MZSCHEME_COLLECTS),
+ {
+ Scheme_Object *coll_string = NULL;
+ Scheme_Object *coll_pair = NULL;
+ Scheme_Config *config = NULL;
+
+ MZ_GC_DECL_REG(3);
+ MZ_GC_VAR_IN_REG(0, coll_string);
+ MZ_GC_VAR_IN_REG(1, coll_pair);
+ MZ_GC_VAR_IN_REG(2, config);
+ MZ_GC_REG();
+ coll_string = scheme_make_string(MZSCHEME_COLLECTS);
+ MZ_GC_CHECK();
+ coll_pair = scheme_make_pair(coll_string, scheme_null);
+ MZ_GC_CHECK();
+ config = scheme_config;
+ MZ_GC_CHECK();
+ scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair);
+ MZ_GC_CHECK();
+ MZ_GC_UNREG();
+ }
# endif
- scheme_null));
#endif
#ifdef HAVE_SANDBOX
- /* setup sandbox guards */
- proc_make_security_guard = scheme_lookup_global(
- scheme_intern_symbol("make-security-guard"),
- environment);
- if (proc_make_security_guard != NULL)
{
- Scheme_Object *args[3];
- Scheme_Object *guard;
- args[0] = scheme_get_param(scheme_config, MZCONFIG_SECURITY_GUARD);
- args[1] = scheme_make_prim_w_arity(sandbox_file_guard,
- "sandbox-file-guard", 3, 3);
- args[2] = scheme_make_prim_w_arity(sandbox_network_guard,
- "sandbox-network-guard", 4, 4);
- guard = scheme_apply(proc_make_security_guard, 3, args);
- scheme_set_param(scheme_config, MZCONFIG_SECURITY_GUARD, guard);
+ Scheme_Object *make_security_guard = NULL;
+ MZ_GC_DECL_REG(1);
+ MZ_GC_VAR_IN_REG(0, make_security_guard);
+ MZ_GC_REG();
+
+#if MZSCHEME_VERSION_MAJOR < 400
+ {
+ Scheme_Object *make_security_guard_symbol = NULL;
+ MZ_GC_DECL_REG(1);
+ MZ_GC_VAR_IN_REG(0, make_security_guard_symbol);
+ MZ_GC_REG();
+ make_security_guard_symbol = scheme_intern_symbol("make-security-guard");
+ MZ_GC_CHECK();
+ make_security_guard = scheme_lookup_global(
+ make_security_guard_symbol, environment);
+ MZ_GC_UNREG();
+ }
+#else