The SWI-Prolog GIT repositories

* Merged JPL 3.1
authorJan Wielemaker <wielemak@science.uva.nl>
Tue, 28 Nov 2006 09:17:41 +0000 (09:17 +0000)
committerJan Wielemaker <wielemak@science.uva.nl>
Tue, 28 Nov 2006 09:17:41 +0000 (09:17 +0000)
81 files changed:
.cvsignore
ChangeLog
Makefile.in
Makefile.mak
TestJPL.java [deleted file]
ac/ac_prog_java.m4 [new file with mode: 0644]
ac/ac_prog_javadoc.m4 [new file with mode: 0644]
ac/ac_prog_javah.m4 [new file with mode: 0644]
check.pl [deleted file]
config.h.in
configure
configure.in
demo.pl [moved from jpl_test.pl with 89% similarity]
examples/java/.cvsignore [new file with mode: 0644]
examples/java/Exceptions/.cvsignore
examples/java/Exceptions2/.cvsignore
examples/java/Family/.cvsignore
examples/java/FamilyMT/.cvsignore
examples/java/SemWeb/.cvsignore [new file with mode: 0644]
examples/java/Test/.cvsignore
examples/java/Test2/.cvsignore
examples/java/Time/.cvsignore
examples/java/Versions/.cvsignore
examples/java/Zahed/.cvsignore
jpl.doc
jpl.pl
src/c/jpl.c
src/java/Makefile.in
src/java/Makefile.mak
src/java/jpl/Atom.java
src/java/jpl/Compound.java
src/java/jpl/Float.java
src/java/jpl/Integer.java
src/java/jpl/JBoolean.java [deleted file]
src/java/jpl/JPL.java
src/java/jpl/JPLException.java
src/java/jpl/JRef.java [deleted file]
src/java/jpl/JVoid.java [deleted file]
src/java/jpl/PrologException.java
src/java/jpl/Query.java
src/java/jpl/Term.java
src/java/jpl/Util.java
src/java/jpl/Variable.java
src/java/jpl/Version.java
src/java/jpl/fli/Int64Holder.java [new file with mode: 0644]
src/java/jpl/fli/Prolog.java
src/java/jpl/test/.cvsignore [new file with mode: 0644]
src/java/jpl/test/Family.java [new file with mode: 0644]
src/java/jpl/test/FetchBigTree.java [new file with mode: 0644]
src/java/jpl/test/FetchLongList.java [new file with mode: 0644]
src/java/jpl/test/Ga.java [new file with mode: 0644]
src/java/jpl/test/Ga2.java [new file with mode: 0644]
src/java/jpl/test/Garbo.java [new file with mode: 0644]
src/java/jpl/test/JPLTest.java [new file with mode: 0644]
src/java/jpl/test/Masstest.java [new file with mode: 0644]
src/java/jpl/test/MaxObjects.java [new file with mode: 0644]
src/java/jpl/test/ShadowA.java [new file with mode: 0644]
src/java/jpl/test/ShadowB.java [new file with mode: 0644]
src/java/jpl/test/SyntaxError.java [new file with mode: 0644]
src/java/jpl/test/Test.java [new file with mode: 0644]
src/java/jpl/test/TestJUnit.java [new file with mode: 0644]
src/java/jpl/test/TestOLD.java [new file with mode: 0644]
src/java/jpl/test/family.pl [new file with mode: 0644]
src/java/jpl/test/test.pl [new file with mode: 0644]
src/java/jpl/util/.cvsignore [new file with mode: 0644]
src/java/jpl/util/Getenv.java [new file with mode: 0644]
src/java/jpl/util/HashedRefs.java [new file with mode: 0644]
src/java/jpl/util/Mod.java [new file with mode: 0644]
src/java/jpl/util/Overload.java [new file with mode: 0644]
src/java/jpl/util/Overload2.java [new file with mode: 0644]
src/java/jpl/util/PopupMenuDemo.java [new file with mode: 0644]
src/java/jpl/util/Prog.java [new file with mode: 0644]
src/java/jpl/util/SwingGadget.java [new file with mode: 0644]
src/java/jpl/util/SwingGadget2.java [new file with mode: 0644]
src/java/jpl/util/Test1.java [new file with mode: 0644]
src/java/jpl/util/Test2.java [new file with mode: 0644]
src/java/jpl/util/Util.java [new file with mode: 0644]
src/java/jpl/util/Util2.java [new file with mode: 0644]
src/java/jpl/util/Xfer.java [new file with mode: 0644]
test_jpl.pl [new file with mode: 0644]
test_singleton.pl [new file with mode: 0644]

index 281dab3..04d885b 100644 (file)
@@ -4,6 +4,7 @@ classes
 jpl.dll
 jpl.so
 jpl.jar
+jpltest.jar
 config.h
 config.log
 Makefile
index ba9b6f5..1666e7c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Nov 23, 2006
+
+  * NEW: Integrated Paul Singletons changes.  Added test-cases, cleanup
+    of installation, etc.  Joint effort of Paul Singleton and Jan Wielemaker.
+
 Nov 8, 2006
 
   * PORT: Started work on support for 64-bit linux.  Jan Wielemaker.
index 1d3e378..8eb464d 100644 (file)
@@ -33,6 +33,8 @@ NETLIBS=@NETLIBS@
 
 JAVA_HOME=@JAVA_HOME@
 JAVAC=@JAVAC@
+JAVA=@JAVA@
+JUNIT=@JUNIT@
 JAVALIBS=@JAVALIBS@
 
 DOCTOTEX=$(PCEHOME)/bin/doc2tex
@@ -59,6 +61,9 @@ all:          $(TARGETS) jpl.jar exjava-compile
 
 libjpl.@SO@:   $(OBJ)
                $(LD) $(LDFLAGS) -o $@ $(OBJ) $(JAVALIBS)
+               if [ -r libjpl.dylib ]; then \
+                 rm -f libjpl.jnilib && ln -s libjpl.dylib libjpl.jnilib ; \
+               fi
 
 jpl.jar::
                (cd src/java && $(MAKE) all)
@@ -67,11 +72,12 @@ jpl.jar::
 # Verify the package
 ################################################################
 
-check::                TestJPL.class
-               $(PL) -q -f check.pl -g test,halt -t 'halt(1)'
+check:         check_pl check_java
 
-TestJPL.class: TestJPL.java
-               $(JAVAC) -classpath jpl.jar TestJPL.java
+check_pl::             
+               $(PL) -q -f test_jpl.pl -g run_tests,halt -t 'halt(1)'
+check_java::
+               CLASSPATH=$(JUNIT):jpl.jar:jpltest.jar $(JAVA) junit.textui.TestRunner jpl.test.TestJUnit
 
 ################################################################
 # Installation
@@ -211,4 +217,5 @@ distclean:  clean
                rm -f $(TARGETS) config.cache config.h config.status Makefile
                rm -f $(DOC).aux $(DOC).log $(DOC).out $(DOC).toc
                rm -rf html
+               (cd src/java && $(MAKE) distclean)
 
index e421516..fa3b956 100644 (file)
@@ -10,6 +10,7 @@
 
 PLHOME=..\..
 !include ..\..\src\rules.mk
+JAVA="$(JAVA_HOME)\bin\java"
 
 PKGDLL=jpl
 
@@ -90,11 +91,29 @@ uninstall::
                del "$(PLBASE)\lib\jpl.jar"
                $(MAKEINDEX)
 
+################################################################
+# Verify the package
+################################################################
+
+check:         check_pl check_java
+
+check_pl::             
+               "$(PLCON)" -q -f test_jpl.pl -g run_tests,halt -t 'halt(1)'
+check_java::
+               set CLASSPATH=$(JUNIT);jpl.jar;jpltest.jar
+               $(JAVA) junit.textui.TestRunner jpl.test.TestJUnit
+
+################################################################
+# Cleanup
+################################################################
+
 clean::
                if exist $(OBJ) del $(OBJ)
                if exist *.obj del *.obj
                if exist *~ del *~
+               chdir src\java & $(MAKE) clean
 
 distclean:     clean
                -DEL *.dll *.lib *.exp *.pdb *.ilk 2>nul
+               chdir src\java & $(MAKE) distclean
 
diff --git a/TestJPL.java b/TestJPL.java
deleted file mode 100644 (file)
index 064f87c..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-import jpl.*;
-
-class TestJPL
-{ public String name;
-
-  public TestJPL()
-  { name = "<unnamed>";
-  }
-  public TestJPL(String s)
-  { name = s;
-  }
-                    
-  public void hello(String[] args)
-  { System.out.println("Hello " + args + "!" );
-  }
-
-  public int magic()
-  { return 42;
-  }
-
-  public void prologBanner()
-  { Query q = new Query("$welcome");
-//    q.oneSolution();
-  }
-}
diff --git a/ac/ac_prog_java.m4 b/ac/ac_prog_java.m4
new file mode 100644 (file)
index 0000000..4825c3d
--- /dev/null
@@ -0,0 +1,14 @@
+dnl Available from the GNU Autoconf Macro Archive at:
+dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_java.html
+dnl
+AC_DEFUN([AC_PROG_JAVA],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test x$JAVAPREFIX = x; then
+        test x$JAVA = x && AC_CHECK_PROGS(JAVA, kaffe$EXEEXT java$EXEEXT)
+else
+        test x$JAVA = x && AC_CHECK_PROGS(JAVA, kaffe$EXEEXT java$EXEEXT, $JAVAPREFIX)
+fi
+test x$JAVA = x && AC_MSG_ERROR([no acceptable Java virtual machine found in \$PATH])
+AC_PROG_JAVA_WORKS
+AC_PROVIDE([$0])dnl
+])
diff --git a/ac/ac_prog_javadoc.m4 b/ac/ac_prog_javadoc.m4
new file mode 100644 (file)
index 0000000..aa3ece4
--- /dev/null
@@ -0,0 +1,14 @@
+dnl Available from the GNU Autoconf Macro Archive at:
+dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_javadoc.html
+dnl
+AC_DEFUN([AC_PROG_JAVADOC],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test "x$JAVAPREFIX" = x; then
+        test "x$JAVADOC" = x && AC_CHECK_PROGS(JAVADOC, javadoc$EXEEXT)
+else
+        test "x$JAVADOC" = x && AC_CHECK_PROGS(JAVADOC, javadoc, $JAVAPREFIX)
+fi
+test "x$JAVADOC" = x && AC_MSG_ERROR([no acceptable javadoc generator found in \$PATH])
+AC_PROVIDE([$0])dnl
+])
+
diff --git a/ac/ac_prog_javah.m4 b/ac/ac_prog_javah.m4
new file mode 100644 (file)
index 0000000..4ee71f7
--- /dev/null
@@ -0,0 +1,20 @@
+dnl Available from the GNU Autoconf Macro Archive at:
+dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_javah.html
+dnl
+AC_DEFUN([AC_PROG_JAVAH],[
+AC_REQUIRE([AC_CANONICAL_SYSTEM])dnl
+AC_REQUIRE([AC_PROG_CPP])dnl
+AC_PATH_PROG(JAVAH,javah)
+if test x"`eval 'echo $ac_cv_path_JAVAH'`" != x ; then
+  AC_TRY_CPP([#include <jni.h>],,[
+    ac_save_CPPFLAGS="$CPPFLAGS"
+changequote(, )dnl
+    ac_dir=`echo $ac_cv_path_JAVAH | sed 's,\(.*\)/[^/]*/[^/]*$,\1/include,'`
+    ac_machdep=`echo $build_os | sed 's,[-0-9].*,,' | sed 's,cygwin,win32,'`
+changequote([, ])dnl
+    CPPFLAGS="$ac_save_CPPFLAGS -I$ac_dir -I$ac_dir/$ac_machdep"
+    AC_TRY_CPP([#include <jni.h>],
+               ac_save_CPPFLAGS="$CPPFLAGS",
+               AC_MSG_WARN([unable to include <jni.h>]))
+    CPPFLAGS="$ac_save_CPPFLAGS"])
+fi])
diff --git a/check.pl b/check.pl
deleted file mode 100644 (file)
index c13478f..0000000
--- a/check.pl
+++ /dev/null
@@ -1,225 +0,0 @@
-/*  $Id$
-
-    Part of SWI-Prolog
-
-    Author:        Jan Wielemaker
-    E-mail:        jan@swi.psy.uva.nl
-    WWW:           http://www.swi-prolog.org
-    Copyright (C): 1985-2004, University of Amsterdam
-
-    This program is free software; you can redistribute it and/or
-    modify it under the terms of the GNU General Public License
-    as published by the Free Software Foundation; either version 2
-    of the License, or (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-    As a special exception, if you link this library with other files,
-    compiled with a Free Software compiler, to produce an executable, this
-    library does not by itself cause the resulting executable to be covered
-    by the GNU General Public License. This exception does not however
-    invalidate any other reasons why the executable file might be covered by
-    the GNU General Public License.
-*/
-
-:- asserta(file_search_path(foreign, '.')).
-:- asserta(file_search_path(jar, '.')).
-
-:- use_module(jpl).
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-RDF-DB test file.  A test is a clause of the form:
-
-       <TestSet>(<Name>-<Number>) :- Body.
-
-If the body fails, an appropriate  error   message  is  printed. So, all
-goals are supposed to  succeed.  The   predicate  testset/1  defines the
-available test sets. The public goals are:
-
-       ?- runtest(+TestSet).
-       ?- test.
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-:- print_message(informational,
-                format('JPL test suite.  To run all tests run ?- test.~n~n',
-                       [])).
-
-% Required to get this always running regardless of user LANG setting.
-% Without this the tests won't run on machines with -for example- LANG=ja
-% according to NIDE Naoyuki, nide@ics.nara-wu.ac.jp.  Thanks!
-
-:- getenv('LANG', _) -> setenv('LANG', 'C'); true.
-
-
-                /*******************************
-                *            RESOURCE          *
-                *******************************/
-
-simple(1) :-
-       jpl_new('TestJPL', [hello], Obj),
-       jpl_get(Obj, name, Name),
-       Name == hello.
-
-
-                /*******************************
-                *            SCRIPTS           *
-                *******************************/
-
-:- dynamic
-       script_dir/1.
-
-set_script_dir :-
-       script_dir(_), !.
-set_script_dir :-
-       find_script_dir(Dir),
-       assert(script_dir(Dir)).
-
-find_script_dir(Dir) :-
-       prolog_load_context(file, File),
-       follow_links(File, RealFile),
-       file_directory_name(RealFile, Dir).
-
-follow_links(File, RealFile) :-
-       read_link(File, _, RealFile), !.
-follow_links(File, File).
-
-
-:- set_script_dir.
-
-run_test_script(Script) :-
-       file_base_name(Script, Base),
-       file_name_extension(Pred, _, Base),
-       load_files(Script, [silent(true)]),
-       Pred.
-
-run_test_scripts(Directory) :-
-       (   script_dir(ScriptDir),
-           concat_atom([ScriptDir, /, Directory], Dir),
-           exists_directory(Dir)
-       ->  true
-       ;   Dir = Directory
-       ),
-       atom_concat(Dir, '/*.pl', Pattern),
-       expand_file_name(Pattern, Files),
-       file_base_name(Dir, BaseDir),
-       format('Running scripts from ~w ', [BaseDir]), flush,
-       run_scripts(Files),
-       format(' done~n').
-
-run_scripts([]).
-run_scripts([H|T]) :-
-       (   catch(run_test_script(H), Except, true)
-       ->  (   var(Except)
-           ->  put(.), flush
-           ;   Except = blocked(Reason)
-           ->  assert(blocked(H, Reason)),
-               put(!), flush
-           ;   script_failed(H, Except)
-           )
-       ;   script_failed(H, fail)
-       ),
-       run_scripts(T).
-
-script_failed(File, fail) :-
-       format('~NScript ~w failed~n', [File]),
-       assert(failed(script(File))).
-script_failed(File, Except) :-
-       message_to_string(Except, Error),
-       format('~NScript ~w failed: ~w~n', [File, Error]),
-       assert(failed(script(File))).
-
-
-                /*******************************
-                *        TEST MAIN-LOOP        *
-                *******************************/
-
-testset(simple).
-
-%      testdir(Dir)
-%      
-%      Enumerate directories holding tests.
-
-testdir('Tests').
-
-:- dynamic
-       failed/1,
-       blocked/2.
-
-test :-
-       retractall(failed(_)),
-       retractall(blocked(_,_)),
-       forall(testset(Set), runtest(Set)),
-       scripts,
-%      statistics,
-       report_blocked,
-       report_failed.
-
-scripts :-
-       forall(testdir(Dir), run_test_scripts(Dir)).
-
-
-report_blocked :-
-       findall(Head-Reason, blocked(Head, Reason), L),
-       (   L \== []
-        ->  format('~nThe following tests are blocked:~n', []),
-           (   member(Head-Reason, L),
-               format('    ~p~t~40|~w~n', [Head, Reason]),
-               fail
-           ;   true
-           )
-        ;   true
-       ).
-report_failed :-
-       findall(X, failed(X), L),
-       length(L, Len),
-       (   Len > 0
-        ->  format('~n*** ~w tests failed ***~n', [Len]),
-           fail
-        ;   format('~nAll tests passed~n', [])
-       ).
-
-runtest(Name) :-
-       format('Running test set "~w" ', [Name]),
-       flush,
-       functor(Head, Name, 1),
-       nth_clause(Head, _N, R),
-       clause(Head, _, R),
-       (   catch(Head, Except, true)
-       ->  (   var(Except)
-           ->  put(.), flush
-           ;   Except = blocked(Reason)
-           ->  assert(blocked(Head, Reason)),
-               put(!), flush
-           ;   test_failed(R, Except)
-           )
-       ;   test_failed(R, fail)
-       ),
-       fail.
-runtest(_) :-
-       format(' done.~n').
-       
-test_failed(R, Except) :-
-       clause(Head, _, R),
-       functor(Head, Name, 1),
-       arg(1, Head, TestName),
-       clause_property(R, line_count(Line)),
-       clause_property(R, file(File)),
-       (   Except == fail
-       ->  format('~N~w:~d: Test ~w(~w) failed~n',
-                  [File, Line, Name, TestName])
-       ;   message_to_string(Except, Error),
-           format('~N~w:~d: Test ~w(~w):~n~t~8|ERROR: ~w~n',
-                  [File, Line, Name, TestName, Error])
-       ),
-       assert(failed(Head)).
-
-blocked(Reason) :-
-       throw(blocked(Reason)).
-
index 4297026..3e2ccdb 100644 (file)
@@ -1,5 +1,35 @@
 /* config.h.in.  Generated from configure.in by autoheader.  */
 
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <wchar.h> header file. */
+#undef HAVE_WCHAR_H
+
 /* Define to the address where bug reports for this package should be sent. */
 #undef PACKAGE_BUGREPORT
 
@@ -15,6 +45,9 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* The size of a `wchar_t', as computed by sizeof. */
+#undef SIZEOF_WCHAR_T
+
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
index 4bb17ba..68ead1f 100755 (executable)
--- a/configure
+++ b/configure
@@ -272,7 +272,44 @@ PACKAGE_STRING=
 PACKAGE_BUGREPORT=
 
 ac_unique_file="install-sh"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS PL PLLIBS PLBASE PLARCH PLINCL COFLAGS CWFLAGS CMFLAGS CIFLAGS ETAGS LD SO LDSOFLAGS JAVA_HOME JAVALIBS PLLD MAKE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP build build_cpu build_vendor build_os host host_cpu host_vendor host_os JAVAC JAR _ACJNI_JAVAC LIBOBJS LTLIBOBJS'
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS PL PLLIBS PLBASE PLARCH PLINCL COFLAGS CWFLAGS CMFLAGS CIFLAGS ETAGS LD SO LDSOFLAGS JAVA_HOME JAVALIBS JUNIT PLLD MAKE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP build build_cpu build_vendor build_os host host_cpu host_vendor host_os JAVAC JAVA uudecode JAR _ACJNI_JAVAC LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -1275,6 +1312,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+
 # Check whether --enable-mt or --disable-mt was given.
 if test "${enable_mt+set}" = set; then
   enableval="$enable_mt"
@@ -3163,6 +3201,10 @@ host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 
 
 
+
+
+
+
 # _ACJNI_FOLLOW_SYMLINKS <path>
 # Follows symbolic links on <path>,
 # finally setting variable _ACJNI_FOLLOWED
@@ -3289,7 +3331,7 @@ else
 JAVA_TEST=Test.java
 CLASS_TEST=Test.class
 cat << \EOF > $JAVA_TEST
-/* #line 3292 "configure" */
+/* #line 3334 "configure" */
 public class Test {
 }
 EOF
@@ -3315,18 +3357,18 @@ echo "${ECHO_T}$ac_cv_prog_javac_works" >&6
 
 
 
-if test "x$JAVAPREFIX" = x; then
-        test "x$JAR" = x && for ac_prog in jar$EXEEXT
+if test x$JAVAPREFIX = x; then
+        test x$JAVA = x && for ac_prog in kaffe$EXEEXT java$EXEEXT
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_JAR+set}" = set; then
+if test "${ac_cv_prog_JAVA+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$JAR"; then
-  ac_cv_prog_JAR="$JAR" # Let the user override the test.
+  if test -n "$JAVA"; then
+  ac_cv_prog_JAVA="$JAVA" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -3335,7 +3377,7 @@ do
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_JAR="$ac_prog"
+    ac_cv_prog_JAVA="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -3344,30 +3386,30 @@ done
 
 fi
 fi
-JAR=$ac_cv_prog_JAR
-if test -n "$JAR"; then
-  echo "$as_me:$LINENO: result: $JAR" >&5
-echo "${ECHO_T}$JAR" >&6
+JAVA=$ac_cv_prog_JAVA
+if test -n "$JAVA"; then
+  echo "$as_me:$LINENO: result: $JAVA" >&5
+echo "${ECHO_T}$JAVA" >&6
 else
   echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
-  test -n "$JAR" && break
+  test -n "$JAVA" && break
 done
 
 else
-        test "x$JAR" = x && for ac_prog in jar
+        test x$JAVA = x && for ac_prog in kaffe$EXEEXT java$EXEEXT
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_JAR+set}" = set; then
+if test "${ac_cv_prog_JAVA+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if test -n "$JAR"; then
-  ac_cv_prog_JAR="$JAR" # Let the user override the test.
+  if test -n "$JAVA"; then
+  ac_cv_prog_JAVA="$JAVA" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -3376,7 +3418,7 @@ do
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_JAR="$ac_prog"
+    ac_cv_prog_JAVA="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -3385,180 +3427,524 @@ done
 
 fi
 fi
-JAR=$ac_cv_prog_JAR
-if test -n "$JAR"; then
-  echo "$as_me:$LINENO: result: $JAR" >&5
-echo "${ECHO_T}$JAR" >&6
+JAVA=$ac_cv_prog_JAVA
+if test -n "$JAVA"; then
+  echo "$as_me:$LINENO: result: $JAVA" >&5
+echo "${ECHO_T}$JAVA" >&6
 else
   echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
-  test -n "$JAR" && break
+  test -n "$JAVA" && break
 done
-test -n "$JAR" || JAR="$JAVAPREFIX"
+test -n "$JAVA" || JAVA="$JAVAPREFIX"
 
 fi
-test "x$JAR" = x && { { echo "$as_me:$LINENO: error: no acceptable jar program found in \$PATH" >&5
-echo "$as_me: error: no acceptable jar program found in \$PATH" >&2;}
+test x$JAVA = x && { { echo "$as_me:$LINENO: error: no acceptable Java virtual machine found in \$PATH" >&5
+echo "$as_me: error: no acceptable Java virtual machine found in \$PATH" >&2;}
    { (exit 1); exit 1; }; }
 
+# Extract the first word of "uudecode$EXEEXT", so it can be a program name with args.
+set dummy uudecode$EXEEXT; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_uudecode+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$uudecode"; then
+  ac_cv_prog_uudecode="$uudecode" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_uudecode="yes"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
 
+fi
+fi
+uudecode=$ac_cv_prog_uudecode
+if test -n "$uudecode"; then
+  echo "$as_me:$LINENO: result: $uudecode" >&5
+echo "${ECHO_T}$uudecode" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
 
+if test x$uudecode = xyes; then
+echo "$as_me:$LINENO: checking if uudecode can decode base 64 file" >&5
+echo $ECHO_N "checking if uudecode can decode base 64 file... $ECHO_C" >&6
+if test "${ac_cv_prog_uudecode_base64+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
 
-JNI_INCLUDE_DIRS=""
-
-test "x$JAVAC" = x && { { echo "$as_me:$LINENO: error: '$JAVAC' undefined" >&5
-echo "$as_me: error: '$JAVAC' undefined" >&2;}
+cat << \EOF > Test.uue
+begin-base64 644 Test.class
+yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
+bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
+bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s
+YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG
+aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB
+AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB
+AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ=
+====
+EOF
+if uudecode$EXEEXT Test.uue; then
+        ac_cv_prog_uudecode_base64=yes
+else
+        echo "configure: 3504: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
+        echo "configure: failed file was:" >&5
+        cat Test.uue >&5
+        ac_cv_prog_uudecode_base64=no
+fi
+rm -f Test.uue
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_uudecode_base64" >&5
+echo "${ECHO_T}$ac_cv_prog_uudecode_base64" >&6
+fi
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        rm -f Test.class
+        { echo "$as_me:$LINENO: WARNING: I have to compile Test.class from scratch" >&5
+echo "$as_me: WARNING: I have to compile Test.class from scratch" >&2;}
+        if test x$ac_cv_prog_javac_works = xno; then
+                { { echo "$as_me:$LINENO: error: Cannot compile java source. $JAVAC does not work properly" >&5
+echo "$as_me: error: Cannot compile java source. $JAVAC does not work properly" >&2;}
    { (exit 1); exit 1; }; }
+        fi
+        if test x$ac_cv_prog_javac_works = x; then
 
-case "$JAVAC" in
-    /*)        _ACJNI_JAVAC="$JAVAC"
-       ;;
-     *) # Extract the first word of "$JAVAC", so it can be a program name with args.
-set dummy $JAVAC; ac_word=$2
+if test "x$JAVAPREFIX" = x; then
+        test "x$JAVAC" = x && for ac_prog in "gcj$EXEEXT -C" guavac$EXEEXT jikes$EXEEXT javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
 echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path__ACJNI_JAVAC+set}" = set; then
+if test "${ac_cv_prog_JAVAC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  case $_ACJNI_JAVAC in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path__ACJNI_JAVAC="$_ACJNI_JAVAC" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  if test -n "$JAVAC"; then
+  ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path__ACJNI_JAVAC="$as_dir/$ac_word$ac_exec_ext"
+    ac_cv_prog_JAVAC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
 
-  test -z "$ac_cv_path__ACJNI_JAVAC" && ac_cv_path__ACJNI_JAVAC="no"
-  ;;
-esac
 fi
-_ACJNI_JAVAC=$ac_cv_path__ACJNI_JAVAC
-
-if test -n "$_ACJNI_JAVAC"; then
-  echo "$as_me:$LINENO: result: $_ACJNI_JAVAC" >&5
-echo "${ECHO_T}$_ACJNI_JAVAC" >&6
+fi
+JAVAC=$ac_cv_prog_JAVAC
+if test -n "$JAVAC"; then
+  echo "$as_me:$LINENO: result: $JAVAC" >&5
+echo "${ECHO_T}$JAVAC" >&6
 else
   echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
-        ;;
-esac
+  test -n "$JAVAC" && break
+done
 
-# Extract the first word of "$JAVAC", so it can be a program name with args.
-set dummy $JAVAC; ac_word=$2
+else
+        test "x$JAVAC" = x && for ac_prog in "gcj$EXEEXT -C" guavac$EXEEXT jikes$EXEEXT javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
 echo "$as_me:$LINENO: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path__ACJNI_JAVAC+set}" = set; then
+if test "${ac_cv_prog_JAVAC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  case $_ACJNI_JAVAC in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path__ACJNI_JAVAC="$_ACJNI_JAVAC" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  if test -n "$JAVAC"; then
+  ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_exec_ext in '' $ac_executable_extensions; do
   if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path__ACJNI_JAVAC="$as_dir/$ac_word$ac_exec_ext"
+    ac_cv_prog_JAVAC="$ac_prog"
     echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
 done
 
-  test -z "$ac_cv_path__ACJNI_JAVAC" && ac_cv_path__ACJNI_JAVAC="no"
-  ;;
-esac
 fi
-_ACJNI_JAVAC=$ac_cv_path__ACJNI_JAVAC
-
-if test -n "$_ACJNI_JAVAC"; then
-  echo "$as_me:$LINENO: result: $_ACJNI_JAVAC" >&5
-echo "${ECHO_T}$_ACJNI_JAVAC" >&6
+fi
+JAVAC=$ac_cv_prog_JAVAC
+if test -n "$JAVAC"; then
+  echo "$as_me:$LINENO: result: $JAVAC" >&5
+echo "${ECHO_T}$JAVAC" >&6
 else
   echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
-test "x$_ACJNI_JAVAC" = xno && { { echo "$as_me:$LINENO: error: $JAVAC could not be found in path" >&5
-echo "$as_me: error: $JAVAC could not be found in path" >&2;}
+  test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="$JAVAPREFIX"
+
+fi
+test "x$JAVAC" = x && { { echo "$as_me:$LINENO: error: no acceptable Java compiler found in \$PATH" >&5
+echo "$as_me: error: no acceptable Java compiler found in \$PATH" >&2;}
    { (exit 1); exit 1; }; }
 
+echo "$as_me:$LINENO: checking if $JAVAC works" >&5
+echo $ECHO_N "checking if $JAVAC works... $ECHO_C" >&6
+if test "${ac_cv_prog_javac_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
 
-# find the include directory relative to the javac executable
-_cur=""$_ACJNI_JAVAC""
-while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do
-        echo "$as_me:$LINENO: checking symlink for $_cur" >&5
-echo $ECHO_N "checking symlink for $_cur... $ECHO_C" >&6
-        _slink=`ls -ld "$_cur" | sed 's/.* -> //'`
-        case "$_slink" in
-        /*) _cur="$_slink";;
-        # 'X' avoids triggering unwanted echo options.
-        *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[^/]*$::'`"$_slink";;
-        esac
-        echo "$as_me:$LINENO: result: $_cur" >&5
-echo "${ECHO_T}$_cur" >&6
-done
-_ACJNI_FOLLOWED="$_cur"
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* #line 3622 "configure" */
+public class Test {
+}
+EOF
+if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null 2>&1; then
+  ac_cv_prog_javac_works=yes
+else
+  { { echo "$as_me:$LINENO: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&5
+echo "$as_me: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&2;}
+   { (exit 1); exit 1; }; }
+  echo "configure: failed program was:" >&5
+  cat $JAVA_TEST >&5
+fi
+rm -f $JAVA_TEST $CLASS_TEST
 
-_JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[^/]*$::'`
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_javac_works" >&5
+echo "${ECHO_T}$ac_cv_prog_javac_works" >&6
 
-case "$host_os" in
-        darwin*)        _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[^/]*$::'`
-                        _JINC="$_JTOPDIR/Headers";;
-        *)              _JINC="$_JTOPDIR/include";;
-esac
-if test -f "$_JINC/jni.h"; then
-        JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JINC"
+
+        fi
+fi
+echo "$as_me:$LINENO: checking if $JAVA works" >&5
+echo $ECHO_N "checking if $JAVA works... $ECHO_C" >&6
+if test "${ac_cv_prog_java_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-        _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[^/]*$::'`
-        if test -f "$_JTOPDIR/include/jni.h"; then
-                JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include"
+
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+TEST=Test
+cat << \EOF > $JAVA_TEST
+/* [#]line 3659 "configure" */
+public class Test {
+public static void main (String args[]) {
+        System.exit (0);
+} }
+EOF
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } && test -s $CLASS_TEST; then
+                :
         else
-                { { echo "$as_me:$LINENO: error: cannot find java include files" >&5
-echo "$as_me: error: cannot find java include files" >&2;}
+          echo "configure: failed program was:" >&5
+          cat $JAVA_TEST >&5
+          { { echo "$as_me:$LINENO: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&5
+echo "$as_me: error: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&2;}
    { (exit 1); exit 1; }; }
         fi
 fi
+if { ac_try='$JAVA $JAVAFLAGS $TEST'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null 2>&1; then
+  ac_cv_prog_java_works=yes
+else
+  echo "configure: failed program was:" >&5
+  cat $JAVA_TEST >&5
+  { { echo "$as_me:$LINENO: error: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&5
+echo "$as_me: error: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -fr $JAVA_TEST $CLASS_TEST Test.uue
 
-# get the likely subdirectories for system specific java includes
-case "$host_os" in
-bsdi*)          _JNI_INC_SUBDIRS="bsdos";;
-linux*)         _JNI_INC_SUBDIRS="linux genunix";;
-osf*)           _JNI_INC_SUBDIRS="alpha";;
-solaris*)       _JNI_INC_SUBDIRS="solaris";;
-*)              _JNI_INC_SUBDIRS="genunix";;
-esac
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_java_works" >&5
+echo "${ECHO_T}$ac_cv_prog_java_works" >&6
 
-# add any subdirectories that are present
-for JINCSUBDIR in $_JNI_INC_SUBDIRS
-do
-        if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then
-                JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR"
-        fi
-done
 
-case "$host_cpu" in
-       i?86)
-               _JNI_LIBDIRS="lib/i386"
+
+
+if test "x$JAVAPREFIX" = x; then
+        test "x$JAR" = x && for ac_prog in jar$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_JAR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$JAR"; then
+  ac_cv_prog_JAR="$JAR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_JAR="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+JAR=$ac_cv_prog_JAR
+if test -n "$JAR"; then
+  echo "$as_me:$LINENO: result: $JAR" >&5
+echo "${ECHO_T}$JAR" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$JAR" && break
+done
+
+else
+        test "x$JAR" = x && for ac_prog in jar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_JAR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$JAR"; then
+  ac_cv_prog_JAR="$JAR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_JAR="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+JAR=$ac_cv_prog_JAR
+if test -n "$JAR"; then
+  echo "$as_me:$LINENO: result: $JAR" >&5
+echo "${ECHO_T}$JAR" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$JAR" && break
+done
+test -n "$JAR" || JAR="$JAVAPREFIX"
+
+fi
+test "x$JAR" = x && { { echo "$as_me:$LINENO: error: no acceptable jar program found in \$PATH" >&5
+echo "$as_me: error: no acceptable jar program found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+
+
+
+
+JNI_INCLUDE_DIRS=""
+
+test "x$JAVAC" = x && { { echo "$as_me:$LINENO: error: '$JAVAC' undefined" >&5
+echo "$as_me: error: '$JAVAC' undefined" >&2;}
+   { (exit 1); exit 1; }; }
+
+case "$JAVAC" in
+    /*)        _ACJNI_JAVAC="$JAVAC"
+       ;;
+     *) # Extract the first word of "$JAVAC", so it can be a program name with args.
+set dummy $JAVAC; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path__ACJNI_JAVAC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $_ACJNI_JAVAC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path__ACJNI_JAVAC="$_ACJNI_JAVAC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path__ACJNI_JAVAC="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_path__ACJNI_JAVAC" && ac_cv_path__ACJNI_JAVAC="no"
+  ;;
+esac
+fi
+_ACJNI_JAVAC=$ac_cv_path__ACJNI_JAVAC
+
+if test -n "$_ACJNI_JAVAC"; then
+  echo "$as_me:$LINENO: result: $_ACJNI_JAVAC" >&5
+echo "${ECHO_T}$_ACJNI_JAVAC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+        ;;
+esac
+
+# Extract the first word of "$JAVAC", so it can be a program name with args.
+set dummy $JAVAC; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path__ACJNI_JAVAC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $_ACJNI_JAVAC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path__ACJNI_JAVAC="$_ACJNI_JAVAC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path__ACJNI_JAVAC="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_path__ACJNI_JAVAC" && ac_cv_path__ACJNI_JAVAC="no"
+  ;;
+esac
+fi
+_ACJNI_JAVAC=$ac_cv_path__ACJNI_JAVAC
+
+if test -n "$_ACJNI_JAVAC"; then
+  echo "$as_me:$LINENO: result: $_ACJNI_JAVAC" >&5
+echo "${ECHO_T}$_ACJNI_JAVAC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+test "x$_ACJNI_JAVAC" = xno && { { echo "$as_me:$LINENO: error: $JAVAC could not be found in path" >&5
+echo "$as_me: error: $JAVAC could not be found in path" >&2;}
+   { (exit 1); exit 1; }; }
+
+
+# find the include directory relative to the javac executable
+_cur=""$_ACJNI_JAVAC""
+while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do
+        echo "$as_me:$LINENO: checking symlink for $_cur" >&5
+echo $ECHO_N "checking symlink for $_cur... $ECHO_C" >&6
+        _slink=`ls -ld "$_cur" | sed 's/.* -> //'`
+        case "$_slink" in
+        /*) _cur="$_slink";;
+        # 'X' avoids triggering unwanted echo options.
+        *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[^/]*$::'`"$_slink";;
+        esac
+        echo "$as_me:$LINENO: result: $_cur" >&5
+echo "${ECHO_T}$_cur" >&6
+done
+_ACJNI_FOLLOWED="$_cur"
+
+_JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[^/]*$::'`
+
+case "$host_os" in
+        darwin*)        _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[^/]*$::'`
+                        _JINC="$_JTOPDIR/Headers";;
+        *)              _JINC="$_JTOPDIR/include";;
+esac
+if test -f "$_JINC/jni.h"; then
+        JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JINC"
+else
+        _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[^/]*$::'`
+        if test -f "$_JTOPDIR/include/jni.h"; then
+                JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include"
+        else
+                { { echo "$as_me:$LINENO: error: cannot find java include files" >&5
+echo "$as_me: error: cannot find java include files" >&2;}
+   { (exit 1); exit 1; }; }
+        fi
+fi
+
+# get the likely subdirectories for system specific java includes
+case "$host_os" in
+bsdi*)          _JNI_INC_SUBDIRS="bsdos";;
+linux*)         _JNI_INC_SUBDIRS="linux genunix";;
+osf*)           _JNI_INC_SUBDIRS="alpha";;
+solaris*)       _JNI_INC_SUBDIRS="solaris";;
+*)              _JNI_INC_SUBDIRS="genunix";;
+esac
+
+# add any subdirectories that are present
+for JINCSUBDIR in $_JNI_INC_SUBDIRS
+do
+        if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then
+                JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR"
+        fi
+done
+
+case "$host_cpu" in
+       i?86)
+               _JNI_LIBDIRS="lib/i386"
                _JNI_LIBSUBDIR="client"
                ;;
        x86_64)
@@ -3599,6 +3985,647 @@ if test "$java_abs_paths" = yes; then
   JAVA_CC="$JAVA_BINDIR/$JAVA_CC"
 fi
 
+if test "x$JUNIT" = "x"; then
+   JUNIT=/usr/share/java/junit.jar
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in wchar.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists.  ##
+## ------------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+echo "$as_me:$LINENO: checking for wchar_t" >&5
+echo $ECHO_N "checking for wchar_t... $ECHO_C" >&6
+if test "${ac_cv_type_wchar_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((wchar_t *) 0)
+  return 0;
+if (sizeof (wchar_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_wchar_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_wchar_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_wchar_t" >&5
+echo "${ECHO_T}$ac_cv_type_wchar_t" >&6
+
+echo "$as_me:$LINENO: checking size of wchar_t" >&5
+echo $ECHO_N "checking size of wchar_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_wchar_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$ac_cv_type_wchar_t" = yes; then
+  # The cast to unsigned long works around a bug in the HP C Compiler
+  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+  # This bug is HP SR number 8606223364.
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (wchar_t))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (wchar_t))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+                   if test $ac_lo -le $ac_mid; then
+                     ac_lo= ac_hi=
+                     break
+                   fi
+                   ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (wchar_t))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (wchar_t))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+                      if test $ac_mid -le $ac_hi; then
+                        ac_lo= ac_hi=
+                        break
+                      fi
+                      ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (wchar_t))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_wchar_t=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (wchar_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (wchar_t), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+else
+  if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+long longval () { return (long) (sizeof (wchar_t)); }
+unsigned long ulongval () { return (long) (sizeof (wchar_t)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    exit (1);
+  if (((long) (sizeof (wchar_t))) < 0)
+    {
+      long i = longval ();
+      if (i != ((long) (sizeof (wchar_t))))
+       exit (1);
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long i = ulongval ();
+      if (i != ((long) (sizeof (wchar_t))))
+       exit (1);
+      fprintf (f, "%lu\n", i);
+    }
+  exit (ferror (f) || fclose (f) != 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_wchar_t=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (wchar_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (wchar_t), 77
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+  ac_cv_sizeof_wchar_t=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_wchar_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_wchar_t" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_WCHAR_T $ac_cv_sizeof_wchar_t
+_ACEOF
+
+
+
                     ac_config_files="$ac_config_files Makefile src/java/Makefile"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -4227,6 +5254,7 @@ s,@SO@,$SO,;t t
 s,@LDSOFLAGS@,$LDSOFLAGS,;t t
 s,@JAVA_HOME@,$JAVA_HOME,;t t
 s,@JAVALIBS@,$JAVALIBS,;t t
+s,@JUNIT@,$JUNIT,;t t
 s,@PLLD@,$PLLD,;t t
 s,@MAKE@,$MAKE,;t t
 s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
@@ -4250,6 +5278,8 @@ s,@host_cpu@,$host_cpu,;t t
 s,@host_vendor@,$host_vendor,;t t
 s,@host_os@,$host_os,;t t
 s,@JAVAC@,$JAVAC,;t t
+s,@JAVA@,$JAVA,;t t
+s,@uudecode@,$uudecode,;t t
 s,@JAR@,$JAR,;t t
 s,@_ACJNI_JAVAC@,$_ACJNI_JAVAC,;t t
 s,@LIBOBJS@,$LIBOBJS,;t t
index 51dce4c..0d826cf 100644 (file)
@@ -18,6 +18,7 @@ AC_SUBST(SO)
 AC_SUBST(LDSOFLAGS)
 AC_SUBST(JAVA_HOME)
 AC_SUBST(JAVALIBS)
+AC_SUBST(JUNIT)
 
 AC_ARG_ENABLE(mt, [  --enable-mt                 Enable Multi-threading],
              [case "$enableval" in
@@ -102,6 +103,8 @@ dnl ================================================================
 
 AC_CANONICAL_HOST                      dnl needed to get $host_os
 
+m4_include([ac/ac_prog_java.m4])
+m4_include([ac/ac_prog_java_works.m4])
 m4_include([ac/ac_prog_javac.m4])
 m4_include([ac/ac_prog_javac_works.m4])
 m4_include([ac/ac_jni_include_dirs.m4])
@@ -125,6 +128,7 @@ if test "x$JAVAC" = x; then
 fi
 
 AC_PROG_JAVAC(javac)
+AC_PROG_JAVA(java)
 AC_PROG_JAR(jar)
 
 AC_JNI_INCLUDE_DIR
@@ -140,6 +144,13 @@ if test "$java_abs_paths" = yes; then
   JAVA_CC="$JAVA_BINDIR/$JAVA_CC"
 fi
 
+if test "x$JUNIT" = "x"; then
+   JUNIT=/usr/share/java/junit.jar
+fi
+
+AC_CHECK_HEADERS(wchar.h)
+AC_CHECK_SIZEOF(wchar_t, 4)
+
 AC_OUTPUT(Makefile src/java/Makefile)
 
 
similarity index 89%
rename from jpl_test.pl
rename to demo.pl
index 4edf440..52ab119 100644 (file)
+++ b/demo.pl
@@ -1,8 +1,9 @@
 :- asserta(file_search_path(foreign, '.')).
 :- asserta(file_search_path(jpl_examples, 'examples/prolog')).
 :- asserta(file_search_path(jar, '.')).
+:- asserta(file_search_path(library, '.')).
 
-:- [jpl].
+:- use_module(library(jpl)).
 
                 /*******************************
                 *             DEMOS            *
diff --git a/examples/java/.cvsignore b/examples/java/.cvsignore
new file mode 100644 (file)
index 0000000..6b468b6
--- /dev/null
@@ -0,0 +1 @@
+*.class
diff --git a/examples/java/SemWeb/.cvsignore b/examples/java/SemWeb/.cvsignore
new file mode 100644 (file)
index 0000000..6b468b6
--- /dev/null
@@ -0,0 +1 @@
+*.class
diff --git a/jpl.doc b/jpl.doc
index 15a8132..b420c5c 100644 (file)
--- a/jpl.doc
+++ b/jpl.doc
 \maketitle
 
 \begin{abstract}
-This document describes the SWI-Prolog interface to ODBC, the Microsoft
-standard for \jargon{Open DataBase Connectivity}.  These days there are
-ODBC managers from multiple vendors for many platforms as well as
-drivers for most databases, making it an attractive target for a Prolog
-database connection.
-The database interface is envisioned to consist of two layers. The first
-layer is an encapsulation of the core functionality of ODBC.  This layer
-makes it possible to run SQL queries.  The second layer exploits the
-relation between Prolog predicates and database tables, providing
----a somewhat limited--- natural Prolog view on the data. The current
-interface only covers the first layer.
+This document describes JPL, the SWI-Prolog interface to Java.
 \end{abstract}
 
 \pagebreak
@@ -43,783 +32,6 @@ interface only covers the first layer.
 
 \section{Introduction}
 
-The value of RDMS for Prolog is often over-estimated, as Prolog itself
-can manage substantial amounts of data. Nevertheless a Prolog/RDMS
-interface provides advantages if data is already provided in an RDMS,
-data must be shared with other applications, there are strong
-persistency requirements or there is too much data to fit in memory.
-
-The popularity of ODBC makes it possible to design a single
-foreign-language module that provides RDMS access for a wide variety
-of databases on a wide variety of platforms. The SWI-Prolog RDMS
-interface is closely modeled after the ODBC API.  This API is rather
-low-level, but defaults and dynamic typing provided by Prolog give the
-user quite simple access to RDMS, while the interface provides the best
-possible performance given the RDMS independency constraint.
-
-The Prolog community knows about various high-level connections between
-RDMS and Prolog. We envision these layered on top of the ODBC connection
-described here.
-
-
-\section{The ODBC layer}
-
-\subsection{Connection management}
-
-The ODBC interface deals with a single ODBC environment with
-multiple simultaneous connections.  The predicates in this section
-deal with connection management.
-
-\begin{description}
-    \predicate{odbc_connect}{3}{+DSN, -Connection, +Options}
-Create a new ODBC connection to data-source \arg{DSN} and return a
-handle to this connection in \arg{Connection}.  The connection handle
-is either an opaque structure or an atom of the \const{alias} option
-is used.  In addition to the options below, options applicable to
-odbc_set_connection/2 may be provided.
-
-\begin{description}
-    \termitem{user}{User}
-Define the user-name for the connection.  This option must be present
-if the database uses authorization.
-
-    \termitem{password}{Password}
-Provide a password for the connection.  Normally used in combination
-with \term{user}{User}.
-
-    \termitem{alias}{AliasName}
-Use \arg{AliasName} as \arg{Connection} identifier, making the
-connection available as a global resource.  A good choice is to
-use the \arg{DSN} as alias.
-
-    \termitem{open}{OpenMode}
-If \arg{OpenMode} is \const{once} (default if an \const{alias} is
-provided), a second call to open the same \arg{DSN} simply returns
-the existing connection.  If \const{multiple} (default if there is
-no alias name), a second connection to the same data-source is
-opened.
-\end{description}
-
-The following example connects to the WordNet%
-       \footnote{An SQL version of WordNet is available from
-                 \url{http://wordnet2sql.infocity.cjb.net/}}
-\cite{miller1990} database, using the connection alias \const{wordnet}
-and opening the connection only once:
-
-\begin{code}
-open_wordnet :-
-       odbc_connect('WordNet', _,
-                    [ user(jan),
-                      password(xxx),
-                      alias(wordnet),
-                      open(once)
-                    ]).
-\end{code}
-
-\predicate{odbc_disconnect}{1}{+Connection}
-Close the given \arg{Connection}.  This destroys the connection alias
-or, if there is no alias, makes further use of the \arg{Connection}
-handle illegal.
-
-\predicate{odbc_current_connection}{2}{?Connection, ?DSN}
-Enumerate the existing ODBC connections.
-
-\predicate{odbc_set_connection}{2}{+Connection, +Option}
-Set options on an existing connection.  All options defined here may
-also be specified with odbc_connect/2 in the option-list.
-Defined options are:
-
-\begin{description}
-    \termitem{access_mode}{Mode}
-If \const{read}, tell the driver we only access the database in read
-mode.  If \const{update} (default), tell the driver we may execute
-update commands.
-
-    \termitem{auto_commit}{bool}
-If \const{true} (default), each update statement is committed
-immediately.  If \const{false}, an update statement starts a transaction
-that can be committed or rolled-back.  See \secref{sqltrans} for details
-on transaction management.
-
-    \termitem{cursor_type}{CursorType}
-I haven't found a good description of what this does, but setting it
-to \const{dynamic} makes it possible to have multiple active statements
-on the same connection with Microsoft SQL server.  Other values
-are \const{static}, \const{forwards_only} and \const{keyset_driven}.
-
-    \termitem{silent}{Bool}
-If \const{true} (default \const{false}), statements returning
-\const{SQL_SUCCESS_WITH_INFO} succeed without printing the info.
-See also \secref{successwithinfo}.
-
-    \termitem{null}{NullSpecifier}
-Defines how the SQL constant NULL is represented. Without specification,
-the default is the atom \verb|$null$|. \arg{NullSpecifier} is an
-arbitrary Prolog term, though the implementation is optimised for
-using an unbound variable, atom and functor with one unbound variable.
-The representation \term{null}{_} is a commonly used alternative.
-
-The specified default holds for all statements executed on this
-connection. Changing the connection default does not affect already
-prepared or running statements.  The null-value can also be specified
-at the statement level.  See the option list of odbc_query/4.
-
-    \termitem{wide_column_threshold}{+Length}
-If the width of a column exceeds \arg{Length}, use the API SQLGetData()
-to get the value incrementally rather than using a (large) buffer
-allocated with the statement.  The default is to use this alternate
-interface for columns larger than 1024 bytes.  There are two cases
-for using this option.  In time critical applications with wide columns
-it may provide better performance at the cost of a higher memory usage
-and to work around bugs in SQLGetData().  The latter applies to Microsoft
-SQL Server fetching the definition of a view.
-\end{description}
-
-    \predicate{odbc_get_connection}{2}{+Connection, ?Property}
-Query for properties of the connection.  \arg{Property} is a term
-of the format \term{\arg{Name}}{\arg{Value}}.  If \arg{Property}
-is unbound all defined properties are enumerated on backtracking.
-Currently the following properties are defined.
-
-\begin{description}
-    \termitem{database_name}{Atom}
-Name of the database associated to the connection.
-    \termitem{dbms_name}{Name}
-Name of the database engine.  This constant can be used to identify
-the engine.
-    \termitem{dbms_version}{Atom}
-Version identifier from the database engine.
-    \termitem{driver_name}{Name}
-ODBC Dynamic Link Library providing the interface between ODBC and
-the database.
-    \termitem{driver_odbc_version}{Atom}
-ODBC version supported by the driver.
-    \termitem{driver_version}{Atom}
-The drivers version identifier.
-    \termitem{active_statements}{Integer}
-Maximum number of statements that can be active at the same time on
-this connection.  Returns 0 (zero) if this is unlimited.%
-       \footnote{Microsoft SQL server can have multiple active
-                 statements after setting the option
-                 \const{cursor_type} to \const{dynamic}.  See
-                 odbc_set_connection/2.}
-\end{description}
-    \predicate{odbc_data_source}{2}{?DSN, ?Description}
-Query the defined data sources.  It is not required to have any open
-connections before calling this predicate. \arg{DSN} is the name
-of the data source as required by odbc_connect/3. \arg{Description} is
-the name of the driver.  The driver name may be used to tailor the
-SQL statements used on the database.  Unfortunately this name depends
-on the local installing details and is therefore not universally 
-useful.
-\end{description}
-
-\subsection{Running SQL queries}
-
-ODBC distinguishes between direct execution of literal SQL strings and
-parameterized execution of SQL strings. The first is a simple practical
-solution for infrequent calls (such as creating a table), while
-parameterized execution allows the driver and database to precompile the
-query and store the optimized code, making it suitable for time-critical
-operations.  In addition, it allows for passing parameters without going
-through SQL-syntax and thus avoiding the need for quoting.
-
-
-\subsubsection{One-time invocation}
-
-\begin{description}
-    \predicate{odbc_query}{3}{+Connection, +SQL, -RowOrAffected}
-Same as odbc_query/4 using \const{[]} for \arg{Options}.
-
-    \predicate{odbc_query}{4}{+Connection, +SQL, -RowOrAffected, +Options}
-Fire an SQL query on the database represented by \arg{Connection}.
-\arg{SQL} is any valid SQL statement. SQL statements can be specified as
-a plain atom, string or a term of the format
-\mbox{\arg{Format}-\arg{Arguments}}, which is converted using format/2.
-
-If the statement is a \const{SELECT} statement the result-set is
-returned in \arg{RowOrAffected}. By default rows are returned one-by-one
-on backtracking as terms of the functor \functor{row}{\arg{Arity}},
-where \arg{Arity} denotes the number of columns in the result-set. The
-library pre-fetches the next value to be able to close the statement and
-return deterministic success when returning the last row of the
-result-set. Using the option \functor{findall}{2} (see below) the
-result-set is returned as a list of user-specified terms. For other
-statements this argument returns \term{affected}{Rows}, where \arg{Rows}
-represents the number of rows affected by the statement. If you are not
-interested in the number of affected rows odbc_query/2 provides a simple
-interface for sending SQL-statements.
-
-Below is a small example using the connection created from
-odbc_connect/3. Please note that the SQL-statement does not end in the
-`\chr{;}' character.
-
-\begin{code}
-lemma(Lemma) :-
-       odbc_query(wordnet,
-                  'SELECT (lemma) FROM word',
-                  row(Lemma).
-\end{code}
-
-The following example adds a name to a table with parent-relations,
-returning the number of rows affected by the statement.
-
-\begin{code}
-insert_child(Child, Mother, Father, Affected) :-
-       odbc_query(parents,
-                  'INSERT INTO parents (name,mother,father) \
-                     VALUES ("mary", "christine", "bob")',
-                  affected(Affected)).
-\end{code}
-
-\arg{Options} defines the following options.
-
-\begin{description}
-    \termitem{types}{ListOfTypes}
-Determine the Prolog type used to report the column-values.  When
-omitted, default conversion as described in \secref{sqltypes} is
-implied.  A column may specify \const{default} to use default
-conversion for that column.  The length of the type-list must match
-the number of columns in the result-set.
-
-For example, in the table \exam{word} the first column is defined
-with the SQL type \exam{DECIMAL(6)}.  Using this SQL-type, ``001''
-is distinct from ``1'', but using Prolog integers is a valid
-representation for Wordnet \exam{wordno} identifiers.  The following
-query extracts rows using Prolog integers:
-
-\begin{code}
-?- odbc_query(wordnet,
-             'select * from word', X,
-             [ types([integer,default])
-             ]).
-
-X = row(1, entity) ;
-X = row(2, thing) ;
-...
-\end{code}
-
-See also \secref{sqltypes} for notes on type-conversion.
-
-    \termitem{null}{NullSpecifier}
-Specify SQL NULL representation.  See odbc_set_connection/2 for details.
-
-    \termitem{source}{Bool}
-If \const{true} (default \const{false}), include the source-column with
-each result-value. With this option, each result in the
-\functor{row}{\arg{N}}-term is of the format below. \arg{TableName} or
-\arg{ColumnName} may be the empty atom if the information is not
-available.%
-       \footnote{This is one possible interface to this information.
-                 In many cases it is more efficient and convenient to
-                 provide this information separately as it is the same
-                 for each result-row.}
-
-\begin{quote}
-\term{column}{TableName, ColumnName, Value}
-\end{quote}
-
-    \termitem{findall}{Template, row(Column, \ldots)}
-Instead of returning rows on backtracking this option makes odbc_query/3
-return all rows in a list and close the statement.  The option is named
-after the Prolog findall/3 predicate, as the it makes odbc_query/3
-behave as the commonly used findall/3 construct below.
-
-\begin{code}
-lemmas(Lemmas) :-
-       findall(Lemma,
-               odbc_query(wordnet,
-                          'select (lemma) from word',
-                          row(Lemma)),
-               Lemmas).
-\end{code}
-
-Using the \functor{findall}{2} option the above can be implemented as
-below.  The number of argument of the \const{row} term must match the
-number of columns in the result-set.
-
-\begin{code}
-lemmas(Lemmas) :-
-       odbc_query(wordnet,
-                  'select (lemma) from word',
-                  Lemmas,
-                  [ findall(Lemma, row(Lemma))
-                  ]).
-\end{code}
-
-\begin{quote}\it
-The current implementation is incomplete. It does not allow arguments of
-\term{row}{\ldots} to be instantiated. Plain instantiation can always
-be avoided using a proper SELECT statement. Potentially useful however
-would be the translation of compound terms, especially to translate
-date/time/timestamp structures to a format for use by the application. 
-\end{quote}
-
-    \termitem{wide_column_threshold}{+Length}
-Specify threshold column width for using SQLGetData().
-See odbc_set_connection/2 for details.
-\end{description}
-
-    \predicate{odbc_query}{2}{+Connection, +SQL}
-As odbc_query/3, but used for SQL-statements that should not return
-result-rows (i.e.\ all statements except for \const{SELECT}).  The
-predicate prints a diagnostic message if the query returns a result.
-\end{description}
-
-
-\subsubsection{Parameterised queries}
-
-ODBC provides for `parameterized queries'.  These are SQL queries with
-a \chr{?}-sign at places where parameters appear.  The ODBC interface
-and database driver may use this to precompile the SQL-statement, giving
-better performance on repeated queries.  This is exactly what we want if
-we associate Prolog predicates to database tables.  This interface is
-defined by the following predicates:
-
-\begin{description}
-\predicate{odbc_prepare}{4}{+Connection, +SQL, +Parameters, -Statement}
-As odbc_prepare/5 using \const{[]} for \arg{Options}.
-
-\predicate{odbc_prepare}{5}{+Connection, +SQL, +Parameters,
-                           -Statement, +Options}
-Create a statement from the given \arg{SQL} (which may be a format
-specification as described with odbc_query/3) statement that normally
-has one or more parameter-indicators (\chr{?}) and unify \arg{Statement}
-with a handle to the created statement. \arg{Parameters} is a list of
-descriptions, one for each parameter. Each parameter description is one
-of the following:
-
-\begin{description}
-    \termitem{default}{}
-Uses the ODBC function SQLDescribeParam() to obtain information about
-the parameter and apply default rules.  See \secref{sqltypes} for
-details.  If the interface fails to return a type or the type is
-unknown to the ODBC interface a message is printed and the interface
-handles the type as text, which implies the user must supply an atom.
-The message can be suppressed using the \term{silent}{true} option
-of odbc_set_connection/2.  An alternative mapping can be selected
-using the $>$ option of this predicate described below.
-
-    \termitem{\arg{SqlType}}{Specifier, ...}
-Declare the parameter to be of type \arg{SqlType} with the given
-specifiers. Specifiers are required for \type{char}, \type{varchar},
-etc.\ to specify the field-width. When calling odbc_execute/[2-3],
-the user must supply the parameter values in the default Prolog type for
-this SQL type. See \secref{sqltypes} for details.
-
-    \definition{\arg{PrologType} $>$ \arg{SqlType}}
-As above, but supply values of the given \arg{PrologType}, using the
-type-transformation defined by the database driver.  For example,
-if the parameter is specified as
-
-\begin{code}
-atom > date
-\end{code}
-
-The use must supply an atom of the format \exam{YYYY-MM-DD} rather than
-a term \term{date}{Year,Month,Day}. This construct enhances flexibility
-and allows for passing values that have no proper representation in
-Prolog.
-\end{description}
-
-\arg{Options} defines a list of options for executing the statement.  See
-odbc_query/4 for details. In addition, the following option is provided:
-
-    \begin{description}
-        \termitem{fetch}{FetchType}
-Determine the \arg{FetchType}, which is one of \const{auto} (default) to
-extract the result-set on backtracking or \const{fetch} to prepare the
-result-set to be fetched using odbc_fetch/3.
-    \end{description}
-
-    \predicate{odbc_execute}{3}{+Statement, +ParameterValues, -RowOrAffected}
-Execute a statement prepared with odbc_prepare/4 with the given
-\arg{ParameterValues} and return the rows or number of affected rows 
-as odbc_query/4. This predicate may return type_error exceptions if the
-provided parameter values cannot be converted to the declared types.
-
-ODBC doesn't appear to allow for multiple cursors on the same
-result-set.%
-       \footnote{Is this right?}
-This would imply there can only be one active odbc_execute/3
-(i.e.\ with a choice-point) on a prepared statement.  Suppose we
-have a table \exam{age (name char(25), age integer)} bound to the
-predicate \predref{age}{2} we cannot write the code below without
-special precautions.  The ODBC interface therefore creates a clone
-of a statement if it discovers the statement is being executed,
-which is discarded after the statement is finished.%
-       \footnote{The code is prepared to maintain a cache of
-                 statements.  Practice should tell us whether
-                 it is worthwhile activating this.}
-
-\begin{code}
-same_age(X, Y) :-
-       age(X, AgeX),
-       age(Y, AgeY),
-       AgeX = AgeY.
-\end{code}
-
-    \predicate{odbc_execute}{2}{+Statement, +ParameterValues}
-Like odbc_query/2, this predicate is meant to execute simple SQL 
-statements without interest in the result.
-
-    \predicate{odbc_free_statement}{1}{+Statement}
-Destroy a statement prepared with odbc_prepare/4. If the statement is
-currently executing (i.e. odbc_execute/3 left a choice-point), the
-destruction is delayed until the execution terminates.
-\end{description}
-
-
-\subsubsection{Fetching rows explicitely}      \label{sec:sqlfetch}
-
-Normally SQL queries return a result-set that is enumerated on
-backtracking.  Using this approach a result-set is similar to a
-predicate holding facts.  There are some cases where fetching the
-rows one-by-one, much like read/1 reads terms from a file is more
-appropriate and there are cases where only part of the result-set
-is to be fetched.  These cases can be dealt with using odbc_fetch/3,
-which provides an interface to SQLFetchScroll().
-
-As a general rule of thumb, stay away from these functions if you do
-not really need them.  Experiment before deciding on the strategy and
-often you'll discover the simply backtracking approach is much easier
-to deal with and about as fast.
-
-\begin{description}
-    \predicate{odbc_fetch}{3}{+Statement, -Row, +Option}
-Fetch a row from the result-set of \arg{Statement}.  \arg{Statement}
-must be created with odbc_prepare/5 using the option \term{fetch}{fetch}
-and be executed using odbc_execute/2.  \arg{Row} is unified to the 
-fetched row or the atom \const{end_of_file}%
-       \footnote{This atom was selected to emphasise the similarity
-                 to read.}
-after the end of the data is reached.  Calling odbc_fetch/2 after all
-data is retrieved causes a permission-error exception. \arg{Option} is
-one of:
-
-    \begin{description}
-       \termitem{next}{}
-Fetch the next row.  
-       \termitem{prior}{}
-Fetch the result-set going backwards.
-       \termitem{first}{}
-Fetch the first row.
-       \termitem{last}{}
-Fetch the last row.
-       \termitem{absolute}{Offset}
-Fetch absolute numbered row.  Rows count from one.
-       \termitem{relative}{Offset}
-Fetch relative to the current row.  \term{relative}{1} is the same
-as \term{next}{}, except that the first row extracted is row 2.
-       \termitem{bookmark}{Offset}
-Reserved.  Bookmarks are not yet supported in this interface.
-    \end{description}
-
-In many cases, depending on the driver and RDBMS, the cursor-type
-must be changed using odbc_set_connection/2 for anything different
-from \term{next}{} to work.
-
-Here is example code each time skipping a row from a table `test'
-holding a single column of integers that represent the row-number.
-This test was executed using unixODBC and MySQL on SuSE Linux.
-
-\begin{code}
-fetch(Options) :-
-       odbc_set_connection(test, cursor_type(static)),
-       odbc_prepare(test,
-                    'select (testval) from test',
-                    [],
-                    Statement,
-                    [ fetch(fetch)
-                    ]),
-       odbc_execute(Statement, []),
-       fetch(Statement, Options).
-
-fetch(Statement, Options) :-
-       odbc_fetch(Statement, Row, Options),
-       (   Row == end_of_file
-       ->  true
-       ;   writeln(Row),
-           fetch(Statement, Options)
-       ).
-\end{code}
-    
-    \predicate{odbc_close_statement}{+Statement}
-Closes the given statement (without freeing it).  This must be used
-if not the whole result-set is retrieved using odbc_fetch/3.
-\end{description}
-
-
-\subsection{Transaction management}            \label{sec:sqltrans}
-
-ODBC can run in two modi. By default, all update actions are immediately
-committed on the server. Using odbc_set_connection/2 this behaviour can
-be switched off, after which each SQL statement that can be inside a
-transaction implicitly starts a new transaction. This transaction can be
-ended using odbc_end_transaction/2.
-
-\begin{description}
-    \predicate{odbc_end_transaction}{2}{+Connection, +Action}
-End the currently open transaction if there is one.  Using \arg{Action}
-\const{commit} pending updates are made permanent, using
-\const{rollback} they are discarded.
-\end{description}
-
-The ODBC documentation has many comments on transaction management and
-its interaction with database cursors.  
-
-
-\subsection{Accessing the database dictionary}
-
-With this interface we do not envision the use of Prolog as a database
-manager.  Nevertheless, elementary access to the structure of a database
-is required, for example to validate a database satisfies the
-assumptions made by the application.  
-
-\begin{description}
-    \predicate{odbc_current_table}{2}{+Connection, -Table}
-Return on backtracking the names of all tables in the database
-identified by the connection.
-
-    \predicate{odbc_current_table}{3}{+Connection, ?Table, ?Facet}
-Enumerate properties of the tables.  Defines facets are:
-
-\begin{description}
-    \termitem{qualifier}{Qualifier}
-    \termitem{owner}{Owner}
-    \termitem{comment}{Comment}
-These facets are defined by SQLTables()
-    \termitem{arity}{Arity}
-This facet returns the number of columns in a table.
-\end{description}
-
-    \predicate{odbc_table_column}{3}{+Connection, ?Table, ?Column}
-On backtracking, enumerate all columns in all tables.
-
-    \predicate{odbc_table_column}{3}{+Connection, ?Table, ?Column, ?Facet}
-Provides access to the properties of the table as defined by the ODBC
-call SQLColumns().  Defined facets are:
-
-\begin{description}
-    \termitem{table_qualifier}{Qualifier}
-    \termitem{table_owner}{Owner}
-    \termitem{table_name}{Table}
-See odbc_current_table/3.
-    \termitem{data_type}{DataType}
-    \termitem{type_name}{TypeName}
-    \termitem{precision}{Precision}
-    \termitem{length}{Length}
-    \termitem{scale}{Scale}
-    \termitem{radix}{Radix}
-    \termitem{nullable}{Nullable}
-    \termitem{remarks}{Remarks}
-These facets are defined by SQLColumns()
-    \termitem{type}{Type}
-More prolog-friendly representation of the type properties.  See
-\secref{sqltypes}.
-\end{description}
-
-    \predicate{odbc_type}{3}{+Connection, ?TypeSpec, ?Facet}
-Query the types supported by the data source.  \arg{TypeSpec} is either
-an integer type-id, the name of an ODBC SQL type or the constant
-\const{all_types} to enumerate all known types.  This predicate calls
-SQLGetTypeInfo() and its facet names are derived from the specification
-of this ODBC function:
-
-\begin{description}
-    \termitem{name}{Name}
-Name used by the data-source.  Use this in CREATE statements
-    \termitem{data_type}{DataType}
-Numeric identifier of the type
-    \termitem{precision}{Precision}
-When available, maximum precision of the type.
-    \termitem{literal_prefix}{Prefix}
-When available, prefix for literal representation.
-    \termitem{literal_suffix}{Suffix}
-When available, suffix for literal representation.
-    \termitem{create_params}{CreateParams}
-When available, arguments needed to create the type.
-    \termitem{nullable}{Bool}
-Whether the type can be \const{NULL}.  May be \const{unknown} 
-    \termitem{case_sensitive}{Bool}
-Whether values for this type are case-sensitive.
-    \termitem{searchable}{Searchable}
-Whether the type can be searched. Values are \const{false},
-\const{true}, \const{like_only} or \const{all_except_like}.
-    \termitem{unsigned}{Bool}
-When available, whether the value is signed. Please note that SWI-Prolog
-does not provide unsigned integral values.
-    \termitem{money}{Bool}
-Whether the type represents money.
-    \termitem{auto_increment}{Bool}
-When available, whether the type can be auto-incremented.
-    \termitem{local_name}{LocalName}
-Name of the type in local language.
-    \termitem{minimum_scale}{MinScale}
-Minimum scale of the type.
-    \termitem{maximum_scale}{MaxScale}
-Maximum scale of the type.
-\end{description}
-\end{description}
-
-
-\subsection{Getting more information}          \label{sec:odbcinfo}
-
-\begin{description}
-    \predicate{odbc_statistics}{1}{?Key}
-Get statistical data on the ODBC interface.  Currently defined keys are:
-
-\begin{description}
-    \termitem{statements}{Created, Freed}
-Number of SQL statements that have been \arg{Created} and \arg{Freed}
-over all connections. Statements executed with odbc_query/[2-3]
-increment \arg{Created} as the query is created and \arg{Freed} if
-the query is terminated due to deterministic success, failure, cut
-or exception.  Statements created with odbc_prepare/[4-5] are freed
-by odbc_free_statement/1 or due to a fatal error with the statement.
-\end{description}
-
-    \predicate{odbc_debug}{1}{+Level}
-Set the verbosity-level to \arg{Level}.  Default is 0.  Higher levels
-make the system print debugging messages.
-\end{description}
-
-
-\subsection{Representing SQL data in Prolog}           \label{sec:sqltypes}
-
-Databases have a poorly standardized but rich set of datatypes.  Some
-have natural Prolog counterparts, some not.  A complete mapping requires
-us to define Prolog data-types for SQL types that have no standardized
-Prolog counterpart (such as timestamp), the definition of a default
-mapping and the possibility to define an alternative mapping for a
-specific column. For example, many variations of the SQL \const{DECIMAL}
-type cannot be mapped to a Prolog integer.  Nevertheless, mapping to
-an integer may be the proper choice for a specific application.
-
-The Prolog/ODBC interface defines the following Prolog result types with
-the indicated default transformation. Different result-types can be
-requested using the \term{types}{TypeList} option for the
-odbc_query/4 and odbc_prepare/5 interfaces.
-
-\begin{description}
-    \termitem{atom}{}
-Used as default for the SQL types \const{char}, \const{varchar},
-\const{longvarchar}, \const{binary}, \const{varbinary},
-\const{longvarbinary}, \const{decimal} and \const{numeric}. Can be used
-for all types.
-
-    \termitem{string}{}
-SWI-Prolog extended type string. Use the type for special cases where
-garbage atoms must be avoided. Can be used for all types.
-
-    \termitem{codes}{}
-List of character codes.  Use this type if the argument must be analysed
-or compatibility with Prolog systems that cannot handle infinite-length
-atoms is desired.  Can be used for all types.
-
-    \termitem{integer}{}
-Used as default for the SQL types \const{bit}, \const{tinyint},
-\const{smallint} and \const{integer}.  Please note that SWI-Prolog
-integers are signed 32-bit values, where SQL allows for unsigned
-values as well. Can be used for the integral, and \const{decimal} types
-as well as the types \const{date} and \const{timestamp}, which are
-represented as POSIX time-stamps (seconds after Jan 1, 1970).
-
-    \termitem{double}{}
-Used as default for the SQL types \const{real}, \const{float} and
-\const{double}.  Can be used for the integral, float and \const{decimal}
-types as well as the types \const{date} and \const{timestamp}, which
-are represented as POSIX time-stamps (seconds after Jan 1, 1970).
-Representing time this way is compatible to SWI-Prologs time-stamp
-handling.
-
-    \termitem{date}{}
-A Prolog term of the form \term{date}{Year,Month,Day} used as default
-for the SQL type \const{date}.
-
-    \termitem{time}{}
-A Prolog term of the form \term{time}{Hour,Minute,Second} used as
-default for the SQL type \const{time}.
-
-    \termitem{timestamp}{}
-A Prolog term of the form
-\term{timestamp}{Year,Month,Day,Hour,Minute,Second,Fraction} used as
-default for the SQL type \const{timestamp}.
-\end{description}
-
-
-\subsection{Errors and warnings}
-
-ODBC operations return success, error or `success with info'. This
-section explains how results from the ODBC layer are reported to Prolog.
-
-\subsubsection{ODBC messages: `Success with info'}
-\label{sec:successwithinfo}
-
-If an ODBC operation returns `with info', the info is extracted from the
-interface and handled to the Prolog message dispatcher print_message/2.
-The level of the message is \const{informational} and the term is of the
-form:
-
-\begin{description}
-    \termitem{odbc}{State, Native, Message}
-Here, \arg{State} is the SQL-state as defined in the ODBC API,
-\arg{Native} is the (integer) error code of the underlying data source
-and \arg{Message} is a human readable explanation of the message.
-\end{description}
-
-\subsubsection{ODBC errors}                            \label{sec:sqlerror}
-
-If an ODBC operation signals an error, it throws the exception
-\term{error}{\term{odbc}{State, Native, Message}, _}. The arguments
-of the \functor{odbc}{3} term are explained in \secref{successwithinfo}.
-
-In addition, the Prolog layer performs the normal tests for proper
-arguments and state, signaling the conventional instantiation, type,
-domain and resource exceptions.
-
-
-\subsection{ODBC implementations}
-
-There is a wealth on ODBC implementations that are completely or almost
-compatible to this interface. In addition, a number of databases are
-delivered with an ODBC compatible interface. This implies you get the
-portability benefits of ODBC without paying the configuration and
-performance price. Currently this interface is, according to the
-\url[PHP]{http://www.php.net} documentation on this subject, provided by
-Adabas D, IBM DB2, Solid, and Sybase SQL Anywhere. 
-
-
-\subsubsection{Using unixODBC}
-
-The SWI-Prolog ODBC interface was developed using
-\url[unixODBC]{http://www.unixodbc.org} and \url[MySQL]{http://www.mysql.com} on
-\url[SuSE Linux]{http://www.suse.com}.  
-
-
-\subsubsection{Using Microsoft ODBC}
-
-On MS-Windows, the ODBC interface is a standard package, linked against
-\file{odbc32.lib}.  
-
-
-\subsection{Remaining issues}
-
-The following issues are identified and waiting for concrete problems
-and suggestions.
-
-\begin{description}
-    \item[Transaction management]
-This certainly requires a high-level interface.  Possibly in combination
-with call_cleanup/3, providing automatic rollback on failure or
-exception and commit on success.
-
-    \item[High-level interface]
-Attaching tables to predicates, partial \emph{DataLog} implementation,
-etc.
-\end{description}
-
-
 \section{Installation}
 
 \subsection{Unix systems}
@@ -844,11 +56,6 @@ the Prolog library files in \file{$PLBASE/library}, where
 
 \section{Acknowledgments}
 
-The SWI-Prolog ODBC interface started from a partial interface by
-Stefano De Giorgi. Mike Elston suggested programmable
-null-representation with many other suggestions while doing the first
-field-tests with this package.
-
 \bibliographystyle{plain}
 \bibliography{odbc}
 
diff --git a/jpl.pl b/jpl.pl
index f826623..2da4e1d 100644 (file)
--- a/jpl.pl
+++ b/jpl.pl
@@ -1,36 +1,39 @@
 /*  $Id$
 
-    Part of JPL -- SWI-Prolog/Java interface
-
-    Author:       Paul Singleton, Fred Dushin and Jan Wielemaker
-    E-mail:       paul@jbgb.com
-    WWW:          http://www.swi-prolog.org
-    Copyright (C): 1985-2004, Paul Singleton
-
-    This program is free software; you can redistribute it and/or
-    modify it under the terms of the GNU General Public License
-    as published by the Free Software Foundation; either version 2
-    of the License, or (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-    As a special exception, if you link this library with other files,
-    compiled with a Free Software compiler, to produce an executable, this
-    library does not by itself cause the resulting executable to be covered
-    by the GNU General Public License. This exception does not however
-    invalidate any other reasons why the executable file might be covered by
-    the GNU General Public License.
+       Part of JPL -- SWI-Prolog/Java interface
+
+       Author:        Paul Singleton, Fred Dushin and Jan Wielemaker
+       E-mail:        paul@jbgb.com
+       WWW:           http://www.swi-prolog.org
+       Copyright (C): 1985-2004, Paul Singleton
+
+       This program is free software; you can redistribute it and/or
+       modify it under the terms of the GNU General Public License
+       as published by the Free Software Foundation; either version 2
+       of the License, or (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU Lesser General Public
+       License along with this library; if not, write to the Free Software
+       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+       As a special exception, if you link this library with other files,
+       compiled with a Free Software compiler, to produce an executable, this
+       library does not by itself cause the resulting executable to be covered
+       by the GNU General Public License. This exception does not however
+       invalidate any other reasons why the executable file might be covered by
+       the GNU General Public License.
 */
 
 :- module(jpl,
-         [ jpl_pl_lib_version/1,
+         [ jpl_get_default_jvm_opts/1,
+           jpl_set_default_jvm_opts/1,
+           jpl_get_actual_jvm_opts/1,
+           jpl_pl_lib_version/1,
            jpl_c_lib_version/1,
            jpl_new/3,
            jpl_call/4,
            jpl_hashtable_pair/2,
            jpl_iterator_element/2,
            jpl_list_to_array/2,
+           jpl_terms_to_array/2,
            jpl_map_element/2,
            jpl_set_element/2
          ]).
 :- use_module(library(lists)).
+
 % suppress debugging this library
 :- set_prolog_flag(generate_debug_info, false).
 
 %------------------------------------------------------------------------------
 
-%   term_to_chars(+Term, ?Chars)
-%   unifies Chars with a printed representation of Term.  It is not at all
-%   clear what representation should be used.  On the grounds that it is
-%   supposed to be re-readable, I have chosen to use write_canonical.
-%   Giving Chars to chars_to_term/2 will yield a *copy* of Term.
+jpl_get_default_jvm_opts( Opts) :-
+       jni_get_default_jvm_opts( Opts).
+
+%------------------------------------------------------------------------------
 
-term_to_chars(Term, Chars) :-
-  % start_output_to_handle(Handle, Stream),
-  % write_canonical(Stream, Term),
-  % close(Stream),
-  % byte_stream_to_chars(Handle, Chars0),
-  % free_byte_stream(Handle),
-  % Chars = Chars0.
-    (  atom(Term)
-    -> Term = A                % avoid superfluous quotes
-    ;  system:term_to_atom(Term, A)        % port
-    ),
-    atom_codes(A, Chars).
+jpl_set_default_jvm_opts( Opts) :-
+       is_list( Opts),
+       length( Opts, N),
+       jni_set_default_jvm_opts( N, Opts).
 
 %------------------------------------------------------------------------------
 
-% jpl_call(+X, +Mspec, +Args, -R) :-
-%   X can be:
-%     a type, class object or classname
-%      (for static methods of the denoted class,
-%       or for static or instance methods of java.lang.Class)
-%     a class instance or array
-%      (for static or instance methods)
+jpl_get_actual_jvm_opts( Opts) :-
+       jni_get_actual_jvm_opts( Opts).
+
+%------------------------------------------------------------------------------
+
+jpl_supported_jni_version( 1, Minor) :-
+       (   Minor = 4,
+       jni_supported_jvm_version( 1, Minor)
+       ;   Minor = 2,
+       jni_supported_jvm_version( 1, Minor)
+       ;   Minor = 1,
+       jni_supported_jvm_version( 1, Minor)
+       ).
+
+%------------------------------------------------------------------------------
+
+jpl_assert( Fact) :-
+       (   jpl_assert_policy( Fact, yes)
+       ->  assert( Fact)
+       ;   true
+       ).
+
+%------------------------------------------------------------------------------
+
+jpl_assert_policy( jpl_field_spec_cache(_,_,_,_,_,_), yes).
+jpl_assert_policy( jpl_method_spec_cache(_,_,_,_,_,_,_,_), yes).
+jpl_assert_policy( jpl_class_tag_type_cache(_,_), yes).
+jpl_assert_policy( jpl_classname_type_cache(_,_), yes).
+jpl_assert_policy( jpl_iref_type_cache(_,_), no).   % must correspond to JPL_CACHE_TYPE_OF_REF in jpl.c
+
+jpl_assert_policy( jpl_field_spec_is_cached(_), YN) :-
+       jpl_assert_policy( jpl_field_spec_cache(_,_,_,_,_,_), YN).
+jpl_assert_policy( jpl_method_spec_is_cached(_), YN) :-
+       jpl_assert_policy( jpl_method_spec_cache(_,_,_,_,_,_,_,_), YN).
+
+%------------------------------------------------------------------------------
+
+% jpl_tidy_iref_type_cache( +Iref) :-
+%   delete the cached type info, if any, under Iref;
+%   called from jpl.c's jni_free_iref() via jni_tidy_iref_type_cache() 
+
+jpl_tidy_iref_type_cache( Iref) :-
+  % write( '[decaching types for iref='), write( Iref), write( ']'), nl,
+       retractall( jpl_iref_type_cache(Iref,_)),
+       true.
+
+%------------------------------------------------------------------------------
+
+% jpl_call(+X, +MethodSpec, +Params, -Result) :-
+%   X should be:
+%     an object reference
+%       (for static or instance methods)
+%     a classname, descriptor or type
+%       (for static methods of the denoted class)
 %
-%   Mspec can be:
-%     an atomic method name
-%      (may involve dynamic overload resolution)
-%     an integral method index
-%      (untested: for static overload resolution)
-%     a methodID/1 structure
-%      (ditto)
+%   MethodSpec should be:
+%     a method name (as an atom)
+%       (may involve dynamic overload resolution based on inferred types of params)
 %
-%   Args must be a proper list (poss empty) of ground arguments;
+%   Params should be:
+%     a proper list (perhaps empty) of suitable actual parameters for the named method
 %
-%   finally, an attempt will be made to unify R with the returned result 
+%   finally, an attempt will be made to unify Result with the returned result
 
-jpl_call(X, Mspec, Args, R) :-
-    (  ground(X)
-    -> (   jpl_is_object(X)                % ie class(_,_) or array(_) instance
+jpl_call(X, Mspec, Params, R) :-
+       (   jpl_object_to_type(X, Type)         % the usual case (goal fails safely if X is var or rubbish)
        ->  Obj = X,
-           jpl_object_to_type(Obj, Type)
-       ;   (X=class(_,_) ; X=array(_) )   % ie an object type
-       ->  jpl_type_to_class(X, Obj),
-           Type = class([java,lang],['Class'])
-       ;   jpl_classname_to_type(X, Tx)   % eg 'java.lang.String' or '[L'
-       ->  jpl_type_to_class(Tx, Obj),
-           Type = class([java,lang],['Class'])
-       ;   throw(error(type_error(jpl_receiver, X),
+           Kind = instance
+       ;   var(X)
+       ->  throw(error(instantiation_error,
+                       context(jpl_call/4,
+                               '1st arg must be bound to an object, classname, descriptor or type')))
+       ;   atom(X)
+       ->  (   jpl_classname_to_type( X, Type)     % does this attempt to load the class?
+       ->  (   jpl_type_to_class( Type, ClassObj)
+           ->  Kind = static
+           ;   throw(error(existence_error(class,X),
                        context(jpl_call/4,
-                               'must be type, class object or class name')))
+                               'the named class cannot be found')))
+           )
+       ;   throw(error(type_error(class_name_or_descriptor,X),
+                   context(jpl_call/4, '1st arg must be an object, classname, descriptor or type')))
        )
-    ;  var(X)
-    -> throw(error(instantiation_error,
-                   context(jpl_call/4, _)))
-    ;  throw(error(type_error(jpl_receiver, X),
+       ;   X = class(_,_)
+       ->  Type = X,
+           jpl_type_to_class( Type, ClassObj),
+           Kind = static
+       ;   X = array(_)
+       ->  throw(error(type_error(object_or_class,X),
+                   context(jpl_call/4, 'cannot call a static method of an array type, as none exists')))
+       ;   throw(error(domain_error(object_or_class,X),
                    context(jpl_call/4,
-                           'must be type, class object or class name')))
-    ),
-    ground(Args),                          % check in jpl_call_1/5 instead?
-    jpl_call_1(Type, Obj, Mspec, Args, Rx),
-
-    R = Rx.
+                           '1st arg must be an object, classname, descriptor or type')))
+       ),
+       (   atom(Mspec)                 % the usual case, i.e. a method name
+       ->  true
+       ;   var(Mspec)
+       ->  throw(error(instantiation_error,
+                   context(jpl_call/4, '2nd arg must be an atom naming a public method of the class or object')))
+       ;   throw(error(type_error(method_name,Mspec),
+                   context(jpl_call/4, '2nd arg must be an atom naming a public method of the class or object')))
+       ),
+       (   is_list(Params)
+       ->  (   catch(
+               jpl_datums_to_types(Params, Taps),
+               error(type_error(acyclic,Te),context(jpl_datum_to_type/2,Msg)),
+               throw(error(type_error(acyclic,Te),context(jpl_call/4,Msg)))
+           )   
+       ->  true
+       ;   throw(error(type_error(method_params,Params),
+                   context(jpl_call/4, 'not all actual parameters are convertible to Java values or references')))
+       ),
+       length( Params, A)
+       ;   var(Params)
+       ->  throw(error(instantiation_error,
+                   context(jpl_call/4, '3rd arg must be a proper list of actual parameters for the named method')))
+       ;   throw(error(type_error(method_params,Params),
+                   context(jpl_call/4, '3rd arg must be a proper list of actual parameters for the named method')))
+       ),
+       (   Kind == instance
+       ->  jpl_call_instance(Type, Obj, Mspec, Params, Taps, A, Rx)
+       ;   jpl_call_static(Type, ClassObj, Mspec, Params, Taps, A, Rx)
+       ),
+       (   nonvar(R),
+           R = {Term}  % yucky way of requesting Term->term conversion
+       ->  (   jni_jref_to_term( Rx, TermX)    % fails if Rx isn't a JRef to a jpl.Term
+       ->  Term = TermX
+       ;   throw(error(type_error,
+                       context(jpl_call/4, 'result is not a jpl.Term instance as required')))
+       )
+       ;   R = Rx
+       ).
 
 %------------------------------------------------------------------------------
 
-% jpl_call_1(+Type, +Object, +MethodSpec, +Argz, -Result) :-
-%   serves only jpl_call/4
-%   Object may be a class object, in which case Type is class([java,lang],['Class'])
-%   Argz (certain to be ground) can be:
-%     a proper list of arguments Args
-%      (their qty and types help resolve the method)
-%     a single argument Arg
-%      (defaulty corrected to Args = [Arg])
+%%     jpl_call_instance(+ObjectType, +Object, +MethodName, Params, 
+%%                       ActualParamTypes, Arity, -Result)
 %
-%   at call, Result is unbound
-%   at exit, Result is bound to the returned result datum (or @void)
-
-jpl_call_1(Tx, X, Mspec, Argz, Rx) :-      % a static method call?
-    Tx = class([java,lang],['Class']),     % a class object...
-    jpl_class_to_type(X, Tx2),
-    Tx2 \== class([java,lang],['Class']),   % ...other than java.lang.Class
-    !,
-    (  integer(Mspec)              % i.e. a method index
-    -> I = Mspec
-    ;  atom(Mspec)                 % i.e. a method name
-    -> N = Mspec
-    ;  jpl_is_methodID(Mspec)      % i.e. a method ID
-    -> MID = Mspec
-    ),
-    (  is_list(Argz)
-    -> Args = Argz,
-       length(Args, A)
-    ;  Args = [Argz],              % ugh: defaulty (?) single arg
-       A = 1
-    ),
-  % consider all methods of java.lang.Class
-  % and static methods of the denoted class
-    findall(
-       z8(T,I,N,A,Mods,MID,Tr,Tps),
-       (   T = Tx,
-           jpl_method_spec(T, I, N, A, Mods, MID, Tr, Tps)
-       ;   T = Tx2,
-           jpl_method_spec(T, I, N, A, Mods, MID, Tr, Tps),
-           member(static, Mods)
+%      call the MethodName-d method  (instance   or  static)  of Object
+%      (which is of ObjectType),  which   most  specifically applies to
+%      Params,  which  we  have   found    to   be   (respectively)  of
+%      ActualParamTypes, and of which there are Arity, yielding Result
+
+jpl_call_instance(Type, Obj, Mname, Params, Taps, A, Rx) :-
+       findall(                    % get remaining details of all accessible methods of Obj's class (as denoted by Type)
+       z5(I,Mods,MID,Tr,Tfps),
+       jpl_method_spec(Type, I, Mname, A, Mods, MID, Tr, Tfps),
+       Z5s
        ),
-       Z8s
-    ),
-    (  Z8s = []
-    -> write('Warning: no arity-matching methods'), nl, fail
-    ;  Z8s = [z8(T,I,N,A,Mods,MID,Tr,Tps)]
-    -> true                                    % exactly one method
-    ;  jpl_datums_to_types(Args, Tas), % most specific types
-       findall(
-           z5(I,Mods,MID,Tr,Tps),
-           (   member(z8(T,I,N,A,Mods,MID,Tr,Tps), Z8s),
-               jpl_types_fit_types(Tas, Tps)   % assignability test
+       (   Z5s = []
+       ->  throw(error(existence_error(method,Mname/A),
+                   context(jpl_call/4,
+                           'the class or object has no public methods with the given name and quantity of parameters')))
+       ;   findall(
+           z5(I,Mods,MID,Tr,Tfps),             % those to which Params is assignable
+           (   member(z5(I,Mods,MID,Tr,Tfps), Z5s),
+               jpl_types_fit_types(Taps, Tfps) % assignability test: actual param types "fit" formal param types
            ),
-           Z5sA                                % Args-assignable methods
+           Z5sA                                % Params-assignable methods
        ),
        (   Z5sA == []
-       ->  write('Warning: no type-assignable methods'), nl, fail
-       ;   Z5sA = [z5(I,Mods,MID,Tr,Tps)]
-       ->  true                % exactly one applicable method
-       ;   jpl_z5s_to_most_specific_z5(Z5sA, z5(I,Mods,MID,Tr,Tps))
-       ->  true                % exactly one most-specific applicable method
-       ;   write('Error: no single most-specific method'), nl, fail
-       )
-    ),
-    (  T = Tx
-    -> jpl_type_to_class(Tx, Cc),
-       (   member(static, Mods)
-       ->  jpl_call_static(Tr, Cc, MID, Tps, Args, Rx)
-       ;   jpl_call_instance(Tr, Cc, MID, Tps, Args, Rx)
+       ->  throw(error(type_error(method_params,Params),
+                       context(jpl_call/4,
+                               'the actual parameters are not assignable to the formal parameters of any of the named methods')))
+
+       ;   Z5sA = [z5(I,Mods,MID,Tr,Tfps)]
+       ->  true                                % exactly one applicable method
+       ;   jpl_z5s_to_most_specific_z5(Z5sA, z5(I,Mods,MID,Tr,Tfps))
+       ->  true                                % exactly one most-specific applicable method
+       ;   throw(error(existence_error(most_specific_method,Mname/Params),
+                       context(jpl_call/4,
+                               'more than one most-specific method is found for the actual parameters (this should not happen)')))
        )
-    ;  T = Tx2
-    -> jpl_call_static(Tr, X, MID, Tps, Args, Rx)
-    ).
-
-jpl_call_1(Tx, X, Mspec, Argz, Rx) :-  % regular instance object,
-    (  Tx = class(_,_)
-    ;  Tx = array(_)
-    ),
-    !,                                 % or instance of java.lang.Class
-    (  integer(Mspec)                  % i.e. a method index
-    -> I = Mspec
-    ;  atom(Mspec)                     % i.e. a method name
-    -> N = Mspec
-    ;  jpl_is_methodID(Mspec)          % i.e. a method ID
-    -> MID = Mspec
-    ),
-    (  is_list(Argz)
-    -> Args = Argz,
-       length(Args, A)
-    ;  Args = [Argz],
-       A = 1
-    ),
-  % Tx = class(Ps,Cs),
-    findall(
-       z5(I,Mods,MID,Tr,Tps),
-       jpl_method_spec(Tx, I, N, A, Mods, MID, Tr, Tps),
+       ),
+       (   member(static, Mods)                                        % if the chosen method is static
+       ->  jpl_object_to_class(Obj, ClassObj),                         % get a java.lang.Class instance which personifies Obj's class
+       jpl_call_static_method(Tr, ClassObj, MID, Tfps, Params, Rx) % call static method w.r.t. associated Class object
+       ;   jpl_call_instance_method(Tr, Obj, MID, Tfps, Params, Rx)    % else call (non-static) method w.r.t. object itself
+       ).
+
+%------------------------------------------------------------------------------
+
+%%     jpl_call_static(+ClassType, +ClassObject, +MethodName, Params,
+%%                     ActualParamTypes, Arity, -Result)
+%
+%      call the MethodName-d static method of   the  class (which is of
+%      ClassType, and which  is  represented   by  the  java.lang.Class
+%      instance ClassObject) which most specifically applies to Params,
+%      which we have found to   be  (respectively) of ActualParamTypes,
+%      and of which there are Arity, yielding Result
+
+jpl_call_static(Type, ClassObj, Mname, Params, Taps, A, Rx) :-
+       findall(                    % get all accessible static methods of the class denoted by Type and ClassObj
+       z5(I,Mods,MID,Tr,Tfps),
+       (   jpl_method_spec(Type, I, Mname, A, Mods, MID, Tr, Tfps),
+           member(static, Mods)
+       ),
        Z5s
-    ),
-    (  Z5s = []
-    -> write('Warning: no arity-matching methods'), nl, fail
-    ;  Z5s = [z5(I,Mods,MID,Tr,Tps)]
-    -> true                                    % exactly one static method
-    ;  jpl_datums_to_types(Args, Tas), % most specific types
-       findall(
-           z5(I,Mods,MID,Tr,Tps),              % those to which Args is assignable
-           (   member(z5(I,Mods,MID,Tr,Tps), Z5s),
-               jpl_types_fit_types(Tas, Tps)   % assignability test
+       ),
+       (   Z5s = []
+       ->  throw(error(existence_error(method,Mname/A),
+                   context(jpl_call/4,
+                           'the class has no public static methods with the given name and quantity of parameters')))
+       ;   findall(
+           z5(I,Mods,MID,Tr,Tfps),
+           (   member(z5(I,Mods,MID,Tr,Tfps), Z5s),
+               jpl_types_fit_types(Taps, Tfps) % assignability test: actual param types "fit" formal param types
            ),
-           Z5sA                                % Args-assignable methods
+           Z5sA                                % Params-assignable methods
        ),
        (   Z5sA == []
-       ->  write('Warning: no type-assignable methods'), nl, fail
-       ;   Z5sA = [z5(I,Mods,MID,Tr,Tps)]
-       ->  true                                % exactly one applicable method
-       ;   jpl_z5s_to_most_specific_z5(Z5sA, z5(I,Mods,MID,Tr,Tps))
-       ->  true                                % exactly one most-specific applicable method
-       ;   write('Error: no single most-specific method'), nl, fail
+       ->  throw(error(type_error(method_params,Params),
+                       context(jpl_call/4,
+                               'the actual parameters are not assignable to the formal parameters of any of the named methods')))
+       ;   Z5sA = [z5(I,Mods,MID,Tr,Tfps)]
+       ->  true                % exactly one applicable method
+       ;   jpl_z5s_to_most_specific_z5(Z5sA, z5(I,Mods,MID,Tr,Tfps))
+       ->  true                % exactly one most-specific applicable method
+       ;   throw(error(existence_error(most_specific_method,Mname/Params),
+                       context(jpl_call/4,
+                               'more than one most-specific method is found for the actual parameters (this should not happen)')))
        )
-    ),
-    (  member(static, Mods)
-    -> jpl_object_to_class(X, Cx),
-       jpl_call_static(Tr, Cx, MID, Tps, Args, Rx)
-    ;  jpl_call_instance(Tr, X, MID, Tps, Args, Rx)
-    ).
+       ),
+       jpl_call_static_method(Tr, ClassObj, MID, Tfps, Params, Rx).
 
 %------------------------------------------------------------------------------
 
-jpl_call_instance(void, Class, MID, Ts, As, R) :-
-    jCallVoidMethod(Class, MID, Ts, As),
-    R = @(void).
+% jpl_call_instance_method(+Type, +ClassObject, +MethodID, +FormalParamTypes, +Params, -Result) :-
+
+jpl_call_instance_method(void, Class, MID, Tfps, Ps, R) :-
+       jCallVoidMethod(Class, MID, Tfps, Ps),
+       jpl_void(R).
 
-jpl_call_instance(boolean, Class, MID, Ts, As, R) :-
-    jCallBooleanMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(boolean, Class, MID, Tfps, Ps, R) :-
+       jCallBooleanMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_instance(byte, Class, MID, Ts, As, R) :-
-    jCallByteMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(byte, Class, MID, Tfps, Ps, R) :-
+       jCallByteMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_instance(char, Class, MID, Ts, As, R) :-
-    jCallCharMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(char, Class, MID, Tfps, Ps, R) :-
+       jCallCharMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_instance(short, Class, MID, Ts, As, R) :-
-    jCallShortMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(short, Class, MID, Tfps, Ps, R) :-
+       jCallShortMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_instance(int, Class, MID, Ts, As, R) :-
-    jCallIntMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(int, Class, MID, Tfps, Ps, R) :-
+       jCallIntMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_instance(long, Class, MID, Ts, As, R) :-
-    jCallLongMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(long, Class, MID, Tfps, Ps, R) :-
+       jCallLongMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_instance(float, Class, MID, Ts, As, R) :-
-    jCallFloatMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(float, Class, MID, Tfps, Ps, R) :-
+       jCallFloatMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_instance(double, Class, MID, Ts, As, R) :-
-    jCallDoubleMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(double, Class, MID, Tfps, Ps, R) :-
+       jCallDoubleMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_instance(array(_), Class, MID, Ts, As, R) :-
-    jCallObjectMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(array(_), Class, MID, Tfps, Ps, R) :-
+       jCallObjectMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_instance(class(_,_), Class, MID, Ts, As, R) :-
-    jCallObjectMethod(Class, MID, Ts, As, R).
+jpl_call_instance_method(class(_,_), Class, MID, Tfps, Ps, R) :-
+       jCallObjectMethod(Class, MID, Tfps, Ps, R).
 
 %------------------------------------------------------------------------------
 
-jpl_call_static(void, Class, MID, Ts, As, R) :-
-    jCallStaticVoidMethod(Class, MID, Ts, As),
-    R = @(void).
+% jpl_call_static_method(+Type, +ClassObject, +MethodID, +FormalParamTypes, +Params, -Result) :-
+
+jpl_call_static_method(void, Class, MID, Tfps, Ps, R) :-
+       jCallStaticVoidMethod(Class, MID, Tfps, Ps),
+       jpl_void(R).
 
-jpl_call_static(boolean, Class, MID, Ts, As, R) :-
-    jCallStaticBooleanMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(boolean, Class, MID, Tfps, Ps, R) :-
+       jCallStaticBooleanMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_static(byte, Class, MID, Ts, As, R) :-
-    jCallStaticByteMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(byte, Class, MID, Tfps, Ps, R) :-
+       jCallStaticByteMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_static(char, Class, MID, Ts, As, R) :-
-    jCallStaticCharMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(char, Class, MID, Tfps, Ps, R) :-
+       jCallStaticCharMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_static(short, Class, MID, Ts, As, R) :-
-    jCallStaticShortMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(short, Class, MID, Tfps, Ps, R) :-
+       jCallStaticShortMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_static(int, Class, MID, Ts, As, R) :-
-    jCallStaticIntMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(int, Class, MID, Tfps, Ps, R) :-
+       jCallStaticIntMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_static(long, Class, MID, Ts, As, R) :-
-    jCallStaticLongMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(long, Class, MID, Tfps, Ps, R) :-
+       jCallStaticLongMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_static(float, Class, MID, Ts, As, R) :-
-    jCallStaticFloatMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(float, Class, MID, Tfps, Ps, R) :-
+       jCallStaticFloatMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_static(double, Class, MID, Ts, As, R) :-
-    jCallStaticDoubleMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(double, Class, MID, Tfps, Ps, R) :-
+       jCallStaticDoubleMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_static(array(_), Class, MID, Ts, As, R) :-
-    jCallStaticObjectMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(array(_), Class, MID, Tfps, Ps, R) :-
+       jCallStaticObjectMethod(Class, MID, Tfps, Ps, R).
 
-jpl_call_static(class(_,_), Class, MID, Ts, As, R) :-
-    jCallStaticObjectMethod(Class, MID, Ts, As, R).
+jpl_call_static_method(class(_,_), Class, MID, Tfps, Ps, R) :-
+       jCallStaticObjectMethod(Class, MID, Tfps, Ps, R).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_fergus_find_candidate(list(T), T, T, list(T))
+%type   jpl_fergus_find_candidate(list(T), T, T, list(T))
 
 jpl_fergus_find_candidate([], Candidate, Candidate, []).
 
 jpl_fergus_find_candidate([X|Xs], Candidate0, Candidate, Rest) :-
-    (  jpl_fergus_greater(X, Candidate0)
-    -> Candidate1 = X,
+       (   jpl_fergus_greater(X, Candidate0)
+       ->  Candidate1 = X,
        Rest = [Candidate0|Rest1]
-    ;  Candidate1 = Candidate0,
+       ;   Candidate1 = Candidate0,
        Rest = [X|Rest1]
-    ),
-    jpl_fergus_find_candidate(Xs, Candidate1, Candidate, Rest1).
+       ),
+       jpl_fergus_find_candidate(Xs, Candidate1, Candidate, Rest1).
 
 %------------------------------------------------------------------------------
 
 jpl_fergus_greater(z5(_,_,_,_,Tps1), z5(_,_,_,_,Tps2)) :-
-    jpl_types_fit_types(Tps1, Tps2).
+       jpl_types_fit_types(Tps1, Tps2).
 jpl_fergus_greater(z3(_,_,Tps1), z3(_,_,Tps2)) :-
-    jpl_types_fit_types(Tps1, Tps2).
+       jpl_types_fit_types(Tps1, Tps2).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_fergus_is_the_greatest(list(T), T)
+%type   jpl_fergus_is_the_greatest(list(T), T)
 
-% jpl_fergus_is_the_greatest(Xs, GreatestX) :-
-%   Xs is a list of things for which jpl_fergus_greater/2 defines a partial ordering;
-%   GreatestX is one of those, than which none is greater;
-%   fails if there is more than one such;
-%   this algorithm was contributed to c.l.p by Fergus Henderson in response to my
-%   "there must be a better way" challenge: there was, this is it
+%%     jpl_fergus_is_the_greatest(Xs, GreatestX)
+%
+%      Xs is a list of things  for which jpl_fergus_greater/2 defines a
+%      partial ordering; GreatestX is one of  those, than which none is
+%      greater; fails if there is more   than  one such; this algorithm
+%      was contributed to c.l.p by Fergus   Henderson in response to my
+%      "there must be a better way" challenge: there was, this is it
 
 jpl_fergus_is_the_greatest([X|Xs], Greatest) :-
-    jpl_fergus_find_candidate(Xs, X, Greatest, Rest),
-    forall(member(R, Rest),
-          jpl_fergus_greater(Greatest, R)).
+       jpl_fergus_find_candidate(Xs, X, Greatest, Rest),
+       forall(
+       member(R, Rest),
+       jpl_fergus_greater(Greatest, R)
+       ).
 
 %------------------------------------------------------------------------------
 
-% jpl_get(+X, +Fspec, -V) :-
+%%     jpl_get(+X, +Fspec, -V)
+%      
 %   X can be:
-%     a class object, a classname, or an (object or array) type
-%      (for static fields, or java.lang.Class fields);
-%     a class instance
-%      (for non-static fields)
-%     an array
-%      (for 'length' pseudo field, or indexed element retrieval),
+%     * a classname, a descriptor, or an (object or array) type
+%       (for static fields);
+%     * a non-array object
+%       (for static and non-static fields)
+%     * an array
+%       (for 'length' pseudo field, or indexed element retrieval),
 %   but not:
-%     a String
-%      (clashes with class name; anyway, String has no fields to retrieve)
+%     * a String
+%       (clashes with class name; anyway, String has no fields to retrieve)
 %
-%   Fspec can be an atomic field name,
-%      or an integral field index,
-%      or a fieldID/1
-%      or a variable (field names, or array indices, are generated
-%      or a pair I-J of integers or variables (array subranges are generated)
+%   Fspec can be:
+%       * an atomic field name,
+%       * or an integral array index (to get an element from an array,
+%      * or a pair I-J of integers (to get a subrange (slice?) of an
+%        array)
 %
 %   finally, an attempt will be made to unify V with the retrieved value
 
 jpl_get(X, Fspec, V) :-
-    (  jpl_is_object(X)        % i.e. instance of class(_,_) or array(_) type
-    -> jpl_object_to_type(X, Type),
-       Obj = X
-    ;  jpl_is_type(X)          % e.g. class([java,lang],['String']), array(int)
-    -> jpl_type_to_class(X, Obj),
-       Type = class([java,lang],['Class'])
-    ;  atom(X)         % e.g. 'java.lang.String', '[L'
-    -> jpl_classname_to_type(X, Tx),
-       jpl_type_to_class(Tx, Obj),
-       Type = class([java,lang],['Class'])
-    ),
-    jpl_get_1(Type, Obj, Fspec, Vx),
-    V = Vx.
-
-%------------------------------------------------------------------------------
-
-% jpl_get_1(+Type, +Object, +FieldSpec, -ResultValue) :-
-%   Object may be a class object, in which case Type is class([java,lang],['Class'])
-%   ResultValue (Vx below) is guaranteed unbound on entry,
-%   and will, before exit, be unified with the retrieved value
-
-jpl_get_1(Tx, X, Fspec, Vx) :-         % static field?
-    Tx = class([java,lang],['Class']), % a class object...
-    jpl_class_to_type(X, Tx2),
-    Tx2 \== Tx,                        % ...other than java.lang.Class itself
-    !,
-    (  integer(Fspec)          % assume it's a field or array index
-    -> I = Fspec
-    ;  atom(Fspec)             % assume it's a field name
-    -> N = Fspec
-    ;  jpl_is_fieldID(Fspec)   % assume it's a JNI field ID
-    -> FID = Fspec
-    ;  var(Fspec)              % experimentally...
-    -> N = Fspec               % we'll generate field names
-    ),
-  % consider static and instance fields of java.lang.Class
-  % and static fields of the denoted class
-    findall(
-       z2(T,I,N,Mods,FID,Tf),
-       (   T = Tx,
-           jpl_field_spec(T, I, N, Mods, FID, Tf)
-       ;   T = Tx2,
-           jpl_field_spec(T, I, N, Mods, FID, Tf),
-           member(static, Mods)
+       (   jpl_object_to_type(X, Type)
+       ->  Obj = X,
+           jpl_get_instance( Type, Type, Obj, Fspec, Vx)   % pass Type twice for FAI
+       ;   var(X)
+       ->  throw(error(instantiation_error,
+                   context(jpl_get/3,
+                           '1st arg must be bound to an object, classname, descriptor or type')))
+       ;   jpl_is_type(X)          % e.g. class([java,lang],['String']), array(int)
+       ->  Type = X,
+           (   jpl_type_to_class(Type, ClassObj)
+           ->  jpl_get_static( Type, ClassObj, Fspec, Vx)
+           ;   jpl_type_to_classname( Type, Classname),
+               throw(error(existence_error(class,Classname),
+                           context(jpl_get/3,
+                                   'the named class cannot be found')))
+           )
+       ;   atom(X)
+       ->  (   jpl_classname_to_type( X, Type)     % does this attempt to load the class?
+           ->  (   jpl_type_to_class( Type, ClassObj)
+               ->  jpl_get_static( Type, ClassObj, Fspec, Vx)
+               ;   throw(error(existence_error(class,X),
+                               context(jpl_get/3,
+                                       'the named class cannot be found')))
+               )
+           ;   throw(error(type_error(class_name_or_descriptor,X),
+                           context(jpl_get/3, '1st arg must be an object, classname, descriptor or type')))
+           )
+
+       ;   throw(error(domain_error(object_or_class,X),
+                   context(jpl_get/3,
+                           '1st arg must be bound to an object, classname, descriptor or type')))
        ),
-       Z2s
-    ),
-    (  Z2s = [],
-       nonvar(Fspec)
-    -> write('Warning: no matching fields'), nl, fail
-    ;  member(z2(T,I,N,Mods,FID,Tf), Z2s),     % generate one or many
-       (   T = Tx
-       ->  jpl_type_to_class(Tx, Cc),
-           (   member(static, Mods)
-           ->  jpl_get_static_field(Tf, Cc, FID, Vx)
-           ;   jpl_get_field(Tf, Cc, FID, Vx)
+       (   nonvar(V),
+           V = {Term}  % yucky way of requesting Term->term conversion
+       ->  (   jni_jref_to_term( Vx, TermX)    % fails if Rx is not a JRef to a jpl.Term
+           ->  Term = TermX
+           ;   throw(error(type_error,
+                           context(jpl_call/4, 'result is not a jpl.Term instance as required')))
            )
-       ;   T = Tx2
-       ->  jpl_get_static_field(Tf, X, FID, Vx)
-       )
-    ).
-
-jpl_get_1(Tx, X, Fspec, Vx) :-
-    Tx = class(_,_),
-    !,
-    (  integer(Fspec)              % assume it's a field or array index
-    -> I = Fspec
-    ;  atom(Fspec)                 % assume it's a field name
-    -> N = Fspec
-    ;  jpl_is_fieldID(Fspec)       % assume it's a JNI field ID (???)
-    -> FID = Fspec
-    ;  var(Fspec)
-    -> N = Fspec                   % we'll generate field names
-    ),
-  % instance object, or the java.lang.Class object itself
-    findall(z(I,N,Mods,FID,Tf),
-       jpl_field_spec(Tx, I, N, Mods, FID, Tf),
-       Zs
-    ),
-    (  Zs = []
-    -> write('Warning: no matching fields'), nl, fail
-    ;  member(z(I,N,Mods,FID,Tf), Zs),    % generate one or many
-       (   member(static, Mods)
-       ->  jpl_object_to_class(X, Cx),
-           jpl_get_static_field(Tf, Cx, FID, Vx)
-       ;   jpl_get_field(Tf, X, FID, Vx)
-       )   
-    ).
-
-jpl_get_1(array(T), X, Fspec, Vx) :-
-    (  integer(Fspec),
-       Fspec >= 0                  % leave HiBound check to Java...
-    -> jpl_get_array_element(T, X, Fspec, Vx)
-    ;  Fspec == length             % special-case this solitary array "method"
-    -> jGetArrayLength(X, Len),
-       Vx = Len
-    ;  var(Fspec)
-    -> jGetArrayLength(X, Len),   % generate length field and elements
-       Max is Len-1,
-       (   Fspec = length,
-           Vx = Len
-       ;   between(0, Max, Fspec),
-           jpl_get_array_element(T, X, Fspec, Vx)
-       )
-    ;  Fspec = N-M,
-       (integer(N) ; var(N) ),
-       (integer(M) ; var(M) )
-    -> jGetArrayLength(X, Len),
-       Max is Len-1,
-       between(0, Max, N),
-      % Mmin is N-1,               % generates many empty sublists
-       Mmin is N,                  % generates no empty sublists
-                                   % you want _one_ empty sublist? which one? ...
-       between(Mmin, Max, M),
-       jpl_get_array_elements(T, X, N, M, Vx)
-    ).
-
-%------------------------------------------------------------------------------
-
-% jpl_get_array_element(+JspType, +Obj, +N, -Vc) :-
-%   Obj is an array of JspType;
-%   Vc is (unified with a JPL repn of) its Nth element (numbered from 0)
-%   NB the nonsense with Xhi and Xlo should be expunged:
-%   values should be converted to terms within foreign code
-
-jpl_get_array_element(T, Obj, N, Vc) :-
-    (  (   T = class(_,_)
-       ;   T = array(_)
-       )
-    -> jGetObjectArrayElement(Obj, N, Vr)
-    ;  jpl_primitive_type(T)
-    -> jni_type_to_xput_code(T, Xc),
-       jni_alloc_buffer(Xc, 1, Bp),                    % one-element buf for a T
-       jpl_get_primitive_array_region(T, Obj, N, 1, Bp),
-       jni_fetch_buffer_value(Bp, 0, Xhi, Xlo, Xc),    % zero-th element
-       jni_convert_primitive_in(T, Vr, Xhi, Xlo),
-       jni_free_buffer(Bp)
-    ),
-    Vr = Vc.
+       ;   V = Vx
+       ).
 
 %------------------------------------------------------------------------------
 
-% jpl_get_array_elements(+Type, +Object, +N, +M, -Rs) :-
-%   serves only jpl_get_1
-%   Rs will always be unbound on entry
+%%     jpl_get_static(+Type, +ClassObject, +FieldName, -Value)
+%
+%      ClassObject is an instance of   java.lang.Class which represents
+%      the same class as Type; Value   (Vx below) is guaranteed unbound
+%      on entry, and will, before exit,   be unified with the retrieved
+%      value
 
-jpl_get_array_elements(T, Obj, N, M, Rs) :-
-    (  (   T = class(_,_)
-       ;   T = array(_)
-       )
-    -> jpl_get_object_array_elements(Obj, N, M, Rs)
-    ;  jpl_get_primitive_array_elements(T, Obj, N, M, Rs)
-    ).
+jpl_get_static(Type, ClassObj, Fname, Vx) :-
+       (   atom(Fname)             % assume it's a field name
+       ->  true
+       ;   var(Fname)
+       ->  throw(error(instantiation_error,
+                   context(jpl_get/3, '2nd arg must be bound to an atom naming a public field of the class')))
+       ;   throw(error(type_error(field_name,Fname),
+                   context(jpl_get/3, '2nd arg must be an atom naming a public field of the class')))
+       ),
+  % get static fields of the denoted class
+       findall(
+       z4(I,Mods,FID,Tf),
+       (   jpl_field_spec(Type, I, Fname, Mods, FID, Tf),
+           member(static, Mods)
+       ),
+       Z4s
+       ),
+       (   Z4s = []
+       ->  throw(error(existence_error(field,Fname),
+                   context(jpl_get/3,
+                           'the class or object has no public static field with the given name')))
+       ;   Z4s = [z4(I,_Mods,FID,Tf)]
+       ->  jpl_get_static_field(Tf, ClassObj, FID, Vx)
+       ;   throw(error(existence_error(unique_field,Fname),
+                   context(jpl_get/3,
+                           'more than one field is found with the given name')))
+       ).
 
 %------------------------------------------------------------------------------
 
-jpl_get_field(boolean, Obj, FieldID, R) :-
-    jGetBooleanField(Obj, FieldID, R).
-
-jpl_get_field(byte, Obj, FieldID, R) :-
-    jGetByteField(Obj, FieldID, R).
-
-jpl_get_field(char, Obj, FieldID, R) :-
-    jGetCharField(Obj, FieldID, R).
-
-jpl_get_field(short, Obj, FieldID, R) :-
-    jGetShortField(Obj, FieldID, R).
-
-jpl_get_field(int, Obj, FieldID, R) :-
-    jGetIntField(Obj, FieldID, R).
-
-jpl_get_field(long, Obj, FieldID, R) :-
-    jGetLongField(Obj, FieldID, R).
-
-jpl_get_field(float, Obj, FieldID, R) :-
-    jGetFloatField(Obj, FieldID, R).
-
-jpl_get_field(double, Obj, FieldID, R) :-
-    jGetDoubleField(Obj, FieldID, R).
+% jpl_get_instance(+Type, +Type, +Object, +FieldSpecifier, -Value) :-
 
-jpl_get_field(class(_,_), Obj, FieldID, R) :-
-    jGetObjectField(Obj, FieldID, R).
+jpl_get_instance(class(_,_), Type, Obj, Fname, Vx) :-
+       (   atom(Fname)                 % the usual case
+       ->  true
+       ;   var(Fname)
+       ->  throw(error(instantiation_error,
+                   context(jpl_get/3, '2nd arg must be bound to an atom naming a public field of the class or object')))
+       ;   throw(error(type_error(field_name,Fname),
+                   context(jpl_get/3, '2nd arg must be an atom naming a public field of the class or object')))
+       ),
+       findall(z4(I,Mods,FID,Tf),
+               jpl_field_spec(Type, I, Fname, Mods, FID, Tf),
+               Z4s),
+       (   Z4s = []
+       ->  throw(error(existence_error(field,Fname),
+                       context(jpl_get/3,
+                               'the class or object has no public field with the given name')))
+       ;   Z4s = [z4(I,Mods,FID,Tf)]
+       ->  (   member(static, Mods)
+           ->  jpl_object_to_class(Obj, ClassObj),
+               jpl_get_static_field(Tf, ClassObj, FID, Vx)
+           ;   jpl_get_instance_field(Tf, Obj, FID, Vx)
+           )   
+       ;   throw(error(existence_error(unique_field,Fname),
+                   context(jpl_get/3,
+                           'more than one field is found with the given name')))
+       ).
 
-jpl_get_field(array(_), Obj, FieldID, R) :-
-    jGetObjectField(Obj, FieldID, R).
+jpl_get_instance(array(ElementType), _, Array, Fspec, Vx) :-
+       (   var(Fspec)
+       ->  throw(error(instantiation_error,
+                       context(jpl_get/3,
+                               'when 1st arg is an array, 2nd arg must be bound to an index, an index range, or ''length''')))
+       ;   integer(Fspec)
+       ->  (   Fspec < 0       % lo bound check
+           ->  throw(error(domain_error(array_index,Fspec),
+                           context(jpl_get/3,
+                                   'when 1st arg is an array, integral 2nd arg must be non-negative')))
+           ;   jGetArrayLength(Array, Len),
+               Fspec >= Len    % hi bound check
+           ->  throw(error(domain_error(array_index,Fspec),
+                           context(jpl_get/3,
+                                   'when 1st arg is an array, integral 2nd arg must not exceed upper bound of array')))
+           ;   jpl_get_array_element(ElementType, Array, Fspec, Vx)
+           )
+       ;   Fspec = N-M     % NB should we support e.g. 3-2 -> [] ?
+       ->  (   integer(N),
+               integer(M)
+           ->  (   N >= 0,
+                   M >= N
+               ->  jGetArrayLength(Array, Len),
+                   (   N >= Len
+                   ->  throw(error(domain_error(array_index_range,N-M),
+                                   context(jpl_get/3,
+                                           'lower bound of array index range must not exceed upper bound of array')))
+                   ;   M >= Len
+                   ->  throw(error(domain_error(array_index_range,N-M),
+                                   context(jpl_get/3,
+                                           'upper bound of array index range must not exceed upper bound of array')))
+                   ;   jpl_get_array_elements(ElementType, Array, N, M, Vx)
+                   )
+               ;   throw(error(domain_error(array_index_range,N-M),
+                               context(jpl_get/3,
+                                       'array index range must be a non-decreasing pair of non-negative integers')))
+               )
+           ;   throw(error(type_error(array_index_range,N-M),
+                           context(jpl_get/3,
+                                   'array index range must be a non-decreasing pair of non-negative integers')))
+           )
+       ;   atom(Fspec)
+       ->  (   Fspec == length             % special-case for this solitary array "method"
+           ->  jGetArrayLength(Array, Vx)
+           ;   throw(error(domain_error(array_field_name,Fspec),
+                           context(jpl_get/3,
+                                   'the array has no public field with the given name')))
+           )
+       ;   throw(error(type_error(array_lookup_spec,Fspec),
+                       context(jpl_get/3,
+                               'when 1st arg is an array, 2nd arg must be an index, an index range, or ''length''')))
+       ).
 
 %------------------------------------------------------------------------------
 
-% jpl_get_object_array_elements(+Type, +Object, +N, +M, -Vcs) :-
-%   Type is some object or array type;
-%   Object should be a (zero-based) array of element-type Type;
-%   N is an integer, 0 =< N < length(Object);
-%   M is an integer, N-1 =< M < length(Object);
-%   at call, Vcs will be unbound;
-%   at exit, Vcs will be a list of refs to the array's elements from index N to M inclusive
+%%     jpl_get_array_element(+ElementType, +Array, +Index, -Vc)
+%
+%      Array is (a  reference  to)  an   array  of  ElementType;  Vc is
+%      (unified with a JPL repn  of)   its  Index-th  (numbered from 0)
+%      element Java values are now  converted   to  Prolog terms within
+%      foreign code
+%      
+%      @tbd    more of this could be done within foreign code ...
 
-jpl_get_object_array_elements(Obj, N, M, Vcs) :-
-    (  N =< M
-    -> Vcs = [Vc|Vcs2],
-       jGetObjectArrayElement(Obj, N, Vc),
-       Nx is N+1,
-       jpl_get_object_array_elements(Obj, Nx, M, Vcs2)
-    ;  Vcs = []
-    ).
+jpl_get_array_element(Type, Array, Index, Vc) :-
+       (   (   Type = class(_,_)
+           ;   Type = array(_)
+           )
+       ->  jGetObjectArrayElement(Array, Index, Vr)
+       ;   jpl_primitive_type(Type)
+       ->  jni_type_to_xput_code(Type, Xc),
+           jni_alloc_buffer(Xc, 1, Bp),                % one-element buf for a Type
+           jpl_get_primitive_array_region(Type, Array, Index, 1, Bp),
+           jni_fetch_buffer_value(Bp, 0, Vr, Xc),      % zero-th element
+           jni_free_buffer(Bp)
+       ),
+       Vr = Vc.    % redundant since Vc is always (?) unbound at call
 
 %------------------------------------------------------------------------------
 
-% jpl_get_primitive_array_elements(+JspType, +Object, +N, +M, -Vcs) :-
-%   Object should be a (zero-based) Java array of (primitive) JspType;
-%   Vcs will be unbound on entry,
-%   and on exit will be a list of the elements from index N to M inclusive
+%%     jpl_get_array_elements(+ElementType, +Array, +N, +M, -Vs)
+%
+%      serves only jpl_get_instance Vs will always be unbound on entry
 
-jpl_get_primitive_array_elements(T, Obj, N, M, Vcs) :-
-    Size is M-N+1,
-    (  Size == 0
-    -> Vcs = []
-    ;  jni_type_to_xput_code(T, Xc),
-       jni_alloc_buffer(Xc, Size, Bp),
-       jpl_get_primitive_array_region(T, Obj, N, Size, Bp),
-       jpl_primitive_buffer_to_array(T, Xc, Bp, 0, Size, Vcs),
-       jni_free_buffer(Bp)
-    ).
+jpl_get_array_elements(ElementType, Array, N, M, Vs) :-
+       (   (   ElementType = class(_,_)
+           ;   ElementType = array(_)
+           )
+       ->  jpl_get_object_array_elements(Array, N, M, Vs)
+       ;   jpl_get_primitive_array_elements(ElementType, Array, N, M, Vs)
+       ).
 
 %------------------------------------------------------------------------------
 
-jpl_get_primitive_array_region(boolean, Obj, N, S, I) :-
-    jGetBooleanArrayRegion(Obj, N, S, jbuf(I,boolean)).
-
-jpl_get_primitive_array_region(byte, Obj, N, S, I) :-
-    jGetByteArrayRegion(Obj, N, S, jbuf(I,byte)).
-
-jpl_get_primitive_array_region(char, Obj, N, S, I) :-
-    jGetCharArrayRegion(Obj, N, S, jbuf(I,char)).
-
-jpl_get_primitive_array_region(short, Obj, N, S, I) :-
-    jGetShortArrayRegion(Obj, N, S, jbuf(I,short)).
-
-jpl_get_primitive_array_region(int, Obj, N, S, I) :-
-    jGetIntArrayRegion(Obj, N, S, jbuf(I,int)).
-
-jpl_get_primitive_array_region(long, Obj, N, S, I) :-
-    jGetLongArrayRegion(Obj, N, S, jbuf(I,long)).
-
-jpl_get_primitive_array_region(float, Obj, N, S, I) :-
-    jGetFloatArrayRegion(Obj, N, S, jbuf(I,float)).
-
-jpl_get_primitive_array_region(double, Obj, N, S, I) :-
-    jGetDoubleArrayRegion(Obj, N, S, jbuf(I,double)).
+jpl_get_instance_field(boolean, Obj, FieldID, V) :-
+       jGetBooleanField(Obj, FieldID, V).
+jpl_get_instance_field(byte, Obj, FieldID, V) :-
+       jGetByteField(Obj, FieldID, V).
+jpl_get_instance_field(char, Obj, FieldID, V) :-
+       jGetCharField(Obj, FieldID, V).
+jpl_get_instance_field(short, Obj, FieldID, V) :-
+       jGetShortField(Obj, FieldID, V).
+jpl_get_instance_field(int, Obj, FieldID, V) :-
+       jGetIntField(Obj, FieldID, V).
+jpl_get_instance_field(long, Obj, FieldID, V) :-
+       jGetLongField(Obj, FieldID, V).
+jpl_get_instance_field(float, Obj, FieldID, V) :-
+       jGetFloatField(Obj, FieldID, V).
+jpl_get_instance_field(double, Obj, FieldID, V) :-
+       jGetDoubleField(Obj, FieldID, V).
+jpl_get_instance_field(class(_,_), Obj, FieldID, V) :-
+       jGetObjectField(Obj, FieldID, V).
+jpl_get_instance_field(array(_), Obj, FieldID, V) :-
+       jGetObjectField(Obj, FieldID, V).
 
 %------------------------------------------------------------------------------
 
-jpl_get_static_field(boolean, Obj, FieldID, R) :-
-    jGetStaticBooleanField(Obj, FieldID, R).
-
-jpl_get_static_field(byte, Obj, FieldID, R) :-
-    jGetStaticByteField(Obj, FieldID, R).
-
-jpl_get_static_field(char, Obj, FieldID, R) :-
-    jGetStaticCharField(Obj, FieldID, R).
-
-jpl_get_static_field(short, Obj, FieldID, R) :-
-    jGetStaticShortField(Obj, FieldID, R).
-
-jpl_get_static_field(int, Obj, FieldID, R) :-
-    jGetStaticIntField(Obj, FieldID, R).
-
-jpl_get_static_field(long, Obj, FieldID, R) :-
-    jGetStaticLongField(Obj, FieldID, R).
-
-jpl_get_static_field(float, Obj, FieldID, R) :-
-    jGetStaticFloatField(Obj, FieldID, R).
-
-jpl_get_static_field(double, Obj, FieldID, R) :-
-    jGetStaticDoubleField(Obj, FieldID, R).
+%%     jpl_get_object_array_elements(+Array, +LoIndex, +HiIndex, -Vcs)
+%
+%      Array should be a (zero-based) array   of  some object (array or
+%      non-array)  type;  LoIndex  is  an  integer,   0  =<  LoIndex  <
+%      length(Array); HiIndex is an  integer,   LoIndex-1  =< HiIndex <
+%      length(Array); at call, Vcs will be   unbound; at exit, Vcs will
+%      be  a  list   of   (references    to)   the   array's   elements
+%      [LoIndex..HiIndex] inclusive
+
+jpl_get_object_array_elements(Array, Lo, Hi, Vcs) :-
+       (   Lo =< Hi
+       ->  Vcs = [Vc|Vcs2],
+           jGetObjectArrayElement(Array, Lo, Vc),
+           Next is Lo+1,
+           jpl_get_object_array_elements(Array, Next, Hi, Vcs2)
+       ;   Vcs = []
+       ).
 
-jpl_get_static_field(class(_,_), Obj, FieldID, R) :-
-    jGetStaticObjectField(Obj, FieldID, R).
+%------------------------------------------------------------------------------
 
-jpl_get_static_field(array(_), Obj, FieldID, R) :-
-    jGetStaticObjectField(Obj, FieldID, R).
+%%     jpl_get_primitive_array_elements(+ElementType, +Array, +LoIndex, +HiIndex, -Vcs)
+%
+%      Array  should  be  a  (zero-based)  Java  array  of  (primitive)
+%      ElementType; Vcs should be unbound on entry, and on exit will be
+%      a list of (JPL representations of   the  values of) the elements
+%      [LoIndex..HiIndex] inclusive
+
+jpl_get_primitive_array_elements(ElementType, Array, Lo, Hi, Vcs) :-
+       Size is Hi-Lo+1,
+       (   Size == 0
+       ->  Vcs = []
+       ;   jni_type_to_xput_code(ElementType, Xc),
+           jni_alloc_buffer(Xc, Size, Bp),
+           jpl_get_primitive_array_region(ElementType, Array, Lo, Size, Bp),
+           jpl_primitive_buffer_to_array(ElementType, Xc, Bp, 0, Size, Vcs),
+           jni_free_buffer(Bp)
+       ).
 
 %------------------------------------------------------------------------------
 
-% jpl_new(+X, +Argz, -V) :-
+jpl_get_primitive_array_region(boolean, Array, Lo, S, I) :-
+       jGetBooleanArrayRegion(Array, Lo, S, jbuf(I,boolean)).
+jpl_get_primitive_array_region(byte, Array, Lo, S, I) :-
+       jGetByteArrayRegion(Array, Lo, S, jbuf(I,byte)).
+jpl_get_primitive_array_region(char, Array, Lo, S, I) :-
+       jGetCharArrayRegion(Array, Lo, S, jbuf(I,char)).
+jpl_get_primitive_array_region(short, Array, Lo, S, I) :-
+       jGetShortArrayRegion(Array, Lo, S, jbuf(I,short)).
+jpl_get_primitive_array_region(int, Array, Lo, S, I) :-
+       jGetIntArrayRegion(Array, Lo, S, jbuf(I,int)).
+jpl_get_primitive_array_region(long, Array, Lo, S, I) :-
+       jGetLongArrayRegion(Array, Lo, S, jbuf(I,long)).
+jpl_get_primitive_array_region(float, Array, Lo, S, I) :-
+       jGetFloatArrayRegion(Array, Lo, S, jbuf(I,float)).
+jpl_get_primitive_array_region(double, Array, Lo, S, I) :-
+       jGetDoubleArrayRegion(Array, Lo, S, jbuf(I,double)).
+
+%------------------------------------------------------------------------------
+
+jpl_get_static_field(boolean, Array, FieldID, V) :-
+       jGetStaticBooleanField(Array, FieldID, V).
+jpl_get_static_field(byte, Array, FieldID, V) :-
+       jGetStaticByteField(Array, FieldID, V).
+jpl_get_static_field(char, Array, FieldID, V) :-
+       jGetStaticCharField(Array, FieldID, V).
+jpl_get_static_field(short, Array, FieldID, V) :-
+       jGetStaticShortField(Array, FieldID, V).
+jpl_get_static_field(int, Array, FieldID, V) :-
+       jGetStaticIntField(Array, FieldID, V).
+jpl_get_static_field(long, Array, FieldID, V) :-
+       jGetStaticLongField(Array, FieldID, V).
+jpl_get_static_field(float, Array, FieldID, V) :-
+       jGetStaticFloatField(Array, FieldID, V).
+jpl_get_static_field(double, Array, FieldID, V) :-
+       jGetStaticDoubleField(Array, FieldID, V).
+jpl_get_static_field(class(_,_), Array, FieldID, V) :-
+       jGetStaticObjectField(Array, FieldID, V).
+jpl_get_static_field(array(_), Array, FieldID, V) :-
+       jGetStaticObjectField(Array, FieldID, V).
+
+%------------------------------------------------------------------------------
+
+%%     jpl_new(+X, +Params, -V)
+%
 %   X can be:
-%    a suitable type
-%      i.e. any class(_,_), array(_) or primitive (i.e. not void)
-%    a class object
-%      i.e. whose type is class([java,lang],['Class'])
-%    an atomic classname
-%      e.g. 'java.lang.String'
-%      e.g. 'Ljava.lang.String;'
-%    an atomic descriptor
-%      e.g. '[I'
+%    * an atomic classname
+%       e.g. 'java.lang.String'
+%    * an atomic descriptor
+%       e.g. '[I' or 'Ljava.lang.String;'
+%    * a suitable type
+%       i.e. any class(_,_) or array(_)
 %
-%   if X denotes a primitive type and Argz is castable to a value of that type,
-%   then V is that value (a pointless mode of operation, but somehow complete...)
+%   if X is an object (non-array)  type   or  descriptor and Params is a
+%   list of values or references, then V  is the result of an invocation
+%   of  that  type's  most  specifically-typed    constructor  to  whose
+%   respective formal parameters the actual   Params are assignable (and
+%   assigned)
 %
-%   if X denotes an array type and Argz is a non-negative integer,
-%   then V is a new array of that many elements,
-%   initialised to the appropriate default value;
+%   if X is an array type or descriptor   and Params is a list of values
+%   or references, each of which is   (independently)  assignable to the
+%   array element type, then V is a  new   array  of as many elements as
+%   Params has members,  initialised  with   the  respective  members of
+%   Params;
 %
-%   if X denotes an array type and Argz is a list of datums,
-%   each of which is (independently) castable to the array element type,
-%   then V is a new array of as many elements as Argz has members,
-%   initialised to the results of casting the respective members of Argz;
+%   if X is an array type  or   descriptor  and Params is a non-negative
+%   integer N, then V is a new array of that type, with N elements, each
+%   initialised to Java's appropriate default value for the type;
 %
-%   if X denotes a non-array object type and Argz is a list of datums,
-%   then V is the result of an invocation of that type's most specifically-typed
-%   constructor to whose respective parameters the members of Argz are assignable
-
-jpl_new(X, Argz, V) :-
-    ground(Argz),
-    (  jpl_is_type(X)                  % NB only class(_,_) or array(_)
-    -> Tx = X
-    ;  jpl_is_object(X),
-       jpl_object_to_type(X, class([java,lang],['Class']))
-    -> jpl_class_to_type(X, Tx)        % get the type this class denotes
-    ;  atom(X)                 % eg 'java.lang.String', '[L'
-    -> jpl_classname_to_type(X, Tx)
-    ),
-
-  % jpl_type_to_classname(Tx, Classname), writeq([jpl_new,Classname,Argz]), nl,
-
-    jpl_new_1(Tx, Argz, Vx),
-    V = Vx.
+%   If V is {Term} then we attempt to convert a new jpl.Term instance to
+%   a corresponding term; this is of  little   obvious  use here, but is
+%   consistent with jpl_call/4 and jpl_get/3
+
+jpl_new(X, Params, V) :-
+       (   var(X)
+       ->  throw(error(instantiation_error,
+                   context(jpl_new/3,
+                           '1st arg must be bound to a classname, descriptor or object type')))
+       ;   jpl_is_type(X)                  % NB only class(_,_) or array(_)
+       ->  Type = X
+       ;   atom(X)                 % e.g. 'java.lang.String', '[L', 'boolean'
+       ->  (   jpl_classname_to_type(X, Type)
+           ->  true
+           ;   throw(error(domain_error(classname,X),
+                           context(jpl_new/3,
+                                   'if 1st arg is an atom, it must be a classname or descriptor')))
+           )
+       ;   throw(error(type_error(instantiable,X),
+                       context(jpl_new/3,
+                               '1st arg must be a classname, descriptor or object type')))
+       ),
+       jpl_new_1(Type, Params, Vx),
+       (   nonvar(V),
+           V = {Term}  % yucky way of requesting Term->term conversion
+       ->  (   jni_jref_to_term( Vx, TermX)    % fails if Rx is not a JRef to a jpl.Term
+           ->  Term = TermX
+           ;   throw(error(type_error,
+                           context(jpl_call/4, 'result is not a jpl.Term instance as required')))
+           )
+       ;   V = Vx
+       ).
 
 %------------------------------------------------------------------------------
 
-% jpl_new_1(+Tx, +Argz, -Vx) :-
+% jpl_new_1(+Tx, +Params, -Vx) :-
 %   (serves only jpl_new/3)
 %
 %   Tx can be:
 %     a class(_,_) or array(_) type;
 %
-%   Argz can be:
-%     a ground, proper list of constructor arguments
-%     a single argument
-%      (sloppy convenience, probably best ditched)
+%   Params must be:
+%     a proper list of constructor parameters
 %
-%   at call, Vx is unbound;
-%   at exit, Vx is bound to a new, initialised ref (or a value) of type Tx
-
-jpl_new_1(class(Ps,Cs), Argz, Vx) :-
-    !,                                     % green (see below)
-    jpl_type_to_class(class(Ps,Cs), Cx),   % ensure class is findable
-    Tx = class(Ps,Cs),
-    (  is_list(Argz)                   % canonise sloppy Argz to Args
-    -> Args = Argz,
-       length(Args, A)
-    ;  Args = [Argz],
-       A = 1
-    ),
-    N = '<init>',      % JNI's constructor naming convention for GetMethodID()
-    Tr = void,         % all constructors have this return "type"
-    findall(
-       z3(I,MID,Tps),
-       jpl_method_spec(Tx, I, N, A, _Mods, MID, Tr, Tps), % cached
+%   at exit, Vx is bound to a JPL reference to a new, initialised instance of Tx
+
+jpl_new_1(class(Ps,Cs), Params, Vx) :-
+       !,                                      % green (see below)
+       Tx = class(Ps,Cs),
+       (   var(Params)
+       ->  throw(error(instantiation_error,
+                   context(jpl_new/3,
+                           '2nd arg must be a proper list of valid parameters for a constructor')))
+       ;   \+ is_list(Params)
+       ->  throw(error(type_error(list,Params),
+                   context(jpl_new/3,
+                           '2nd arg must be a proper list of valid parameters for a constructor')))
+       ;   true
+       ),
+       length(Params, A),          % the "arity" of the required constructor
+       jpl_type_to_class(Tx, Cx),  % throws Java exception if class is not found
+       N = '<init>',               % JNI's constructor naming convention for GetMethodID()
+       Tr = void,                  % all constructors have this return "type"
+       findall(
+       z3(I,MID,Tfps),
+       jpl_method_spec(Tx, I, N, A, _Mods, MID, Tr, Tfps), % cached
        Z3s
-    ),
-    (  Z3s == []                           % no matches
-    -> write('Warning: no arity-matching constructors'), nl, fail
-    ;  Z3s = [z3(I,MID,Tps)]               % exactly one match
-    -> true
-    ;  jpl_datums_to_types(Args, Tas),    % most specific types
+       ),
+       (   Z3s == []               % no constructors which require the given qty of parameters?
+       ->  jpl_type_to_classname( Tx, Cn),
+       (   jpl_call( Cx, isInterface, [], @(true))
+       ->  throw(error(type_error(concrete_class,Cn),
+                       context(jpl_new/3,
+                               'cannot create instance of an interface')))
+       ;   throw(error(existence_error(constructor,Cn/A),
+                       context(jpl_new/3,
+                               'no constructor found with the corresponding quantity of parameters')))
+       )
+       ;   (   catch(
+               jpl_datums_to_types(Params, Taps),  % infer actual parameter types
+               error(type_error(acyclic,Te),context(jpl_datum_to_type/2,Msg)),
+               throw(error(type_error(acyclic,Te),context(jpl_new/3,Msg)))
+           )
+       ->  true
+       ;   throw(error(domain_error(list(jpl_datum),Params),
+                       context(jpl_new/3,
+                               'one or more of the actual parameters is not a valid representation of any Java value or object')))
+       ),
        findall(
-           z3(I,MID,Tps),  % select those to which Args is assignable
-           (   member(z3(I,MID,Tps), Z3s),
-               jpl_types_fit_types(Tas, Tps)
+           z3(I,MID,Tfps),                 % select constructors to which actual parameters are assignable
+           (   member(z3(I,MID,Tfps), Z3s),
+               jpl_types_fit_types(Taps, Tfps) % assignability test: actual parameter types "fit" formal parameter types?
            ),
            Z3sA
        ),
-       (   Z3sA == []
-       ->  write('Warning: no type-assignable constructors'), nl, fail
-       ;   Z3sA = [z3(I,MID,Tps)]
+       (   Z3sA == []                      % no type-assignable constructors?
+       ->  (   Z3s = [_]
+           ->  throw(error(existence_error(constructor,Tx/A),
+                       context(jpl_new/3,
+                               'the actual parameters are not assignable to the formal parameter types of the only constructor which takes this qty of parameters')))
+           ;   throw(error(type_error(constructor_args,Params),
+                       context(jpl_new/3,
+                               'the actual parameters are not assignable to the formal parameter types of any of the constructors which take this qty of parameters')))
+           )
+       ;   Z3sA = [z3(I,MID,Tfps)]
        ->  true
-       ;   jpl_z3s_to_most_specific_z3(Z3sA, z3(I,MID,Tps))
+       ;   jpl_z3s_to_most_specific_z3(Z3sA, z3(I,MID,Tfps))
        ->  true
-       ;   write('Error: no single most-specific constructor'), nl, fail
+       ;   throw(error(type_error(constructor_params,Params),
+                       context(jpl_new/3,
+                               'more than one most-specific matching constructor (shouldn''t happen)')))
        )
-    ),
-    jNewObject(Cx, MID, Tps, Args, Vx),
-    jpl_cache_type_of_ref(Tx, Vx).         % since we know it
-
-jpl_new_1(array(T), Argz, Vx) :-
-    !,
-    (  integer(Argz),          % integer I -> array[0..I-1] of default values
-       Argz >= 0
-    -> Len is Argz
-    ;  is_list(Argz)       % [V1,..VN] -> array[0..N-1] of respective values
-    -> length(Argz, Len)
-    ),
-    jpl_new_array(T, Len, Vx), % NB may throw out-of-memory exception
-    (  nth0(I, Argz, Arg),     % nmember fails silently when Argz is integer
-       jpl_set(Vx, I, Arg),
-       fail
-    ;  true
-    ),
-    jpl_cache_type_of_ref(array(T), Vx).   % since we know it
-
-jpl_new_1(T, Argz, Vx) :-      % dubious completist generation of new primitive...
-    (  Argz == []
-    -> jpl_primitive_type_default_value(T, Vx)
-    ;  (   Argz = [Arg]
-       ;   Argz = Arg          % tolerate sloppiness...
+       ),
+       catch(
+       jNewObject(Cx, MID, Tfps, Params, Vx),
+       error(java_exception(@(_)), 'java.lang.InstantiationException'),
+       (   jpl_type_to_classname( Tx, Cn),
+           throw(error(type_error(concrete_class,Cn),
+                       context(jpl_new/3,
+                               'cannot create instance of an abstract class')))
+       )
+       ),
+       jpl_cache_type_of_ref(Tx, Vx).          % since we know it
+
+jpl_new_1(array(T), Params, Vx) :-
+       !,
+       (   var(Params)
+       ->  throw(error(instantiation_error,
+                   context(jpl_new/3,
+                           'when constructing a new array, 2nd arg must either be a non-negative integer (denoting the required array length) or a proper list of valid element values')))
+       ;   integer(Params)         % integer I -> array[0..I-1] of default values
+       ->  (   Params >= 0
+       ->  Len is Params
+       ;   throw(error(domain_error(array_length,Params),
+                   context(jpl_new/3,
+                           'when constructing a new array, if the 2nd arg is an integer (denoting the required array length) then it must be non-negative')))
        )
-    -> jpl_primitive_type_term_to_value(T, Argz, Vx)
-    ).
+       ;   is_list(Params)     % [V1,..VN] -> array[0..N-1] of respective values
+       ->  length(Params, Len)
+       ),
+       jpl_new_array(T, Len, Vx), % NB may throw out-of-memory exception
+       (   nth0(I, Params, Param),     % nmember fails silently when Params is integer
+       jpl_set(Vx, I, Param),
+       fail
+       ;   true
+       ),
+       jpl_cache_type_of_ref(array(T), Vx).   % since we know it
+
+jpl_new_1(T, _Params, _Vx) :-       % doomed attempt to create new primitive type instance (formerly a dubious completist feature :-)
+       jpl_primitive_type(T),
+       !,
+       throw(error(domain_error(object_type,T),
+           context(jpl_new/3,
+                   'cannot construct an instance of a primitive type'))).
+  % (   var(Params)
+  % ->  throw(error(instantiation_error,
+  %                 context(jpl_new/3,
+  %                         'when constructing a new instance of a primitive type, 2nd arg must be bound (to a representation of a suitable value)')))
+  % ;   Params == []
+  % ->  jpl_primitive_type_default_value(T, Vx)
+  % ;   Params = [Param]
+  % ->  jpl_primitive_type_term_to_value(T, Param, Vx)
+  % ;   throw(error(domain_error(constructor_args,Params),
+  %                 context(jpl_new/3,
+  %                         'when constructing a new instance of a primitive type, 2nd arg must either be an empty list (indicating that the default value of that type is required) or a list containing exactly one representation of a suitable value)')))
+  % ).
+
+jpl_new_1( T, _, _) :-
+       throw(error(domain_error(jpl_type,T),
+                   context(jpl_new/3,
+                           '1st arg must denote a known or plausible type'))).
 
 %------------------------------------------------------------------------------
 
 % jpl_new_array(+ElementType, +Length, -NewArray) :-
 
 jpl_new_array(boolean, Len, A) :-
-    jNewBooleanArray(Len, A).
+       jNewBooleanArray(Len, A).
 
 jpl_new_array(byte, Len, A) :-
-    jNewByteArray(Len, A).
+       jNewByteArray(Len, A).
 
 jpl_new_array(char, Len, A) :-
-    jNewCharArray(Len, A).
+       jNewCharArray(Len, A).
 
 jpl_new_array(short, Len, A) :-
-    jNewShortArray(Len, A).
+       jNewShortArray(Len, A).
 
 jpl_new_array(int, Len, A) :-
-    jNewIntArray(Len, A).
+       jNewIntArray(Len, A).
 
 jpl_new_array(long, Len, A) :-
-    jNewLongArray(Len, A).
+       jNewLongArray(Len, A).
 
 jpl_new_array(float, Len, A) :-
-    jNewFloatArray(Len, A).
+       jNewFloatArray(Len, A).
 
 jpl_new_array(double, Len, A) :-
-    jNewDoubleArray(Len, A).
+       jNewDoubleArray(Len, A).
 
 jpl_new_array(array(T), Len, A) :-
-    jpl_type_to_class(array(T), C),
-    jNewObjectArray(Len, C, @(null), A).       % initialise each element to null
+       jpl_type_to_class(array(T), C),
+       jNewObjectArray(Len, C, @(null), A).        % initialise each element to null
 
 jpl_new_array(class(Ps,Cs), Len, A) :-
-    jpl_type_to_class(class(Ps,Cs), C),
-    jNewObjectArray(Len, C, @(null), A).   
+       jpl_type_to_class(class(Ps,Cs), C),
+       jNewObjectArray(Len, C, @(null), A).
 
 %------------------------------------------------------------------------------
 
 % jpl_set(+X, +Fspec, +V) :-
-%   basically, sets the Fspec-th field of object X to value V
+%   basically, sets the Fspec-th field of class or object X to value V
+%   iff it is assignable
 %
 %   X can be:
-%     a class object, a classname, or an (object or array) type
-%      (for static fields, or java.lang.Class fields)
 %     a class instance
-%      (for non-static fields)
+%       (for static or non-static fields)
 %     an array
-%      (for indexed element or subrange assignment)
+%       (for indexed element or subrange assignment)
+%     a classname, or a class/2 or array/1 type
+%       (for static fields)
 %   but not:
 %     a String (no fields to retrieve)
 %
 %   Fspec can be:
 %     an atomic field name
-%      (overloading will be resolved dynamically)
-%     an integral field index
-%      (static resolution: not tried yet)
-%     a fieldID/1
-%      (static resolution: not tried yet)
-%     a variable
-%      (field names, or array indices, are generated)
+%       (overloading through shadowing has yet to be handled properly)
 %     an array index I
-%      (X must be an array object: X[I] is assigned V)
-%     a pair I-J of integers (J can be a variable)
-%      (X must be an array object, V must be a list of values: X[I-J] will be assigned V)
+%       (X must be an array object: V is assigned to X[I])
+%     a pair I-J of integers
+%       (X must be an array object, V must be a list of values: successive members of V are assigned to X[I..J])
 %
-%   V must be ground (although one day we may pass variables to JPL?!)
+%   V must be a suitable value or object
 
 jpl_set(X, Fspec, V) :-
-    ground(V),                 % only defined for ground datums
-    (  jpl_is_object(X)        % i.e. of class(_,_) or array(_) type
-    -> jpl_object_to_type(X, Type),
-       Obj = X
-    ;  jpl_is_type(X)          % e.g. class([java,lang],['String']), array(int)
-    -> jpl_type_to_class(X, Obj),
-       Type = class([java,lang],['Class'])
-    ;  atom(X)         % e.g. 'java.lang.String', '[L'
-    -> jpl_classname_to_type(X, Tx),
-       jpl_type_to_class(Tx, Obj),
-       Type = class([java,lang],['Class'])
-    ),
-    jpl_set_1(Type, Obj, Fspec, V).
-
-%------------------------------------------------------------------------------
-
-% jpl_set_1(+Type, +Object, +FieldSpec, +Value) :-
-%   Object may be a class object, in which case Type is class([java,lang],['Class'])
-
-jpl_set_1(Tx, X, Fspec, V) :-          % static field?
-    Tx = class([java,lang],['Class']), % a class object...
-    jpl_class_to_type(X, Tx2),
-    Tx2 \== Tx,                                % ...denoting other than java.lang.Class
-    !,
-    (  integer(Fspec)                  % assume it's a field index
-    -> I = Fspec
-    ;  atom(Fspec)                     % assume it's a field name
-    -> N = Fspec
-    ;  jpl_is_fieldID(Fspec)           % assume it's a JNI field ID
-    -> FID = Fspec
-    ),
-  % consider static and instance fields of java.lang.Class
-  % and static fields of the denoted class
-    findall(z2(T,I,N,Mods,FID,Tf),
-       (   T = Tx,
-           jpl_field_spec(T, I, N, Mods, FID, Tf)
-       ;   T = Tx2,
-           jpl_field_spec(T, I, N, Mods, FID, Tf),
-           member(static, Mods)
+       (   jpl_object_to_type(X, Type)         % the usual case (test is safe if X is var or rubbish)
+       ->  Obj = X,
+       catch(
+           jpl_set_instance(Type, Type, Obj, Fspec, V),    % first 'Type' is for FAI
+           error(type_error(acyclic,Te),context(jpl_datum_to_type/2,Msg)),
+           throw(error(type_error(acyclic,Te),context(jpl_set/3,Msg)))
+       )
+       ;   var(X)
+       ->  throw(error(instantiation_error,
+                   context(jpl_set/3,
+                           '1st arg must be an object, classname, descriptor or type')))
+       ;   (   atom(X)
+       ->  (   jpl_classname_to_type(X, Type)          % it's a classname or descriptor...
+           ->  true
+           ;   throw(error(existence_error(class,X),
+                       context(jpl_set/3,
+                               'the named class cannot be found')))
+           )
+       ;   (   X = class(_,_)                          % it's a class type...
+           ;   X = array(_)                            % ...or an array type
+           )
+       ->  Type = X
        ),
-       Z2s
-    ),
-    (  Z2s = []
-    -> write('Warning: no matching fields'), nl
-    ;  Z2s = [z2(T,I,N,Mods,FID,Tf)]
-    -> (   T = Tx
-       ->  jpl_type_to_class(Tx, Cc),
-           (   member(static, Mods)
-           ->  jpl_set_static_field(Tf, Cc, FID, V)
-           ;   jpl_set_field(Tf, Cc, FID, V)
+       (   jpl_type_to_class( Type, ClassObj)      % ...whose Class object is available
+       ->  true
+       ;   jpl_type_to_classname( Type, Classname),
+           throw(error(existence_error(class,Classname),
+                   context(jpl_set/3,
+                           'the class cannot be found')))
+       )
+       ->  catch(
+           jpl_set_static(Type, ClassObj, Fspec, V),
+           error(type_error(acyclic,Te),context(jpl_datum_to_type/2,Msg)),
+           throw(error(type_error(acyclic,Te),context(jpl_set/3,Msg)))
+       )
+       ;   throw(error(domain_error(object_or_class,X),
+                   context(jpl_set/3,
+                           '1st arg must be an object, classname, descriptor or type')))
+       ).
+
+%------------------------------------------------------------------------------
+
+% jpl_set_instance(+Type, +Type, +ObjectReference, +FieldName, +Value) :-
+%   ObjectReference is a JPL reference to a Java object
+%   of the class denoted by Type (which is passed twice for first agument indexing);
+%   FieldName should name a public, non-final (static or non-static) field of this object,
+%   but could be anything, and is validated here;
+%   Value should be assignable to the named field, but could be anything, and is validated here
+
+jpl_set_instance(class(_,_), Type, Obj, Fname, V) :-    % a non-array object
+       (   atom(Fname)                 % the usual case
+       ->  true
+       ;   var(Fname)
+       ->  throw(error(instantiation_error,
+                   context(jpl_set/3,
+                           '2nd arg must be bound to the name of a public, non-final field')))
+       ;   throw(error(type_error(field_name,Fname),
+                   context(jpl_set/3,
+                           '2nd arg must be the name of a public, non-final field')))
+       ),
+       findall(
+       z4(I,Mods,FID,Tf),
+       jpl_field_spec(Type, I, Fname, Mods, FID, Tf),  % public fields of class denoted by Type
+       Z4s
+       ),
+       (   Z4s = []
+       ->  throw(error(existence_error(field,Fname),
+                   context(jpl_set/3,
+                           'no public fields of the object have this name')))
+       ;   Z4s = [z4(I,Mods,FID,Tf)]
+       ->  (   member(final, Mods)
+       ->  throw(error(permission_error(modify,final_field,Fname),
+                   context(jpl_set/3,
+                           'cannot assign a value to a final field (actually you could but I''ve decided not to let you)')))
+       ;   jpl_datum_to_type( V, Tv)
+       ->  (   jpl_type_fits_type( Tv, Tf)
+           ->  (   member(static, Mods)
+               ->  jpl_object_to_class(Obj, ClassObj),
+                   jpl_set_static_field(Tf, ClassObj, FID, V)
+               ;   jpl_set_instance_field(Tf, Obj, FID, V)         % oughta be jpl_set_instance_field?
+               )
+           ;   jpl_type_to_nicename( Tf, NNf),
+               throw(error(type_error(NNf,V),
+                   context(jpl_set/3,
+                           'the value is not assignable to the named field of the class')))
            )
-       ;   T = Tx2
-       ->  jpl_set_static_field(Tf, X, FID, V)
+       ;   throw(error(type_error(field_value,V),
+                   context(jpl_set/3,
+                           '3rd arg does not represent any Java value or object')))
        )
-    ;  write('Warning: many matching fields'), nl, fail
-    ).
-
-jpl_set_1(Tx, X, Fspec, V) :-  % instance field?
-    Tx = class(_,_),   % instance object, or the java.lang.Class object itself
-    !,
-    (  integer(Fspec)              % assume it's a field or array index
-    -> I = Fspec
-    ;  atom(Fspec)                 % assume it's a field name
-    -> N = Fspec
-    ;  jpl_is_fieldID(Fspec)       % assume it's a JNI field ID
-    -> FID = Fspec
-    ),
-    findall(
-       z(I,N,Mods,FID,Tf),
-       jpl_field_spec(Tx, I, N, Mods, FID, Tf),
-       Zs
-    ),
-    (  Zs = []
-    -> write('Warning: no matching fields'), nl
-    ;  Zs = [z(I,N,Mods,FID,Tf)]
-    -> (   member(static, Mods)
-       ->  jpl_object_to_class(X, Cx),
-           jpl_set_static_field(Tf, Cx, FID, V)
-       ;   jpl_set_field(Tf, X, FID, V)
+       ;   throw(error(existence_error(field,Fname),   % 'existence'? or some other sort of error maybe?
+                   context(jpl_set/3,
+                           'more than one public field of the object has this name (this should not happen)')))
+       ).
+
+
+jpl_set_instance(array(Type), _, Obj, Fspec, V) :-
+       (   is_list(V)                  % a list of array element values
+       ->  Vs = V
+       ;   var(V)
+       ->  throw(error(instantiation_error,
+                   context(jpl_set/3, 'when 1st arg is an array, 3rd arg must be bound to a suitable element value or list of values')))
+       ;   Vs = [V]                    % a single array element value
+       ),
+       length(Vs, Iv),
+       (   var(Fspec)
+       ->  throw(error(instantiation_error,
+                   context(jpl_set/3,
+                           'when 1st arg is an array, 2nd arg must be bound to an index or index range')))
+       ;   integer(Fspec)          % single-element assignment
+       ->  (   Fspec < 0
+       ->  throw(error(domain_error(array_index,Fspec),
+                   context(jpl_set/3,
+                           'when 1st arg is an array, an integral 2nd arg must be a non-negative index')))
+       ;   Iv is 1
+       ->  N is Fspec
+       ;   Iv is 0
+       ->  throw(error(domain_error(array_element(Fspec),Vs),
+                       context(jpl_set/3,
+                               'no values for array element assignment: needs one')))
+       ;   throw(error(domain_error(array_element(Fspec),Vs),
+                       context(jpl_set/3,
+                               'too many values for array element assignment: needs one')))
        )
-    ;  write('Warning: many matching fields'), nl, fail
-    ).
-
-jpl_set_1(array(T), X, Fspec, V) :-
-    (  is_list(V)
-    -> Vs = V
-    ;  Vs = [V]                    % sloppy single-argument form
-    ),
-    length(Vs, Iv),
-    (  integer(Fspec),     % single-element assignment
-       Fspec >= 0,
-       Iv is 1
-    -> N is Fspec
-    ;  Fspec = N-M,                % element-sequence assignment
-       integer(N),
-       M is N+Iv-1
-    -> true
-    ;  Fspec == length
-    -> write('Error: cannot assign a value to final variable length'), nl, fail
-    ;  write('Error: bad field spec for array set '(Fspec)), nl, fail
-    ),
-    jpl_set_2(T, X, N, Iv, Vs).
-
-%------------------------------------------------------------------------------
-
-% jpl_set_2(+Type, +ArrayObject, +Offset, +DatumCount, +Datums) :-
-%   Datums, of which there are DatumCount,
-%   are stashed in successive elements of ArrayObject
-%   which is an array of Type
-%   starting at the Offset-th (numbered from 0)
-
-jpl_set_2(T, A, N, I, Ds) :-
-    (  jpl_datums_to_types(Ds, Tds),       % most specialised types
-       jpl_types_fit_type(Tds, T)          % all assignable?
-    -> true
-    ;  write('Warning: not all datums can be assigned to array element type'), nl, fail
-    ),
-    (  (   T = class(_,_)
-       ;   T = array(_)
+       ;   Fspec = N-M             % element-sequence assignment
+       ->  (   integer(N),
+           integer(M)
+       ->  (   N >= 0,
+               Size is (M-N)+1,
+               Size >= 0
+           ->  (   Size == Iv
+               ->  true
+               ;   Size < Iv
+               ->  throw(error(domain_error(array_elements(N-M),Vs),
+                               context(jpl_set/3,
+                                       'too few values for array range assignment')))
+               ;   throw(error(domain_error(array_elements(N-M),Vs),
+                               context(jpl_set/3,
+                                       'too many values for array range assignment')))
+               )
+           ;   throw(error(domain_error(array_index_range,N-M),
+                   context(jpl_set/3,
+                           'array index range must be a non-decreasing pair of non-negative integers')))
+           )
+       ;   throw(error(type_error(array_index_range,N-M),
+                   context(jpl_set/3,
+                           'array index range must be a non-decreasing pair of non-negative integers')))
        )
-    -> (   nth0(J, Ds, D),                 % for each datum
-           Nd is N+J,                      % compute array index
-           jSetObjectArrayElement(A, Nd, D),
-           fail                            % iterate
-       ;   true
+       ;   atom(Fspec)
+       ->  (   Fspec == length
+       ->  throw(error(permission_error(modify,final_field,length),
+                           context(jpl_set/3,
+                                   'cannot assign a value to a final field')))
+       ;   throw(error(existence_error(field,Fspec),
+                           context(jpl_set/3,
+                                   'array has no field with that name')))
        )
-    ;  jpl_primitive_type(T)
-    -> jni_type_to_xput_code(T, Xc),
-       jni_alloc_buffer(Xc, I, Bp),        % I-element buf of required type
-       jpl_set_3(Ds, T, 0, Bp),
-       jpl_set_elements(T, A, N, I, Bp),
-       jni_free_buffer(Bp)
-    ;  fail                                % bad type (exception?)
-    ).
+       ;   throw(error(domain_error(array_index,Fspec),
+                   context(jpl_set/3,
+                           'when 1st arg is an array object, 2nd arg must be a non-negative index or index range')))
+       ),
+       jpl_set_array(Type, Obj, N, Iv, Vs).
 
 %------------------------------------------------------------------------------
 
-% jpl_set_3(+Values, +Type, +BufferIndex, +BufferPointer) :-
-%   successive members of Values are stashed as (primitive) Type
-%   from the BufferIndex-th element (numbered from 0) onwards
-%   of the buffer indicated by BufferPointer
+% jpl_set_static(+Type, +ClassObj, +FieldName, +Value) :-
+%   we can rely on:
+%       Type being a class/2 type representing some accessible class
+%       ClassObj being an instance of java.lang.Class which represents the same class as Type
+%   but FieldName could be anything, so we validate it here,
+%   look for a suitable (static) field of the target class,
+%   then call jpl_set_static_field/4 to attempt to assign Value (which could be anything) to it
+%
+%   NB this does not yet handle shadowed fields correctly...
 
-jpl_set_3([], _, _, _).
+jpl_set_static(Type, ClassObj, Fname, V) :-
+       (   atom(Fname)                     % the usual case
+       ->  true
+       ;   var(Fname)
+       ->  throw(error(instantiation_error,
+                   context(jpl_set/3,
+                           'when 1st arg denotes a class, 2nd arg must be bound to the name of a public, static, non-final field')))
+       ;   throw(error(type_error(field_name,Fname),
+                   context(jpl_set/3,
+                           'when 1st arg denotes a class, 2nd arg must be the name of a public, static, non-final field')))
+       ),
+       findall(  % get all static fields of the denoted class
+       z4(I,Mods,FID,Tf),
+       (   jpl_field_spec(Type, I, Fname, Mods, FID, Tf),
+           member(static, Mods)
+       ),
+       Z4s
+       ),
+       (   Z4s = []
+       ->  throw(error(existence_error(field,Fname),
+                   context(jpl_set/3,
+                           'class has no public static fields of this name')))
+       ;   Z4s = [z4(I,Mods,FID,Tf)]       % exactly one synonymous field?
+       ->  (   member(final, Mods)
+       ->  throw(error(permission_error(modify,final_field,Fname),
+                   context(jpl_set/3,
+                           'cannot assign a value to a final field')))
+       ;   jpl_datum_to_type(V, Tv)
+       ->  (   jpl_type_fits_type(Tv, Tf)
+           ->  jpl_set_static_field(Tf, ClassObj, FID, V)
+           ;   jpl_type_to_nicename(Tf, NNf),
+               throw(error(type_error(NNf,V),
+                   context(jpl_set/3,
+                           'the value is not assignable to the named field of the class')))
+           )
+       ;   throw(error(type_error(field_value,V),
+                   context(jpl_set/3,
+                           '3rd arg does not represent any Java value or object')))
+       )
+       ;   throw(error(existence_error(field,Fname),
+                   context(jpl_set/3,
+                           'more than one public static field of the class has this name (this should not happen)(?)')))
+       ).
 
-jpl_set_3([V|Vs], Tprim, Ib, Bp) :-
-    jni_convert_primitive_out(Tprim, V, Xhi, Xlo, Xc),
-    jni_stash_buffer_value(Bp, Ib, Xhi, Xlo, Xc),
-    Ibnext is Ib+1,
-    jpl_set_3(Vs, Tprim, Ibnext, Bp).
+%------------------------------------------------------------------------------
+
+%%     jpl_set_array(+ElementType, +Array, +Offset, +DatumQty, +Datums)
+%
+%      Datums, of which there are DatumQty,   are stashed in successive
+%      elements of Array which is an   array of ElementType starting at
+%      the      Offset-th      (numbered      from       0)      throws
+%      error(type_error(acyclic,_),context(jpl_datum_to_type/2,_))
+
+jpl_set_array(T, A, N, I, Ds) :-
+       (   jpl_datums_to_types(Ds, Tds)        % most specialised types of given values
+       ->  (   jpl_types_fit_type(Tds, T)      % all assignable to element type?
+           ->  true
+           ;   throw(error(type_error(array(T),Ds),
+                           context(jpl_set/3,
+                                   'not all values are assignable to the array element type')))
+           )
+       ;   throw(error(type_error(array(T),Ds),
+                   context(jpl_set/3,
+                           'not all values are convertible to Java values or references')))
+       ),
+       (   (   T = class(_,_)
+           ;   T = array(_)                    % array elements are objects
+           )
+       ->  (   nth0(J, Ds, D),                 % for each datum
+               Nd is N+J,                      % compute array index
+               (   D = {Tq}                    % quoted term?
+               ->  jni_term_to_jref(Tq, D2)    % convert to a JPL reference to a corresponding jpl.Term object
+               ;   D = D2
+               ),
+               jSetObjectArrayElement(A, Nd, D2),
+               fail                            % iterate
+           ;   true
+           )
+       ;   jpl_primitive_type(T)               % array elements are primitive values
+       ->  jni_type_to_xput_code(T, Xc),
+           jni_alloc_buffer(Xc, I, Bp),        % I-element buf of required primitive type
+           jpl_set_array_1(Ds, T, 0, Bp),
+           jpl_set_elements(T, A, N, I, Bp),
+           jni_free_buffer(Bp)
+       ;   throw(error(system_error(array_element_type,T),
+                   context(jpl_set/3,
+                           'array element type is unknown (this should not happen)')))
+       ).
 
 %------------------------------------------------------------------------------
 
-jpl_set_elements(boolean, Obj, N, I, Bp) :-
-    jSetBooleanArrayRegion(Obj, N, I, jbuf(Bp,boolean)).
+%%     jpl_set_array_1(+Values, +Type, +BufferIndex, +BufferPointer)
+%
+%      successive members of Values  are   stashed  as (primitive) Type
+%      from the BufferIndex-th element (numbered from 0) onwards of the
+%      buffer indicated by BufferPointer NB  this   could  be done more
+%      efficiently (?) within foreign code...
 
-jpl_set_elements(char, Obj, N, I, Bp) :-
-    jSetCharArrayRegion(Obj, N, I, jbuf(Bp,char)).
+jpl_set_array_1([], _, _, _).
+jpl_set_array_1([V|Vs], Tprim, Ib, Bp) :-
+       jni_type_to_xput_code(Tprim, Xc),
+       jni_stash_buffer_value(Bp, Ib, V, Xc),
+       Ibnext is Ib+1,
+       jpl_set_array_1(Vs, Tprim, Ibnext, Bp).
 
-jpl_set_elements(byte, Obj, N, I, Bp) :-
-    jSetByteArrayRegion(Obj, N, I, jbuf(Bp,byte)).
+%------------------------------------------------------------------------------
 
+jpl_set_elements(boolean, Obj, N, I, Bp) :-
+       jSetBooleanArrayRegion(Obj, N, I, jbuf(Bp,boolean)).
+jpl_set_elements(char, Obj, N, I, Bp) :-
+       jSetCharArrayRegion(Obj, N, I, jbuf(Bp,char)).
+jpl_set_elements(byte, Obj, N, I, Bp) :-
+       jSetByteArrayRegion(Obj, N, I, jbuf(Bp,byte)).
 jpl_set_elements(short, Obj, N, I, Bp) :-
-    jSetShortArrayRegion(Obj, N, I, jbuf(Bp,short)).
-
+       jSetShortArrayRegion(Obj, N, I, jbuf(Bp,short)).
 jpl_set_elements(int, Obj, N, I, Bp) :-
-    jSetIntArrayRegion(Obj, N, I, jbuf(Bp,int)).
-
+       jSetIntArrayRegion(Obj, N, I, jbuf(Bp,int)).
 jpl_set_elements(long, Obj, N, I, Bp) :-
-    jSetLongArrayRegion(Obj, N, I, jbuf(Bp,long)).
-
+       jSetLongArrayRegion(Obj, N, I, jbuf(Bp,long)).
 jpl_set_elements(float, Obj, N, I, Bp) :-
-    jSetFloatArrayRegion(Obj, N, I, jbuf(Bp,float)).
-
+       jSetFloatArrayRegion(Obj, N, I, jbuf(Bp,float)).
 jpl_set_elements(double, Obj, N, I, Bp) :-
-    jSetDoubleArrayRegion(Obj, N, I, jbuf(Bp,double)).
+       jSetDoubleArrayRegion(Obj, N, I, jbuf(Bp,double)).
 
 %------------------------------------------------------------------------------
 
-jpl_set_field(boolean, Obj, FieldID, R) :-
-    jSetBooleanField(Obj, FieldID, R).
-
-jpl_set_field(byte, Obj, FieldID, R) :-
-    jSetByteField(Obj, FieldID, R).
-
-jpl_set_field(char, Obj, FieldID, R) :-
-    jSetCharField(Obj, FieldID, R).
-
-jpl_set_field(short, Obj, FieldID, R) :-
-    jSetShortField(Obj, FieldID, R).
-
-jpl_set_field(int, Obj, FieldID, R) :-
-    jSetIntField(Obj, FieldID, R).
-
-jpl_set_field(long, Obj, FieldID, R) :-
-    jSetLongField(Obj, FieldID, R).
-
-jpl_set_field(float, Obj, FieldID, R) :-
-    jSetFloatField(Obj, FieldID, R).
-
-jpl_set_field(double, Obj, FieldID, R) :-
-    jSetDoubleField(Obj, FieldID, R).
-
-jpl_set_field(class(_,_), Obj, FieldID, R) :-
-    jSetObjectField(Obj, FieldID, R).
-
-jpl_set_field(array(_), Obj, FieldID, R) :-
-    jSetObjectField(Obj, FieldID, R).
+%%     jpl_set_instance_field(+Type, +Obj, +FieldID, +V)
+%
+%      we can rely on Type, Obj and FieldID being valid, and on V being
+%      assignable (if V is a quoted term then it is converted here)
+
+jpl_set_instance_field(boolean, Obj, FieldID, V) :-
+       jSetBooleanField(Obj, FieldID, V).
+jpl_set_instance_field(byte, Obj, FieldID, V) :-
+       jSetByteField(Obj, FieldID, V).
+jpl_set_instance_field(char, Obj, FieldID, V) :-
+       jSetCharField(Obj, FieldID, V).
+jpl_set_instance_field(short, Obj, FieldID, V) :-
+       jSetShortField(Obj, FieldID, V).
+jpl_set_instance_field(int, Obj, FieldID, V) :-
+       jSetIntField(Obj, FieldID, V).
+jpl_set_instance_field(long, Obj, FieldID, V) :-
+       jSetLongField(Obj, FieldID, V).
+jpl_set_instance_field(float, Obj, FieldID, V) :-
+       jSetFloatField(Obj, FieldID, V).
+jpl_set_instance_field(double, Obj, FieldID, V) :-
+       jSetDoubleField(Obj, FieldID, V).
+jpl_set_instance_field(class(_,_), Obj, FieldID, V) :-  % also handles byval term assignments
+       (   V = {T}                     % quoted term?
+       ->  jni_term_to_jref(T, V2)     % convert to a JPL reference to a corresponding jpl.Term object
+       ;   V = V2
+       ),
+       jSetObjectField(Obj, FieldID, V2).
+jpl_set_instance_field(array(_), Obj, FieldID, V) :-
+       jSetObjectField(Obj, FieldID, V).
 
 %------------------------------------------------------------------------------
 
-jpl_set_static_field(boolean, Obj, FieldID, R) :-
-    jSetStaticBooleanField(Obj, FieldID, R).
+% jpl_set_static_field(+Type, +ClassObj, +FieldID, +V) :-
+%   we can rely on Type, ClassObj and FieldID being valid,
+%   and on V being assignable (if V is a quoted term then it is converted here)
+
+jpl_set_static_field(boolean, Obj, FieldID, V) :-
+       jSetStaticBooleanField(Obj, FieldID, V).
 
-jpl_set_static_field(byte, Obj, FieldID, R) :-
-    jSetStaticByteField(Obj, FieldID, R).
+jpl_set_static_field(byte, Obj, FieldID, V) :-
+       jSetStaticByteField(Obj, FieldID, V).
 
-jpl_set_static_field(char, Obj, FieldID, R) :-
-    jSetStaticCharField(Obj, FieldID, R).
+jpl_set_static_field(char, Obj, FieldID, V) :-
+       jSetStaticCharField(Obj, FieldID, V).
 
-jpl_set_static_field(short, Obj, FieldID, R) :-
-    jSetStaticShortField(Obj, FieldID, R).
+jpl_set_static_field(short, Obj, FieldID, V) :-
+       jSetStaticShortField(Obj, FieldID, V).
 
-jpl_set_static_field(int, Obj, FieldID, R) :-
-    jSetStaticIntField(Obj, FieldID, R).
+jpl_set_static_field(int, Obj, FieldID, V) :-
+       jSetStaticIntField(Obj, FieldID, V).
 
-jpl_set_static_field(long, Obj, FieldID, R) :-
-    jSetStaticLongField(Obj, FieldID, R).
+jpl_set_static_field(long, Obj, FieldID, V) :-
+       jSetStaticLongField(Obj, FieldID, V).
 
-jpl_set_static_field(float, Obj, FieldID, R) :-
-    jSetStaticFloatField(Obj, FieldID, R).
+jpl_set_static_field(float, Obj, FieldID, V) :-
+       jSetStaticFloatField(Obj, FieldID, V).
 
-jpl_set_static_field(double, Obj, FieldID, R) :-
-    jSetStaticDoubleField(Obj, FieldID, R).
+jpl_set_static_field(double, Obj, FieldID, V) :-
+       jSetStaticDoubleField(Obj, FieldID, V).
 
-jpl_set_static_field(class(_,_), Obj, FieldID, R) :-
-    jSetStaticObjectField(Obj, FieldID, R).
+jpl_set_static_field(class(_,_), Obj, FieldID, V) :-    % also handles byval term assignments
+       (   V = {T}                         % quoted term?
+       ->  jni_term_to_jref(T, V2)         % convert to a JPL reference to a corresponding jpl.Term object
+       ;   V = V2
+       ),
+       jSetStaticObjectField(Obj, FieldID, V2).
 
-jpl_set_static_field(array(_), Obj, FieldID, R) :-
-    jSetStaticObjectField(Obj, FieldID, R).
+jpl_set_static_field(array(_), Obj, FieldID, V) :-
+       jSetStaticObjectField(Obj, FieldID, V).
 
 %------------------------------------------------------------------------------
 
 % jpl_z3s_to_most_specific_z3(+Zs, -Z) :-
-%   Zs is a list of arity-matching, type-suitable z3(I,MID,Tps)
+%   Zs is a list of arity-matching, type-suitable z3(I,MID,Tfps)
 %   Z is the single most specific element of Zs,
 %   i.e. that than which no other z3/3 has a more specialised signature;
 %   fails if there is more than one such
 
 jpl_z3s_to_most_specific_z3(Zs, Z) :-
-    jpl_fergus_is_the_greatest(Zs, Z).
+       jpl_fergus_is_the_greatest(Zs, Z).
 
 %------------------------------------------------------------------------------
 
 % jpl_z5s_to_most_specific_z5(+Zs, -Z) :-
-%   Zs is a list of arity-matching, type-suitable z5(I,Mods,MID,Tr,Tps)
+%   Zs is a list of arity-matching, type-suitable z5(I,Mods,MID,Tr,Tfps)
 %   Z is the single most specific element of Zs,
 %   i.e. that than which no other z5/5 has a more specialised signature
 %   (this fails if there is more than one such)
 
 jpl_z5s_to_most_specific_z5(Zs, Z) :-
-    jpl_fergus_is_the_greatest(Zs, Z).
+       jpl_fergus_is_the_greatest(Zs, Z).
 
 %------------------------------------------------------------------------------
 
@@ -1151,1233 +1431,1124 @@ jpl_z5s_to_most_specific_z5(Zs, Z) :-
 % jpl_pl_lib_version(-Major, -Minor, -Patch, -Status) :-
 
 jpl_pl_lib_version(VersionString) :-
-    jpl_pl_lib_version(Major, Minor, Patch, Status),
-    concat_atom([Major,'.',Minor,'.',Patch,'-',Status], VersionString).
+       jpl_pl_lib_version(Major, Minor, Patch, Status),
+       concat_atom([Major,'.',Minor,'.',Patch,'-',Status], VersionString).
 
 
-jpl_pl_lib_version(3, 0, 3, alpha).
+jpl_pl_lib_version(3, 1, 3, alpha).
 
 %------------------------------------------------------------------------------
 
-% jpl_type_alfa(0'$) -->       % presumably not allowed
-%   "$".                       % given the "inner class" syntax?
+% jpl_type_alfa(0'$) -->        % presumably not allowed
+%   "$".                        % given the "inner class" syntax?
 
 jpl_type_alfa(0'_) -->
-    "_",
-    !.
+       "_",
+       !.
 
 jpl_type_alfa(C) -->
-    [C], { C>=0'a, C=<0'z },
-    !.
+       [C], { C>=0'a, C=<0'z },
+       !.
 
 jpl_type_alfa(C) -->
-    [C], { C>=0'A, C=<0'Z }.
+       [C], { C>=0'A, C=<0'Z }.
 
 %------------------------------------------------------------------------------
 
 jpl_type_alfa_num(C) -->
-    jpl_type_alfa(C),
-    !.
+       jpl_type_alfa(C),
+       !.
 
 jpl_type_alfa_num(C) -->
-    [C], { C>=0'0, C=<0'9 }.
+       [C], { C>=0'0, C=<0'9 }.
 
 %------------------------------------------------------------------------------
 
 jpl_type_array_classname(array(T)) -->
-    "[", jpl_type_classname_2(T).
+       "[", jpl_type_classname_2(T).
 
 %------------------------------------------------------------------------------
 
 jpl_type_array_descriptor(array(T)) -->
-    "[", jpl_type_descriptor_1(T).
+       "[", jpl_type_descriptor_1(T).
 
 %------------------------------------------------------------------------------
 
 jpl_type_bare_class_descriptor(class(Ps,Cs)) -->
-    jpl_type_slashed_package_parts(Ps), jpl_type_class_parts(Cs).
+       jpl_type_slashed_package_parts(Ps), jpl_type_class_parts(Cs).
 
 %------------------------------------------------------------------------------
 
 jpl_type_bare_classname(class(Ps,Cs)) -->
-    jpl_type_dotted_package_parts(Ps), jpl_type_class_parts(Cs).
+       jpl_type_dotted_package_parts(Ps), jpl_type_class_parts(Cs).
 
 %------------------------------------------------------------------------------
 
 jpl_type_class_descriptor(class(Ps,Cs)) -->
-    "L", jpl_type_bare_class_descriptor(class(Ps,Cs)), ";".
+       "L", jpl_type_bare_class_descriptor(class(Ps,Cs)), ";".
 
 %------------------------------------------------------------------------------
 
 jpl_type_class_part(N) -->
-    jpl_type_id(N).
+       jpl_type_id(N).
 
 %------------------------------------------------------------------------------
 
 jpl_type_class_parts([C|Cs]) -->
-    jpl_type_class_part(C), jpl_type_inner_class_parts(Cs).
+       jpl_type_class_part(C), jpl_type_inner_class_parts(Cs).
 
 %------------------------------------------------------------------------------
 
 jpl_type_classname_1(T) -->
-    jpl_type_bare_classname(T),
-    !.
+       jpl_type_bare_classname(T),
+       !.
 
 jpl_type_classname_1(T) -->
-    jpl_type_array_classname(T),
-    !.
+       jpl_type_array_classname(T),
+       !.
 
 jpl_type_classname_1(T) -->
-    jpl_type_primitive(T).
+       jpl_type_primitive(T).
 
 %------------------------------------------------------------------------------
 
 jpl_type_classname_2(T) -->
-    jpl_type_delimited_classname(T).
+       jpl_type_delimited_classname(T).
 
 jpl_type_classname_2(T) -->
-    jpl_type_array_classname(T).
+       jpl_type_array_classname(T).
 
 jpl_type_classname_2(T) -->
-    jpl_type_primitive(T).
+       jpl_type_primitive(T).
 
 %------------------------------------------------------------------------------
 
 jpl_type_delimited_classname(Class) -->
-    "L", jpl_type_bare_classname(Class), ";".
+       "L", jpl_type_bare_classname(Class), ";".
 
 %------------------------------------------------------------------------------
 
 jpl_type_descriptor_1(T) -->
-    jpl_type_primitive(T),
-    !.
+       jpl_type_primitive(T),
+       !.
 
 jpl_type_descriptor_1(T) -->
-    jpl_type_class_descriptor(T),
-    !.
+       jpl_type_class_descriptor(T),
+       !.
 
 jpl_type_descriptor_1(T) -->
-    jpl_type_array_descriptor(T),
-    !.
+       jpl_type_array_descriptor(T),
+       !.
 
 jpl_type_descriptor_1(T) -->
-    jpl_type_method_descriptor(T).
+       jpl_type_method_descriptor(T).
 
 %------------------------------------------------------------------------------
 
 jpl_type_dotted_package_parts([P|Ps]) -->
-    jpl_type_package_part(P), ".", !, jpl_type_dotted_package_parts(Ps).
+       jpl_type_package_part(P), ".", !, jpl_type_dotted_package_parts(Ps).
 
 jpl_type_dotted_package_parts([]) -->
-    [].
+       [].
 
 %------------------------------------------------------------------------------
 
 jpl_type_findclassname(T) -->
-    jpl_type_bare_class_descriptor(T).
+       jpl_type_bare_class_descriptor(T).
 
 jpl_type_findclassname(T) -->
-    jpl_type_array_descriptor(T).
+       jpl_type_array_descriptor(T).
 
 %------------------------------------------------------------------------------
 
 jpl_type_id(A) -->
-    { nonvar(A) -> atom_codes(A,[C|Cs]) ; true },
-    jpl_type_alfa(C), jpl_type_id_rest(Cs),
-    { atom_codes(A, [C|Cs]) }.
+       { nonvar(A) -> atom_codes(A,[C|Cs]) ; true },
+       jpl_type_alfa(C), jpl_type_id_rest(Cs),
+       { atom_codes(A, [C|Cs]) }.
 
 %------------------------------------------------------------------------------
 
 jpl_type_id_rest([C|Cs]) -->
-    jpl_type_alfa_num(C), !, jpl_type_id_rest(Cs).
+       jpl_type_alfa_num(C), !, jpl_type_id_rest(Cs).
 
 jpl_type_id_rest([]) -->
-    [].
+       [].
 
 %------------------------------------------------------------------------------
 
-jpl_type_id_v2(A) -->                  % inner class name parts (empirically)
-    { nonvar(A) -> atom_codes(A,Cs) ; true },
-    jpl_type_id_rest(Cs),
-    { atom_codes(A, Cs) }.
+jpl_type_id_v2(A) -->                   % inner class name parts (empirically)
+       { nonvar(A) -> atom_codes(A,Cs) ; true },
+       jpl_type_id_rest(Cs),
+       { atom_codes(A, Cs) }.
 
 %------------------------------------------------------------------------------
 
 jpl_type_inner_class_part(N) -->
-    jpl_type_id_v2(N).
+       jpl_type_id_v2(N).
 
 %------------------------------------------------------------------------------
 
 jpl_type_inner_class_parts([C|Cs]) -->
-    "$", jpl_type_inner_class_part(C), !, jpl_type_inner_class_parts(Cs).
+       "$", jpl_type_inner_class_part(C), !, jpl_type_inner_class_parts(Cs).
 
 jpl_type_inner_class_parts([]) -->
-    [].
+       [].
 
 %------------------------------------------------------------------------------
 
 jpl_type_method_descriptor(method(Ts,T)) -->
-    "(", jpl_type_method_descriptor_args(Ts), ")", jpl_type_method_descriptor_return(T).
+       "(", jpl_type_method_descriptor_args(Ts), ")", jpl_type_method_descriptor_return(T).
 
 %------------------------------------------------------------------------------
 
 jpl_type_method_descriptor_args([T|Ts]) -->
-    jpl_type_descriptor_1(T), !, jpl_type_method_descriptor_args(Ts).
+       jpl_type_descriptor_1(T), !, jpl_type_method_descriptor_args(Ts).
 
 jpl_type_method_descriptor_args([]) -->
-    [].
+       [].
 
 %------------------------------------------------------------------------------
 
 jpl_type_method_descriptor_return(T) -->
-    jpl_type_void(T).
+       jpl_type_void(T).
 
 jpl_type_method_descriptor_return(T) -->
-    jpl_type_descriptor_1(T).
+       jpl_type_descriptor_1(T).
 
 %------------------------------------------------------------------------------
 
 jpl_type_package_part(N) -->
-    jpl_type_id(N).
+       jpl_type_id(N).
 
 %------------------------------------------------------------------------------
 
 jpl_type_primitive(boolean) -->
-    "Z",
-    !.
+       "Z",
+       !.
 
 jpl_type_primitive(byte) -->
-    "B",
-    !.
+       "B",
+       !.
 
 jpl_type_primitive(char) -->
-    "C",
-    !.
+       "C",
+       !.
 
 jpl_type_primitive(short) -->
-    "S",
-    !.
+       "S",
+       !.
 
 jpl_type_primitive(int) -->
-    "I",
-    !.
+       "I",
+       !.
 
 jpl_type_primitive(long) -->
-    "J",
-    !.
+       "J",
+       !.
 
 jpl_type_primitive(float) -->
-    "F",
-    !.
+       "F",
+       !.
 
 jpl_type_primitive(double) -->
-    "D".
+       "D".
 
 %------------------------------------------------------------------------------
 
 jpl_type_slashed_package_parts([P|Ps]) -->
-    jpl_type_package_part(P), "/", !, jpl_type_slashed_package_parts(Ps).
+       jpl_type_package_part(P), "/", !, jpl_type_slashed_package_parts(Ps).
 
 jpl_type_slashed_package_parts([]) -->
-    [].
+       [].
 
 %------------------------------------------------------------------------------
 
 jpl_type_void(void) -->
-    "V".
+       "V".
 
 %------------------------------------------------------------------------------
 
-%type  jCallBooleanMethod(object, method_id, types, datums, boolean)
+%type   jCallBooleanMethod(object, method_id, types, datums, boolean)
 
-% jCallBooleanMethod(+Obj, +MethodID, +Types, +Args, -Rbool) :-
+% jCallBooleanMethod(+Obj, +MethodID, +Types, +Params, -Rbool) :-
 
-jCallBooleanMethod(Obj, MethodID, Types, Args, Rbool) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(39, Obj, MethodID, ArgBuf, Rbool).
+jCallBooleanMethod(Obj, MethodID, Types, Params, Rbool) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(39, Obj, MethodID, ParamBuf, Rbool).
 
 %------------------------------------------------------------------------------
 
-%type  jCallByteMethod(object, method_id, types, datums, byte)
+%type   jCallByteMethod(object, method_id, types, datums, byte)
 
-% jCallByteMethod(+Obj, +MethodID, +Types, +Args, -Rbyte) :-
+% jCallByteMethod(+Obj, +MethodID, +Types, +Params, -Rbyte) :-
 
-jCallByteMethod(Obj, MethodID, Types, Args, Rbyte) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(42, Obj, MethodID, ArgBuf, Rbyte).
+jCallByteMethod(Obj, MethodID, Types, Params, Rbyte) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(42, Obj, MethodID, ParamBuf, Rbyte).
 
 %------------------------------------------------------------------------------
 
-%type  jCallCharMethod(object, method_id, types, datums, char)
+%type   jCallCharMethod(object, method_id, types, datums, char)
 
-% jCallCharMethod(+Obj, +MethodID, +Types, +Args, -Rchar) :-
+% jCallCharMethod(+Obj, +MethodID, +Types, +Params, -Rchar) :-
 
-jCallCharMethod(Obj, MethodID, Types, Args, Rchar) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(45, Obj, MethodID, ArgBuf, Rchar).
+jCallCharMethod(Obj, MethodID, Types, Params, Rchar) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(45, Obj, MethodID, ParamBuf, Rchar).
 
 %------------------------------------------------------------------------------
 
-%type  jCallDoubleMethod(object, method_id, types, datums, double)
+%type   jCallDoubleMethod(object, method_id, types, datums, double)
 
-% jCallDoubleMethod(+Obj, +MethodID, +Types, +Args, -Rdouble) :-
+% jCallDoubleMethod(+Obj, +MethodID, +Types, +Params, -Rdouble) :-
 
-jCallDoubleMethod(Obj, MethodID, Types, Args, Rdouble) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(60, Obj, MethodID, ArgBuf, Rdouble).
+jCallDoubleMethod(Obj, MethodID, Types, Params, Rdouble) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(60, Obj, MethodID, ParamBuf, Rdouble).
 
 %------------------------------------------------------------------------------
 
-%type  jCallFloatMethod(object, method_id, types, datums, float)
+%type   jCallFloatMethod(object, method_id, types, datums, float)
 
-% jCallFloatMethod(+Obj, +MethodID, +Types, +Args, -Rfloat) :-
+% jCallFloatMethod(+Obj, +MethodID, +Types, +Params, -Rfloat) :-
 
-jCallFloatMethod(Obj, MethodID, Types, Args, Rfloat) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(57, Obj, MethodID, ArgBuf, Rfloat).
+jCallFloatMethod(Obj, MethodID, Types, Params, Rfloat) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(57, Obj, MethodID, ParamBuf, Rfloat).
 
 %------------------------------------------------------------------------------
 
-%type  jCallIntMethod(object, method_id, types, datums, int)
+%type   jCallIntMethod(object, method_id, types, datums, int)
 
-% jCallIntMethod(+Obj, +MethodID, +Types, +Args, -Rint) :-
+% jCallIntMethod(+Obj, +MethodID, +Types, +Params, -Rint) :-
 
-jCallIntMethod(Obj, MethodID, Types, Args, Rint) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(51, Obj, MethodID, ArgBuf, Rint).
+jCallIntMethod(Obj, MethodID, Types, Params, Rint) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(51, Obj, MethodID, ParamBuf, Rint).
 
 %------------------------------------------------------------------------------
 
-%type  jCallLongMethod(object, method_id, types, datums, long)
+%type   jCallLongMethod(object, method_id, types, datums, long)
 
-% jCallLongMethod(+Obj, +MethodID, +Types, +Args, -Rlong) :-
+% jCallLongMethod(+Obj, +MethodID, +Types, +Params, -Rlong) :-
 
-jCallLongMethod(Obj, MethodID, Types, Args, Rlong) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(54, Obj, MethodID, ArgBuf, Rlong).
+jCallLongMethod(Obj, MethodID, Types, Params, Rlong) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(54, Obj, MethodID, ParamBuf, Rlong).
 
 %------------------------------------------------------------------------------
 
-%type  jCallObjectMethod(object, method_id, types, datums, object)
+%type   jCallObjectMethod(object, method_id, types, datums, object)
 
-% jCallObjectMethod(+Obj, +MethodID, +Types, +Args, -Robj) :-
+% jCallObjectMethod(+Obj, +MethodID, +Types, +Params, -Robj) :-
 
-jCallObjectMethod(Obj, MethodID, Types, Args, Robj) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(36, Obj, MethodID, ArgBuf, Robj).
+jCallObjectMethod(Obj, MethodID, Types, Params, Robj) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(36, Obj, MethodID, ParamBuf, Robj).
 
 %------------------------------------------------------------------------------
 
-%type  jCallShortMethod(object, method_id, types, datums, short)
+%type   jCallShortMethod(object, method_id, types, datums, short)
 
-% jCallShortMethod(+Obj, +MethodID, +Types, +Args, -Rshort) :-
+% jCallShortMethod(+Obj, +MethodID, +Types, +Params, -Rshort) :-
 
-jCallShortMethod(Obj, MethodID, Types, Args, Rshort) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(48, Obj, MethodID, ArgBuf, Rshort).
+jCallShortMethod(Obj, MethodID, Types, Params, Rshort) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(48, Obj, MethodID, ParamBuf, Rshort).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticBooleanMethod(class, types, datums, boolean)
+%type   jCallStaticBooleanMethod(class, types, datums, boolean)
 
-% jCallStaticBooleanMethod(+Class, +MethodID, +Types, +Args, -Rbool) :-
+% jCallStaticBooleanMethod(+Class, +MethodID, +Types, +Params, -Rbool) :-
 
-jCallStaticBooleanMethod(Class, MethodID, Types, Args, Rbool) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(119, Class, MethodID, ArgBuf, Rbool).
+jCallStaticBooleanMethod(Class, MethodID, Types, Params, Rbool) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(119, Class, MethodID, ParamBuf, Rbool).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticByteMethod(class, method_id, types, datums, byte)
+%type   jCallStaticByteMethod(class, method_id, types, datums, byte)
 
-% jCallStaticByteMethod(+Class, +MethodID, +Types, +Args, -Rbyte) :-
+% jCallStaticByteMethod(+Class, +MethodID, +Types, +Params, -Rbyte) :-
 
-jCallStaticByteMethod(Class, MethodID, Types, Args, Rbyte) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(122, Class, MethodID, ArgBuf, Rbyte).
+jCallStaticByteMethod(Class, MethodID, Types, Params, Rbyte) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(122, Class, MethodID, ParamBuf, Rbyte).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticCharMethod(class, method_id, types, datums, char)
+%type   jCallStaticCharMethod(class, method_id, types, datums, char)
 
-% jCallStaticCharMethod(+Class, +MethodID, +Types, +Args, -Rchar) :-
+% jCallStaticCharMethod(+Class, +MethodID, +Types, +Params, -Rchar) :-
 
-jCallStaticCharMethod(Class, MethodID, Types, Args, Rchar) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(125, Class, MethodID, ArgBuf, Rchar).
+jCallStaticCharMethod(Class, MethodID, Types, Params, Rchar) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(125, Class, MethodID, ParamBuf, Rchar).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticDoubleMethod(class, method_id, types, datums, double)
+%type   jCallStaticDoubleMethod(class, method_id, types, datums, double)
 
-% jCallStaticDoubleMethod(+Class, +MethodID, +Types, +Args, -Rdouble) :-
+% jCallStaticDoubleMethod(+Class, +MethodID, +Types, +Params, -Rdouble) :-
 
-jCallStaticDoubleMethod(Class, MethodID, Types, Args, Rdouble) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(140, Class, MethodID, ArgBuf, Rdouble).
+jCallStaticDoubleMethod(Class, MethodID, Types, Params, Rdouble) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(140, Class, MethodID, ParamBuf, Rdouble).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticFloatMethod(class, method_id, types, datums, float)
+%type   jCallStaticFloatMethod(class, method_id, types, datums, float)
 
-% jCallStaticFloatMethod(+Class, +MethodID, +Types, +Args, -Rfloat) :-
+% jCallStaticFloatMethod(+Class, +MethodID, +Types, +Params, -Rfloat) :-
 
-jCallStaticFloatMethod(Class, MethodID, Types, Args, Rfloat) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(137, Class, MethodID, ArgBuf, Rfloat).
+jCallStaticFloatMethod(Class, MethodID, Types, Params, Rfloat) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(137, Class, MethodID, ParamBuf, Rfloat).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticIntMethod(class, method_id, types, datums, int)
+%type   jCallStaticIntMethod(class, method_id, types, datums, int)
 
-% jCallStaticIntMethod(+Class, +MethodID, +Types, +Args, -Rint) :-
+% jCallStaticIntMethod(+Class, +MethodID, +Types, +Params, -Rint) :-
 
-jCallStaticIntMethod(Class, MethodID, Types, Args, Rint) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(131, Class, MethodID, ArgBuf, Rint).
+jCallStaticIntMethod(Class, MethodID, Types, Params, Rint) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(131, Class, MethodID, ParamBuf, Rint).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticLongMethod(class, method_id, types, datums, long)
+%type   jCallStaticLongMethod(class, method_id, types, datums, long)
 
-% jCallStaticLongMethod(+Class, +MethodID, +Types, +Args, -Rlong) :-
+% jCallStaticLongMethod(+Class, +MethodID, +Types, +Params, -Rlong) :-
 
-jCallStaticLongMethod(Class, MethodID, Types, Args, Rlong) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(134, Class, MethodID, ArgBuf, Rlong).
+jCallStaticLongMethod(Class, MethodID, Types, Params, Rlong) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(134, Class, MethodID, ParamBuf, Rlong).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticObjectMethod(class, method_id, types, datums, object)
+%type   jCallStaticObjectMethod(class, method_id, types, datums, object)
 
-% jCallStaticObjectMethod(+Class, +MethodID, +Types, +Args, -Robj) :-
+% jCallStaticObjectMethod(+Class, +MethodID, +Types, +Params, -Robj) :-
 
-jCallStaticObjectMethod(Class, MethodID, Types, Args, Robj) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(116, Class, MethodID, ArgBuf, Robj).
+jCallStaticObjectMethod(Class, MethodID, Types, Params, Robj) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(116, Class, MethodID, ParamBuf, Robj).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticShortMethod(class, method_id, types, datums, short)
+%type   jCallStaticShortMethod(class, method_id, types, datums, short)
 
-% jCallStaticShortMethod(+Class, +MethodID, +Types, +Args, -Rshort) :-
+% jCallStaticShortMethod(+Class, +MethodID, +Types, +Params, -Rshort) :-
 
-jCallStaticShortMethod(Class, MethodID, Types, Args, Rshort) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(128, Class, MethodID, ArgBuf, Rshort).
+jCallStaticShortMethod(Class, MethodID, Types, Params, Rshort) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(128, Class, MethodID, ParamBuf, Rshort).
 
 %------------------------------------------------------------------------------
 
-%type  jCallStaticVoidMethod(class, method_id, types, datums)
+%type   jCallStaticVoidMethod(class, method_id, types, datums)
 
-% jCallStaticVoidMethod(+Class, +MethodID, +Types, +Args) :-
+% jCallStaticVoidMethod(+Class, +MethodID, +Types, +Params) :-
 
-jCallStaticVoidMethod(Class, MethodID, Types, Args) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_void(143, Class, MethodID, ArgBuf).
+jCallStaticVoidMethod(Class, MethodID, Types, Params) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_void(143, Class, MethodID, ParamBuf).
 
 %------------------------------------------------------------------------------
 
-%type  jCallVoidMethod(object, method_id, types, datums)
+%type   jCallVoidMethod(object, method_id, types, datums)
 
-% jCallVoidMethod(+Obj, +MethodID, +Types, +Args) :-
+% jCallVoidMethod(+Obj, +MethodID, +Types, +Params) :-
 
-jCallVoidMethod(Obj, MethodID, Types, Args) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_void(63, Obj, MethodID, ArgBuf).
+jCallVoidMethod(Obj, MethodID, Types, Params) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_void(63, Obj, MethodID, ParamBuf).
 
 %------------------------------------------------------------------------------
 
-%type  jFindClass(findclassname, class)
+%type   jFindClass(findclassname, class)
 
 % jFindClass(+ClassName, -Class) :-
 
 jFindClass(ClassName, Class) :-
-    jni_func(6, ClassName, Class).
+       jni_func(6, ClassName, Class).
 
 %------------------------------------------------------------------------------
 
-%type  jGetArrayLength(array, int)
+%type   jGetArrayLength(array, int)
 
 % jGetArrayLength(+Array, -Size) :-
 
 jGetArrayLength(Array, Size) :-
-    jni_func(171, Array, Size).
+       jni_func(171, Array, Size).
 
 %------------------------------------------------------------------------------
 
-%type  jGetBooleanArrayRegion(boolean_array, int, int, boolean_buf)
+%type   jGetBooleanArrayRegion(boolean_array, int, int, boolean_buf)
 
 % jGetBooleanArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jGetBooleanArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(199, Array, Start, Len, Buf).
+       jni_void(199, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jGetBooleanField(object, field_id, boolean)
+%type   jGetBooleanField(object, field_id, boolean)
 
 % jGetBooleanField(+Obj, +FieldID, -Rbool) :-
 
 jGetBooleanField(Obj, FieldID, Rbool) :-
-    jni_func(96, Obj, FieldID, Rbool).
+       jni_func(96, Obj, FieldID, Rbool).
 
 %------------------------------------------------------------------------------
 
-%type  jGetByteArrayRegion(byte_array, int, int, byte_buf)
+%type   jGetByteArrayRegion(byte_array, int, int, byte_buf)
 
 % jGetByteArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jGetByteArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(200, Array, Start, Len, Buf).
+       jni_void(200, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jGetByteField(object, field_id, byte)
+%type   jGetByteField(object, field_id, byte)
 
 % jGetByteField(+Obj, +FieldID, -Rbyte) :-
 
 jGetByteField(Obj, FieldID, Rbyte) :-
-    jni_func(97, Obj, FieldID, Rbyte).
+       jni_func(97, Obj, FieldID, Rbyte).
 
 %------------------------------------------------------------------------------
 
-%type  jGetCharArrayRegion(char_array, int, int, char_buf)
+%type   jGetCharArrayRegion(char_array, int, int, char_buf)
 
 % jGetCharArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jGetCharArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(201, Array, Start, Len, Buf).
+       jni_void(201, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jGetCharField(object, field_id, char)
+%type   jGetCharField(object, field_id, char)
 
 % jGetCharField(+Obj, +FieldID, -Rchar) :-
 
 jGetCharField(Obj, FieldID, Rchar) :-
-    jni_func(98, Obj, FieldID, Rchar).
+       jni_func(98, Obj, FieldID, Rchar).
 
 %------------------------------------------------------------------------------
 
-%type  jGetDoubleArrayRegion(double_array, int, int, double_buf)
+%type   jGetDoubleArrayRegion(double_array, int, int, double_buf)
 
 % jGetDoubleArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jGetDoubleArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(206, Array, Start, Len, Buf).
+       jni_void(206, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jGetDoubleField(object, field_id, double)
+%type   jGetDoubleField(object, field_id, double)
 
 % jGetDoubleField(+Obj, +FieldID, -Rdouble) :-
 
 jGetDoubleField(Obj, FieldID, Rdouble) :-
-    jni_func(103, Obj, FieldID, Rdouble).
+       jni_func(103, Obj, FieldID, Rdouble).
 
 %------------------------------------------------------------------------------
 
-%type  jGetFieldID(class, descriptor, field_id)
+%type   jGetFieldID(class, descriptor, field_id)
 
 % jGetFieldID(+Class, +Name, +Typedescriptor, -FieldID) :-
 
 jGetFieldID(Class, Name, Type, FieldID) :-
-    jpl_type_to_descriptor(Type, TD),
-    jni_func(94, Class, Name, TD, FieldID).
+       jpl_type_to_descriptor(Type, TD),
+       jni_func(94, Class, Name, TD, FieldID).
 
 %------------------------------------------------------------------------------
 
-%type  jGetFloatArrayRegion(float_array, int, int, float_buf)
+%type   jGetFloatArrayRegion(float_array, int, int, float_buf)
 
 % jGetFloatArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jGetFloatArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(205, Array, Start, Len, Buf).
+       jni_void(205, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jGetFloatField(object, field_id, float)
+%type   jGetFloatField(object, field_id, float)
 
 % jGetFloatField(+Obj, +FieldID, -Rfloat) :-
 
 jGetFloatField(Obj, FieldID, Rfloat) :-
-    jni_func(102, Obj, FieldID, Rfloat).
+       jni_func(102, Obj, FieldID, Rfloat).
 
 %------------------------------------------------------------------------------
 
-%type  jGetIntArrayRegion(int_array, int, int, int_buf)
+%type   jGetIntArrayRegion(int_array, int, int, int_buf)
 
 % jGetIntArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jGetIntArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(203, Array, Start, Len, Buf).
+       jni_void(203, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jGetIntField(object, field_id, int)
+%type   jGetIntField(object, field_id, int)
 
 % jGetIntField(+Obj, +FieldID, -Rint) :-
 
 jGetIntField(Obj, FieldID, Rint) :-
-    jni_func(100, Obj, FieldID, Rint).
+       jni_func(100, Obj, FieldID, Rint).
 
 %------------------------------------------------------------------------------
 
-%type  jGetLongArrayRegion(long_array, int, int, long_buf)
+%type   jGetLongArrayRegion(long_array, int, int, long_buf)
 
 % jGetLongArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jGetLongArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(204, Array, Start, Len, Buf).
+       jni_void(204, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jGetLongField(object, field_id, long)
+%type   jGetLongField(object, field_id, long)
 
 % jGetLongField(+Obj, +FieldID, -Rlong) :-
 
 jGetLongField(Obj, FieldID, Rlong) :-
-    jni_func(101, Obj, FieldID, Rlong).
+       jni_func(101, Obj, FieldID, Rlong).
 
 %------------------------------------------------------------------------------
 
-%type  jGetMethodID(class, name, descriptor, method_id)
+%type   jGetMethodID(class, name, descriptor, method_id)
 
 % jGetMethodID(+Class, +Name, +TypeDescriptor, -MethodID) :-
 
 jGetMethodID(Class, Name, Type, MethodID) :-
-    jpl_type_to_descriptor(Type, TD),
-    jni_func(33, Class, Name, TD, MethodID).
+       jpl_type_to_descriptor(Type, TD),
+       jni_func(33, Class, Name, TD, MethodID).
 
 %------------------------------------------------------------------------------
 
-%type  jGetObjectArrayElement(object_array, int, object)
+%type   jGetObjectArrayElement(object_array, int, object)
 
 % jGetObjectArrayElement(+Array, +Index, -Obj) :-
 
 jGetObjectArrayElement(Array, Index, Obj) :-
-    jni_func(173, Array, Index, Obj).
+       jni_func(173, Array, Index, Obj).
 
 %------------------------------------------------------------------------------
 
-%type  jGetObjectClass(object, class)
+%type   jGetObjectClass(object, class)
 
 % jGetObjectClass(+Object, -Class) :-
 
 jGetObjectClass(Object, Class) :-
-    jni_func(31, Object, Class).
+       jni_func(31, Object, Class).
 
 %------------------------------------------------------------------------------
 
-%type  jGetObjectField(object, field_id, object)
+%type   jGetObjectField(object, field_id, object)
 
 % jGetObjectField(+Obj, +FieldID, -RObj) :-
 
 jGetObjectField(Obj, FieldID, Robj) :-
-    jni_func(95, Obj, FieldID, Robj).
+       jni_func(95, Obj, FieldID, Robj).
 
 %------------------------------------------------------------------------------
 
-%type  jGetShortArrayRegion(short_array, int, int, short_buf)
+%type   jGetShortArrayRegion(short_array, int, int, short_buf)
 
 % jGetShortArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jGetShortArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(202, Array, Start, Len, Buf).
+       jni_void(202, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jGetShortField(object, field_id, short)
+%type   jGetShortField(object, field_id, short)
 
 % jGetShortField(+Obj, +FieldID, -Rshort) :-
 
 jGetShortField(Obj, FieldID, Rshort) :-
-    jni_func(99, Obj, FieldID, Rshort).
+       jni_func(99, Obj, FieldID, Rshort).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticBooleanField(class, field_id, boolean)
+%type   jGetStaticBooleanField(class, field_id, boolean)
 
 % jGetStaticBooleanField(+Class, +FieldID, -Rbool) :-
 
 jGetStaticBooleanField(Class, FieldID, Rbool) :-
-    jni_func(146, Class, FieldID, Rbool).
+       jni_func(146, Class, FieldID, Rbool).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticByteField(class, field_id, byte)
+%type   jGetStaticByteField(class, field_id, byte)
 
 % jGetStaticByteField(+Class, +FieldID, -Rbyte) :-
 
 jGetStaticByteField(Class, FieldID, Rbyte) :-
-    jni_func(147, Class, FieldID, Rbyte).
+       jni_func(147, Class, FieldID, Rbyte).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticCharField(class, field_id, char)
+%type   jGetStaticCharField(class, field_id, char)
 
 % jGetStaticCharField(+Class, +FieldID, -Rchar) :-
 
 jGetStaticCharField(Class, FieldID, Rchar) :-
-    jni_func(148, Class, FieldID, Rchar).
+       jni_func(148, Class, FieldID, Rchar).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticDoubleField(class, field_id, double)
+%type   jGetStaticDoubleField(class, field_id, double)
 
 % jGetStaticDoubleField(+Class, +FieldID, -Rdouble) :-
 
 jGetStaticDoubleField(Class, FieldID, Rdouble) :-
-    jni_func(153, Class, FieldID, Rdouble).
+       jni_func(153, Class, FieldID, Rdouble).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticFieldID(class, name, field_id)
+%type   jGetStaticFieldID(class, name, field_id)
 
 % jGetStaticFieldID(+Class, +Name, +TypeDescriptor, -FieldID) :-
 
 jGetStaticFieldID(Class, Name, Type, FieldID) :-
-    jpl_type_to_descriptor(Type, TD),              % cache this?
-    jni_func(144, Class, Name, TD, FieldID).
+       jpl_type_to_descriptor(Type, TD),               % cache this?
+       jni_func(144, Class, Name, TD, FieldID).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticFloatField(class, field_id, float)
+%type   jGetStaticFloatField(class, field_id, float)
 
 % jGetStaticFloatField(+Class, +FieldID, -Rfloat) :-
 
 jGetStaticFloatField(Class, FieldID, Rfloat) :-
-    jni_func(152, Class, FieldID, Rfloat).
+       jni_func(152, Class, FieldID, Rfloat).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticIntField(class, field_id, int)
+%type   jGetStaticIntField(class, field_id, int)
 
 % jGetStaticIntField(+Class, +FieldID, -Rint) :-
 
 jGetStaticIntField(Class, FieldID, Rint) :-
-    jni_func(150, Class, FieldID, Rint).
+       jni_func(150, Class, FieldID, Rint).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticLongField(class, field_id, long)
+%type   jGetStaticLongField(class, field_id, long)
 
 % jGetStaticLongField(+Class, +FieldID, -Rlong) :-
 
 jGetStaticLongField(Class, FieldID, Rlong) :-
-    jni_func(151, Class, FieldID, Rlong).
+       jni_func(151, Class, FieldID, Rlong).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticMethodID(class, name, method_id)
+%type   jGetStaticMethodID(class, name, method_id)
 
 % jGetStaticMethodID(+Class, +Name, +TypeDescriptor, -MethodID) :-
 
 jGetStaticMethodID(Class, Name, Type, MethodID) :-
-    jpl_type_to_descriptor(Type, TD),
-    jni_func(113, Class, Name, TD, MethodID).
+       jpl_type_to_descriptor(Type, TD),
+       jni_func(113, Class, Name, TD, MethodID).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticObjectField(class, field_id, object)
+%type   jGetStaticObjectField(class, field_id, object)
 
 % jGetStaticObjectField(+Class, +FieldID, -RObj) :-
 
 jGetStaticObjectField(Class, FieldID, Robj) :-
-    jni_func(145, Class, FieldID, Robj).
+       jni_func(145, Class, FieldID, Robj).
 
 %------------------------------------------------------------------------------
 
-%type  jGetStaticShortField(class, field_id, short)
+%type   jGetStaticShortField(class, field_id, short)
 
 % jGetStaticShortField(+Class, +FieldID, -Rshort) :-
 
 jGetStaticShortField(Class, FieldID, Rshort) :-
-    jni_func(149, Class, FieldID, Rshort).
+       jni_func(149, Class, FieldID, Rshort).
 
 %------------------------------------------------------------------------------
 
-%type  jGetSuperclass(object, object)
+%type   jGetSuperclass(object, object)
 
 % jGetSuperclass(+Class1, -Class2) :-
 
 jGetSuperclass(Class1, Class2) :-
-    jni_func(10, Class1, Class2).
+       jni_func(10, Class1, Class2).
 
 %------------------------------------------------------------------------------
 
-%type  jIsAssignableFrom(object, object)
+%type   jIsAssignableFrom(object, object)
 
 % jIsAssignableFrom(+Class1, +Class2) :-
 
 jIsAssignableFrom(Class1, Class2) :-
-    jni_func(11, Class1, Class2, @(true)).
+       jni_func(11, Class1, Class2, @(true)).
 
 %------------------------------------------------------------------------------
 
-%type  jNewBooleanArray(int, boolean_array)
+%type   jNewBooleanArray(int, boolean_array)
 
 % jNewBooleanArray(+Length, -Array) :-
 
 jNewBooleanArray(Length, Array) :-
-    jni_func(175, Length, Array).
+       jni_func(175, Length, Array).
 
 %------------------------------------------------------------------------------
 
-%type  jNewByteArray(int, byte_array)
+%type   jNewByteArray(int, byte_array)
 
 % jNewByteArray(+Length, -Array) :-
 
 jNewByteArray(Length, Array) :-
-    jni_func(176, Length, Array).
+       jni_func(176, Length, Array).
 
 %------------------------------------------------------------------------------
 
-%type  jNewCharArray(int, char_array)
+%type   jNewCharArray(int, char_array)
 
 % jNewCharArray(+Length, -Array) :-
 
 jNewCharArray(Length, Array) :-
-    jni_func(177, Length, Array).
+       jni_func(177, Length, Array).
 
 %------------------------------------------------------------------------------
 
-%type  jNewDoubleArray(int, double_array)
+%type   jNewDoubleArray(int, double_array)
 
 % jNewDoubleArray(+Length, -Array) :-
 
 jNewDoubleArray(Length, Array) :-
-    jni_func(182, Length, Array).
+       jni_func(182, Length, Array).
 
 %------------------------------------------------------------------------------
 
-%type  jNewFloatArray(int, float_array)
+%type   jNewFloatArray(int, float_array)
 
 % jNewFloatArray(+Length, -Array) :-
 
 jNewFloatArray(Length, Array) :-
-    jni_func(181, Length, Array).
+       jni_func(181, Length, Array).
 
 %------------------------------------------------------------------------------
 
-%type  jNewIntArray(int, int_array)
+%type   jNewIntArray(int, int_array)
 
 % jNewIntArray(+Length, -Array) :-
 
 jNewIntArray(Length, Array) :-
-    jni_func(179, Length, Array).
+       jni_func(179, Length, Array).
 
 %------------------------------------------------------------------------------
 
-%type  jNewLongArray(int, long_array)
+%type   jNewLongArray(int, long_array)
 
 % jNewLongArray(+Length, -Array) :-
 
 jNewLongArray(Length, Array) :-
-    jni_func(180, Length, Array).
+       jni_func(180, Length, Array).
 
 %------------------------------------------------------------------------------
 
-%type  jNewObject(class, method_id, types, datums, object)
+%type   jNewObject(class, method_id, types, datums, object)
 
-% jNewObject(+Class, +MethodID, +Types, +Args, -Obj) :-
+% jNewObject(+Class, +MethodID, +Types, +Params, -Obj) :-
 
-jNewObject(Class, MethodID, Types, Args, Obj) :-
-    jni_params_put(Args, Types, ArgBuf),
-    jni_func(30, Class, MethodID, ArgBuf, Obj).
+jNewObject(Class, MethodID, Types, Params, Obj) :-
+       jni_params_put(Params, Types, ParamBuf),
+       jni_func(30, Class, MethodID, ParamBuf, Obj).
 
 %------------------------------------------------------------------------------
 
-%type  jNewObjectArray(int, class, object, object_array)
+%type   jNewObjectArray(int, class, object, object_array)
 
 % jNewObjectArray(+Len, +Class, +InitVal, -Array) :-
 
 jNewObjectArray(Len, Class, InitVal, Array) :-
-    jni_func(172, Len, Class, InitVal, Array).
+       jni_func(172, Len, Class, InitVal, Array).
 
 %------------------------------------------------------------------------------
 
-%type  jNewShortArray(int, short_array)
+%type   jNewShortArray(int, short_array)
 
 % jNewShortArray(+Length, -Array) :-
 
 jNewShortArray(Length, Array) :-
-    jni_func(178, Length, Array).
+       jni_func(178, Length, Array).
 
 %------------------------------------------------------------------------------
 
-%type  jSetBooleanArrayRegion(boolean_array, int, int, boolean_buf)
+%type   jSetBooleanArrayRegion(boolean_array, int, int, boolean_buf)
 
 % jSetBooleanArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jSetBooleanArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(207, Array, Start, Len, Buf).
+       jni_void(207, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jSetBooleanField(object, field_id, boolean)
+%type   jSetBooleanField(object, field_id, boolean)
 
 % jSetBooleanField(+Obj, +FieldID, +Rbool) :-
 
 jSetBooleanField(Obj, FieldID, Rbool) :-
-    jni_void(105, Obj, FieldID, Rbool).
+       jni_void(105, Obj, FieldID, Rbool).
 
 %------------------------------------------------------------------------------
 
-%type  jSetByteArrayRegion(byte_array, int, int, byte_buf)
+%type   jSetByteArrayRegion(byte_array, int, int, byte_buf)
 
 % jSetByteArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jSetByteArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(208, Array, Start, Len, Buf).
+       jni_void(208, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jSetByteField(object, field_id, byte)
+%type   jSetByteField(object, field_id, byte)
 
 % jSetByteField(+Obj, +FieldID, +Rbyte) :-
 
 jSetByteField(Obj, FieldID, Rbyte) :-
-    jni_void(106, Obj, FieldID, Rbyte).
+       jni_void(106, Obj, FieldID, Rbyte).
 
 %------------------------------------------------------------------------------
 
-%type  jSetCharArrayRegion(char_array, int, int, char_buf)
+%type   jSetCharArrayRegion(char_array, int, int, char_buf)
 
 % jSetCharArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jSetCharArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(209, Array, Start, Len, Buf).
+       jni_void(209, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jSetCharField(object, field_id, char)
+%type   jSetCharField(object, field_id, char)
 
 % jSetCharField(+Obj, +FieldID, +Rchar) :-
 
 jSetCharField(Obj, FieldID, Rchar) :-
-    jni_void(107, Obj, FieldID, Rchar).
+       jni_void(107, Obj, FieldID, Rchar).
 
 %------------------------------------------------------------------------------
 
-%type  jSetDoubleArrayRegion(double_array, int, int, double_buf)
+%type   jSetDoubleArrayRegion(double_array, int, int, double_buf)
 
 % jSetDoubleArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jSetDoubleArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(214, Array, Start, Len, Buf).
+       jni_void(214, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jSetDoubleField(object, field_id, double)
+%type   jSetDoubleField(object, field_id, double)
 
 % jSetDoubleField(+Obj, +FieldID, +Rdouble) :-
 
 jSetDoubleField(Obj, FieldID, Rdouble) :-
-    jni_void(112, Obj, FieldID, Rdouble).
+       jni_void(112, Obj, FieldID, Rdouble).
 
 %------------------------------------------------------------------------------
 
-%type  jSetFloatArrayRegion(float_array, int, int, float_buf)
+%type   jSetFloatArrayRegion(float_array, int, int, float_buf)
 
 % jSetFloatArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jSetFloatArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(213, Array, Start, Len, Buf).
+       jni_void(213, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jSetFloatField(object, field_id, float)
+%type   jSetFloatField(object, field_id, float)
 
 % jSetFloatField(+Obj, +FieldID, +Rfloat) :-
 
 jSetFloatField(Obj, FieldID, Rfloat) :-
-    jni_void(111, Obj, FieldID, Rfloat).
+       jni_void(111, Obj, FieldID, Rfloat).
 
 %------------------------------------------------------------------------------
 
-%type  jSetIntArrayRegion(int_array, int, int, int_buf)
+%type   jSetIntArrayRegion(int_array, int, int, int_buf)
 
 % jSetIntArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jSetIntArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(211, Array, Start, Len, Buf).
+       jni_void(211, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jSetIntField(object, field_id, int)
+%type   jSetIntField(object, field_id, int)
 
 % jSetIntField(+Obj, +FieldID, +Rint) :-
 
 jSetIntField(Obj, FieldID, Rint) :-
-    jni_void(109, Obj, FieldID, Rint).
+       jni_void(109, Obj, FieldID, Rint).
 
 %------------------------------------------------------------------------------
 
-%type  jSetLongArrayRegion(long_array, int, int, long_buf)
+%type   jSetLongArrayRegion(long_array, int, int, long_buf)
 
 % jSetLongArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jSetLongArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(212, Array, Start, Len, Buf).
+       jni_void(212, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jSetLongField(object, field_id, long)
+%type   jSetLongField(object, field_id, long)
 
 % jSetLongField(+Obj, +FieldID, +Rlong) :-
 
 jSetLongField(Obj, FieldID, Rlong) :-
-    jni_void(110, Obj, FieldID, Rlong).
+       jni_void(110, Obj, FieldID, Rlong).
 
 %------------------------------------------------------------------------------
 
-%type  jSetObjectArrayElement(object_array, int, object)
+%type   jSetObjectArrayElement(object_array, int, object)
 
 % jSetObjectArrayElement(+Array, +Index, +Obj) :-
 
 jSetObjectArrayElement(Array, Index, Obj) :-
-    jni_void(174, Array, Index, Obj).
+       jni_void(174, Array, Index, Obj).
 
 %------------------------------------------------------------------------------
 
-%type  jSetObjectField(object, field_id, object)
+%type   jSetObjectField(object, field_id, object)
 
 % jSetObjectField(+Obj, +FieldID, +RObj) :-
 
 jSetObjectField(Obj, FieldID, Robj) :-
-    jni_void(104, Obj, FieldID, Robj).
+       jni_void(104, Obj, FieldID, Robj).
 
 %------------------------------------------------------------------------------
 
-%type  jSetShortArrayRegion(short_array, int, int, short_buf)
+%type   jSetShortArrayRegion(short_array, int, int, short_buf)
 
 % jSetShortArrayRegion(+Array, +Start, +Len, +Buf) :-
 
 jSetShortArrayRegion(Array, Start, Len, Buf) :-
-    jni_void(210, Array, Start, Len, Buf).
+       jni_void(210, Array, Start, Len, Buf).
 
 %------------------------------------------------------------------------------
 
-%type  jSetShortField(object, field_id, short)
+%type   jSetShortField(object, field_id, short)
 
 % jSetShortField(+Obj, +FieldID, +Rshort) :-
 
 jSetShortField(Obj, FieldID, Rshort) :-
-    jni_void(108, Obj, FieldID, Rshort).
+       jni_void(108, Obj, FieldID, Rshort).
 
 %------------------------------------------------------------------------------
 
-%type  jSetStaticBooleanField(class, field_id, boolean)
+%type   jSetStaticBooleanField(class, field_id, boolean)
 
 % jSetStaticBooleanField(+Class, +FieldID, +Rbool) :-
 
 jSetStaticBooleanField(Class, FieldID, Rbool) :-
-    jni_void(155, Class, FieldID, Rbool).
+       jni_void(155, Class, FieldID, Rbool).
 
 %------------------------------------------------------------------------------
 
-%type  jSetStaticByteField(class, field_id, byte)
+%type   jSetStaticByteField(class, field_id, byte)
 
 % jSetStaticByteField(+Class, +FieldID, +Rbyte) :-
 
 jSetStaticByteField(Class, FieldID, Rbyte) :-
-    jni_void(156, Class, FieldID, Rbyte).
+       jni_void(156, Class, FieldID, Rbyte).
 
 %------------------------------------------------------------------------------
 
-%type  jSetStaticCharField(class, field_id, char)
+%type   jSetStaticCharField(class, field_id, char)
 
 % jSetStaticCharField(+Class, +FieldID, +Rchar) :-
 
 jSetStaticCharField(Class, FieldID, Rchar) :-
-    jni_void(157, Class, FieldID, Rchar).
+       jni_void(157, Class, FieldID, Rchar).
 
 %------------------------------------------------------------------------------
 
-%type  jSetStaticDoubleField(class, field_id, double)
+%type   jSetStaticDoubleField(class, field_id, double)
 
 % jSetStaticDoubleField(+Class, +FieldID, +Rdouble) :-
 
 jSetStaticDoubleField(Class, FieldID, Rdouble) :-
-    jni_void(162, Class, FieldID, Rdouble).
+       jni_void(162, Class, FieldID, Rdouble).
 
 %------------------------------------------------------------------------------
 
-%type  jSetStaticFloatField(class, field_id, float)
+%type   jSetStaticFloatField(class, field_id, float)
 
 % jSetStaticFloatField(+Class, +FieldID, +Rfloat) :-
 
 jSetStaticFloatField(Class, FieldID, Rfloat) :-
-    jni_void(161, Class, FieldID, Rfloat).
+       jni_void(161, Class, FieldID, Rfloat).
 
 %------------------------------------------------------------------------------
 
-%type  jSetStaticIntField(class, field_id, int)
+%type   jSetStaticIntField(class, field_id, int)
 
 % jSetStaticIntField(+Class, +FieldID, +Rint) :-
 
 jSetStaticIntField(Class, FieldID, Rint) :-
-    jni_void(159, Class, FieldID, Rint).
+       jni_void(159, Class, FieldID, Rint).
 
 %------------------------------------------------------------------------------
 
-%type  jSetStaticLongField(class, field_id, long)
+%type   jSetStaticLongField(class, field_id, long)
 
 % jSetStaticLongField(+Class, +FieldID, +Rlong) :-
 
 jSetStaticLongField(Class, FieldID, Rlong) :-
-    jni_void(160, Class, FieldID, Rlong).
+       jni_void(160, Class, FieldID, Rlong).
 
 %------------------------------------------------------------------------------
 
-%type  jSetStaticObjectField(class, field_id, object)
+%type   jSetStaticObjectField(class, field_id, object)
 
 % jSetStaticObjectField(+Class, +FieldID, +Robj) :-
 
 jSetStaticObjectField(Class, FieldID, Robj) :-
-    jni_void(154, Class, FieldID, Robj).
+       jni_void(154, Class, FieldID, Robj).
 
 %------------------------------------------------------------------------------
 
-%type  jSetStaticShortField(class, field_id, short)
+%type   jSetStaticShortField(class, field_id, short)
 
 % jSetStaticShortField(+Class, +FieldID, +Rshort) :-
 
 jSetStaticShortField(Class, FieldID, Rshort) :-
-    jni_void(158, Class, FieldID, Rshort).
-
-%------------------------------------------------------------------------------
-
-% jni_convert_primitive_in(+JspType, -Term, +Xhi, +Xlo) :-
-%   a value of JspType returned
-%   (by jni_primitive_buffer_to_array or jni_get_array_element)
-%   as integers Xhi and Xlo
-%   is canonically (?) represented by Term;
-%   object types are bound in only where obvious (e.g. jstring, but not jthrowable)
-%   NB this oughta be done in foreign code...
-%   NB the following NBs are obsolete...
-%   NB this code assumes that null jbufs are never returned...
-%   NB XputMode is determined solely by JniType, but is needed earlier (for jni_call)
-%   NB this proc should be defined for all return types of supported JNI functions
-%   (see jni_proto/5)
-%   NB 'jsize' is synonymous with 'jint'
-
-jni_convert_primitive_in(boolean, T,   0, Xlo) :-
-    (  Xlo == 0
-    -> T = @(false)
-    ;  Xlo == 1
-    -> T = @(true)
-    ).
-jni_convert_primitive_in(byte,    I,   0,   I).
-jni_convert_primitive_in(char,    I,   0,   I).
-jni_convert_primitive_in(short,   I,   0,   I).
-jni_convert_primitive_in(int,     I,   0,   I).
-jni_convert_primitive_in(long,    T, Xhi, Xlo) :-
-    (  (   Xhi == 0,
-           Xlo >= 0    %  small non-negative
-       ;   Xhi == -1,
-           Xlo < 0     %  small negative
-       )
-    -> T = Xlo
-    ;  T = jlong(Xhi,Xlo)
-    ).
-jni_convert_primitive_in(float,   F,   0,   F).
-jni_convert_primitive_in(double,  F,   0,   F).
-
-%------------------------------------------------------------------------------
-
-% jni_convert_primitive_out(+JspType, +Term, -Xhi, -Xlo, -JniXputCode) :-
-%   to pass Term to a JNI function as (primitive) JspType,
-%   send Xhi, Xlo with JniXputCode
-%   NB all this oughta be done in foreign code...
-%   NB JniXputCode is determined by both JspType and Term
-%   NB JniXputCode determines reassembly, widening and casting in foreign code
-
-jni_convert_primitive_out(boolean, @(false),      0,  0,  1).      % JNI_XPUT_BOOLEAN
-
-jni_convert_primitive_out(boolean, @(true),       0,  1,  1).      % JNI_XPUT_BOOLEAN
-
-jni_convert_primitive_out(char,    I,             0,  I,  3) :-    % JNI_XPUT_CHAR
-    integer(I),
-    I >=     0,
-    I =< 65535.
-
-jni_convert_primitive_out(byte,    I,             0,  I,  2) :-    % JNI_XPUT_BYTE
-    integer(I),
-    I >= -128,
-    I =<  127.
-
-jni_convert_primitive_out(short,   I,             0,  I,  4) :-    % JNI_XPUT_SHORT
-    integer(I),
-    I >= -32768,
-    I =<  32767.
-
-jni_convert_primitive_out(int,     I,             0,  I,  5) :-    % JNI_XPUT_INT
-    integer(I),
-    I >= -2147483648,
-    I =<  2147483647.
-
-jni_convert_primitive_out(long,    I,            V2,  I,  6) :-    % JNI_XPUT_LONG
-    integer(I),
-    (  I < 0
-    -> V2 = -1
-    ;  V2 = 0
-    ).
-
-jni_convert_primitive_out(long,    jlong(V2,V1), V2, V1,  6) :-    % JNI_XPUT_LONG
-    integer(V1),
-    integer(V2).
-
-jni_convert_primitive_out(float,   F,             0,  F,  7) :-    % JNI_XPUT_FLOAT
-    float(F).
-
-jni_convert_primitive_out(float,   I,             0,  F,  7) :-    % JNI_XPUT_FLOAT
-    integer(I),
-    F is float(I).
-
-jni_convert_primitive_out(float,   jlong(V2,V1), V2, V1, 10) :-    % JNI_XPUT_LONG_TO_FLOAT
-    integer(V1),
-    integer(V2).
-
-jni_convert_primitive_out(double,  I,             0,  F,  9) :-    % JNI_XPUT_FLOAT_TO_DOUBLE
-    integer(I),
-    F is float(I).
-
-jni_convert_primitive_out(double,  jlong(V2,V1), V2, V1, 11) :-    % JNI_XPUT_LONG_TO_DOUBLE
-    integer(V1),
-    integer(V2).
-
-jni_convert_primitive_out(double,  F,             0,  F,  9) :-    % JNI_XPUT_FLOAT_TO_DOUBLE
-    float(F).
+       jni_void(158, Class, FieldID, Rshort).
 
 %------------------------------------------------------------------------------
 
-% jni_params_put(+Args, +Types, -ArgBuf)  :-
+% jni_params_put(+Params, +Types, -ParamBuf)  :-
 %   the old form used a static buffer, hence was not re-entrant;
 %   the new form allocates a buffer of one jvalue per arg,
 %   puts the (converted) args into respective elements, then returns it
 %   (the caller is responsible for freeing it)
 
-%jni_params_put(As, Ts)  :-
-%   jni_ensure_jvm,                    % in case e.g. NewStringUTF() is called
-%   jni_params_put_1(As, 0, Ts).
-
-
-jni_params_put(As, Ts, ArgBuf)  :-
-    jni_ensure_jvm,                    % in case e.g. NewStringUTF() is called
-    length(As, N),
-    jni_type_to_xput_code(jvalue, Xc), % Xc will be 15
-    jni_alloc_buffer(Xc, N, ArgBuf),
-    jni_params_put_1(As, 0, Ts, ArgBuf).
+jni_params_put(As, Ts, ParamBuf)     :-
+       jni_ensure_jvm,                     % in case e.g. NewStringUTF() is called
+       length(As, N),
+       jni_type_to_xput_code(jvalue, Xc), % Xc will be 15
+       jni_alloc_buffer(Xc, N, ParamBuf),
+       jni_params_put_1(As, 0, Ts, ParamBuf).
 
 %------------------------------------------------------------------------------
 
-% jni_params_put_1(+Args, +N, +JPLTypes, +ArgBuf) :-
-%   Args is a (full or partial) list of args-not-yet-stashed,
+% jni_params_put_1(+Params, +N, +JPLTypes, +ParamBuf) :-
+%   Params is a (full or partial) list of args-not-yet-stashed,
 %   and Types are their (JPL) types (e.g. 'boolean');
-%   N is the arg and buffer index (0+) at which the head of Args is to be stashed;
+%   N is the arg and buffer index (0+) at which the head of Params is to be stashed;
 %   the old form used a static buffer and hence was non-reentrant;
 %   the new form uses a dynamically allocated buffer (which oughta be freed after use)
 %
@@ -2386,26 +2557,19 @@ jni_params_put(As, Ts, ArgBuf)   :-
 %NB it's not clear whether the overloaded-method-resolution ensures that all args
 %NB are convertible
 
-%jni_params_put_1([], _, []).
-
-%jni_params_put_1([A|As], N, [Tjni|Ts]) :-             % type checking?
-%   N2 is N+1,
-%   jni_params_put_1(As, N2, Ts),                      % stash last param first
-%   (  jni_type_to_xput_code(Tjni, Xc)
-%   -> jni_param_put(N, Xc, A)                 % foreign
-%   ;  fail                                            % oughta raise an exception?
-%   ).
-
-
 jni_params_put_1([], _, [], _).
 
-jni_params_put_1([A|As], N, [Tjni|Ts], ArgBuf) :-      % type checking?
-    (  jni_type_to_xput_code(Tjni, Xc)
-    -> jni_param_put(N, Xc, A, ArgBuf)         % foreign
-    ;  fail                                            % oughta raise an exception?
-    ),
-    N2 is N+1,
-    jni_params_put_1(As, N2, Ts, ArgBuf).              % stash remaining params (if any)
+jni_params_put_1([A|As], N, [Tjni|Ts], ParamBuf) :-     % type checking?
+       (   jni_type_to_xput_code(Tjni, Xc)
+       ->  (       A = {Term}                              % a quoted general term?
+       ->      jni_term_to_jref( Term, Ax)             % convert it to a @(Tag) ref to a new Term instance
+       ;       A = Ax
+       ),
+       jni_param_put(N, Xc, Ax, ParamBuf)              % foreign
+       ;   fail                                            % oughta raise an exception?
+       ),
+       N2 is N+1,
+       jni_params_put_1(As, N2, Ts, ParamBuf).             % stash remaining params (if any)
 
 %------------------------------------------------------------------------------
 
@@ -2414,72 +2578,73 @@ jni_params_put_1([A|As], N, [Tjni|Ts], ArgBuf) :-       % type checking?
 %   NB the codes could be compiled into jni_method_spec_cache etc.
 %   instead of, or as well as, types (for - small - efficiency gain)
 
-jni_type_to_xput_code(boolean,     1).     % JNI_XPUT_BOOLEAN
+jni_type_to_xput_code(boolean,      1).     % JNI_XPUT_BOOLEAN
 
-jni_type_to_xput_code(byte,        2).     % JNI_XPUT_BYTE
+jni_type_to_xput_code(byte,         2).     % JNI_XPUT_BYTE
 
-jni_type_to_xput_code(char,        3).     % JNI_XPUT_CHAR
+jni_type_to_xput_code(char,         3).     % JNI_XPUT_CHAR
 
-jni_type_to_xput_code(short,       4).     % JNI_XPUT_SHORT
+jni_type_to_xput_code(short,        4).     % JNI_XPUT_SHORT
 
-jni_type_to_xput_code(int,         5).     % JNI_XPUT_INT
+jni_type_to_xput_code(int,          5).     % JNI_XPUT_INT
 
-jni_type_to_xput_code(long,        6).     % JNI_XPUT_LONG
+jni_type_to_xput_code(long,         6).     % JNI_XPUT_LONG
 
-jni_type_to_xput_code(float,       7).     % JNI_XPUT_FLOAT
+jni_type_to_xput_code(float,        7).     % JNI_XPUT_FLOAT
 
-jni_type_to_xput_code(double,      8).     % JNI_XPUT_DOUBLE
+jni_type_to_xput_code(double,       8).     % JNI_XPUT_DOUBLE
 
-jni_type_to_xput_code(class(_,_), 12).     % JNI_XPUT_REF
+jni_type_to_xput_code(class(_,_),   12).    % JNI_XPUT_REF
 
-jni_type_to_xput_code(array(_),   12).     % JNI_XPUT_REF
+jni_type_to_xput_code(array(_),     12).    % JNI_XPUT_REF
 
-jni_type_to_xput_code(jvalue,     15).     % JNI_XPUT_JVALUE
+jni_type_to_xput_code(jvalue,       15).    % JNI_XPUT_JVALUE
 
 %------------------------------------------------------------------------------
 
 % jpl_class_to_constructor_array(+Class, -MethodArray) :-
-%   might this be done more efficiently in foreign code?
+%   might this be done more efficiently in foreign code? or in Java?
 
 jpl_class_to_constructor_array(Cx, Ma) :-
-    jpl_classname_to_class('java.lang.Class', CC),     % cached?
-    jGetMethodID(
+       jpl_classname_to_class('java.lang.Class', CC),      % cacheable?
+       jGetMethodID(
        CC,
        getConstructors,
        method([],array(class([java,lang,reflect],['Constructor']))),
        MID
-    ),
-    jCallObjectMethod(Cx, MID, [], [], Ma).
+       ),                                                  % cacheable?
+       jCallObjectMethod(Cx, MID, [], [], Ma).
 
 %------------------------------------------------------------------------------
 
 % jpl_class_to_constructors(+Class, -Methods) :-
 
 jpl_class_to_constructors(Cx, Ms) :-
-    jpl_class_to_constructor_array(Cx, Ma),
-    jpl_object_array_to_list(Ma, Ms).
+       jpl_class_to_constructor_array(Cx, Ma),
+       jpl_object_array_to_list(Ma, Ms).
 
 %------------------------------------------------------------------------------
 
 % jpl_class_to_field_array(+Class, -FieldArray) :-
 
 jpl_class_to_field_array(Cx, Fa) :-
-    jpl_classname_to_class('java.lang.Class', CC),
-    jGetMethodID(
+       jpl_classname_to_class('java.lang.Class', CC),      % cacheable?
+       jGetMethodID(
        CC,
        getFields,
        method([],array(class([java,lang,reflect],['Field']))),
        MID
-    ),
-    jCallObjectMethod(Cx, MID, [], [], Fa).
+       ),                                                  % cacheable?
+       jCallObjectMethod(Cx, MID, [], [], Fa).
 
 %------------------------------------------------------------------------------
 
 % jpl_class_to_fields(+Class, -Fields) :-
+%   do this in Java (ditto for methods)?
 
 jpl_class_to_fields(C, Fs) :-
-    jpl_class_to_field_array(C, Fa),
-    jpl_object_array_to_list(Fa, Fs).
+       jpl_class_to_field_array(C, Fa),
+       jpl_object_array_to_list(Fa, Fs).
 
 %------------------------------------------------------------------------------
 
@@ -2487,22 +2652,24 @@ jpl_class_to_fields(C, Fs) :-
 %   migrate into foreign code for efficiency?
 
 jpl_class_to_method_array(Cx, Ma) :-
-    jpl_classname_to_class('java.lang.Class', CC),     % cached?
-    jGetMethodID(
+       jpl_classname_to_class('java.lang.Class', CC),      % cacheable?
+       jGetMethodID(
        CC,
        getMethods,
        method([],array(class([java,lang,reflect],['Method']))),
        MID
-    ),
-    jCallObjectMethod(Cx, MID, [], [], Ma).
+       ),                                                  % cacheable?
+       jCallObjectMethod(Cx, MID, [], [], Ma).
 
 %------------------------------------------------------------------------------
 
 % jpl_class_to_methods(+Class, -Methods) :-
+%   also used for constructors
+%   do this in Java (ditto for fields)?
 
 jpl_class_to_methods(Cx, Ms) :-
-    jpl_class_to_method_array(Cx, Ma),
-    jpl_object_array_to_list(Ma, Ms).
+       jpl_class_to_method_array(Cx, Ma),
+       jpl_object_array_to_list(Ma, Ms).
 
 %------------------------------------------------------------------------------
 
@@ -2510,8 +2677,8 @@ jpl_class_to_methods(Cx, Ms) :-
 %   migrate into foreign code for efficiency?
 
 jpl_constructor_to_modifiers(X, Ms) :-
-    jpl_classname_to_class('java.lang.reflect.Constructor', Cx),   % cached?
-    jpl_method_to_modifiers_1(X, Cx, Ms).
+       jpl_classname_to_class('java.lang.reflect.Constructor', Cx),   % cached?
+       jpl_method_to_modifiers_1(X, Cx, Ms).
 
 %------------------------------------------------------------------------------
 
@@ -2526,9 +2693,9 @@ jpl_constructor_to_name(_X, '<init>').
 % jpl_constructor_to_parameter_types(+Method, -ParameterTypes) :-
 %   migrate to foreign code for efficiency?
 
-jpl_constructor_to_parameter_types(X, Tps) :-
-    jpl_classname_to_class('java.lang.reflect.Constructor', Cx),   % cached?
-    jpl_method_to_parameter_types_1(X, Cx, Tps).
+jpl_constructor_to_parameter_types(X, Tfps) :-
+       jpl_classname_to_class('java.lang.reflect.Constructor', Cx),   % cached?
+       jpl_method_to_parameter_types_1(X, Cx, Tfps).
 
 %------------------------------------------------------------------------------
 
@@ -2540,120 +2707,130 @@ jpl_constructor_to_return_type(_X, void).
 
 %------------------------------------------------------------------------------
 
-% jpl_field_spec(+ClassType, -Index, -Name, -Modifiers, -MID, -Type) :-
+% jpl_field_spec(+Type, -Index, -Name, -Modifiers, -MID, -FieldType) :-
+%   I'm unsure whether arrays have fields, but if they do, this will handle them correctly
 
-jpl_field_spec(Tc, I, N, Mods, MID, T) :-
-    (  jpl_field_spec_is_cached(Tc)
-    -> jpl_field_spec_cache(Tc, I, N, Mods, MID, T)
-    ;  jpl_type_to_class(Tc, C),
+jpl_field_spec(T, I, N, Mods, MID, Tf) :-
+       (   jpl_field_spec_is_cached(T)
+       ->  jpl_field_spec_cache(T, I, N, Mods, MID, Tf)
+       ;   jpl_type_to_class(T, C),
        jpl_class_to_fields(C, Fs),
-       jpl_field_spec_1(Fs, Tc),
-       assert(jpl_field_spec_is_cached(Tc)),
-       jpl_field_spec_cache(Tc, I, N, Mods, MID, T)
-    ).
+       (   T = array(_BaseType)    % regardless of base type...
+       ->  Tci = array(_)          % ...the "cache index" type is this
+       ;   Tci = T
+       ),
+       jpl_field_spec_1(C, Tci, Fs),
+       jpl_assert(jpl_field_spec_is_cached(Tci)),
+       jpl_field_spec_cache(Tci, I, N, Mods, MID, Tf)
+       ).
 
 %------------------------------------------------------------------------------
 
-jpl_field_spec_1(Fs, Tc) :-
-    (  jpl_type_to_class(Tc, C),
-       nth1(I, Fs, F),
+jpl_field_spec_1(C, Tci, Fs) :-
+       (   nth1(I, Fs, F),
        jpl_field_to_name(F, N),
        jpl_field_to_modifiers(F, Mods),
-       jpl_field_to_type(F, T),
+       jpl_field_to_type(F, Tf),
        (   member(static, Mods)
-       ->  jGetStaticFieldID(C, N, T, MID)
-       ;   jGetFieldID(C, N, T, MID)
+       ->  jGetStaticFieldID(C, N, Tf, MID)
+       ;   jGetFieldID(C, N, Tf, MID)
        ),
-       assert(jpl_field_spec_cache(Tc,I,N,Mods,MID,T)),
+       jpl_assert(jpl_field_spec_cache(Tci,I,N,Mods,MID,Tf)),
        fail
-    ;  true
-    ).
+       ;   true
+       ).
 
 %------------------------------------------------------------------------------
 
-:- dynamic jpl_field_spec_cache/6.
+:- dynamic jpl_field_spec_cache/6.      % document this...
 
 %------------------------------------------------------------------------------
 
-:- dynamic jpl_field_spec_is_cached/1.
+:- dynamic jpl_field_spec_is_cached/1.  % document this...
 
 %------------------------------------------------------------------------------
 
-%type  jpl_field_to_modifiers(object, ordset(modifier))
+%type   jpl_field_to_modifiers(object, ordset(modifier))
 
 % jpl_field_to_modifiers(+Field, -Modifiers) :-
 
 jpl_field_to_modifiers(F, Ms) :-
-    jpl_classname_to_class('java.lang.reflect.Field', Cf),
-    jpl_method_to_modifiers_1(F, Cf, Ms).
+       jpl_classname_to_class('java.lang.reflect.Field', Cf),
+       jpl_method_to_modifiers_1(F, Cf, Ms).
 
 %------------------------------------------------------------------------------
 
 % jpl_field_to_name(+Field, -Name) :-
 
 jpl_field_to_name(F, N) :-
-    jpl_classname_to_class('java.lang.reflect.Field', Cf),
-    jpl_method_to_name_1(F, Cf, N).
+       jpl_classname_to_class('java.lang.reflect.Field', Cf),
+       jpl_member_to_name_1(F, Cf, N).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_field_to_type(object, type)
+%type   jpl_field_to_type(object, type)
 
 % jpl_field_to_type(+Field, -Type) :-
 
 jpl_field_to_type(F, Tf) :-
-    jpl_classname_to_class('java.lang.reflect.Field', Cf),
-    jGetMethodID(Cf, getType, method([],class([java,lang],['Class'])), MID),
-    jCallObjectMethod(F, MID, [], [], Cr),
-    jpl_class_to_type(Cr, Tf).
+       jpl_classname_to_class('java.lang.reflect.Field', Cf),
+       jGetMethodID(Cf, getType, method([],class([java,lang],['Class'])), MID),
+       jCallObjectMethod(F, MID, [], [], Cr),
+       jpl_class_to_type(Cr, Tf).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_method_spec(type, integer, name, arity, ordset(modifier), method_id, type, list(type))
+%type   jpl_method_spec(type, integer, name, arity, ordset(modifier), method_id, type, list(type))
 
-% jpl_method_spec(+ClassType, -Index, -Name, -Arity, -Modifiers, -MID, -ReturnType, -ParameterTypes) :-
-%   generates pertinent details of all accessible methods of ClassType,
+% jpl_method_spec(+Type, -Index, -Name, -Arity, -Modifiers, -MID, -ReturnType, -ParameterTypes) :-
+%   generates pertinent details of all accessible methods of Type (class/2 or array/1),
 %   populating or using the cache as appropriate
 
-jpl_method_spec(Tc, I, N, A, Mods, MID, Tr, Tps) :-
-    (  jpl_method_spec_is_cached(Tc)
-    -> jpl_method_spec_cache(Tc, I, N, A, Mods, MID, Tr, Tps)
-    ;  jpl_type_to_class(Tc, Cx),
-       jpl_class_to_constructors(Cx, Xs),
-       jpl_class_to_methods(Cx, Ms),
-       jpl_method_spec_1(Tc, Xs, Ms),
-       assert(jpl_method_spec_is_cached(Tc)),
-       jpl_method_spec_cache(Tc, I, N, A, Mods, MID, Tr, Tps)
-    ).
+jpl_method_spec(T, I, N, A, Mods, MID, Tr, Tfps) :-
+       (   jpl_method_spec_is_cached(T)
+       ->  jpl_method_spec_cache(T, I, N, A, Mods, MID, Tr, Tfps)
+       ;   jpl_type_to_class(T, C),
+       jpl_class_to_constructors(C, Xs),
+       jpl_class_to_methods(C, Ms),
+       (   T = array(_BaseType)    % regardless of base type...
+       ->  Tci = array(_)          % ...the "cache index" type is this
+       ;   Tci = T
+       ),
+       jpl_method_spec_1(C, Tci, Xs, Ms),
+       jpl_assert(jpl_method_spec_is_cached(Tci)),
+       jpl_method_spec_cache(Tci, I, N, A, Mods, MID, Tr, Tfps)
+       ).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_method_spec_1(type, list(method), list(method))
+%type   jpl_method_spec_1(class, partial_type, list(method), list(method))
+
+% jpl_method_spec_1(+ClassObject, +CacheIndexType, +Constructors, +Methods) :-
+%   if the original type is e.g. array(byte) then CacheIndexType is array(_) else it is that type;
 
-jpl_method_spec_1(Tc, Xs, Ms) :-
-    (  jpl_type_to_class(Tc, C),
-       (   nth1(I, Xs, X),     % generate constructors, numbered from 1
+jpl_method_spec_1(C, Tci, Xs, Ms) :-
+       (   (   nth1(I, Xs, X),     % generate constructors, numbered from 1
            jpl_constructor_to_name(X, N),
            jpl_constructor_to_modifiers(X, Mods),
            jpl_constructor_to_return_type(X, Tr),
-           jpl_constructor_to_parameter_types(X, Tps)
+           jpl_constructor_to_parameter_types(X, Tfps)
        ;   length(Xs, J0),
-           nth1(J, Ms, M),     % generate members, continuing numbering
+           nth1(J, Ms, M),     % generate members, continuing numbering
            I is J0+J,
            jpl_method_to_name(M, N),
            jpl_method_to_modifiers(M, Mods),
            jpl_method_to_return_type(M, Tr),
-           jpl_method_to_parameter_types(M, Tps)
+           jpl_method_to_parameter_types(M, Tfps)
        ),
-       length(Tps, A), % arity
+       length(Tfps, A), % arity
        (   member(static, Mods)
-       ->  jGetStaticMethodID(C, N, method(Tps,Tr), MID)
-       ;   jGetMethodID(C, N, method(Tps,Tr), MID)
+       ->  jGetStaticMethodID(C, N, method(Tfps,Tr), MID)
+       ;   jGetMethodID(C, N, method(Tfps,Tr), MID)
        ),
-       assert(jpl_method_spec_cache(Tc,I,N,A,Mods,MID,Tr,Tps)),
+       jpl_assert(jpl_method_spec_cache(Tci,I,N,A,Mods,MID,Tr,Tfps)),
        fail
-    ;  true
-    ).
+       ;   true
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -2668,77 +2845,80 @@ jpl_method_spec_1(Tc, Xs, Ms) :-
 % jpl_method_to_modifiers(+Method, -ModifierSet) :-
 
 jpl_method_to_modifiers(M, Ms) :-
-    jpl_classname_to_class('java.lang.reflect.Method', Cm),
-    jpl_method_to_modifiers_1(M, Cm, Ms).
+       jpl_classname_to_class('java.lang.reflect.Method', Cm),
+       jpl_method_to_modifiers_1(M, Cm, Ms).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_method_to_modifiers_1(object, object, ordset(modifier))
+%type   jpl_method_to_modifiers_1(object, object, ordset(modifier))
 
 % jpl_method_to_modifiers_1(+Method, +ConstructorClass, -ModifierSet) :-
 
 jpl_method_to_modifiers_1(XM, Cxm, Ms) :-
-    jGetMethodID(Cxm, getModifiers, method([],int), MID),
-    jCallIntMethod(XM, MID, [], [], I),
-    jpl_modifier_int_to_modifiers(I, Ms).
+       jGetMethodID(Cxm, getModifiers, method([],int), MID),
+       jCallIntMethod(XM, MID, [], [], I),
+       jpl_modifier_int_to_modifiers(I, Ms).
 
 %------------------------------------------------------------------------------
 
 % jpl_method_to_name(+Method, -Name) :-
 
 jpl_method_to_name(M, N) :-
-    jpl_classname_to_class('java.lang.reflect.Method', CM),
-    jpl_method_to_name_1(M, CM, N).
+       jpl_classname_to_class('java.lang.reflect.Method', CM),
+       jpl_member_to_name_1(M, CM, N).
 
 %------------------------------------------------------------------------------
 
-jpl_method_to_name_1(M, CM, N) :-
-    jGetMethodID(CM, getName, method([],class([java,lang],['String'])), MID),
-    jCallObjectMethod(M, MID, [], [], N).
+jpl_member_to_name_1(M, CM, N) :-
+       jGetMethodID(CM, getName, method([],class([java,lang],['String'])), MID),
+       jCallObjectMethod(M, MID, [], [], N).
 
 %------------------------------------------------------------------------------
 
 % jpl_method_to_parameter_types(+Method, -Types) :-
 
-jpl_method_to_parameter_types(M, Tps) :-
-    jpl_classname_to_class('java.lang.reflect.Method', Cm),
-    jpl_method_to_parameter_types_1(M, Cm, Tps).
+jpl_method_to_parameter_types(M, Tfps) :-
+       jpl_classname_to_class('java.lang.reflect.Method', Cm),
+       jpl_method_to_parameter_types_1(M, Cm, Tfps).
 
 %------------------------------------------------------------------------------
 
-jpl_method_to_parameter_types_1(XM, Cxm, Tps) :-
-    jGetMethodID(Cxm, getParameterTypes, method([],array(class([java,lang],['Class']))), MID),
-    jCallObjectMethod(XM, MID, [], [], Atp),
-    jpl_object_array_to_list(Atp, Ctps),
-    jpl_classes_to_types(Ctps, Tps).
+% jpl_method_to_parameter_types_1(+XM, +Cxm, -Tfps) :-
+%   XM is (a JPL ref to) an instance of java.lang.reflect.[Constructor|Method]
+
+jpl_method_to_parameter_types_1(XM, Cxm, Tfps) :-
+       jGetMethodID(Cxm, getParameterTypes, method([],array(class([java,lang],['Class']))), MID),
+       jCallObjectMethod(XM, MID, [], [], Atp),
+       jpl_object_array_to_list(Atp, Ctps),
+       jpl_classes_to_types(Ctps, Tfps).
 
 %------------------------------------------------------------------------------
 
 % jpl_method_to_return_type(+Method, -Type) :-
 
 jpl_method_to_return_type(M, Tr) :-
-    jpl_classname_to_class('java.lang.reflect.Method', Cm),
-    jGetMethodID(Cm, getReturnType, method([],class([java,lang],['Class'])), MID),
-    jCallObjectMethod(M, MID, [], [], Cr),
-    jpl_class_to_type(Cr, Tr).
+       jpl_classname_to_class('java.lang.reflect.Method', Cm),
+       jGetMethodID(Cm, getReturnType, method([],class([java,lang],['Class'])), MID),
+       jCallObjectMethod(M, MID, [], [], Cr),
+       jpl_class_to_type(Cr, Tr).
 
 %------------------------------------------------------------------------------
 
-jpl_modifier_bit(public,       0x001).
-jpl_modifier_bit(private,      0x002).
-jpl_modifier_bit(protected,    0x004).
-jpl_modifier_bit(static,       0x008).
-jpl_modifier_bit(final,                0x010).
-jpl_modifier_bit(synchronized, 0x020).
-jpl_modifier_bit(volatile,     0x040).
-jpl_modifier_bit(transient,    0x080).
-jpl_modifier_bit(native,       0x100).
-jpl_modifier_bit(interface,    0x200).
-jpl_modifier_bit(abstract,     0x400).
+jpl_modifier_bit(public,        0x001).
+jpl_modifier_bit(private,       0x002).
+jpl_modifier_bit(protected,     0x004).
+jpl_modifier_bit(static,        0x008).
+jpl_modifier_bit(final,         0x010).
+jpl_modifier_bit(synchronized,  0x020).
+jpl_modifier_bit(volatile,      0x040).
+jpl_modifier_bit(transient,     0x080).
+jpl_modifier_bit(native,        0x100).
+jpl_modifier_bit(interface,     0x200).
+jpl_modifier_bit(abstract,      0x400).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_modifier_int_to_modifiers(integer, ordset(modifier))
+%type   jpl_modifier_int_to_modifiers(integer, ordset(modifier))
 
 % jpl_modifier_int_to_modifiers(+Int, -ModifierSet) :-
 %   ModifierSet is an ordered (hence canonical) list,
@@ -2746,181 +2926,186 @@ jpl_modifier_bit(abstract,    0x400).
 %   of modifier atoms, e.g. [public,static]
 
 jpl_modifier_int_to_modifiers(I, Ms) :-
-    setof(
-       M,                                  %  should use e.g. set_of_all/3
+       setof(
+       M,                                  %  should use e.g. set_of_all/3
        B^(jpl_modifier_bit(M, B),
            (B /\ I) =\= 0
        ),
        Ms
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
 % jpl_servlet_byref(+Config, +Request, +Response) :-
+%   this serves the "byref" servlet demo,
+%   exemplifying one tactic for implementing a servlet in Prolog
+%   by accepting the Request and Response objects as JPL references
+%   and accessing their members via JPL as required;
+%   see also jpl_servlet_byval/3
 
 jpl_servlet_byref(Config, Request, Response) :-
-    jpl_call(Config, getServletContext, [], Context),
+       jpl_call(Config, getServletContext, [], Context),
 
-    jpl_call(Response, setStatus, [200], _),
-    jpl_call(Response, setContentType, ['text/html'], _),
-    jpl_call(Response, getWriter, [], W),
+       jpl_call(Response, setStatus, [200], _),
+       jpl_call(Response, setContentType, ['text/html'], _),
+       jpl_call(Response, getWriter, [], W),
 
-    jpl_call(W, println, ['<html><head></head><body><h2>jpl_servlet_byref/3 says:</h2><pre>'], _),
+       jpl_call(W, println, ['<html><head></head><body><h2>jpl_servlet_byref/3 says:</h2><pre>'], _),
 
-    jpl_call(W, println, ['\nservlet context stuff:'], _),
+       jpl_call(W, println, ['\nservlet context stuff:'], _),
 
-    jpl_call(Context, getInitParameterNames, [], ContextInitParameterNameEnum),
-    jpl_enumeration_to_list(ContextInitParameterNameEnum, ContextInitParameterNames),
-    length(ContextInitParameterNames, NContextInitParameterNames),
-    concat_atom(['\tContext.InitParameters = ',NContextInitParameterNames], NContextInitParameterNamesMsg),
-    jpl_call(W, println, [NContextInitParameterNamesMsg], _),
-    (  member(ContextInitParameterName, ContextInitParameterNames),
+       jpl_call(Context, getInitParameterNames, [], ContextInitParameterNameEnum),
+       jpl_enumeration_to_list(ContextInitParameterNameEnum, ContextInitParameterNames),
+       length(ContextInitParameterNames, NContextInitParameterNames),
+       concat_atom(['\tContext.InitParameters = ',NContextInitParameterNames], NContextInitParameterNamesMsg),
+       jpl_call(W, println, [NContextInitParameterNamesMsg], _),
+       (   member(ContextInitParameterName, ContextInitParameterNames),
        jpl_call(Context, getInitParameter, [ContextInitParameterName], ContextInitParameter),
        concat_atom(['\t\tContext.InitParameter[',ContextInitParameterName,'] = ',ContextInitParameter], ContextInitParameterMsg),
        jpl_call(W, println, [ContextInitParameterMsg], _),
        fail
-    ;  true
-    ),
-
-    jpl_call(Context, getMajorVersion, [], MajorVersion),
-    concat_atom(['\tContext.MajorVersion = ',MajorVersion], MajorVersionMsg),
-    jpl_call(W, println, [MajorVersionMsg], _),
-
-    jpl_call(Context, getMinorVersion, [], MinorVersion),
-    concat_atom(['\tContext.MinorVersion = ',MinorVersion], MinorVersionMsg),
-    jpl_call(W, println, [MinorVersionMsg], _),
-
-    jpl_call(Context, getServerInfo, [], ServerInfo),
-    concat_atom(['\tContext.ServerInfo = ',ServerInfo], ServerInfoMsg),
-    jpl_call(W, println, [ServerInfoMsg], _),
-
-    jpl_call(W, println, ['\nservlet config stuff:'], _),
-
-    jpl_call(Config, getServletName, [], ServletName),
-    (  ServletName == @(null)
-    -> ServletNameAtom = null
-    ;  ServletNameAtom = ServletName
-    ),
-    concat_atom(['\tConfig.ServletName = ',ServletNameAtom], ServletNameMsg),
-    jpl_call(W, println, [ServletNameMsg], _),
-
-    jpl_call(Config, getInitParameterNames, [], ConfigInitParameterNameEnum),
-    jpl_enumeration_to_list(ConfigInitParameterNameEnum, ConfigInitParameterNames),
-    length(ConfigInitParameterNames, NConfigInitParameterNames),
-    concat_atom(['\tConfig.InitParameters = ',NConfigInitParameterNames], NConfigInitParameterNamesMsg),
-    jpl_call(W, println, [NConfigInitParameterNamesMsg], _),
-    (  member(ConfigInitParameterName, ConfigInitParameterNames),
+       ;   true
+       ),
+
+       jpl_call(Context, getMajorVersion, [], MajorVersion),
+       concat_atom(['\tContext.MajorVersion = ',MajorVersion], MajorVersionMsg),
+       jpl_call(W, println, [MajorVersionMsg], _),
+
+       jpl_call(Context, getMinorVersion, [], MinorVersion),
+       concat_atom(['\tContext.MinorVersion = ',MinorVersion], MinorVersionMsg),
+       jpl_call(W, println, [MinorVersionMsg], _),
+
+       jpl_call(Context, getServerInfo, [], ServerInfo),
+       concat_atom(['\tContext.ServerInfo = ',ServerInfo], ServerInfoMsg),
+       jpl_call(W, println, [ServerInfoMsg], _),
+
+       jpl_call(W, println, ['\nservlet config stuff:'], _),
+
+       jpl_call(Config, getServletName, [], ServletName),
+       (   ServletName == @(null)
+       ->  ServletNameAtom = null
+       ;   ServletNameAtom = ServletName
+       ),
+       concat_atom(['\tConfig.ServletName = ',ServletNameAtom], ServletNameMsg),
+       jpl_call(W, println, [ServletNameMsg], _),
+
+       jpl_call(Config, getInitParameterNames, [], ConfigInitParameterNameEnum),
+       jpl_enumeration_to_list(ConfigInitParameterNameEnum, ConfigInitParameterNames),
+       length(ConfigInitParameterNames, NConfigInitParameterNames),
+       concat_atom(['\tConfig.InitParameters = ',NConfigInitParameterNames], NConfigInitParameterNamesMsg),
+       jpl_call(W, println, [NConfigInitParameterNamesMsg], _),
+       (   member(ConfigInitParameterName, ConfigInitParameterNames),
        jpl_call(Config, getInitParameter, [ConfigInitParameterName], ConfigInitParameter),
        concat_atom(['\t\tConfig.InitParameter[',ConfigInitParameterName,'] = ',ConfigInitParameter], ConfigInitParameterMsg),
        jpl_call(W, println, [ConfigInitParameterMsg], _),
        fail
-    ;  true
-    ),
+       ;   true
+       ),
 
-    jpl_call(W, println, ['\nrequest stuff:'], _),
+       jpl_call(W, println, ['\nrequest stuff:'], _),
 
-    jpl_call(Request, getAttributeNames, [], AttributeNameEnum),
-    jpl_enumeration_to_list(AttributeNameEnum, AttributeNames),
-    length(AttributeNames, NAttributeNames),
-    concat_atom(['\tRequest.Attributes = ',NAttributeNames], NAttributeNamesMsg),
-    jpl_call(W, println, [NAttributeNamesMsg], _),
-    (  member(AttributeName, AttributeNames),
+       jpl_call(Request, getAttributeNames, [], AttributeNameEnum),
+       jpl_enumeration_to_list(AttributeNameEnum, AttributeNames),
+       length(AttributeNames, NAttributeNames),
+       concat_atom(['\tRequest.Attributes = ',NAttributeNames], NAttributeNamesMsg),
+       jpl_call(W, println, [NAttributeNamesMsg], _),
+       (   member(AttributeName, AttributeNames),
        jpl_call(Request, getAttribute, [AttributeName], Attribute),
        jpl_call(Attribute, toString, [], AttributeString),
        concat_atom(['\t\tRequest.Attribute[',AttributeName,'] = ',AttributeString], AttributeMsg),
        jpl_call(W, println, [AttributeMsg], _),
        fail
-    ;  true
-    ),
-
-    jpl_call(Request, getCharacterEncoding, [], CharacterEncoding),
-    (  CharacterEncoding == @(null)
-    -> CharacterEncodingAtom = ''
-    ;  CharacterEncodingAtom = CharacterEncoding
-    ),
-    concat_atom(['\tRequest.CharacterEncoding',' = ',CharacterEncodingAtom], CharacterEncodingMsg),
-    jpl_call(W, println, [CharacterEncodingMsg], _),
-
-    jpl_call(Request, getContentLength, [], ContentLength),
-    concat_atom(['\tRequest.ContentLength',' = ',ContentLength], ContentLengthMsg),
-    jpl_call(W, println, [ContentLengthMsg], _),
-
-    jpl_call(Request, getContentType, [], ContentType),
-    (  ContentType == @(null)
-    -> ContentTypeAtom = ''
-    ;  ContentTypeAtom = ContentType
-    ),
-    concat_atom(['\tRequest.ContentType',' = ',ContentTypeAtom], ContentTypeMsg),
-    jpl_call(W, println, [ContentTypeMsg], _),
-
-    jpl_call(Request, getParameterNames, [], ParameterNameEnum),
-    jpl_enumeration_to_list(ParameterNameEnum, ParameterNames),
-    length(ParameterNames, NParameterNames),
-    concat_atom(['\tRequest.Parameters = ',NParameterNames], NParameterNamesMsg),
-    jpl_call(W, println, [NParameterNamesMsg], _),
-    (  member(ParameterName, ParameterNames),
+       ;   true
+       ),
+
+       jpl_call(Request, getCharacterEncoding, [], CharacterEncoding),
+       (   CharacterEncoding == @(null)
+       ->  CharacterEncodingAtom = ''
+       ;   CharacterEncodingAtom = CharacterEncoding
+       ),
+       concat_atom(['\tRequest.CharacterEncoding',' = ',CharacterEncodingAtom], CharacterEncodingMsg),
+       jpl_call(W, println, [CharacterEncodingMsg], _),
+
+       jpl_call(Request, getContentLength, [], ContentLength),
+       concat_atom(['\tRequest.ContentLength',' = ',ContentLength], ContentLengthMsg),
+       jpl_call(W, println, [ContentLengthMsg], _),
+
+       jpl_call(Request, getContentType, [], ContentType),
+       (   ContentType == @(null)
+       ->  ContentTypeAtom = ''
+       ;   ContentTypeAtom = ContentType
+       ),
+       concat_atom(['\tRequest.ContentType',' = ',ContentTypeAtom], ContentTypeMsg),
+       jpl_call(W, println, [ContentTypeMsg], _),
+
+       jpl_call(Request, getParameterNames, [], ParameterNameEnum),
+       jpl_enumeration_to_list(ParameterNameEnum, ParameterNames),
+       length(ParameterNames, NParameterNames),
+       concat_atom(['\tRequest.Parameters = ',NParameterNames], NParameterNamesMsg),
+       jpl_call(W, println, [NParameterNamesMsg], _),
+       (   member(ParameterName, ParameterNames),
        jpl_call(Request, getParameter, [ParameterName], Parameter),
        concat_atom(['\t\tRequest.Parameter[',ParameterName,'] = ',Parameter], ParameterMsg),
        jpl_call(W, println, [ParameterMsg], _),
        fail
-    ;  true
-    ),
-
-    jpl_call(Request, getProtocol, [], Protocol),
-    concat_atom(['\tRequest.Protocol',' = ',Protocol], ProtocolMsg),
-    jpl_call(W, println, [ProtocolMsg], _),
-
-    jpl_call(Request, getRemoteAddr, [], RemoteAddr),
-    concat_atom(['\tRequest.RemoteAddr',' = ',RemoteAddr], RemoteAddrMsg),
-    jpl_call(W, println, [RemoteAddrMsg], _),
-
-    jpl_call(Request, getRemoteHost, [], RemoteHost),
-    concat_atom(['\tRequest.RemoteHost',' = ',RemoteHost], RemoteHostMsg),
-    jpl_call(W, println, [RemoteHostMsg], _),
-
-    jpl_call(Request, getScheme, [], Scheme),
-    concat_atom(['\tRequest.Scheme',' = ',Scheme], SchemeMsg),
-    jpl_call(W, println, [SchemeMsg], _),
-
-    jpl_call(Request, getServerName, [], ServerName),
-    concat_atom(['\tRequest.ServerName',' = ',ServerName], ServerNameMsg),
-    jpl_call(W, println, [ServerNameMsg], _),
-
-    jpl_call(Request, getServerPort, [], ServerPort),
-    concat_atom(['\tRequest.ServerPort',' = ',ServerPort], ServerPortMsg),
-    jpl_call(W, println, [ServerPortMsg], _),
-
-    jpl_call(Request, isSecure, [], @(Secure)),
-    concat_atom(['\tRequest.Secure',' = ',Secure], SecureMsg),
-    jpl_call(W, println, [SecureMsg], _),
-
-    jpl_call(W, println, ['\nHTTP request stuff:'], _),
-
-    jpl_call(Request, getAuthType, [], AuthType),
-    (  AuthType == @(null)
-    -> AuthTypeAtom = ''
-    ;  AuthTypeAtom = AuthType
-    ),
-    concat_atom(['\tRequest.AuthType',' = ',AuthTypeAtom], AuthTypeMsg),
-    jpl_call(W, println, [AuthTypeMsg], _),
-
-    jpl_call(Request, getContextPath, [], ContextPath),
-    (  ContextPath == @(null)
-    -> ContextPathAtom = ''
-    ;  ContextPathAtom = ContextPath
-    ),
-    concat_atom(['\tRequest.ContextPath',' = ',ContextPathAtom], ContextPathMsg),
-    jpl_call(W, println, [ContextPathMsg], _),
-
-    jpl_call(Request, getCookies, [], CookieArray),
-    (  CookieArray == @(null)
-    -> Cookies = []
-    ;  jpl_array_to_list(CookieArray, Cookies)
-    ),
-    length(Cookies, NCookies),
-    concat_atom(['\tRequest.Cookies',' = ',NCookies], NCookiesMsg),
-    jpl_call(W, println, [NCookiesMsg], _),
-    (  nth0(NCookie, Cookies, Cookie),
+       ;   true
+       ),
+
+       jpl_call(Request, getProtocol, [], Protocol),
+       concat_atom(['\tRequest.Protocol',' = ',Protocol], ProtocolMsg),
+       jpl_call(W, println, [ProtocolMsg], _),
+
+       jpl_call(Request, getRemoteAddr, [], RemoteAddr),
+       concat_atom(['\tRequest.RemoteAddr',' = ',RemoteAddr], RemoteAddrMsg),
+       jpl_call(W, println, [RemoteAddrMsg], _),
+
+       jpl_call(Request, getRemoteHost, [], RemoteHost),
+       concat_atom(['\tRequest.RemoteHost',' = ',RemoteHost], RemoteHostMsg),
+       jpl_call(W, println, [RemoteHostMsg], _),
+
+       jpl_call(Request, getScheme, [], Scheme),
+       concat_atom(['\tRequest.Scheme',' = ',Scheme], SchemeMsg),
+       jpl_call(W, println, [SchemeMsg], _),
+
+       jpl_call(Request, getServerName, [], ServerName),
+       concat_atom(['\tRequest.ServerName',' = ',ServerName], ServerNameMsg),
+       jpl_call(W, println, [ServerNameMsg], _),
+
+       jpl_call(Request, getServerPort, [], ServerPort),
+       concat_atom(['\tRequest.ServerPort',' = ',ServerPort], ServerPortMsg),
+       jpl_call(W, println, [ServerPortMsg], _),
+
+       jpl_call(Request, isSecure, [], @(Secure)),
+       concat_atom(['\tRequest.Secure',' = ',Secure], SecureMsg),
+       jpl_call(W, println, [SecureMsg], _),
+
+       jpl_call(W, println, ['\nHTTP request stuff:'], _),
+
+       jpl_call(Request, getAuthType, [], AuthType),
+       (   AuthType == @(null)
+       ->  AuthTypeAtom = ''
+       ;   AuthTypeAtom = AuthType
+       ),
+       concat_atom(['\tRequest.AuthType',' = ',AuthTypeAtom], AuthTypeMsg),
+       jpl_call(W, println, [AuthTypeMsg], _),
+
+       jpl_call(Request, getContextPath, [], ContextPath),
+       (   ContextPath == @(null)
+       ->  ContextPathAtom = ''
+       ;   ContextPathAtom = ContextPath
+       ),
+       concat_atom(['\tRequest.ContextPath',' = ',ContextPathAtom], ContextPathMsg),
+       jpl_call(W, println, [ContextPathMsg], _),
+
+       jpl_call(Request, getCookies, [], CookieArray),
+       (   CookieArray == @(null)
+       ->  Cookies = []
+       ;   jpl_array_to_list(CookieArray, Cookies)
+       ),
+       length(Cookies, NCookies),
+       concat_atom(['\tRequest.Cookies',' = ',NCookies], NCookiesMsg),
+       jpl_call(W, println, [NCookiesMsg], _),
+       (   nth0(NCookie, Cookies, Cookie),
        concat_atom(['\t\tRequest.Cookie[',NCookie,']'], CookieMsg),
        jpl_call(W, println, [CookieMsg], _),
 
@@ -2969,15 +3154,21 @@ jpl_servlet_byref(Config, Request, Response) :-
        jpl_call(W, println, [CookieSecureMsg], _),
 
        fail
-    ;  true
-    ),
+       ;   true
+       ),
 
-    jpl_call(W, println, ['</pre></body></html>'], _),
+       jpl_call(W, println, ['</pre></body></html>'], _),
 
-    true.
+       true.
 
 %------------------------------------------------------------------------------
 
+% jpl_servlet_byval(+MultiMap, -ContentType, -BodyAtom) :-
+%   this exemplifies an alternative (to jpl_servlet_byref) tactic
+%   for implementing a servlet in Prolog;
+%   most Request fields are extracted in Java before this is called,
+%   and passed in as a multimap (a map, some of whose values are maps)
+
 jpl_servlet_byval(MM, CT, Ba) :-
        CT = 'text/html',
        multimap_to_atom(MM, MMa),
@@ -2989,42 +3180,44 @@ jpl_servlet_byval(MM, CT, Ba) :-
 
 %------------------------------------------------------------------------------
 
-%type  jpl_cache_type_of_ref(jpl_type, ref)
+%type   jpl_cache_type_of_ref(jpl_type, ref)
 
 % jpl_cache_type_of_ref(+Type, +Ref) :-
-%   Type must be a proper JPL type;
+%   Type must be a proper (concrete) JPL type;
 %   Ref must be a proper JPL reference (not void);
-%   Type is memoed as the type of the referenced object (unless it's null)
+%   Type is memoed (if policy so dictates) as the type of the referenced object (unless it's null)
 %   by iref (so as not to disable atom-based GC)
 %   NB obsolete lemmas must be watched-out-for and removed
 
 jpl_cache_type_of_ref(T, @(Tag)) :-
-    (  \+ ground(T)
-    -> write('[jpl_cache_type_of_ref/2: arg 1 is not ground]'), nl,
+       (   jpl_assert_policy( jpl_iref_type_cache(_,_), no)
+       ->  true
+       ;   \+ ground(T)                            % shouldn't happen (implementation error)
+       ->  write('[jpl_cache_type_of_ref/2: arg 1 is not ground]'), nl,    % oughta throw an exception
        fail
-    ;  \+ atom(Tag)
-    -> write('[jpl_cache_type_of_ref/2: arg 2 is not an atomic-tag ref]'), nl,
+       ;   \+ atom(Tag)                            % shouldn't happen (implementation error)
+       ->  write('[jpl_cache_type_of_ref/2: arg 2 is not an atomic-tag ref]'), nl, % oughta throw an exception
        fail
-    ;  Tag == null
-    -> true                                    % silently ignore null refs
-    ;  jni_tag_to_iref(Tag, Iref)
-    -> (   jpl_iref_type_cache(Iref, TC)       % assume TC == T
-       ->  (   T == TC
-           ->  true
-           ; % write('[JPL: found obsolete tag-type lemma...]'), nl,   % keep statistics? (why?)
+       ;   Tag == null                             % a null ref? (this is valid)
+       ->  true                                    % silently ignore it
+       ;   jni_tag_to_iref(Tag, Iref)
+       ->  (   jpl_iref_type_cache(Iref, TC)       % we expect TC == T
+       ->  (   T == TC
+           ->  true
+           ; % write('[JPL: found obsolete tag-type lemma...]'), nl,   % or keep statistics? (why?)
                retractall(jpl_iref_type_cache(Iref,_)),
-               assert(jpl_iref_type_cache(Iref,T))
+               jpl_assert(jpl_iref_type_cache(Iref,T))
            )
-       ;   assert(jpl_iref_type_cache(Iref,T))
+       ;   jpl_assert(jpl_iref_type_cache(Iref,T))
        )
-    ;  write('[jpl_cache_type_of_ref/2: jni_tagatom_to_iref(Tag,_) failed]'), nl,
+       ;   write('[jpl_cache_type_of_ref/2: jni_tagatom_to_iref(Tag,_) failed]'), nl,  % oughta throw an exception
        fail
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
 % jpl_class_tag_type_cache(-Tag, -ClassType) :-
-%   Tag is the tag part of an @Tag reference
+%   Tag is the tag part of an @(Tag) reference
 %   to a JVM instance of java.lang.Class
 %   which denotes ClassType;
 %   we index on Tag rather than on Iref so as to keep these objects around
@@ -3036,13 +3229,18 @@ jpl_cache_type_of_ref(T, @(Tag)) :-
 %------------------------------------------------------------------------------
 
 % jpl_class_to_ancestor_classes(+Class, -AncestorClasses) :-
+%   AncestorClasses will be a list of (JPL references to) instances of java.lang.Class
+%   denoting the "implements" lineage (?), nearest first
+%   (the first member denotes the class which Class directly implements,
+%   the next (if any) denotes the class which *that* class implements,
+%   and so on to java.lang.Object)
 
 jpl_class_to_ancestor_classes(C, Cas) :-
-    (  jpl_class_to_super_class(C, Ca)
-    -> Cas = [Ca|Cas2],
+       (   jpl_class_to_super_class(C, Ca)
+       ->  Cas = [Ca|Cas2],
        jpl_class_to_ancestor_classes(Ca, Cas2)
-    ;  Cas = []
-    ).
+       ;   Cas = []
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3050,21 +3248,22 @@ jpl_class_to_ancestor_classes(C, Cas) :-
 %   Class is a reference to a class object;
 %   ClassName is its canonical (?) source-syntax (dotted) name,
 %   e.g. 'java.util.Date'
-%   not used outside jni_junk and jpl_test;
-%   oughta use the available caches...
+%   not used outside jni_junk and jpl_test (is this (still) true?);
+%   oughta use the available caches (but their indexing doesn't suit)
 
 jpl_class_to_classname(C, CN) :-
-    jpl_call(C, getName, [], CN).
+       jpl_call(C, getName, [], CN).
 
 %------------------------------------------------------------------------------
 
 % jpl_class_to_raw_classname(+Class, -ClassName) :-
+%   hmm, I forget exactly what a "raw" classname is...
 
 jpl_class_to_raw_classname(Cobj, CN) :-
-    jpl_classname_to_class('java.lang.Class', CC),     % cached?
-    jGetMethodID(CC, getName, method([],class([java,lang],['String'])), MIDgetName),
-    jCallObjectMethod(Cobj, MIDgetName, [], [], S),
-    S = CN.
+       jpl_classname_to_class('java.lang.Class', CC),      % cached?
+       jGetMethodID(CC, getName, method([],class([java,lang],['String'])), MIDgetName),
+       jCallObjectMethod(Cobj, MIDgetName, [], [], S),
+       S = CN.
 
 %------------------------------------------------------------------------------
 
@@ -3074,15 +3273,15 @@ jpl_class_to_raw_classname(Cobj, CN) :-
 %   "java.util.Date"
 
 jpl_class_to_raw_classname_chars(Cobj, CsCN) :-
-    jpl_class_to_raw_classname(Cobj, CN),
-    atom_codes(CN, CsCN).
+       jpl_class_to_raw_classname(Cobj, CN),
+       atom_codes(CN, CsCN).
 
 %------------------------------------------------------------------------------
 
 jpl_class_to_super_class(C, Cx) :-
-    jGetSuperclass(C, Cx),
-    Cx \== @(null),        % as returned when C is java.lang.Object, i.e. no superclass
-    jpl_cache_type_of_ref(class([java,lang],['Class']), Cx).   
+       jGetSuperclass(C, Cx),
+       Cx \== @(null),         % as returned when C is java.lang.Object, i.e. no superclass
+       jpl_cache_type_of_ref(class([java,lang],['Class']), Cx).    
 
 %------------------------------------------------------------------------------
 
@@ -3093,41 +3292,42 @@ jpl_class_to_super_class(C, Cx) :-
 %   'boolean', 'byte' etc. and even 'void' (?!)
 
 jpl_class_to_type(@(Tag), Type) :-
-    (  jpl_class_tag_type_cache(Tag, Tx)
-    -> true
-    ;  jpl_class_to_raw_classname_chars(@(Tag), Cs),   % uncached
+       (   jpl_class_tag_type_cache(Tag, Tx)
+       ->  true
+       ;   jpl_class_to_raw_classname_chars(@(Tag), Cs),   % uncached
        jpl_classname_chars_to_type(Cs, Tr),
-       jpl_type_to_canonical_type(Tr, Tx),
-       assert(jpl_class_tag_type_cache(Tag,Tx))
-    -> true    % the elseif goal should be determinate, but just in case...
-    ),
-    Type = Tx.
+       jpl_type_to_canonical_type(Tr, Tx),             % map e.g. class([],[byte]) -> byte
+       jpl_assert(jpl_class_tag_type_cache(Tag,Tx))
+       ->  true    % the elseif goal should be determinate, but just in case...
+       ),
+       Type = Tx.
 
 %------------------------------------------------------------------------------
 
 jpl_classes_to_types([], []).
 
 jpl_classes_to_types([C|Cs], [T|Ts]) :-
-    jpl_class_to_type(C, T),
-    jpl_classes_to_types(Cs, Ts).
+       jpl_class_to_type(C, T),
+       jpl_classes_to_types(Cs, Ts).
 
 %------------------------------------------------------------------------------
 
 jpl_classname_chars_to_type(Cs, Type) :-
-    (  phrase(jpl_type_classname_1(Type), Cs)
-    -> true
-    ).
+       (   phrase(jpl_type_classname_1(Type), Cs)
+       ->  true
+       ).
 
 %------------------------------------------------------------------------------
 
 % jpl_classname_to_class(+ClassName, -Class) :-
 %   ClassName unambiguously represents a class,
 %   e.g. 'java.lang.String'
-%   Class is a (canonical) reference to the corresponding class object
+%   Class is a (canonical) reference to the corresponding class object;
+%   uses caches where the class is already encountered
 
 jpl_classname_to_class(N, C) :-
-    jpl_classname_to_type(N, T),   % cached
-    jpl_type_to_class(T, C).   
+       jpl_classname_to_type(N, T),    % cached
+       jpl_type_to_class(T, C).        % cached
 
 %------------------------------------------------------------------------------
 
@@ -3135,19 +3335,27 @@ jpl_classname_to_class(N, C) :-
 %   Classname is a source-syntax (dotted) class name,
 %   e.g. 'java.util.Date', '[java.util.Date' or '[L'
 %   Type is its corresponding JPL type structure,
-%   e.g. class([java,util],['Date']), array(class([java,util],['Date'])), ...
+%   e.g. class([java,util],['Date']), array(class([java,util],['Date'])), array(long)
+%
+%thinks
+%   by "classname" do I mean "typename"?
+%   should this throw an exception for unbound CN? is this public API?
 
 jpl_classname_to_type(CN, T) :-
-    (  jpl_classname_type_cache(CN, Tx)
-    -> Tx = T
-    ;  atom_codes(CN, CsCN),
+       (   jpl_classname_type_cache(CN, Tx)
+       ->  Tx = T
+       ;   atom_codes(CN, CsCN),
        phrase(jpl_type_classname_1(T), CsCN)
-    -> assert(jpl_classname_type_cache(CN,T)),
+       ->  jpl_assert(jpl_classname_type_cache(CN,T)),
        true
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
+% jpl_classname_type_cache( -Classname, -Type) :-
+%   Classname is the atomic name of Type;
+%   NB may denote a class which cannot be found
+
 :- dynamic jpl_classname_type_cache/2.
 
 %------------------------------------------------------------------------------
@@ -3158,32 +3366,50 @@ jpl_classname_to_type(CN, T) :-
 %   Type is the unique most specialised type of which Datum denotes an instance;
 %   N.B. 3 is an instance of byte, char, short, int and long,
 %   of which byte and char are the joint, overlapping most specialised types,
-%   so this relates 3 to the pseudo subtype 'char_byte'
+%   so this relates 3 to the pseudo subtype 'char_byte';
+%   see jpl_type_to_preferred_concrete_type/2 for converting inferred types
+%   to instantiable types
 
 jpl_datum_to_type(D, T) :-
-    (  jpl_value_to_type(D, T)
-    -> true
-    ;  jpl_ref_to_type(D, T)
-    ).
+       (   jpl_value_to_type(D, T)
+       ->  true
+       ;   jpl_ref_to_type(D, T)
+       ->  true
+       ;   nonvar( D),
+       D = {Term}
+       ->  (   cyclic_term(Term)
+       ->  throw(error(type_error(acyclic,Term),
+                       context(jpl_datum_to_type/2,'must be acyclic')))
+       ;   atom( Term)
+       ->  T = class([jpl],['Atom'])
+       ;   integer( Term)
+       ->  T = class([jpl],['Integer'])
+       ;   float( Term)
+       ->  T = class([jpl],['Float'])
+       ;   var( Term)
+       ->  T = class([jpl],['Variable'])
+       ;   T = class([jpl],['Compound'])
+       )
+       ).
 
 %------------------------------------------------------------------------------
 
 jpl_datums_to_most_specific_common_ancestor_type([D], T) :-
-    jpl_datum_to_type(D, T).
+       jpl_datum_to_type(D, T).
 
 jpl_datums_to_most_specific_common_ancestor_type([D1,D2|Ds], T0) :-
-    jpl_datum_to_type(D1, T1),
-    jpl_type_to_ancestor_types(T1, Ts1),
-    jpl_datums_to_most_specific_common_ancestor_type_1([D2|Ds], [T1|Ts1], [T0|_]).
+       jpl_datum_to_type(D1, T1),
+       jpl_type_to_ancestor_types(T1, Ts1),
+       jpl_datums_to_most_specific_common_ancestor_type_1([D2|Ds], [T1|Ts1], [T0|_]).
 
 %------------------------------------------------------------------------------
 
 jpl_datums_to_most_specific_common_ancestor_type_1([], Ts, Ts).
 
 jpl_datums_to_most_specific_common_ancestor_type_1([D|Ds], Ts1, Ts0) :-
-    jpl_datum_to_type(D, Tx),
-    jpl_lineage_types_type_to_common_lineage_types(Ts1, Tx, Ts2),
-    jpl_datums_to_most_specific_common_ancestor_type_1(Ds, Ts2, Ts0).
+       jpl_datum_to_type(D, Tx),
+       jpl_lineage_types_type_to_common_lineage_types(Ts1, Tx, Ts2),
+       jpl_datums_to_most_specific_common_ancestor_type_1(Ds, Ts2, Ts0).
 
 %------------------------------------------------------------------------------
 
@@ -3197,13 +3423,13 @@ jpl_datums_to_most_specific_common_ancestor_type_1([D|Ds], Ts1, Ts0) :-
 jpl_datums_to_types([], []).
 
 jpl_datums_to_types([D|Ds], [T|Ts]) :-
-    jpl_datum_to_type(D, T),
-    jpl_datums_to_types(Ds, Ts).
+       jpl_datum_to_type(D, T),
+       jpl_datums_to_types(Ds, Ts).
 
 %------------------------------------------------------------------------------
 
 % jpl_false(-X) :-
-%   X is (by unification) the proper JPL datum which represents the Java value 'false'
+%   X is (by unification) the proper JPL datum which represents the Java boolean value 'false'
 %   c.f. jpl_is_false/1
 
 jpl_false(@(false)).
@@ -3214,11 +3440,11 @@ jpl_false(@(false)).
 %   X, known to be ground, is (or at least superficially resembles :-) a JPL type
 
 jpl_ground_is_type(X) :-
-    jpl_primitive_type(X),
-    !.
+       jpl_primitive_type(X),
+       !.
 
 jpl_ground_is_type(array(X)) :-
-    jpl_ground_is_type(X).
+       jpl_ground_is_type(X).
 
 jpl_ground_is_type(class(_,_)).
 
@@ -3234,17 +3460,17 @@ jpl_ground_is_type(method(_,_)).
 %   X is a JPL ref to a java.lang.Class object
 
 jpl_is_class(X) :-
-    jpl_is_object(X),
-    jpl_object_to_type(X, class([java,lang],['Class'])).
+       jpl_is_object(X),
+       jpl_object_to_type(X, class([java,lang],['Class'])).
 
 %------------------------------------------------------------------------------
 
 % jpl_is_false(?X) :-
-%   X is the proper JPL datum which represents the Java value 'false';
+%   X is the proper JPL datum which represents the Java boolean value 'false';
 %   whatever, no further instantiation of X occurs
 
 jpl_is_false(X) :-
-    X == @(false).
+       X == @(false).
 
 %------------------------------------------------------------------------------
 
@@ -3253,8 +3479,8 @@ jpl_is_false(X) :-
 %   applications should not be messing with these (?);
 %   whatever, no further instantiation of X occurs
 
-jpl_is_fieldID(jfieldID(X)) :-     % NB a var arg may get bound...
-    integer(X).
+jpl_is_fieldID(jfieldID(X)) :-      % NB a var arg may get bound...
+       integer(X).
 
 %------------------------------------------------------------------------------
 
@@ -3264,7 +3490,7 @@ jpl_is_fieldID(jfieldID(X)) :-        % NB a var arg may get bound...
 %   whatever, no further instantiation of X occurs
 
 jpl_is_methodID(jmethodID(X)) :-   % NB a var arg may get bound...
-    integer(X).
+       integer(X).
 
 %------------------------------------------------------------------------------
 
@@ -3273,7 +3499,7 @@ jpl_is_methodID(jmethodID(X)) :-   % NB a var arg may get bound...
 %   whatever, no further instantiation of X occurs
 
 jpl_is_null(X) :-
-    X == @(null).
+       X == @(null).
 
 %------------------------------------------------------------------------------
 
@@ -3283,8 +3509,8 @@ jpl_is_null(X) :-
 %   whatever, no further instantiation of X occurs
 
 jpl_is_object(X) :-
-    jpl_is_ref(X),     % (syntactically, at least...)
-    X \== @(null).
+       jpl_is_ref(X),      % (syntactically, at least...)
+       X \== @(null).
 
 %------------------------------------------------------------------------------
 
@@ -3293,8 +3519,8 @@ jpl_is_object(X) :-
 %   not e.g. a primitive, null or void
 
 jpl_is_object_type(T) :-
-    \+ var(T),
-    jpl_non_var_is_object_type(T).
+       \+ var(T),
+       jpl_non_var_is_object_type(T).
 
 %------------------------------------------------------------------------------
 
@@ -3308,27 +3534,27 @@ jpl_is_object_type(T) :-
 %   could check initial character(s) or length? or adopt strong/weak scheme...
 
 jpl_is_ref(@(Y)) :-
-    atom(Y),       % presumably a (garbage-collectable) tag
-    Y \== void,            % not a ref
-    Y \== false,    % not a ref
-    Y \== true.            % not a ref
+       atom(Y),        % presumably a (garbage-collectable) tag
+       Y \== void,     % not a ref
+       Y \== false,    % not a ref
+       Y \== true.     % not a ref
 
 %------------------------------------------------------------------------------
 
 % jpl_is_true(?X) :-
-%   X is a proper JPL datum, representing the Java value 'true';
+%   X is a proper JPL datum, representing the Java boolean value 'true';
 %   whatever, no further instantiation of X occurs
 
 jpl_is_true(X) :-
-    X == @(true).
+       X == @(true).
 
 %------------------------------------------------------------------------------
 
 % jpl_is_type(+X) :-
 
 jpl_is_type(X) :-
-    ground(X),
-    jpl_ground_is_type(X).
+       ground(X),
+       jpl_ground_is_type(X).
 
 %------------------------------------------------------------------------------
 
@@ -3339,16 +3565,16 @@ jpl_is_type(X) :-
 %   whatever, no further instantiation of X occurs
 
 jpl_is_void(X) :-
-    X == @(void).
+       X == @(void).
 
 %------------------------------------------------------------------------------
 
 jpl_lineage_types_type_to_common_lineage_types(Ts, Tx, Ts0) :-
-    (  append(_, [Tx|Ts2], Ts)
-    -> [Tx|Ts2] = Ts0
-    ;  jpl_type_to_super_type(Tx, Tx2)
-    -> jpl_lineage_types_type_to_common_lineage_types(Ts, Tx2, Ts0)
-    ).
+       (   append(_, [Tx|Ts2], Ts)
+       ->  [Tx|Ts2] = Ts0
+       ;   jpl_type_to_super_type(Tx, Tx2)
+       ->  jpl_lineage_types_type_to_common_lineage_types(Ts, Tx2, Ts0)
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3371,33 +3597,33 @@ jpl_null(@(null)).
 %   representing the respective elements of ArrayObject
 
 jpl_object_array_to_list(A, Vs) :-
-    jpl_array_to_length(A, N),
-    jpl_object_array_to_list_1(A, 0, N, Vs).
+       jpl_array_to_length(A, N),
+       jpl_object_array_to_list_1(A, 0, N, Vs).
 
 %------------------------------------------------------------------------------
 
 % jpl_object_array_to_list_1(+A, +I, +N, -Xs) :-
 
 jpl_object_array_to_list_1(A, I, N, Xs) :-
-    (  I == N
-    -> Xs = []
-    ;  jGetObjectArrayElement(A, I, X),
+       (   I == N
+       ->  Xs = []
+       ;   jGetObjectArrayElement(A, I, X),
        Xs = [X|Xs2],
        J is I+1,
        jpl_object_array_to_list_1(A, J, N, Xs2)
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
 % jpl_object_to_class(+Object, -Class) :-
+%   Object must be a valid object (should this throw an exception otherwise?);
 %   Class is a (canonical) reference to the (canonical) class object
-%   which represents the (most specific) class of Object
-%   NB Object must be a valid object, else...
+%   which represents the class of Object;
 %   NB wot's the point of caching the type if we don't look there first?
 
 jpl_object_to_class(Obj, C) :-
-    jGetObjectClass(Obj, C),
-    jpl_cache_type_of_ref(class([java,lang],['Class']), C).
+       jGetObjectClass(Obj, C),
+       jpl_cache_type_of_ref(class([java,lang],['Class']), C).
 
 %------------------------------------------------------------------------------
 
@@ -3407,19 +3633,19 @@ jpl_object_to_class(Obj, C) :-
 %   Type is the JPL type of that object
 
 jpl_object_to_type(@(Tag), Type) :-
-    jpl_tag_to_type(Tag, Type).
+       jpl_tag_to_type(Tag, Type).
 
 %------------------------------------------------------------------------------
 
 jpl_object_type_to_super_type(T, Tx) :-
-    (  (   T = class(_,_)
+       (   (   T = class(_,_)
        ;   T = array(_)
        )
-    -> jpl_type_to_class(T, C),
+       ->  jpl_type_to_class(T, C),
        jpl_class_to_super_class(C, Cx),
        Cx \== @(null),
        jpl_class_to_type(Cx, Tx)
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3430,13 +3656,12 @@ jpl_object_type_to_super_type(T, Tx) :-
 %   (the buffer is indexed from zero)
 
 jpl_primitive_buffer_to_array(T, Xc, Bp, I, Size, [Vc|Vcs]) :-
-    jni_fetch_buffer_value(Bp, I, Xhi, Xlo, Xc),
-    jni_convert_primitive_in(T, Vc, Xhi, Xlo),
-    Ix is I+1,
-    (  Ix < Size
-    -> jpl_primitive_buffer_to_array(T, Xc, Bp, Ix, Size, Vcs)
-    ;  Vcs = []
-    ).
+       jni_fetch_buffer_value(Bp, I, Vc, Xc),
+       Ix is I+1,
+       (   Ix < Size
+       ->  jpl_primitive_buffer_to_array(T, Xc, Bp, Ix, Size, Vcs)
+       ;   Vcs = []
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3457,20 +3682,20 @@ jpl_primitive_type(double).
 %   should be initialised to Value (to mimic Java semantics)
 
 jpl_primitive_type_default_value(boolean, @(false)).
-jpl_primitive_type_default_value(char,    0).
-jpl_primitive_type_default_value(byte,    0).
+jpl_primitive_type_default_value(char,    0).
+jpl_primitive_type_default_value(byte,    0).
 jpl_primitive_type_default_value(short,   0).
-jpl_primitive_type_default_value(int,     0).
-jpl_primitive_type_default_value(long,    0).
+jpl_primitive_type_default_value(int,     0).
+jpl_primitive_type_default_value(long,    0).
 jpl_primitive_type_default_value(float,   0.0).
 jpl_primitive_type_default_value(double,  0.0).
 
 %------------------------------------------------------------------------------
 
 jpl_primitive_type_super_type(T, Tx) :-
-    (  jpl_type_fits_type_direct_prim(T, Tx)
-    ;  jpl_type_fits_type_direct_xtra(T, Tx)
-    ).
+       (   jpl_type_fits_type_direct_prim(T, Tx)
+       ;   jpl_type_fits_type_direct_xtra(T, Tx)
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3482,9 +3707,9 @@ jpl_primitive_type_super_type(T, Tx) :-
 %   do that in Java)
 
 jpl_primitive_type_term_to_value(Type, Term, Val) :-
-    (  jpl_primitive_type_term_to_value_1(Type, Term, Val)
-    -> true
-    ).
+       (   jpl_primitive_type_term_to_value_1(Type, Term, Val)
+       ->  true
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3497,57 +3722,57 @@ jpl_primitive_type_term_to_value_1(boolean, @(false), @(false)).
 jpl_primitive_type_term_to_value_1(boolean, @(true), @(true)).
 
 jpl_primitive_type_term_to_value_1(char, I, I) :-
-    integer(I),
-    I >= 0,
-    I =< 65535.
+       integer(I),
+       I >= 0,
+       I =< 65535.         %  (2**16)-1.
 
 jpl_primitive_type_term_to_value_1(byte, I, I) :-
-    integer(I),
-    I >= -128,
-    I =<  127.
+       integer(I),
+       I >= 128,           % -(2**7)
+       I =< 127.           %  (2**7)-1
 
 jpl_primitive_type_term_to_value_1(short, I, I) :-
-    integer(I),
-    I >= -32768,
-    I =<  32767.
+       integer(I),
+       I >= -32768,        % -(2**15)
+       I =<  32767.        %  (2**15)-1
 
 jpl_primitive_type_term_to_value_1(int, I, I) :-
-    integer(I).
+       integer(I),
+       I >= -2147483648,   % -(2**31)
+       I =<  2147483647.   %  (2**31)-1
 
 jpl_primitive_type_term_to_value_1(long, I, I) :-
-    integer(I).
-
-jpl_primitive_type_term_to_value_1(long, jlong(Xhi,Xlo), jlong(Xhi,Xlo)) :-
-    integer(Xhi),
-    integer(Xlo).
+       integer(I),
+       I >= -9223372036854775808,  % -(2**63)
+       I =<  9223372036854775807.  %  (2**63)-1
 
 jpl_primitive_type_term_to_value_1(float, I, F) :-
-    integer(I),
-    F is float(I).
+       integer(I),
+       F is float(I).
 
 jpl_primitive_type_term_to_value_1(float, F, F) :-
-    float(F).
+       float(F).
 
 jpl_primitive_type_term_to_value_1(double, I, F) :-
-    integer(I),
-    F is float(I).
+       integer(I),
+       F is float(I).
 
 jpl_primitive_type_term_to_value_1(double, F, F) :-
-    float(F).
+       float(F).
 
 %------------------------------------------------------------------------------
 
 jpl_primitive_type_to_ancestor_types(T, Ts) :-
-    (  jpl_primitive_type_super_type(T, Ta)
-    -> Ts = [Ta|Tas],
+       (   jpl_primitive_type_super_type(T, Ta)
+       ->  Ts = [Ta|Tas],
        jpl_primitive_type_to_ancestor_types(Ta, Tas)
-    ;  Ts = []
-    ).
+       ;   Ts = []
+       ).
 
 %------------------------------------------------------------------------------
 
 jpl_primitive_type_to_super_type(T, Tx) :-
-    jpl_primitive_type_super_type(T, Tx).
+       jpl_primitive_type_super_type(T, Tx).
 
 %------------------------------------------------------------------------------
 
@@ -3556,12 +3781,12 @@ jpl_primitive_type_to_super_type(T, Tx) :-
 %   Type is its type
 
 jpl_ref_to_type(@(X), T) :-
-    (  X == null
-    -> T = null
-    ;  X == void
-    -> T = void
-    ;  jpl_tag_to_type(X, T)
-    ).
+       (   X == null
+       ->  T = null
+       ;   X == void
+       ->  T = void
+       ;   jpl_tag_to_type(X, T)
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3570,29 +3795,33 @@ jpl_ref_to_type(@(X), T) :-
 %   Type is its type (either from the cache or by reflection);
 
 jpl_tag_to_type(Tag, Type) :-
-    jni_tag_to_iref(Tag, Iref),
-    (  jpl_iref_type_cache(Iref, T)
-    -> true                                % T is Tag's type
-    ;  jpl_object_to_class(@(Tag), Cobj), % else get ref to class obj
-       jpl_class_to_type(Cobj, T),         % get type of class it denotes
-       assert(jpl_iref_type_cache(Iref,T))
-    ),
-    Type = T.
+       jni_tag_to_iref(Tag, Iref),
+       (   jpl_iref_type_cache(Iref, T)
+       ->  true                                % T is Tag's type
+       ;   jpl_object_to_class(@(Tag), Cobj), % else get ref to class obj
+       jpl_class_to_type(Cobj, T),         % get type of class it denotes
+       jpl_assert(jpl_iref_type_cache(Iref,T))
+       ),
+       Type = T.
 
 %------------------------------------------------------------------------------
 
 % jpl_true(-X) :-
-%   X is (by unification) the proper JPL datum which represents the Java value 'true';
-%   c.f. jpl_is_true/1
+%   X is (by unification) the proper JPL datum which represents the Java boolean value 'true';
+%cf jpl_is_true/1
 
 jpl_true(@(true)).
 
 %------------------------------------------------------------------------------
 
+% jpl_type_fits_type(+TypeX, +TypeY) :-
+%   TypeX and TypeY must each be proper JPL types;
+%   this succeeds iff TypeX is assignable to TypeY
+
 jpl_type_fits_type(Tx, Ty) :-
-    (  jpl_type_fits_type_1(Tx, Ty)
-    -> true
-    ).
+       (   jpl_type_fits_type_1(Tx, Ty)
+       ->  true
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3602,26 +3831,26 @@ jpl_type_fits_type(Tx, Ty) :-
 jpl_type_fits_type_1(T, T).
 
 jpl_type_fits_type_1(class(Ps1,Cs1), class(Ps2,Cs2)) :-
-    jpl_type_to_class(class(Ps1,Cs1), C1),
-    jpl_type_to_class(class(Ps2,Cs2), C2),
-    jIsAssignableFrom(C1, C2).
+       jpl_type_to_class(class(Ps1,Cs1), C1),
+       jpl_type_to_class(class(Ps2,Cs2), C2),
+       jIsAssignableFrom(C1, C2).
 
 jpl_type_fits_type_1(array(T1), class(Ps2,Cs2)) :-
-    jpl_type_to_class(array(T1), C1),
-    jpl_type_to_class(class(Ps2,Cs2), C2),
-    jIsAssignableFrom(C1, C2).
+       jpl_type_to_class(array(T1), C1),
+       jpl_type_to_class(class(Ps2,Cs2), C2),
+       jIsAssignableFrom(C1, C2).
 
 jpl_type_fits_type_1(array(T1), array(T2)) :-
-    jpl_type_to_class(array(T1), C1),
-    jpl_type_to_class(array(T2), C2),
-    jIsAssignableFrom(C1, C2).
+       jpl_type_to_class(array(T1), C1),
+       jpl_type_to_class(array(T2), C2),
+       jIsAssignableFrom(C1, C2).
 
 jpl_type_fits_type_1(null, class(_,_)).
 
 jpl_type_fits_type_1(null, array(_)).
 
 jpl_type_fits_type_1(T1, T2) :-
-    jpl_type_fits_type_xprim(T1, T2).
+       jpl_type_fits_type_xprim(T1, T2).
 
 %------------------------------------------------------------------------------
 
@@ -3635,118 +3864,156 @@ jpl_type_fits_type_direct_prim(byte,  short).
 %------------------------------------------------------------------------------
 
 jpl_type_fits_type_direct_xprim(Tp, Tq) :-
-    jpl_type_fits_type_direct_prim(Tp, Tq).
+       jpl_type_fits_type_direct_prim(Tp, Tq).
 
 jpl_type_fits_type_direct_xprim(Tp, Tq) :-
-    jpl_type_fits_type_direct_xtra(Tp, Tq).
+       jpl_type_fits_type_direct_xtra(Tp, Tq).
 
 %------------------------------------------------------------------------------
 
-% jpl_type_fits_type_direct_xtra(pos_int,    int).
-  jpl_type_fits_type_direct_xtra(char_int,   int).
-  jpl_type_fits_type_direct_xtra(char_int,   char).
-  jpl_type_fits_type_direct_xtra(char_short, short).
-  jpl_type_fits_type_direct_xtra(char_short, char).
-  jpl_type_fits_type_direct_xtra(char_byte,  byte).
-  jpl_type_fits_type_direct_xtra(char_byte,  char).
-% jpl_type_fits_type_direct_xtra(neg_byte,   byte).
-% jpl_type_fits_type_direct_xtra(neg_short,  short).
-% jpl_type_fits_type_direct_xtra(neg_int,    int).
+% jpl_type_fits_type_direct_xtra(-PseudoType, -ConcreteType) :-
+%   this predicate defines the direct subtype-supertype relationships
+%   which involve the intersection pseudo types char_int, char_short and char_byte
+
+jpl_type_fits_type_direct_xtra(char_int,   int).    % char_int is a direct subtype of int
+jpl_type_fits_type_direct_xtra(char_int,   char).   % etc.
+jpl_type_fits_type_direct_xtra(char_short, short).
+jpl_type_fits_type_direct_xtra(char_short, char).
+jpl_type_fits_type_direct_xtra(char_byte,  byte).
+jpl_type_fits_type_direct_xtra(char_byte,  char).
+
+jpl_type_fits_type_direct_xtra(overlong,   float).  % 6/Oct/2006 experiment
 
 %------------------------------------------------------------------------------
 
 % jpl_type_fits_type_xprim(-Tp, -T) :-
-%   indeterminate: serves only jpl_type_fits_type_1/2
+%   indeterminate;
+%   serves only jpl_type_fits_type_1/2
 
 jpl_type_fits_type_xprim(Tp, T) :-
-    jpl_type_fits_type_direct_xprim(Tp, Tq),
-    (  Tq = T
-    ;  jpl_type_fits_type_xprim(Tq, T)
-    ).
+       jpl_type_fits_type_direct_xprim(Tp, Tq),
+       (   Tq = T
+       ;   jpl_type_fits_type_xprim(Tq, T)
+       ).
 
 %------------------------------------------------------------------------------
 
 % jpl_type_to_ancestor_types(+T, -Tas) :-
-%   this fails to accommodate the assignability of null...
+%   this does not accommodate the assignability of null,
+%   but that's OK (?) since "type assignability" and "type ancestry" are not equivalent
 
 jpl_type_to_ancestor_types(T, Tas) :-
-    (  (   T = class(_,_)
+       (   (   T = class(_,_)
        ;   T = array(_)
        )
-    -> jpl_type_to_class(T, C),
+       ->  jpl_type_to_class(T, C),
        jpl_class_to_ancestor_classes(C, Cas),
        jpl_classes_to_types(Cas, Tas)
-    ;  jpl_primitive_type_to_ancestor_types(T, Tas)
-    -> true
-    ).
+       ;   jpl_primitive_type_to_ancestor_types(T, Tas)
+       ->  true
+       ).
 
 %------------------------------------------------------------------------------
 
+% jpl_type_to_canonical_type(+Type, -CanonicalType) :-
+%   Type must be a type, not necessarily canonical;
+%   CanonicalType will be equivalent and canonical
+
+%eg jpl_type_to_canonical_type(class([],[byte]), byte)
+
 jpl_type_to_canonical_type(array(T), array(Tc)) :-
-    !,
-    jpl_type_to_canonical_type(T, Tc).
+       !,
+       jpl_type_to_canonical_type(T, Tc).
 
 jpl_type_to_canonical_type(class([],[void]), void) :-
-    !.
+       !.
 
 jpl_type_to_canonical_type(class([],[N]), N) :-
-    jpl_primitive_type(N),
-    !.
+       jpl_primitive_type(N),
+       !.
 
 jpl_type_to_canonical_type(class(Ps,Cs), class(Ps,Cs)) :-
-    !.
+       !.
 
 jpl_type_to_canonical_type(void, void) :-
-    !.
+       !.
 
 jpl_type_to_canonical_type(P, P) :-
-    jpl_primitive_type(P).
+       jpl_primitive_type(P).
 
 %------------------------------------------------------------------------------
 
 % jpl_type_to_class(+Type, -ClassObject) :-
-%   incomplete types are now never cached (or otherwise passed around),
-%   but we check anyway (?)
+%   incomplete types are now never cached (or otherwise passed around);
 %   jFindClass throws an exception if FCN can't be found
 
+%nb if this is public API maybe oughta restore the ground(T) check and throw exception
+
 jpl_type_to_class(T, @(Tag)) :-
-    ground(T),
-    (  jpl_class_tag_type_cache(ClassTag,T)
-    -> Tag = ClassTag
-    ;  (   jpl_type_to_findclassname(T, FCN)   % peculiar syntax for FindClass()
-       ->  jFindClass(FCN, @(ClassTag)),       % which caches type of @ClassTag
-           jpl_cache_type_of_ref(T, @(ClassTag))
+  % ground(T),  % 9/Nov/2004 removed this spurious (?) check
+       (   jpl_class_tag_type_cache(ClassTag,T)
+       ->  Tag = ClassTag
+       ;   (   jpl_type_to_findclassname(T, FCN)   % peculiar syntax for FindClass()
+       ->  jFindClass(FCN, @(ClassTag)),       % which caches type of @ClassTag
+         % jpl_cache_type_of_ref(T, @(ClassTag))
+           jpl_cache_type_of_ref(class([java,lang],['Class']), @(ClassTag))    % 9/Nov/2004 bugfix (?)
        ),
-       assert(jpl_class_tag_type_cache(ClassTag,T))
-    ),
-    Tag = ClassTag.
+       jpl_assert(jpl_class_tag_type_cache(ClassTag,T))
+       ),
+       Tag = ClassTag.
 
 %------------------------------------------------------------------------------
 
-%eg jpl_type_to_classname(class([java,util],['Date']), 'java.util.Date')
+% jpl_type_to_nicename(+Type, -NiceName) :-
+%   Type, which is a class or array type (not sure about the others...),
+%   is denoted by ClassName in dotted syntax
+
+%nb is this used? is "nicename" well defined and necessary?
+%nb this could use caching if indexing were amenable
+
+%eg jpl_type_to_nicename(class([java,util],['Date']), 'java.util.Date')
+%eg jpl_type_to_nicename(boolean, boolean)
+
+%cf jpl_type_to_classname/2
+
+jpl_type_to_nicename(T, NN) :-
+       (   jpl_primitive_type( T)
+       ->  NN = T
+       ;   (   phrase(jpl_type_classname_1(T), Cs)
+       ->  atom_codes(CNx, Cs),                                % green commit to first solution
+           NN = CNx
+       )
+       ).
+
+%------------------------------------------------------------------------------
 
 % jpl_type_to_classname(+Type, -ClassName) :-
 %   Type, which is a class or array type (not sure about the others...),
 %   is denoted by ClassName in dotted syntax
 
+%eg jpl_type_to_classname(class([java,util],['Date']), 'java.util.Date')
+
+%cf jpl_type_to_nicename/2
+
 jpl_type_to_classname(T, CN) :-
-    (  phrase(jpl_type_classname_1(T), Cs)
-    -> atom_codes(CNx, Cs),                                % green commit to first solution
+       (   phrase(jpl_type_classname_1(T), Cs)
+       ->  atom_codes(CNx, Cs),                                % green commit to first solution
        CN = CNx
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
 % jpl_type_to_descriptor(+Type, -Descriptor) :-
-%   Type (denoting any Java type, and can also be a JPL method/2 structure)
+%   Type (denoting any Java type)
+%   (can also be a JPL method/2 structure (?!))
 %   is represented by Descriptor (JVM internal syntax)
 %   I'd cache this, but I'd prefer more efficient indexing on types (hashed?)
 
 jpl_type_to_descriptor(T, D) :-
-    (  phrase(jpl_type_descriptor_1(T), Cs)
-    -> atom_codes(Dx, Cs),
+       (   phrase(jpl_type_descriptor_1(T), Cs)
+       ->  atom_codes(Dx, Cs),
        D = Dx
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3755,19 +4022,52 @@ jpl_type_to_descriptor(T, D) :-
 %   in the syntax required peculiarly by FindClass()
 
 jpl_type_to_findclassname(T, FCN) :-
-    (  phrase(jpl_type_findclassname(T), Cs)
-    -> atom_codes(FCNx, Cs),
+       (   phrase(jpl_type_findclassname(T), Cs)
+       ->  atom_codes(FCNx, Cs),
        FCN = FCNx
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
+% jpl_type_to_super_type(+Type, -SuperType) :-
+%   Type oughta be a proper JPL type;
+%   SuperType is the (at most one) type which it directly implements (if it's a class);
+%   if Type denotes a class, this works only if that class can be found;
+%   if Type = array(Type) then I dunno what happens...
+
 jpl_type_to_super_type(T, Tx) :-
-    (  jpl_object_type_to_super_type(T, Tx)
-    -> true
-    ;  jpl_primitive_type_to_super_type(T, Tx)
-    -> true
-    ).
+       (   jpl_object_type_to_super_type(T, Tx)
+       ->  true
+       ;   jpl_primitive_type_to_super_type(T, Tx)
+       ->  true
+       ).
+
+%------------------------------------------------------------------------------
+
+% jpl_type_to_preferred_concrete_type( +Type, -ConcreteType) :-
+%   Type must be a canonical JPL type,
+%   possibly a pseudo (inferred) type such as char_int or array(char_byte);
+%   ConcreteType is the preferred concrete (Java-instantiable) type;
+%   introduced 16/Apr/2005 to fix bug whereby jpl_list_to_array([1,2,3],A) failed 
+%   because the lists's inferred type of array(char_byte) is not Java-instantiable
+
+jpl_type_to_preferred_concrete_type( T, Tc) :-
+       (   jpl_type_to_preferred_concrete_type_1( T, TcX)
+       ->  Tc = TcX
+       ).
+
+%------------------------------------------------------------------------------
+
+jpl_type_to_preferred_concrete_type_1( char_int, int).
+
+jpl_type_to_preferred_concrete_type_1( char_short, short).
+
+jpl_type_to_preferred_concrete_type_1( char_byte, byte).
+
+jpl_type_to_preferred_concrete_type_1( array(T), array(Tc)) :-
+       jpl_type_to_preferred_concrete_type_1( T, Tc).
+
+jpl_type_to_preferred_concrete_type_1( T, T).
 
 %------------------------------------------------------------------------------
 
@@ -3779,29 +4079,33 @@ jpl_type_to_super_type(T, Tx) :-
 jpl_types_fit_type([], _).
 
 jpl_types_fit_type([T1|T1s], T2) :-
-    jpl_type_fits_type(T1, T2),
-    jpl_types_fit_type(T1s, T2).
+       jpl_type_fits_type(T1, T2),
+       jpl_types_fit_type(T1s, T2).
 
 %------------------------------------------------------------------------------
 
+% jpl_types_fit_types(+Types1, +Types2) :-
+%   each member type of Types1 "fits" the respective member type of Types2
+
 jpl_types_fit_types([], []).
 
 jpl_types_fit_types([T1|T1s], [T2|T2s]) :-
-    jpl_type_fits_type(T1, T2),
-    jpl_types_fit_types(T1s, T2s).
+       jpl_type_fits_type(T1, T2),
+       jpl_types_fit_types(T1s, T2s).
 
 %------------------------------------------------------------------------------
 
 % jpl_value_to_type(+Value, -Type) :-
 %   Value must be a proper JPL datum other than a ref
 %   i.e. primitive, String or void;
-%   it is of (unique most specific) Type
+%   it is of (unique most specific) Type,
+%   which may be one of the pseudo types char_byte, char_short or char_int
 
 jpl_value_to_type(V, T) :-
-    ground(V),                         % critically assumed by jpl_value_to_type_1/2
-    (  jpl_value_to_type_1(V, Tv)      % 2nd arg must be unbound
-    -> T = Tv
-    ).
+       ground(V),                          % critically assumed by jpl_value_to_type_1/2
+       (   jpl_value_to_type_1(V, Tv)      % 2nd arg must be unbound
+       ->  T = Tv
+       ).
 
 %------------------------------------------------------------------------------
 
@@ -3809,14 +4113,9 @@ jpl_value_to_type(V, T) :-
 %   Type is the unique most specific JPL type of which Value represents an instance;
 %   called solely by jpl_value_to_type/2, which commits to first solution;
 %
-%   NB integer values are of JPL-peculiar uniquely most specific subtypes,
-%   i.e. char_byte, char_short, char_int, pos_int, neg_byte, neg_short, neg_int
-%   but all are understood by the JPL-internal utilities which call this proc
-%
-%   NB could replace
-%      {pos_int,neg_int} -> proper_int (or int?)
-%      neg_byte -> proper_byte (or byte?)
-%      neg_short -> proper_short (or short?)
+%   NB some integer values are of JPL-peculiar uniquely most specific subtypes,
+%   i.e. char_byte, char_short, char_int
+%   but all are understood by JPL's internal utilities which call this proc
 %
 %   NB we regard float as subtype of double
 %
@@ -3826,25 +4125,27 @@ jpl_value_to_type_1(@(false), boolean).
 
 jpl_value_to_type_1(@(true), boolean).
 
-jpl_value_to_type_1(jlong(_,_), long).     % discrimination, not validation
-
 jpl_value_to_type_1(A, class([java,lang],['String'])) :-   % yes it's a "value"
-    atom(A).
+       atom(A).
 
 jpl_value_to_type_1(I, T) :-
-    integer(I),
-    (  I >= 0  ->  (   I < 128     ->  T = char_byte
-                   ;   I < 32768   ->  T = char_short
-                   ;   I < 65536   ->  T = char_int
-                                   ;   T = int         % was pos_int
+       integer(I),
+       (   I >= 0  ->  (   I < 2**7    ->  T = char_byte
+                   ;   I < 2**15   ->  T = char_short
+                   ;   I < 2**16   ->  T = char_int
+                   ;   I < 2**31   ->  T = int
+                   ;   I < 2**63   ->  T = long
+                                   ;   T = overlong
                    )
-    ;  I >= -128   ->  T = byte                        % was neg_byte
-    ;  I >= -32768 ->  T = short                       % was neg_short
-                   ;   T = int                         % was neg_int
-    ).
+       ;   I >= -(2**7)    ->  T = byte
+       ;   I >= -(2**15)   ->  T = short
+       ;   I >= -(2**31)   ->  T = int
+       ;   I >= -(2**63)   ->  T = long
+                       ;   T = overlong 
+       ).
 
 jpl_value_to_type_1(F, float) :-
-    float(F).
+       float(F).
 
 %------------------------------------------------------------------------------
 
@@ -3856,107 +4157,113 @@ jpl_void(@(void)).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_array_to_length(array, integer)
+%type   jpl_array_to_length(array, integer)
 
 % jpl_array_to_length(+ArrayObject, -Length) :-
 %   must validate ArrayObject before making the JNI call...
 
 jpl_array_to_length(A, N) :-
-    (  jpl_ref_to_type(A, array(_))    % can this be done cheaper e.g. in foreign code?
-    -> jGetArrayLength(A, N)           % *must* be array, else undefined (crash?)
-    ).
+       (   jpl_ref_to_type(A, array(_))    % can this be done cheaper e.g. in foreign code?
+       ->  jGetArrayLength(A, N)           % *must* be array, else undefined (crash?)
+       ).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_array_to_list(array, list(datum))
+%type   jpl_array_to_list(array, list(datum))
 
 % jpl_array_to_list(+Array, -Elements) :-
 
 jpl_array_to_list(A, Es) :-
-    jpl_array_to_length(A, Len),
-    (  Len > 0
-    -> LoBound is 0,
+       jpl_array_to_length(A, Len),
+       (   Len > 0
+       ->  LoBound is 0,
        HiBound is Len-1,
        jpl_get(A, LoBound-HiBound, Es)
-    ;  Es = []
-    ).
+       ;   Es = []
+       ).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_datums_to_array(list(datum), array)
+%type   jpl_datums_to_array(list(datum), array)
 
 % jpl_datums_to_array(+Ds, -A) :-
 %   A will be a ref to a new JVM array,
 %   whose base type is the most specific Java type
 %   of which each member of Datums is (directly or indirectly) an instance;
 %   NB this fails (without warning, currently) if:
-%      Ds is an empty list (no base type can be inferred)
-%      Ds contains a primitive value and an object or array ref (no common supertype)
+%       Ds is an empty list (no base type can be inferred)
+%       Ds contains a primitive value and an object or array ref (no common supertype)
 
 jpl_datums_to_array(Ds, A) :-
-    ground(Ds),
-    jpl_datums_to_most_specific_common_ancestor_type(Ds, T),
-    jpl_new(array(T), Ds, A).
+       ground(Ds),
+       jpl_datums_to_most_specific_common_ancestor_type(Ds, T),    % T may be pseudo e.g. char_byte
+       jpl_type_to_preferred_concrete_type( T, Tc),    % bugfix added 16/Apr/2005
+       jpl_new(array(Tc), Ds, A).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_enumeration_element(object, datum)
+%type   jpl_enumeration_element(object, datum)
 
 % jpl_enumeration_element(+Enumeration, -Element) :-
-%   generates each Element from the Enumeration
+%   generates each Element from the Enumeration;
+%   if the element is a java.lang.String then Element will be an atom;
+%   if the element is null then Element will (oughta) be null;
+%   otherwise I reckon it has to be an object ref
 
 jpl_enumeration_element(En, E) :-
-    (  jpl_call(En, hasMoreElements, [], @(true))
-    -> jpl_call(En, nextElement, [], Ex),
+       (   jpl_call(En, hasMoreElements, [], @(true))
+       ->  jpl_call(En, nextElement, [], Ex),
        (   E = Ex
        ;   jpl_enumeration_element(En, E)
        )
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_enumeration_to_list(object, list(datum))
+%type   jpl_enumeration_to_list(object, list(datum))
 
 % jpl_enumeration_to_list(+Enumeration, -Elements) :-
 
 jpl_enumeration_to_list(EN, Es) :-
-    (  jpl_call(EN, hasMoreElements, [], @(true))
-    -> jpl_call(EN, nextElement, [], E),
+       (   jpl_call(EN, hasMoreElements, [], @(true))
+       ->  jpl_call(EN, nextElement, [], E),
        Es = [E|Es1],
        jpl_enumeration_to_list(EN, Es1)
-    ;  Es = []
-    ).
+       ;   Es = []
+       ).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_hashtable_pair(object, pair(datum,datum))
+%type   jpl_hashtable_pair(object, pair(datum,datum))
 
 % jpl_hashtable_pair(+HashTable, -KeyValuePair) :-
 %   generates Key-Value pairs from the given HashTable
 %   NB String is converted to atom but Integer is presumably returned as an object ref
+%   (i.e. as elsewhere, no auto unboxing);
+%nb this is anachronistic (oughta use the Map interface?)
 
 jpl_hashtable_pair(HT, K-V) :-
-    jpl_call(HT, keys, [], Ek),
-    jpl_enumeration_to_list(Ek, Ks),
-    member(K, Ks),
-    jpl_call(HT, get, [K], V).
+       jpl_call(HT, keys, [], Ek),
+       jpl_enumeration_to_list(Ek, Ks),
+       member(K, Ks),
+       jpl_call(HT, get, [K], V).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_iterator_element(object, datum)
+%type   jpl_iterator_element(object, datum)
 
 % jpl_iterator_element(+Iterator, -Element) :-
 
 jpl_iterator_element(I, E) :-
-    (  jpl_call(I, hasNext, [], @(true))
-    -> (   jpl_call(I, next, [], E)        % surely it's steadfast...
+       (   jpl_call(I, hasNext, [], @(true))
+       ->  (   jpl_call(I, next, [], E)        % surely it's steadfast...
        ;   jpl_iterator_element(I, E)
        )
-    ).
+       ).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_list_to_array(list(datum), array)
+%type   jpl_list_to_array(list(datum), array)
 
 % jpl_list_to_array(+Datums, -Array) :-
 %   Datums is a proper list of JPL datums (values or refs);
@@ -3965,32 +4272,51 @@ jpl_iterator_element(I, E) :-
 %   whose respective elements are Datums
 
 jpl_list_to_array(Ds, A) :-
-    jpl_datums_to_array(Ds, A).
+       jpl_datums_to_array(Ds, A).
+
+%------------------------------------------------------------------------------
+
+%type   jpl_terms_to_array(list(term), array)
+
+% jpl_terms_to_array(+Terms, -Array) :-
+%   Terms is a proper list of arbitrary terms;
+%   Array is an array of jpl.Term,
+%   whose elements represent the respective members of the list
+
+jpl_terms_to_array(Ts, A) :-
+       jpl_terms_to_array_1(Ts, Ts2),
+       jpl_new( array(class([jpl],['Term'])), Ts2, A).
+
+%------------------------------------------------------------------------------
+
+jpl_terms_to_array_1([], []).
+
+jpl_terms_to_array_1([T|Ts], [{T}|Ts2]) :-
+       jpl_terms_to_array_1(Ts, Ts2).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_map_element(object, pair(datum,datum))
+%type   jpl_map_element(object, pair(datum,datum))
 
 % jpl_map_element(+Map, -KeyValue) :-
 %   Map must be an instance of any implementation of the java.util.Map interface;
 %   this generates each Key-Value pair from the Map
 
 jpl_map_element(M, K-V) :-
-    jpl_call(M, entrySet, [], ES),
-    jpl_set_element(ES, E),
-    jpl_call(E, getKey, [], K),
-    jpl_call(E, getValue, [], V).
+       jpl_call(M, entrySet, [], ES),
+       jpl_set_element(ES, E),
+       jpl_call(E, getKey, [], K),
+       jpl_call(E, getValue, [], V).
 
 %------------------------------------------------------------------------------
 
-%type  jpl_set_element(object, datum)
+%type   jpl_set_element(object, datum)
 
 % jpl_set_element(+Set, -Element) :-
 
 jpl_set_element(S, E) :-
-    jpl_call(S, iterator, [], I),
-    jpl_iterator_element(I, E).
-
+       jpl_call(S, iterator, [], I),
+       jpl_iterator_element(I, E).
 
 %------------------------------------------------------------------------------
 
@@ -3999,60 +4325,62 @@ jpl_set_element(S, E) :-
 
 is_pair(0) :- !, fail.
 is_pair(Key-_Val) :-
-    ground(Key).
+       ground(Key).
 
 %------------------------------------------------------------------------------
 
 is_pairs(0) :- !, fail.
 is_pairs([]).
 is_pairs([H|T]) :-
-    is_pair(H),
-    is_pairs(T).
-
-%------------------------------------------------------------------------------
-
-qp_atom_to_chars(A, Cs) :-
-       atom_codes(A, Cs).
-
-%------------------------------------------------------------------------------
-
-qp_chars_to_atom(Cs, A) :-
-       atom_codes(A, Cs).
+       is_pair(H),
+       is_pairs(T).
 
 %------------------------------------------------------------------------------
 
 multimap_to_atom(KVs, A) :-
        multimap_to_atom_1(KVs, "", Cz, []),
        flatten(Cz, Cs),
-       qp_chars_to_atom(Cs, A).
+       atom_codes(A, Cs).
 
 %------------------------------------------------------------------------------
 
 multimap_to_atom_1([], _, Cs, Cs).
-
 multimap_to_atom_1([K-V|KVs], T, Cs1, Cs0) :-
-    qp_atom_to_chars(K, CsK),
-    Cs1 = [T,CsK," = "|Cs2],
-    (  is_list(V)
-    -> (   is_pairs(V)
-       ->  V = V2
-       ;   findall(
-               N-Ve,
-               nth1(N, V, Ve),
-               V2
-           )
+       atom_codes(K, CsK),
+       Cs1 = [T,CsK," = "|Cs2],
+       (   is_list(V)
+       ->  (   is_pairs(V)
+           ->  V = V2
+           ;   findall(N-Ve, nth1(N, V, Ve), V2)
+           ),
+           T2 = ["    ",T],
+           Cs2 = [10|Cs2a],
+           multimap_to_atom_1(V2, T2, Cs2a, Cs3)
+       ;   term_to_codes(V, CsV),
+           Cs2 = [CsV,10|Cs3]
+       ),
+       multimap_to_atom_1(KVs, T, Cs3, Cs0).
+
+%------------------------------------------------------------------------------
+
+%%     term_to_codes(+Term, ?Codes)
+%
+%      unifies Codes with a printed representation of Term.
+%      
+%      @tbd Sort of quoting requirements and use format(codes(Codes),
+%      ...)
+
+term_to_codes(Term, Codes) :-
+       (   atom(Term)
+       ->  Term = A                % avoid superfluous quotes
+       ;   system:term_to_atom(Term, A)
        ),
-       T2 = ["    ",T],
-       Cs2 = [10|Cs2a],
-       multimap_to_atom_1(V2, T2, Cs2a, Cs3)
-    ;  term_to_chars(V, CsV),
-       Cs2 = [CsV,10|Cs3]
-    ),
-    multimap_to_atom_1(KVs, T, Cs3, Cs0).
+       atom_codes(A, Codes).
 
+%------------------------------------------------------------------------------
 
                 /*******************************
-                *            MESSAGES          *
+                *            MESSAGES          *
                 *******************************/
 
 :- multifile
@@ -4067,7 +4395,7 @@ prolog:error_message(java_exception(Ex)) -->
 
 
                 /*******************************
-                *             PATHS            *
+                *             PATHS            *
                 *******************************/
 
 :- multifile user:file_search_path/2.
@@ -4075,26 +4403,51 @@ prolog:error_message(java_exception(Ex)) -->
 
 user:file_search_path(jar, swi(lib)).
 
+%%     add_search_path(+Var, +Value) is det.
+%
+%      Add value to search-path Var.  Value is normally a directory.
+%      
+%      @param Value    Path to add in OS notation.
+
+add_search_path(Path, Dir) :-
+       (   getenv(Path, Old)
+       ->  (   current_prolog_flag(windows, true)
+           ->  Sep = (;)
+           ;   Sep = (:)
+           ),
+           concat_atom([Old, Sep, Dir], New),
+           setenv(Path, New)
+       ;   setenv(Path, Dir)
+       ).
+
+%%     search_path_separator(-Sep:atom)
+%
+%      Separator  used  the  the  OS    in  =PATH=,  =LD_LIBRARY_PATH=,
+%      =CLASSPATH=, etc.
+
+search_path_separator((;)) :-
+       current_prolog_flag(windows, true), !.
+search_path_separator(:).
 
                 /*******************************
-                *         LOAD THE JVM         *
+                *         LOAD THE JVM         *
                 *******************************/
 
-%      check_java_environment
-%      
-%      Verify the Java environment.  Preferably   we  would create, but
-%      most Unix systems do not   allow putenv("LD_LIBRARY_PATH=..." in
-%      the current process. A suggesting found on  the net is to modify
-%      LD_LIBRARY_PATH right at startup and  next execv() yourself, but
-%      this doesn't work if we want to load Java on demand or if Prolog
-%      itself is embedded in another application.
-%      
-%      So, after reading lots of pages on   the web, I decided checking
-%      the environment and producing a sensible   error  message is the
-%      best we can do.
-%      
-%      Please not that Java2 doesn't require   $CLASSPATH to be set, so
-%      we do not check for that.
+%%      check_java_environment
+%       
+%       Verify the Java environment.  Preferably   we  would create, but
+%       most Unix systems do not   allow putenv("LD_LIBRARY_PATH=..." in
+%       the current process. A suggesting found on  the net is to modify
+%       LD_LIBRARY_PATH right at startup and  next execv() yourself, but
+%       this doesn't work if we want to load Java on demand or if Prolog
+%       itself is embedded in another application.
+%       
+%       So, after reading lots of pages on   the web, I decided checking
+%       the environment and producing a sensible   error  message is the
+%       best we can do.
+%       
+%       Please not that Java2 doesn't require   $CLASSPATH to be set, so
+%       we do not check for that.
 
 check_java_environment :-
        check_lib(java),
@@ -4104,16 +4457,23 @@ check_lib(Name) :-
        check_shared_object(Name, File, EnvVar, Absolute),
        (   Absolute == (-)
        ->  (   current_prolog_flag(windows, true)
-           ->  A = '%', Z = '%'
-           ;   A = '$', Z = ''
+           ->  A = '%', Z = '%'
+           ;   A = '$', Z = ''
            ),
-           sformat(Msg, 'Please add directory holding ~w to ~w~w~w',
-                   [ File, A, EnvVar, Z ]),
+           format(string(Msg), 'Please add directory holding ~w to ~w~w~w',
+                  [ File, A, EnvVar, Z ]),
            throw(error(existence_error(library, Name),
                        context(_, Msg)))
        ;   true
        ).
 
+%%     check_shared_object(+Lib, -File, -EnvVar, -AbsFile) is semidet.
+%
+%      True if AbsFile is existing .so/.dll file for Lib.
+%      
+%      @param File     Full name of Lib (i.e. libjpl.so or jpl.dll)
+%      @param EnvVar   Search-path for shared objects.
+
 check_shared_object(Name, File, EnvVar, Absolute) :-
        libfile(Name, File),
        library_search_path(Path, EnvVar),
@@ -4134,24 +4494,26 @@ libfile(Base, File) :-
        current_prolog_flag(shared_object_extension, Ext),
        file_name_extension(Base, Ext, File).
 
-library_search_path(Path, 'LD_LIBRARY_PATH') :-
-       current_prolog_flag(unix, true), !,
-       (   getenv('LD_LIBRARY_PATH', Env),
-           concat_atom(Path, ':', Env)
-       ->  true
-       ;   Path = []
-       ).
-library_search_path(Path, 'PATH') :-
-       current_prolog_flag(windows, true), !,
-       (   getenv('PATH', Env),
-           concat_atom(Path, ';', Env)
+
+%%     library_search_path(-Dirs:list, -EnvVar) is det.
+%
+%      Dirs  is  the  list   of    directories   searched   for  shared
+%      objects/DLLs. EnvVar is the variable in which the search path os
+%      stored.
+
+library_search_path(Path, EnvVar) :-
+       current_prolog_flag(shared_object_search_path, EnvVar),
+       search_path_separator(Sep),
+       (   getenv(EnvVar, Env),
+           concat_atom(Path, Sep, Env)
        ->  true
        ;   Path = []
        ).
 
-%      add_jpl_to_classpath/0
-%      
-%      Add jpl.jar to $CLASSPATH to facilitate callbacks
+
+%%      add_jpl_to_classpath
+%       
+%       Add jpl.jar to =CLASSPATH= to facilitate callbacks
 
 add_jpl_to_classpath :-
        absolute_file_name(jar('jpl.jar'),
@@ -4161,18 +4523,19 @@ add_jpl_to_classpath :-
        ->  true
        ;   Old = '.'
        ),
-       (   current_prolog_flag(windows, true)
-       ->  Sep = (';')
-       ;   Sep = (:)
+       (       current_prolog_flag(windows, true)
+       ->      Separator = ';'
+       ;       Separator = ':'
        ),
-       concat_atom([JplJAR, Old], Sep, New),
+       concat_atom([JplJAR, Old], Separator, New),
        setenv('CLASSPATH', New).
 
-%      libjpl(-Spec)
-%      
-%      Return the spec for loading the   JPL shared object. This shared
-%      object must be called libjpl.so as the Java System.loadLibrary()
-%      call used by jpl.jar adds the lib* prefix.
+
+%%      libjpl(-Spec) is det.
+%       
+%       Return the spec for loading the   JPL shared object. This shared
+%       object must be called libjpl.so as the Java System.loadLibrary()
+%       call used by jpl.jar adds the lib* prefix.
 
 libjpl(File) :-