This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
authorJarkko Hietaniemi <jhi@iki.fi>
Mon, 23 Dec 2002 06:37:31 +0000 (06:37 +0000)
committerJarkko Hietaniemi <jhi@iki.fi>
Mon, 23 Dec 2002 06:37:31 +0000 (06:37 +0000)
[ 18300]
Subject: [patch] typo in perlop
From: andreas.koenig@anima.de (Andreas J. Koenig)
Date: Wed, 11 Dec 2002 21:31:14 +0100
Message-ID: <m3k7igjo19.fsf@k242.linux.bogus>

[ 18304]
Redone #18011 from metaunits

[ 18305]
Enough changes to Configure and metaunits warrant an update.
Several small changes and three additions

[ 18306]
More documentation of obscure flags is good, even if the
documentation might be not so good. Atleast it's not false!
Documents the flags one can give to perl_clone

[ 18308]
Subject: [PATCH] Re: [perl #19017] lexical "my" variables not visible in debugger "x" command
From: peter@PSDT.com (Peter Scott)
Date: 12 Dec 2002 18:13:17 -0000
Message-ID: <20021212181317.50538.qmail@onion.perl.org>
(fix bug [perl #19058])

[ 18310]
regen-headers to get new API docs from #18306

[ 18312]
Subject: [Fwd: Patch for perl utf8-related bug]
From: Richard Hitt <rbh00@utsglobal.com>
Date: Fri, 06 Dec 2002 16:47:42 -0800
[perl #18932]

[ 18313]
Subject: [PATCH 5.8.1 @oldish-18156] OS/2 REXX interface assuming Object REXX
From: Ilya Zakharevich <ilya@Math.Berkeley.EDU>
Date: Fri, 13 Dec 2002 14:08:00 -0800
Message-ID: <20021213220800.GA2625@math.berkeley.edu>

[ 18314]
Subject: [PATCH 5.8.1 @oldish-18156] Morphing to PM on OS/2
From: Ilya Zakharevich <ilya@Math.Berkeley.EDU>
Date: Fri, 13 Dec 2002 14:00:48 -0800
Message-ID: <20021213220048.GA2606@math.berkeley.edu>

[ 18315]
Subject: [PATCH 5.8.1 @oldish-18156] deprecated warnings
From: Ilya Zakharevich <ilya@Math.Berkeley.EDU>
Date: Fri, 13 Dec 2002 13:47:08 -0800
Message-ID: <20021213214707.GA2588@math.berkeley.edu>

[ 18316]
Subject: [PATCH 5.8.1 @oldish-18156] build
From: Ilya Zakharevich <ilya@Math.Berkeley.EDU>
Date: Fri, 13 Dec 2002 13:54:05 -0800
Message-ID: <20021213215404.GA2597@math.berkeley.edu>

[ 18317]
Integrate Net::Ping v2.26. (lib/Net/Ping/t/450_service.t should work now)

[ 18323]
PerlSIO_stderr et al are not functions

[ 18324]
windows: avoid prompting under some shells during $(MAKE) distclean

[ 18325]
PerlIO_{stdoutf,vprintf} don't exist, should be PerlSIO_*

[ 18326]
Win32.pod update

[ 18327]
windows: support for large files

note that this change will break binary compatibility with the
default 5.8.0 build options; nevertheless I think it is worth
having in 5.8.1 (people who want the compatibility can disable
the option in the makefile)

[ 18328]
fix for GPF in C<print Win32::GetFullPathName('\\\\host\share')>

[ 18330]
remove CRs from a couple of files (these show up as CRCRLF
on windows)

[ 18332]
$Config{prefixexp} was set incorrectly on windows

[ 18334]
AIX compiler version updates

[ 18335]
my_fflush_all() wasn't doing the right thing under useperlio
on many platforms

[ 18337]
handy hint: getting a perforce change as a usable patch

[ 18338]
Subject: [PATCH] read permissions for h2ph-generated files
From: Slaven Rezic <slaven.rezic@berlin.de>
Date: Fri, 22 Nov 2002 14:49:14 +0100 (CET)
Message-Id: <200211221349.gAMDnEAK014033@vran.herceg.de>

[ 18339]
Integrate Time::HiRes v1.39 (for VMS build tweak)

[ 18342]
Subject: [perl #18544] Patch included to fix problem.
From: Richard Kandarian <richard.kandarian@lanl.gov>
Date: Thu, 21 Nov 2002 08:00:20 -0700
(from RT)

[ 18343]
Subject: [perl #19153] Term::Complete (the argument of stty)
From: OKAIE Yutaka (via RT) <perlbug-followup@perl.org>
Date: 15 Dec 2002 13:45:23 -0000
Message-Id: <rt-19153-45441.1.2145712923207@bugs6.perl.org>

[ 18344]
more on #18312: sv.c:ss_dup()

[ 18345]
more on #18344.
p4raw-link: @18345 on //depot/perl: b9609c016748169d47b94fc4dbf8db845fb4579c
p4raw-link: @18344 on //depot/perl: a1bb4754fb5094033f3cadf3932de7db09e32812
p4raw-link: @18343 on //depot/perl: 83486d4664566cb522472f736593148f56d87b63
p4raw-link: @18342 on //depot/perl: 03994de86de9fdff188863fc25636fecf2362e27
p4raw-link: @18339 on //depot/perl: 6a20eacca2c8d50cbe7b8dbb810a041242de9c84
p4raw-link: @18338 on //depot/perl: 80d6dabb1f4e81b92db68bc68e3624f20eb37717
p4raw-link: @18337 on //depot/perl: 44897049c7ce4054501bf4c45cf5cb8ee2f04dc9
p4raw-link: @18335 on //depot/perl: f800e14d03e1bfa2cf42b86e56c0183cd5875618
p4raw-link: @18334 on //depot/perl: c67773d0c9c360a2a93d7e99edf5825f76a431d3
p4raw-link: @18332 on //depot/perl: 334a36dcf47634b7e6609e44a2c4d6f2d5861219
p4raw-link: @18330 on //depot/perl: 91317f6dc6510472a47ca905c966428ddcc2e589
p4raw-link: @18328 on //depot/perl: 7cb420191309ad69a81b6ee87235753ed843b9e6
p4raw-link: @18327 on //depot/perl: 4a9d61009ab1e3df94ef4ecfcc453c9ce73010a4
p4raw-link: @18326 on //depot/perl: 87755fa7011638e8ad4f4be9619e28e676b74d12
p4raw-link: @18325 on //depot/perl: 1f59ddd9a8e20e4c4d1106263d1ad3ba2a9be2d4
p4raw-link: @18324 on //depot/perl: 522078af5f1ca8130b4cc9f209e138b0a1b57eb3
p4raw-link: @18323 on //depot/perl: 197357d06d33c170630e69c10ddc5a47bc2ed305
p4raw-link: @18317 on //depot/perl: 69c74a9cf75f986f610f13d1567297e884d75c25
p4raw-link: @18316 on //depot/perl: cd4e750ae15ad1c90d874c67a9960de086fdccf5
p4raw-link: @18315 on //depot/perl: 803b07a779c719a9176a69ed7eb5685bb9f23042
p4raw-link: @18314 on //depot/perl: 8c4b3a79c68253730d09878656b5526d4d65ef85
p4raw-link: @18313 on //depot/perl: ae2efb68622a795e5d137b8fd8181b67e74a58b9
p4raw-link: @18312 on //depot/perl: 9febdf04c602e91a389f75497c9add388bc632ec
p4raw-link: @18310 on //depot/perl: c78c2b74b534960cba26d1362c8930e3a6dfd4cb
p4raw-link: @18308 on //depot/perl: ec9edb2ec3ca34b14bf6a2fa1d8f828c8ab93fee
p4raw-link: @18306 on //depot/perl: 6a78b4db838997434df520d6d78be1e74fd2a70c
p4raw-link: @18305 on //depot/perl: 123f32c0e4e1154f54984e59e57611e93b9f359a
p4raw-link: @18304 on //depot/perl: c2bfb7b11c4dc9d76451f12c861dc02f6bc7fcb6
p4raw-link: @18300 on //depot/perl: 0412d5267fa2300f66eb4eb554e2af493b5e5b33

p4raw-id: //depot/maint-5.8/perl@18347
p4raw-branched: from //depot/perl@18322 'branch in'
lib/Net/Ping/t/410_syn_host.t
p4raw-edited: from //depot/perl@18322 'ignore' Configure (@18182..)
p4raw-integrated: from //depot/perl@18322 'copy in' jpl/JNI/JNI.xs
jpl/JNI/Makefile.PL (@12915..) os2/OS2/REXX/REXX.xs (@13183..)
os2/OS2/Process/t/os2_process.t (@14705..) lib/Term/Complete.pm
(@16424..) win32/win32iop.h (@16503..) ext/Devel/DProf/DProf.xs
(@16604..) lib/Win32.pod (@17085..) iperlsys.h win32/perlhost.h
(@17570..) ext/PerlIO/scalar/scalar.xs (@17687..) README.aix
(@17702..) ext/POSIX/POSIX.xs (@17805..) utils/h2ph.PL
(@17939..) ext/Time/HiRes/Changes ext/Time/HiRes/HiRes.pm
(@18034..) lib/Net/Ping.pm lib/Net/Ping/t/400_ping_syn.t
(@18038..) lib/Net/Ping/t/450_service.t (@18063..)
ext/PerlIO/via/via.xs (@18086..) t/run/runenv.t (@18136..)
ext/Time/HiRes/Makefile.PL (@18277..) Porting/repository.pod
(@18287..) XSUB.h (@18323..) 'edit in' os2/os2.c (@18314..)
win32/Makefile win32/makefile.mk (@18324..) win32/config.bc
win32/config.gc win32/config.vc win32/config.vc64 win32/win32.c
(@18327..) sv.c (@18344..) 'merge in' lib/fields.t (@17725..)
lib/constant.t (@17730..) Porting/Glossary win32/config_H.bc
win32/config_H.gc win32/config_H.vc win32/config_H.vc64
win32/config_sh.PL (@18030..) scope.c scope.h (@18048..)
global.sym (@18113..) pod/perlop.pod (@18184..) perl.h
(@18217..) pp_sys.c (@18262..) util.c (@18267..) regcomp.c
(@18268..) MANIFEST (@18280..) regexec.c (@18299..)
pod/perlapi.pod (@18302..) embed.h (@18307..) embed.fnc proto.h
(@18311..)
p4raw-integrated: from //depot/perl@18308 'merge in' lib/perl5db.pl
(@17291..)

58 files changed:
Configure
MANIFEST
Porting/Glossary
Porting/repository.pod
README.aix
XSUB.h
embed.fnc
embed.h
ext/Devel/DProf/DProf.xs
ext/POSIX/POSIX.xs
ext/PerlIO/scalar/scalar.xs
ext/PerlIO/via/via.xs
ext/Time/HiRes/Changes
ext/Time/HiRes/HiRes.pm
ext/Time/HiRes/Makefile.PL
global.sym
iperlsys.h
jpl/JNI/JNI.xs
jpl/JNI/Makefile.PL
lib/Net/Ping.pm
lib/Net/Ping/t/400_ping_syn.t
lib/Net/Ping/t/410_syn_host.t [new file with mode: 0644]
lib/Net/Ping/t/450_service.t
lib/Term/Complete.pm
lib/Win32.pod
lib/constant.t
lib/fields.t
lib/perl5db.pl
os2/OS2/Process/t/os2_process.t
os2/OS2/REXX/REXX.xs
os2/os2.c
perl.h
pod/perlapi.pod
pod/perlop.pod
pp_sys.c
proto.h
regcomp.c
regexec.c
scope.c
scope.h
sv.c
t/run/runenv.t
util.c
utils/h2ph.PL
win32/Makefile
win32/config.bc
win32/config.gc
win32/config.vc
win32/config.vc64
win32/config_H.bc
win32/config_H.gc
win32/config_H.vc
win32/config_H.vc64
win32/config_sh.PL
win32/makefile.mk
win32/perlhost.h
win32/win32.c
win32/win32iop.h

index c9cb6cf..5aad156 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -20,7 +20,7 @@
 
 # $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $
 #
-# Generated on Mon Dec  9 05:42:31 EET 2002 [metaconfig 3.0 PL70]
+# Generated on Mon Dec 23 09:34:08 EET 2002 [metaconfig 3.0 PL70]
 # (with additional metaconfig patches by perlbug@perl.org)
 
 cat >c1$$ <<EOF
index 6b81a10..8781b3a 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1349,6 +1349,7 @@ lib/Net/Ping/t/250_ping_hires.t   Ping Net::Ping
 lib/Net/Ping/t/300_ping_stream.t       Ping Net::Ping
 lib/Net/Ping/t/300_ping_stream.t       Ping Net::Ping
 lib/Net/Ping/t/400_ping_syn.t  Ping Net::Ping
+lib/Net/Ping/t/410_syn_host.t  Ping Net::Ping
 lib/Net/Ping/t/450_service.t   Ping Net::Ping
 lib/Net/POP3.pm                        libnet
 lib/Net/protoent.pm            By-name interface to Perl's builtin getproto*
index 9cec029..5b460eb 100644 (file)
@@ -1399,6 +1399,10 @@ d_mymalloc (mallocsrc.U):
        of the source want to take special action if MYMALLOC is used.
        This may include different sorts of profiling or error detection.
 
+d_nanosleep (d_nanosleep.U):
+       This variable conditionally defines HAS_NANOSLEEP
+       if nanosleep() is available to sleep with 1E-9 sec accuracy.
+
 d_nice (d_nice.U):
        This variable conditionally defines the HAS_NICE symbol, which
        indicates to the C program that the nice() routine is available.
@@ -2408,13 +2412,18 @@ full_sed (Loc_sed.U):
        can share this executable will have the same full pathname to
        'sed.'
 
+gccansipedantic (gccvers.U):
+       If GNU cc (gcc) is used, this variable will enable (if set) the
+       -ansi and -pedantic ccflags for building core files (through
+       cflags script). (See Porting/pumpkin.pod for full description).
+
 gccosandvers (gccvers.U):
-       If GNU cc (gcc) is used, this variable the operating system and
-       version used to compile the gcc.  It is set to '' if not gcc,
+       If GNU cc (gcc) is used, this variable holds the operating system
+       and version used to compile gcc.  It is set to '' if not gcc,
        or if nothing useful can be parsed as the os version.
 
 gccversion (gccvers.U):
-       If GNU cc (gcc) is used, this variable holds '1' or '2' to 
+       If GNU cc (gcc) is used, this variable holds '1' or '2' to
        indicate whether the compiler is version 1 or 2.  This is used in
        setting some of the default cflags.  It is set to '' if not gcc.
 
@@ -3094,6 +3103,22 @@ installstyle (installstyle.U):
        is useful if $prefix is shared by many packages, e.g. if
        $prefix=/usr/local.
 
+       Unfortunately, while this "style" variable is used to set
+       defaults for all three directory hierarchies (core, vendor, and
+       site), there is no guarantee that the same style is actually
+       appropriate for all those directories.  For example, $prefix
+       might be /opt/perl, but $siteprefix might be /usr/local.
+       (Perhaps, in retrospect, the "lib" style should never have been
+       supported, but it did seem like a nice idea at the time.)
+
+       The situation is even less clear for tools such as MakeMaker
+       that can be used to install additional modules into
+       non-standard places.  For example, if a user intends to install
+       a module into a private directory (perhaps by setting PREFIX on
+       the Makefile.PL command line), then there is no reason to
+       assume that the Configure-time $installstyle setting will be
+       relevant for that PREFIX.
+
        This may later be extended to include other information, so
        be careful with pattern-matching on the results.
 
@@ -4113,7 +4138,7 @@ spackage (package.U):
 
 spitshell (spitshell.U):
        This variable contains the command necessary to spit out a runnable
-       shell on this system.  It is either cat or a grep '-v' for # comments.
+       shell on this system.  It is either cat or a grep -v for # comments.
 
 srand48_r_proto (d_srand48_r.U):
        This variable encodes the prototype of srand48_r.
index 5f73179..9b59bba 100644 (file)
@@ -366,6 +366,9 @@ Other useful Perforce commands
 
 Note: the output of "p4 describe" is not in proper diff format, use
 the F<Porting/p4genpatch> to get a diff-compatible format.
+(Note that it may be easier to get one already prepared: grep
+L<perlhack> for APC, and append eg "/diffs/12345.gz" to one of the
+URLs to get a usable patch.)
 
     % p4 diff -se ./...     # have I modified something but forgotten
                             # to "p4 edit", easy faux pas with autogenerated
index ef8dfd1..9044bae 100644 (file)
@@ -23,8 +23,16 @@ for which you have to pay: B<xlC> and B<vac>. If you decide to use either
 of these two (which is quite a lot easier than using gcc), be sure to
 upgrade to the latest available patch level. Currently:
 
-    xlC.C     3.1.4.10 or 3.6.6.0 or 5.0.2.6
-    vac.C     4.4.0.3  or 5.0.2.4
+    xlC.C     3.1.4.10 or 3.6.6.0 or 4.0.2.2 or 5.0.2.9 or 6.0.0.3
+    vac.C     4.4.0.3  or 5.0.2.6 or 6.0.0.1
+
+note that xlC has the OS version in the name as of version 4.0.2.0, so
+you will find xlC.C for AIX-5.0 as package
+
+    xlC.aix50.rte   5.0.2.0 or 6.0.0.3
+
+subversions are not the same `latest' on all OS versions. For example,
+the latest xlC-5 on aix41 is 5.0.2.9, while on aix43, it is 5.0.2.7.
 
 Perl can be compiled with either IBM's ANSI C compiler or with gcc.
 The former is recommended, as not only can it compile Perl with no
@@ -61,7 +69,7 @@ cannot be built without bos.adt.syscalls and bos.adt.libm installed
 
     # lslpp -l | egrep "syscalls|libm"
     bos.adt.libm      5.1.0.25  COMMITTED  Base Application Development
-    bos.adt.syscalls  5.1.0.25  COMMITTED  System Calls Application
+    bos.adt.syscalls  5.1.0.36  COMMITTED  System Calls Application
     #
 
 =head2 Building Dynamic Extensions on AIX
@@ -89,9 +97,9 @@ All defaults for Configure can be used.
 
 If you've chosen to use vac 4, be sure to run 4.4.0.3. Older versions
 will turn up nasty later on. For vac 5 be sure to run at least 5.0.1.0,
-but vac 5.0.2.3 or up is highly recommended. Note that since IBM has
-removed vac 5.0.2.1 and 5.0.2.2 from the software depot, these versions
-should be considered obsolete.
+but vac 5.0.2.6 or up is highly recommended. Note that since IBM has
+removed vac 5.0.2.1 through 5.0.2.5 from the software depot, these
+versions should be considered obsolete.
 
 Here's a brief lead of how to upgrade the compiler to the latest
 level.  Of course this is subject to changes.  You can only upgrade
@@ -156,7 +164,8 @@ On AIX 4.3 using vac, we continue:
  -rw-rw-r--   1 45776101 1        13592576 Apr 16 2001  vac.C.5.0.2.0.bff
  -rw-rw-r--   1 45776101 1        14133248 Apr  9 2002  vac.C.5.0.2.3.bff
  -rw-rw-r--   1 45776101 1        14173184 May 20 2002  vac.C.5.0.2.4.bff
- # wget ftp://ftp.software.ibm.com/aix/fixes/v4/other/vac.C.5.0.2.4.bff
+ -rw-rw-r--   1 45776101 1        14192640 Nov 22 2002  vac.C.5.0.2.6.bff
+ # wget ftp://ftp.software.ibm.com/aix/fixes/v4/other/vac.C.5.0.2.6.bff
  #
 
 Likewise on all other OS levels. Then execute the following command, and
@@ -164,7 +173,7 @@ fill in its choices
 
  # smit install_update
   -> Install and Update from LATEST Available Software
-  * INPUT device / directory for software [ vac.C.5.0.2.4.bff    ]
+  * INPUT device / directory for software [ vac.C.5.0.2.6.bff    ]
   [ OK ]
   [ OK ]
 
@@ -176,9 +185,9 @@ http://www14.software.ibm.com/webapp/download/downloadaz.jsp and click
 
 =head2 Using GNU's gcc for building perl
 
-Using gcc-3.0 (tested with 3.0.4) now works out of the box, as do
-recent gcc-2.9 builds available directly from IBM as part of their Linux
-compatibility packages, available here:
+Using gcc-3.x (tested with 3.0.4, 3.1, and 3.2) now works out of the box,
+as do recent gcc-2.9 builds available directly from IBM as part of their
+Linux compatibility packages, available here:
 
   http://www.ibm.com/servers/aix/products/aixos/linux/
 
@@ -213,6 +222,6 @@ H.Merijn Brand <h.m.brand@hccnet.nl>
 
 =head1 DATE
 
-Version 0.0.5: 22 May 2002
+Version 0.0.6: 23 Dec 2002
 
 =cut
diff --git a/XSUB.h b/XSUB.h
index a2826ea..82eb423 100644 (file)
--- a/XSUB.h
+++ b/XSUB.h
@@ -382,9 +382,9 @@ C<xsubpp>.  See L<perlxs/"The VERSIONCHECK: Keyword">.
 #    define putenv             PerlEnv_putenv
 #    define getenv             PerlEnv_getenv
 #    define uname              PerlEnv_uname
-#    define stdin              PerlSIO_stdin()
-#    define stdout             PerlSIO_stdout()
-#    define stderr             PerlSIO_stderr()
+#    define stdin              PerlSIO_stdin
+#    define stdout             PerlSIO_stdout
+#    define stderr             PerlSIO_stderr
 #    define fopen              PerlIO_open
 #    define fclose             PerlIO_close
 #    define feof               PerlIO_eof
@@ -403,8 +403,8 @@ C<xsubpp>.  See L<perlxs/"The VERSIONCHECK: Keyword">.
 #    define setbuf             PerlSIO_setbuf
 #    define setvbuf            PerlSIO_setvbuf
 #    define setlinebuf         PerlSIO_setlinebuf
-#    define stdoutf            PerlIO_stdoutf
-#    define vfprintf           PerlIO_vprintf
+#    define stdoutf            PerlSIO_stdoutf
+#    define vfprintf           PerlSIO_vprintf
 #    define ftell              PerlIO_tell
 #    define fseek              PerlIO_seek
 #    define fgetpos            PerlIO_getpos
index 26ec990..ce2974f 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -639,6 +639,7 @@ Ap  |void   |save_aelem     |AV* av|I32 idx|SV **sptr
 Ap     |I32    |save_alloc     |I32 size|I32 pad
 Ap     |void   |save_aptr      |AV** aptr
 Ap     |AV*    |save_ary       |GV* gv
+Ap     |void   |save_bool      |bool* boolp
 Ap     |void   |save_clearsv   |SV** svp
 Ap     |void   |save_delete    |HV* hv|char* key|I32 klen
 Ap     |void   |save_destructor|DESTRUCTORFUNC_NOCONTEXT_t f|void* p
diff --git a/embed.h b/embed.h
index d19f40d..6cb9a2d 100644 (file)
--- a/embed.h
+++ b/embed.h
 #define save_alloc             Perl_save_alloc
 #define save_aptr              Perl_save_aptr
 #define save_ary               Perl_save_ary
+#define save_bool              Perl_save_bool
 #define save_clearsv           Perl_save_clearsv
 #define save_delete            Perl_save_delete
 #define save_destructor                Perl_save_destructor
 #define save_alloc(a,b)                Perl_save_alloc(aTHX_ a,b)
 #define save_aptr(a)           Perl_save_aptr(aTHX_ a)
 #define save_ary(a)            Perl_save_ary(aTHX_ a)
+#define save_bool(a)           Perl_save_bool(aTHX_ a)
 #define save_clearsv(a)                Perl_save_clearsv(aTHX_ a)
 #define save_delete(a,b,c)     Perl_save_delete(aTHX_ a,b,c)
 #define save_destructor(a,b)   Perl_save_destructor(aTHX_ a,b)
index 3525a27..78ea3c9 100644 (file)
@@ -84,7 +84,7 @@ typedef struct {
     U32                dprof_ticks;
     char*      out_file_name;  /* output file (defaults to tmon.out) */
     PerlIO*    fp;             /* pointer to tmon.out file */
-    long       TIMES_LOCATION; /* Where in the file to store the time totals */
+    Off_t      TIMES_LOCATION; /* Where in the file to store the time totals */
     int                SAVE_STACK;     /* How much data to buffer until end of run */
     int                prof_pid;       /* pid of profiled process */
     struct tms prof_start;
index 9a4fc02..519f741 100644 (file)
@@ -1374,11 +1374,17 @@ dup2(fd1, fd2)
        int             fd1
        int             fd2
 
-SysRetLong
+SV *
 lseek(fd, offset, whence)
        int             fd
        Off_t           offset
        int             whence
+    CODE:
+       Off_t pos = PerlLIO_lseek(fd, offset, whence);
+       RETVAL = sizeof(Off_t) > sizeof(IV)
+                ? newSVnv((NV)pos) : newSViv((IV)pos);
+    OUTPUT:
+       RETVAL
 
 SysRet
 nice(incr)
index 7bcee57..d92ef83 100644 (file)
@@ -105,10 +105,10 @@ SSize_t
 PerlIOScalar_unread(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
 {
     PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
-    char *dst = SvGROW(s->var, s->posn + count);
+    char *dst = SvGROW(s->var, (STRLEN)s->posn + count);
     Move(vbuf, dst + s->posn, count, char);
     s->posn += count;
-    SvCUR_set(s->var, s->posn);
+    SvCUR_set(s->var, (STRLEN)s->posn);
     SvPOK_on(s->var);
     return count;
 }
@@ -128,7 +128,7 @@ PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
        }
        else {
            if ((s->posn + count) > SvCUR(sv))
-               dst = SvGROW(sv, s->posn + count);
+               dst = SvGROW(sv, (STRLEN)s->posn + count);
            else
                dst = SvPV_nolen(sv);
            offset = s->posn;
@@ -136,7 +136,7 @@ PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
        }
        Move(vbuf, dst + offset, count, char);
        if ((STRLEN) s->posn > SvCUR(sv))
-           SvCUR_set(sv, s->posn);
+           SvCUR_set(sv, (STRLEN)s->posn);
        SvPOK_on(s->var);
        return count;
     }
@@ -182,7 +182,7 @@ PerlIOScalar_get_cnt(pTHX_ PerlIO * f)
     if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
        PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
        if (SvCUR(s->var) > (STRLEN) s->posn)
-           return SvCUR(s->var) - s->posn;
+           return SvCUR(s->var) - (STRLEN)s->posn;
        else
            return 0;
     }
index d454678..524d24a 100644 (file)
@@ -350,7 +350,8 @@ IV
 PerlIOVia_seek(pTHX_ PerlIO * f, Off_t offset, int whence)
 {
     PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
-    SV *offsv = sv_2mortal(newSViv(offset));
+    SV *offsv = sv_2mortal(sizeof(Off_t) > sizeof(IV)
+                          ? newSVnv((NV)offset) : newSViv((IV)offset));
     SV *whsv = sv_2mortal(newSViv(whence));
     SV *result =
        PerlIOVia_method(aTHX_ f, MYMethod(SEEK), G_SCALAR, offsv, whsv,
@@ -364,7 +365,9 @@ PerlIOVia_tell(pTHX_ PerlIO * f)
     PerlIOVia *s = PerlIOSelf(f, PerlIOVia);
     SV *result =
        PerlIOVia_method(aTHX_ f, MYMethod(TELL), G_SCALAR, Nullsv);
-    return (result) ? (Off_t) SvIV(result) : (Off_t) - 1;
+    return (result)
+          ? (SvNOK(result) ? (Off_t)SvNV(result) : (Off_t)SvIV(result))
+          : (Off_t) - 1;
 }
 
 SSize_t
index 3ba982d..2340fb5 100644 (file)
@@ -1,5 +1,8 @@
 Revision history for Perl extension Time::HiRes.
 
+1.39
+       - fix from Craig Berry for better building in VMS with PERL_CORE
+
 1.38
        - no functional changes
        - move lib/Time/HiRes.pm as Hires.pm
index 9886138..532484e 100644 (file)
@@ -15,7 +15,7 @@ require DynaLoader;
                 d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer
                 d_nanosleep);
        
-$VERSION = '1.38';
+$VERSION = '1.39';
 $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 
index afbe000..5868239 100644 (file)
@@ -83,7 +83,9 @@ sub try_compile_and_link {
        my $ccflags = $Config{'ccflags'} . ' ' . "-I$COREincdir";
        if ($^O eq 'VMS') {
            if ($ENV{PERL_CORE}) {
-                $cccmd = "$Config{'cc'} /include=([---]) $tmp.c"; 
+               # Fragile if the extensions change hierachy within
+               # the Perl core but this should do for now.
+                $cccmd = "$Config{'cc'} /include=([---]) $tmp.c";
            } else {
                my $perl_core = $Config{'installarchlib'};
                $perl_core =~ s/\]$/.CORE]/;
index 001dcd3..a0541ad 100644 (file)
@@ -379,6 +379,7 @@ Perl_save_aelem
 Perl_save_alloc
 Perl_save_aptr
 Perl_save_ary
+Perl_save_bool
 Perl_save_clearsv
 Perl_save_delete
 Perl_save_destructor
index c82ffa7..a712237 100644 (file)
@@ -598,7 +598,7 @@ typedef int         (*LPLIOAccess)(struct IPerlLIO*, const char*, int);
 typedef int            (*LPLIOChmod)(struct IPerlLIO*, const char*, int);
 typedef int            (*LPLIOChown)(struct IPerlLIO*, const char*, uid_t,
                            gid_t);
-typedef int            (*LPLIOChsize)(struct IPerlLIO*, int, long);
+typedef int            (*LPLIOChsize)(struct IPerlLIO*, int, Off_t);
 typedef int            (*LPLIOClose)(struct IPerlLIO*, int);
 typedef int            (*LPLIODup)(struct IPerlLIO*, int);
 typedef int            (*LPLIODup2)(struct IPerlLIO*, int, int);
index ea67a2e..f482695 100644 (file)
-/*\r
- * Copyright 1997, O'Reilly & Associate, Inc.\r
- *\r
- * This package may be copied under the same terms as Perl itself.\r
- */\r
-\r
-#include "EXTERN.h"\r
-#include "perl.h"\r
-#include "XSUB.h"\r
-\r
-#include <stdio.h>\r
-#include <jni.h>\r
-\r
-#ifndef PERL_VERSION\r
-#  include <patchlevel.h>\r
-#  define PERL_REVISION                5\r
-#  define PERL_VERSION         PATCHLEVEL\r
-#  define PERL_SUBVERSION      SUBVERSION\r
-#endif\r
-\r
-#if PERL_REVISION == 5 && (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION <= 75))\r
-#  define PL_na                na\r
-#  define PL_sv_no     sv_no\r
-#  define PL_sv_undef  sv_undef\r
-#  define PL_dowarn    dowarn\r
-#endif\r
-\r
-#ifndef newSVpvn\r
-#  define newSVpvn(a,b)        newSVpv(a,b)\r
-#endif\r
-\r
-#ifndef pTHX\r
-#  define pTHX         void\r
-#  define pTHX_\r
-#  define aTHX\r
-#  define aTHX_\r
-#  define dTHX         extern int JNI___notused\r
-#endif\r
-\r
-#ifndef WIN32\r
-#  include <dlfcn.h>\r
-#endif\r
-\r
-#ifdef EMBEDDEDPERL\r
-extern JNIEnv* jplcurenv;\r
-extern int jpldebug;\r
-#else\r
-JNIEnv* jplcurenv;\r
-int jpldebug = 1;\r
-#endif\r
-\r
-#define SysRet jint\r
-\r
-#ifdef WIN32\r
-static void JNICALL call_my_exit(jint status)\r
-{\r
-    my_exit(status);\r
-}\r
-#else\r
-static void call_my_exit(jint status)\r
-{\r
-    my_exit(status);\r
-}\r
-#endif\r
-\r
-jvalue*\r
-makeargs(char *sig, SV** svp, int items)\r
-{\r
-    jvalue* jv = (jvalue*)safemalloc(sizeof(jvalue) * items);\r
-    int ix = 0;\r
-    char *s = sig;\r
-    JNIEnv* env = jplcurenv;\r
-    char *start;\r
-    STRLEN n_a;\r
-\r
-    if (jpldebug)\r
-       fprintf(stderr, "sig = %s, items = %d\n", sig, items);\r
-    if (*s++ != '(')\r
-       goto cleanup;\r
-\r
-    while (items--) {\r
-       SV *sv = *svp++;\r
-       start = s;\r
-       switch (*s++) {\r
-       case 'Z':\r
-           jv[ix++].z = (jboolean)(SvIV(sv) != 0);\r
-           break;\r
-       case 'B':\r
-           jv[ix++].b = (jbyte)SvIV(sv);\r
-           break;\r
-       case 'C':\r
-           jv[ix++].c = (jchar)SvIV(sv);\r
-           break;\r
-       case 'S':\r
-           jv[ix++].s = (jshort)SvIV(sv);\r
-           break;\r
-       case 'I':\r
-           jv[ix++].i = (jint)SvIV(sv);\r
-           break;\r
-       case 'J':\r
-           jv[ix++].j = (jlong)SvNV(sv);\r
-           break;\r
-       case 'F':\r
-           jv[ix++].f = (jfloat)SvNV(sv);\r
-           break;\r
-       case 'D':\r
-           jv[ix++].d = (jdouble)SvNV(sv);\r
-           break;\r
-       case '[':\r
-           switch (*s++) {\r
-           case 'Z':\r
-               if (SvROK(sv)) {\r
-                   SV* rv = (SV*)SvRV(sv);\r
-                   if (SvOBJECT(rv))\r
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                   else if (SvTYPE(rv) == SVt_PVAV) {\r
-                       jsize len = av_len((AV*)rv) + 1;\r
-                       jboolean* buf = (jboolean*)malloc(len * sizeof(jboolean));\r
-                       int i;\r
-                       SV** esv;\r
-\r
-                       jbooleanArray ja = (*env)->NewBooleanArray(env, len);\r
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
-                           buf[i] = (jboolean)SvIV(*esv);\r
-                       (*env)->SetBooleanArrayRegion(env, ja, 0, len, buf);\r
-                       free((void*)buf);\r
-                       jv[ix++].l = (jobject)ja;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-               }\r
-               else if (SvPOK(sv)) {\r
-                   jsize len = sv_len(sv) / sizeof(jboolean);\r
-\r
-                   jbooleanArray ja = (*env)->NewBooleanArray(env, len);\r
-                   (*env)->SetBooleanArrayRegion(env, ja, 0, len, (jboolean*)SvPV(sv,n_a));\r
-                   jv[ix++].l = (jobject)ja;\r
-               }\r
-               else\r
-                   jv[ix++].l = (jobject)(void*)0;\r
-               break;\r
-           case 'B':\r
-               if (SvROK(sv)) {\r
-                   SV* rv = (SV*)SvRV(sv);\r
-                   if (SvOBJECT(rv))\r
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                   else if (SvTYPE(rv) == SVt_PVAV) {\r
-                       jsize len = av_len((AV*)rv) + 1;\r
-                       jbyte* buf = (jbyte*)malloc(len * sizeof(jbyte));\r
-                       int i;\r
-                       SV** esv;\r
-\r
-                       jbyteArray ja = (*env)->NewByteArray(env, len);\r
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
-                           buf[i] = (jbyte)SvIV(*esv);\r
-                       (*env)->SetByteArrayRegion(env, ja, 0, len, buf);\r
-                       free((void*)buf);\r
-                       jv[ix++].l = (jobject)ja;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-               }\r
-               else if (SvPOK(sv)) {\r
-                   jsize len = sv_len(sv) / sizeof(jbyte);\r
-\r
-                   jbyteArray ja = (*env)->NewByteArray(env, len);\r
-                   (*env)->SetByteArrayRegion(env, ja, 0, len, (jbyte*)SvPV(sv,n_a));\r
-                   jv[ix++].l = (jobject)ja;\r
-               }\r
-               else\r
-                   jv[ix++].l = (jobject)(void*)0;\r
-               break;\r
-           case 'C':\r
-               if (SvROK(sv)) {\r
-                   SV* rv = (SV*)SvRV(sv);\r
-                   if (SvOBJECT(rv))\r
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                   else if (SvTYPE(rv) == SVt_PVAV) {\r
-                       jsize len = av_len((AV*)rv) + 1;\r
-                       jchar* buf = (jchar*)malloc(len * sizeof(jchar));\r
-                       int i;\r
-                       SV** esv;\r
-\r
-                       jcharArray ja = (*env)->NewCharArray(env, len);\r
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
-                           buf[i] = (jchar)SvIV(*esv);\r
-                       (*env)->SetCharArrayRegion(env, ja, 0, len, buf);\r
-                       free((void*)buf);\r
-                       jv[ix++].l = (jobject)ja;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-               }\r
-               else if (SvPOK(sv)) {\r
-                   jsize len = sv_len(sv) / sizeof(jchar);\r
-\r
-                   jcharArray ja = (*env)->NewCharArray(env, len);\r
-                   (*env)->SetCharArrayRegion(env, ja, 0, len, (jchar*)SvPV(sv,n_a));\r
-                   jv[ix++].l = (jobject)ja;\r
-               }\r
-               else\r
-                   jv[ix++].l = (jobject)(void*)0;\r
-               break;\r
-           case 'S':\r
-               if (SvROK(sv)) {\r
-                   SV* rv = (SV*)SvRV(sv);\r
-                   if (SvOBJECT(rv))\r
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                   else if (SvTYPE(rv) == SVt_PVAV) {\r
-                       jsize len = av_len((AV*)rv) + 1;\r
-                       jshort* buf = (jshort*)malloc(len * sizeof(jshort));\r
-                       int i;\r
-                       SV** esv;\r
-\r
-                       jshortArray ja = (*env)->NewShortArray(env, len);\r
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
-                           buf[i] = (jshort)SvIV(*esv);\r
-                       (*env)->SetShortArrayRegion(env, ja, 0, len, buf);\r
-                       free((void*)buf);\r
-                       jv[ix++].l = (jobject)ja;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-               }\r
-               else if (SvPOK(sv)) {\r
-                   jsize len = sv_len(sv) / sizeof(jshort);\r
-\r
-                   jshortArray ja = (*env)->NewShortArray(env, len);\r
-                   (*env)->SetShortArrayRegion(env, ja, 0, len, (jshort*)SvPV(sv,n_a));\r
-                   jv[ix++].l = (jobject)ja;\r
-               }\r
-               else\r
-                   jv[ix++].l = (jobject)(void*)0;\r
-               break;\r
-           case 'I':\r
-               if (SvROK(sv)) {\r
-                   SV* rv = (SV*)SvRV(sv);\r
-                   if (SvOBJECT(rv))\r
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                   else if (SvTYPE(rv) == SVt_PVAV) {\r
-                       jsize len = av_len((AV*)rv) + 1;\r
-                       jint* buf = (jint*)malloc(len * sizeof(jint));\r
-                       int i;\r
-                       SV** esv;\r
-\r
-                       jintArray ja = (*env)->NewIntArray(env, len);\r
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
-                           buf[i] = (jint)SvIV(*esv);\r
-                       (*env)->SetIntArrayRegion(env, ja, 0, len, buf);\r
-                       free((void*)buf);\r
-                       jv[ix++].l = (jobject)ja;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-               }\r
-               else if (SvPOK(sv)) {\r
-                   jsize len = sv_len(sv) / sizeof(jint);\r
-\r
-                   jintArray ja = (*env)->NewIntArray(env, len);\r
-                   (*env)->SetIntArrayRegion(env, ja, 0, len, (jint*)SvPV(sv,n_a));\r
-                   jv[ix++].l = (jobject)ja;\r
-               }\r
-               else\r
-                   jv[ix++].l = (jobject)(void*)0;\r
-               break;\r
-           case 'J':\r
-               if (SvROK(sv)) {\r
-                   SV* rv = (SV*)SvRV(sv);\r
-                   if (SvOBJECT(rv))\r
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                   else if (SvTYPE(rv) == SVt_PVAV) {\r
-                       jsize len = av_len((AV*)rv) + 1;\r
-                       jlong* buf = (jlong*)malloc(len * sizeof(jlong));\r
-                       int i;\r
-                       SV** esv;\r
-\r
-                       jlongArray ja = (*env)->NewLongArray(env, len);\r
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
-                           buf[i] = (jlong)SvNV(*esv);\r
-                       (*env)->SetLongArrayRegion(env, ja, 0, len, buf);\r
-                       free((void*)buf);\r
-                       jv[ix++].l = (jobject)ja;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-               }\r
-               else if (SvPOK(sv)) {\r
-                   jsize len = sv_len(sv) / sizeof(jlong);\r
-\r
-                   jlongArray ja = (*env)->NewLongArray(env, len);\r
-                   (*env)->SetLongArrayRegion(env, ja, 0, len, (jlong*)SvPV(sv,n_a));\r
-                   jv[ix++].l = (jobject)ja;\r
-               }\r
-               else\r
-                   jv[ix++].l = (jobject)(void*)0;\r
-               break;\r
-           case 'F':\r
-               if (SvROK(sv)) {\r
-                   SV* rv = (SV*)SvRV(sv);\r
-                   if (SvOBJECT(rv))\r
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                   else if (SvTYPE(rv) == SVt_PVAV) {\r
-                       jsize len = av_len((AV*)rv) + 1;\r
-                       jfloat* buf = (jfloat*)malloc(len * sizeof(jfloat));\r
-                       int i;\r
-                       SV** esv;\r
-\r
-                       jfloatArray ja = (*env)->NewFloatArray(env, len);\r
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
-                           buf[i] = (jfloat)SvNV(*esv);\r
-                       (*env)->SetFloatArrayRegion(env, ja, 0, len, buf);\r
-                       free((void*)buf);\r
-                       jv[ix++].l = (jobject)ja;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-               }\r
-               else if (SvPOK(sv)) {\r
-                   jsize len = sv_len(sv) / sizeof(jfloat);\r
-\r
-                   jfloatArray ja = (*env)->NewFloatArray(env, len);\r
-                   (*env)->SetFloatArrayRegion(env, ja, 0, len, (jfloat*)SvPV(sv,n_a));\r
-                   jv[ix++].l = (jobject)ja;\r
-               }\r
-               else\r
-                   jv[ix++].l = (jobject)(void*)0;\r
-               break;\r
-           case 'D':\r
-               if (SvROK(sv)) {\r
-                   SV* rv = (SV*)SvRV(sv);\r
-                   if (SvOBJECT(rv))\r
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                   else if (SvTYPE(rv) == SVt_PVAV) {\r
-                       jsize len = av_len((AV*)rv) + 1;\r
-                       jdouble* buf = (jdouble*)malloc(len * sizeof(jdouble));\r
-                       int i;\r
-                       SV** esv;\r
-\r
-                       jdoubleArray ja = (*env)->NewDoubleArray(env, len);\r
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)\r
-                           buf[i] = (jdouble)SvNV(*esv);\r
-                       (*env)->SetDoubleArrayRegion(env, ja, 0, len, buf);\r
-                       free((void*)buf);\r
-                       jv[ix++].l = (jobject)ja;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-               }\r
-               else if (SvPOK(sv)) {\r
-                   jsize len = sv_len(sv) / sizeof(jdouble);\r
-\r
-                   jdoubleArray ja = (*env)->NewDoubleArray(env, len);\r
-                   (*env)->SetDoubleArrayRegion(env, ja, 0, len, (jdouble*)SvPV(sv,n_a));\r
-                   jv[ix++].l = (jobject)ja;\r
-               }\r
-               else\r
-                   jv[ix++].l = (jobject)(void*)0;\r
-               break;\r
-           case 'L':\r
-               while (*s != ';') s++;\r
-               s++;\r
-               if (strnEQ(start, "[Ljava/lang/String;", 19)) {\r
-                   if (SvROK(sv)) {\r
-                       SV* rv = (SV*)SvRV(sv);\r
-                       if (SvOBJECT(rv))\r
-                           jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                       else if (SvTYPE(rv) == SVt_PVAV) {\r
-                           jsize len = av_len((AV*)rv) + 1;\r
-                           int i;\r
-                           SV** esv;\r
-                           static jclass jcl = 0;\r
-                           jobjectArray ja;\r
-\r
-                           if (!jcl)\r
-                               jcl = (*env)->FindClass(env, "java/lang/String");\r
-                           ja = (*env)->NewObjectArray(env, len, jcl, 0);\r
-                           for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {\r
-                               jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));\r
-                               (*env)->SetObjectArrayElement(env, ja, i, str);\r
-                           }\r
-                           jv[ix++].l = (jobject)ja;\r
-                       }\r
-                       else\r
-                           jv[ix++].l = (jobject)(void*)0;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-                   break;\r
-               }\r
-               /* FALL THROUGH */\r
-           default:\r
-               if (SvROK(sv)) {\r
-                   SV* rv = (SV*)SvRV(sv);\r
-                   if (SvOBJECT(rv))\r
-                       jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-                   else if (SvTYPE(rv) == SVt_PVAV) {\r
-                       jsize len = av_len((AV*)rv) + 1;\r
-                       int i;\r
-                       SV** esv;\r
-                      static jclass jcl = 0;\r
-                       jobjectArray ja;\r
-\r
-                       if (!jcl)\r
-                           jcl = (*env)->FindClass(env, "java/lang/Object");\r
-                       ja = (*env)->NewObjectArray(env, len, jcl, 0);\r
-                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {\r
-                           if (SvROK(*esv) && (rv = SvRV(*esv)) && SvOBJECT(rv)) {\r
-                               (*env)->SetObjectArrayElement(env, ja, i, (jobject)(void*)SvIV(rv));\r
-                           }\r
-                           else {\r
-                               jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));\r
-                               (*env)->SetObjectArrayElement(env, ja, i, str);\r
-                           }\r
-                       }\r
-                       jv[ix++].l = (jobject)ja;\r
-                   }\r
-                   else\r
-                       jv[ix++].l = (jobject)(void*)0;\r
-               }\r
-               else\r
-                   jv[ix++].l = (jobject)(void*)0;\r
-               break;\r
-           }\r
-           break;\r
-       case 'L':\r
-           if (!SvROK(sv) || strnEQ(s, "java/lang/String;", 17)) {\r
-               s += 17;\r
-               jv[ix++].l = (jobject)(*env)->NewStringUTF(env, (char*) SvPV(sv,n_a));\r
-               break;\r
-           }\r
-           while (*s != ';') s++;\r
-           s++;\r
-           if (SvROK(sv)) {\r
-               SV* rv = SvRV(sv);\r
-               jv[ix++].l = (jobject)(void*)SvIV(rv);\r
-           }\r
-           break;\r
-       case ')':\r
-           croak("too many arguments, signature: %s", sig);\r
-           goto cleanup;\r
-       default:\r
-           croak("panic: malformed signature: %s", s-1);\r
-           goto cleanup;\r
-       }\r
-\r
-    }\r
-    if (*s != ')') {\r
-       croak("not enough arguments, signature: %s", sig);\r
-       goto cleanup;\r
-    }\r
-    return jv;\r
-\r
-cleanup:\r
-    safefree((char*)jv);\r
-    return 0;\r
-}\r
-\r
-static int\r
-not_here(char *s)\r
-{\r
-    croak("%s not implemented on this architecture", s);\r
-    return -1;\r
-}\r
-\r
-static double\r
-constant(char *name, int arg)\r
-{\r
-    errno = 0;\r
-    switch (*name) {\r
-    case 'A':\r
-       break;\r
-    case 'B':\r
-       break;\r
-    case 'C':\r
-       break;\r
-    case 'D':\r
-       break;\r
-    case 'E':\r
-       break;\r
-    case 'F':\r
-       break;\r
-    case 'G':\r
-       break;\r
-    case 'H':\r
-       break;\r
-    case 'I':\r
-       break;\r
-    case 'J':\r
-       if (strEQ(name, "JNI_ABORT"))\r
-#ifdef JNI_ABORT\r
-           return JNI_ABORT;\r
-#else\r
-           goto not_there;\r
-#endif\r
-       if (strEQ(name, "JNI_COMMIT"))\r
-#ifdef JNI_COMMIT\r
-           return JNI_COMMIT;\r
-#else\r
-           goto not_there;\r
-#endif\r
-       if (strEQ(name, "JNI_ERR"))\r
-#ifdef JNI_ERR\r
-           return JNI_ERR;\r
-#else\r
-           goto not_there;\r
-#endif\r
-       if (strEQ(name, "JNI_FALSE"))\r
-#ifdef JNI_FALSE\r
-           return JNI_FALSE;\r
-#else\r
-           goto not_there;\r
-#endif\r
-       if (strEQ(name, "JNI_H"))\r
-#ifdef JNI_H\r
-#ifdef WIN32\r
-           return 1;\r
-#else\r
-           return JNI_H;\r
-#endif\r
-#else\r
-           goto not_there;\r
-#endif\r
-       if (strEQ(name, "JNI_OK"))\r
-#ifdef JNI_OK\r
-           return JNI_OK;\r
-#else\r
-           goto not_there;\r
-#endif\r
-       if (strEQ(name, "JNI_TRUE"))\r
-#ifdef JNI_TRUE\r
-           return JNI_TRUE;\r
-#else\r
-           goto not_there;\r
-#endif\r
-       break;\r
-    case 'K':\r
-       break;\r
-    case 'L':\r
-       break;\r
-    case 'M':\r
-       break;\r
-    case 'N':\r
-       break;\r
-    case 'O':\r
-       break;\r
-    case 'P':\r
-       break;\r
-    case 'Q':\r
-       break;\r
-    case 'R':\r
-       break;\r
-    case 'S':\r
-       break;\r
-    case 'T':\r
-       break;\r
-    case 'U':\r
-       break;\r
-    case 'V':\r
-       break;\r
-    case 'W':\r
-       break;\r
-    case 'X':\r
-       break;\r
-    case 'Y':\r
-       break;\r
-    case 'Z':\r
-       break;\r
-    }\r
-    errno = EINVAL;\r
-    return 0;\r
-\r
-not_there:\r
-    errno = ENOENT;\r
-    return 0;\r
-}\r
-\r
-#define FETCHENV jplcurenv\r
-#define RESTOREENV jplcurenv = env\r
-\r
-MODULE = JNI           PACKAGE = JNI           \r
-\r
-PROTOTYPES: ENABLE\r
-\r
-double\r
-constant(name,arg)\r
-       char *          name\r
-       int             arg\r
-\r
-jint\r
-GetVersion()\r
-       JNIEnv *                env = FETCHENV;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetVersion(env);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jclass\r
-DefineClass(name, loader, buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jsize                   buf_len_ = NO_INIT;\r
-       const char *            name\r
-       jobject                 loader\r
-       const jbyte *           buf\r
-    CODE:\r
-       {\r
-#ifdef KAFFE\r
-           RETVAL = (*env)->DefineClass(env,  loader, buf, (jsize)buf_len_);\r
-#else\r
-           RETVAL = (*env)->DefineClass(env,  name, loader, buf, (jsize)buf_len_); \r
-#endif\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jclass\r
-FindClass(name)\r
-       JNIEnv *                env = FETCHENV;\r
-       const char *            name\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->FindClass(env,  name);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jclass\r
-GetSuperclass(sub)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  sub\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetSuperclass(env,  sub);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-IsAssignableFrom(sub, sup)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  sub\r
-       jclass                  sup\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->IsAssignableFrom(env,  sub, sup);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-SysRet\r
-Throw(obj)\r
-       JNIEnv *                env = FETCHENV;\r
-       jthrowable              obj\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->Throw(env,  obj);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL    \r
-\r
-SysRet\r
-ThrowNew(clazz, msg)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       const char *            msg\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->ThrowNew(env,  clazz, msg);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jthrowable\r
-ExceptionOccurred()\r
-       JNIEnv *                env = FETCHENV;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->ExceptionOccurred(env);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-void\r
-ExceptionDescribe()\r
-       JNIEnv *                env = FETCHENV;\r
-    CODE:\r
-       {\r
-           (*env)->ExceptionDescribe(env);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-ExceptionClear()\r
-       JNIEnv *                env = FETCHENV;\r
-    CODE:\r
-       {\r
-           (*env)->ExceptionClear(env);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-FatalError(msg)\r
-       JNIEnv *                env = FETCHENV;\r
-       const char *            msg\r
-    CODE:\r
-       {\r
-           (*env)->FatalError(env,  msg);\r
-           RESTOREENV;\r
-       }\r
-\r
-jobject\r
-NewGlobalRef(lobj)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 lobj\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewGlobalRef(env, lobj);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-void\r
-DeleteGlobalRef(gref)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 gref\r
-    CODE:\r
-       {\r
-           (*env)->DeleteGlobalRef(env, gref);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-DeleteLocalRef(obj)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-    CODE:\r
-       {\r
-           (*env)->DeleteLocalRef(env,  obj);\r
-           RESTOREENV;\r
-       }\r
-\r
-jboolean\r
-IsSameObject(obj1,obj2)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj1\r
-       jobject                 obj2\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->IsSameObject(env, obj1,obj2);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-AllocObject(clazz)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->AllocObject(env, clazz);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-NewObject(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-NewObjectA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jclass\r
-GetObjectClass(obj)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetObjectClass(env, obj);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-IsInstanceOf(obj,clazz)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->IsInstanceOf(env, obj,clazz);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jmethodID\r
-GetMethodID(clazz,name,sig)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       const char *            name\r
-       const char *            sig\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetMethodID(env, clazz,name,sig);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-CallObjectMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-CallObjectMethodA(obj,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-CallBooleanMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-CallBooleanMethodA(obj,methodID, args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID, args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jbyte\r
-CallByteMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jbyte\r
-CallByteMethodA(obj,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jchar\r
-CallCharMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jchar\r
-CallCharMethodA(obj,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jshort\r
-CallShortMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jshort\r
-CallShortMethodA(obj,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jint\r
-CallIntMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jint\r
-CallIntMethodA(obj,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jlong\r
-CallLongMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jlong\r
-CallLongMethodA(obj,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jfloat\r
-CallFloatMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jfloat\r
-CallFloatMethodA(obj,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jdouble\r
-CallDoubleMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jdouble\r
-CallDoubleMethodA(obj,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-void\r
-CallVoidMethod(obj,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           (*env)->CallVoidMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-CallVoidMethodA(obj,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           (*env)->CallVoidMethodA(env, obj,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-\r
-jobject\r
-CallNonvirtualObjectMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-CallNonvirtualObjectMethodA(obj,clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-CallNonvirtualBooleanMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-CallNonvirtualBooleanMethodA(obj,clazz,methodID, args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID, args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jbyte\r
-CallNonvirtualByteMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jbyte\r
-CallNonvirtualByteMethodA(obj,clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jchar\r
-CallNonvirtualCharMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jchar\r
-CallNonvirtualCharMethodA(obj,clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jshort\r
-CallNonvirtualShortMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jshort\r
-CallNonvirtualShortMethodA(obj,clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jint\r
-CallNonvirtualIntMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jint\r
-CallNonvirtualIntMethodA(obj,clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jlong\r
-CallNonvirtualLongMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jlong\r
-CallNonvirtualLongMethodA(obj,clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jfloat\r
-CallNonvirtualFloatMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jfloat\r
-CallNonvirtualFloatMethodA(obj,clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jdouble\r
-CallNonvirtualDoubleMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jdouble\r
-CallNonvirtualDoubleMethodA(obj,clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-void\r
-CallNonvirtualVoidMethod(obj,clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-CallNonvirtualVoidMethodA(obj,clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-\r
-jfieldID\r
-GetFieldID(clazz,name,sig)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       const char *            name\r
-       const char *            sig\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetFieldID(env, clazz,name,sig);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-GetObjectField(obj,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetObjectField(env, obj,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-GetBooleanField(obj,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetBooleanField(env, obj,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jbyte\r
-GetByteField(obj,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetByteField(env, obj,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jchar\r
-GetCharField(obj,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetCharField(env, obj,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jshort\r
-GetShortField(obj,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetShortField(env, obj,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jint\r
-GetIntField(obj,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetIntField(env, obj,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jlong\r
-GetLongField(obj,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetLongField(env, obj,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jfloat\r
-GetFloatField(obj,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetFloatField(env, obj,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jdouble\r
-GetDoubleField(obj,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetDoubleField(env, obj,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-void\r
-SetObjectField(obj,fieldID,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jobject                 val\r
-    CODE:\r
-       {\r
-           (*env)->SetObjectField(env, obj,fieldID,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetBooleanField(obj,fieldID,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jboolean                val\r
-    CODE:\r
-       {\r
-           (*env)->SetBooleanField(env, obj,fieldID,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetByteField(obj,fieldID,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jbyte                   val\r
-    CODE:\r
-       {\r
-           (*env)->SetByteField(env, obj,fieldID,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetCharField(obj,fieldID,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jchar                   val\r
-    CODE:\r
-       {\r
-           (*env)->SetCharField(env, obj,fieldID,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetShortField(obj,fieldID,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jshort                  val\r
-    CODE:\r
-       {\r
-           (*env)->SetShortField(env, obj,fieldID,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetIntField(obj,fieldID,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jint                    val\r
-    CODE:\r
-       {\r
-           (*env)->SetIntField(env, obj,fieldID,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetLongField(obj,fieldID,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jlong                   val\r
-    CODE:\r
-       {\r
-           (*env)->SetLongField(env, obj,fieldID,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetFloatField(obj,fieldID,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jfloat                  val\r
-    CODE:\r
-       {\r
-           (*env)->SetFloatField(env, obj,fieldID,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetDoubleField(obj,fieldID,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jdouble                 val\r
-    CODE:\r
-       {\r
-           (*env)->SetDoubleField(env, obj,fieldID,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-jmethodID\r
-GetStaticMethodID(clazz,name,sig)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       const char *            name\r
-       const char *            sig\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticMethodID(env, clazz,name,sig);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-CallStaticObjectMethod(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-CallStaticObjectMethodA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-CallStaticBooleanMethod(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-CallStaticBooleanMethodA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jbyte\r
-CallStaticByteMethod(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jbyte\r
-CallStaticByteMethodA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jchar\r
-CallStaticCharMethod(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jchar\r
-CallStaticCharMethodA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jshort\r
-CallStaticShortMethod(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jshort\r
-CallStaticShortMethodA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jint\r
-CallStaticIntMethod(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jint\r
-CallStaticIntMethodA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jlong\r
-CallStaticLongMethod(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jlong\r
-CallStaticLongMethodA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jfloat\r
-CallStaticFloatMethod(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jfloat\r
-CallStaticFloatMethodA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jdouble\r
-CallStaticDoubleMethod(clazz,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jdouble\r
-CallStaticDoubleMethodA(clazz,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-void\r
-CallStaticVoidMethod(cls,methodID,...)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  cls\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       int                     argoff = $min_args;\r
-    CODE:\r
-       {\r
-           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);\r
-           (*env)->CallStaticVoidMethodA(env, cls,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-CallStaticVoidMethodA(cls,methodID,args)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  cls\r
-       jmethodID               methodID\r
-       char *                  sig = 0;\r
-       jvalue *                args\r
-    CODE:\r
-       {\r
-           (*env)->CallStaticVoidMethodA(env, cls,methodID,args);\r
-           RESTOREENV;\r
-       }\r
-\r
-jfieldID\r
-GetStaticFieldID(clazz,name,sig)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       const char *            name\r
-       const char *            sig\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticFieldID(env, clazz,name,sig);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-GetStaticObjectField(clazz,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticObjectField(env, clazz,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean\r
-GetStaticBooleanField(clazz,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticBooleanField(env, clazz,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jbyte\r
-GetStaticByteField(clazz,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticByteField(env, clazz,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jchar\r
-GetStaticCharField(clazz,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticCharField(env, clazz,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jshort\r
-GetStaticShortField(clazz,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticShortField(env, clazz,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jint\r
-GetStaticIntField(clazz,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticIntField(env, clazz,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jlong\r
-GetStaticLongField(clazz,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticLongField(env, clazz,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jfloat\r
-GetStaticFloatField(clazz,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticFloatField(env, clazz,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jdouble\r
-GetStaticDoubleField(clazz,fieldID)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStaticDoubleField(env, clazz,fieldID);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-void\r
-SetStaticObjectField(clazz,fieldID,value)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jobject                 value\r
-    CODE:\r
-       {\r
-         (*env)->SetStaticObjectField(env, clazz,fieldID,value);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetStaticBooleanField(clazz,fieldID,value)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jboolean                value\r
-    CODE:\r
-       {\r
-         (*env)->SetStaticBooleanField(env, clazz,fieldID,value);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetStaticByteField(clazz,fieldID,value)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jbyte                   value\r
-    CODE:\r
-       {\r
-         (*env)->SetStaticByteField(env, clazz,fieldID,value);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetStaticCharField(clazz,fieldID,value)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jchar                   value\r
-    CODE:\r
-       {\r
-         (*env)->SetStaticCharField(env, clazz,fieldID,value);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetStaticShortField(clazz,fieldID,value)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jshort                  value\r
-    CODE:\r
-       {\r
-         (*env)->SetStaticShortField(env, clazz,fieldID,value);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetStaticIntField(clazz,fieldID,value)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jint                    value\r
-    CODE:\r
-       {\r
-         (*env)->SetStaticIntField(env, clazz,fieldID,value);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetStaticLongField(clazz,fieldID,value)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jlong                   value\r
-    CODE:\r
-       {\r
-         (*env)->SetStaticLongField(env, clazz,fieldID,value);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetStaticFloatField(clazz,fieldID,value)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jfloat                  value\r
-    CODE:\r
-       {\r
-         (*env)->SetStaticFloatField(env, clazz,fieldID,value);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetStaticDoubleField(clazz,fieldID,value)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       jfieldID                fieldID\r
-       char *                  sig = 0;\r
-       jdouble                 value\r
-    CODE:\r
-       {\r
-         (*env)->SetStaticDoubleField(env, clazz,fieldID,value);\r
-           RESTOREENV;\r
-       }\r
-\r
-jstring\r
-NewString(unicode)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jsize                   unicode_len_ = NO_INIT;\r
-       const jchar *           unicode\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewString(env, unicode, unicode_len_);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jsize\r
-GetStringLength(str)\r
-       JNIEnv *                env = FETCHENV;\r
-       jstring                 str\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStringLength(env, str);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-const jchar *\r
-GetStringChars(str)\r
-       JNIEnv *                env = FETCHENV;\r
-       jstring                 str\r
-       jboolean                isCopy = NO_INIT;\r
-       jsize                   RETVAL_len_ = NO_INIT;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStringChars(env, str,&isCopy);\r
-           RETVAL_len_ = (*env)->GetStringLength(env, str);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-    CLEANUP:\r
-           (*env)->ReleaseStringChars(env, str,RETVAL);\r
-\r
-jstring\r
-NewStringUTF(utf)\r
-       JNIEnv *                env = FETCHENV;\r
-       const char *            utf\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewStringUTF(env, utf);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jsize\r
-GetStringUTFLength(str)\r
-       JNIEnv *                env = FETCHENV;\r
-       jstring                 str\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStringUTFLength(env, str);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-const char *\r
-GetStringUTFChars(str)\r
-       JNIEnv *                env = FETCHENV;\r
-       jstring                 str\r
-       jboolean                isCopy = NO_INIT;\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetStringUTFChars(env, str,&isCopy);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-    CLEANUP:\r
-       (*env)->ReleaseStringUTFChars(env, str, RETVAL);\r
-\r
-\r
-jsize\r
-GetArrayLength(array)\r
-       JNIEnv *                env = FETCHENV;\r
-       jarray                  array\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetArrayLength(env, array);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobjectArray\r
-NewObjectArray(len,clazz,init)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   len\r
-       jclass                  clazz\r
-       jobject                 init\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewObjectArray(env, len,clazz,init);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jobject\r
-GetObjectArrayElement(array,index)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobjectArray            array\r
-       jsize                   index\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->GetObjectArrayElement(env, array,index);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-void\r
-SetObjectArrayElement(array,index,val)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobjectArray            array\r
-       jsize                   index\r
-       jobject                 val\r
-    CODE:\r
-       {\r
-           (*env)->SetObjectArrayElement(env, array,index,val);\r
-           RESTOREENV;\r
-       }\r
-\r
-jbooleanArray\r
-NewBooleanArray(len)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   len\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewBooleanArray(env, len);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jbyteArray\r
-NewByteArray(len)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   len\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewByteArray(env, len);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jcharArray\r
-NewCharArray(len)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   len\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewCharArray(env, len);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jshortArray\r
-NewShortArray(len)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   len\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewShortArray(env, len);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jintArray\r
-NewIntArray(len)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   len\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewIntArray(env, len);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jlongArray\r
-NewLongArray(len)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   len\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewLongArray(env, len);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jfloatArray\r
-NewFloatArray(len)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   len\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewFloatArray(env, len);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jdoubleArray\r
-NewDoubleArray(len)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   len\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->NewDoubleArray(env, len);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-jboolean *\r
-GetBooleanArrayElements(array)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   RETVAL_len_ = NO_INIT;\r
-       jbooleanArray           array\r
-       jboolean                isCopy = NO_INIT;\r
-    PPCODE:\r
-       {\r
-           RETVAL = (*env)->GetBooleanArrayElements(env, array,&isCopy);\r
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
-           if (GIMME == G_ARRAY) {\r
-               int i;\r
-               jboolean* r = RETVAL;\r
-               EXTEND(sp, RETVAL_len_);\r
-               for (i = RETVAL_len_; i; --i) {\r
-                   PUSHs(sv_2mortal(newSViv(*r++)));\r
-               }\r
-           }\r
-           else {\r
-               if (RETVAL_len_) {\r
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
-                       (STRLEN)RETVAL_len_ * sizeof(jboolean))));\r
-               }\r
-               else\r
-                   PUSHs(&PL_sv_no);\r
-           }\r
-           (*env)->ReleaseBooleanArrayElements(env, array,RETVAL,JNI_ABORT);\r
-           RESTOREENV;\r
-       }\r
-\r
-jbyte *\r
-GetByteArrayElements(array)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   RETVAL_len_ = NO_INIT;\r
-       jbyteArray              array\r
-       jboolean                isCopy = NO_INIT;\r
-    PPCODE:\r
-       {\r
-           RETVAL = (*env)->GetByteArrayElements(env, array,&isCopy);\r
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
-           if (GIMME == G_ARRAY) {\r
-               int i;\r
-               jbyte* r = RETVAL;\r
-               EXTEND(sp, RETVAL_len_);\r
-               for (i = RETVAL_len_; i; --i) {\r
-                   PUSHs(sv_2mortal(newSViv(*r++)));\r
-               }\r
-           }\r
-           else {\r
-               if (RETVAL_len_) {\r
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
-                       (STRLEN)RETVAL_len_ * sizeof(jbyte))));\r
-               }\r
-               else\r
-                   PUSHs(&PL_sv_no);\r
-           }\r
-           (*env)->ReleaseByteArrayElements(env, array,RETVAL,JNI_ABORT);\r
-           RESTOREENV;\r
-       }\r
-\r
-jchar *\r
-GetCharArrayElements(array)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   RETVAL_len_ = NO_INIT;\r
-       jcharArray              array\r
-       jboolean                isCopy = NO_INIT;\r
-    PPCODE:\r
-       {\r
-           RETVAL = (*env)->GetCharArrayElements(env, array,&isCopy);\r
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
-           if (GIMME == G_ARRAY) {\r
-               int i;\r
-               jchar* r = RETVAL;\r
-               EXTEND(sp, RETVAL_len_);\r
-               for (i = RETVAL_len_; i; --i) {\r
-                   PUSHs(sv_2mortal(newSViv(*r++)));\r
-               }\r
-           }\r
-           else {\r
-               if (RETVAL_len_) {\r
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
-                       (STRLEN)RETVAL_len_ * sizeof(jchar))));\r
-               }\r
-               else\r
-                   PUSHs(&PL_sv_no);\r
-           }\r
-           (*env)->ReleaseCharArrayElements(env, array,RETVAL,JNI_ABORT);\r
-           RESTOREENV;\r
-       }\r
-\r
-jshort *\r
-GetShortArrayElements(array)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   RETVAL_len_ = NO_INIT;\r
-       jshortArray             array\r
-       jboolean                isCopy = NO_INIT;\r
-    PPCODE:\r
-       {\r
-           RETVAL = (*env)->GetShortArrayElements(env, array,&isCopy);\r
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
-           if (GIMME == G_ARRAY) {\r
-               int i;\r
-               jshort* r = RETVAL;\r
-               EXTEND(sp, RETVAL_len_);\r
-               for (i = RETVAL_len_; i; --i) {\r
-                   PUSHs(sv_2mortal(newSViv(*r++)));\r
-               }\r
-           }\r
-           else {\r
-               if (RETVAL_len_) {\r
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
-                       (STRLEN)RETVAL_len_ * sizeof(jshort))));\r
-               }\r
-               else\r
-                   PUSHs(&PL_sv_no);\r
-           }\r
-           (*env)->ReleaseShortArrayElements(env, array,RETVAL,JNI_ABORT);\r
-           RESTOREENV;\r
-       }\r
-\r
-jint *\r
-GetIntArrayElements(array)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   RETVAL_len_ = NO_INIT;\r
-       jintArray               array\r
-       jboolean                isCopy = NO_INIT;\r
-    PPCODE:\r
-       {\r
-           RETVAL = (*env)->GetIntArrayElements(env, array,&isCopy);\r
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
-           if (GIMME == G_ARRAY) {\r
-               int i;\r
-               jint* r = RETVAL;\r
-               EXTEND(sp, RETVAL_len_);\r
-               for (i = RETVAL_len_; i; --i) {\r
-                   PUSHs(sv_2mortal(newSViv(*r++)));\r
-               }\r
-           }\r
-           else {\r
-               if (RETVAL_len_) {\r
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
-                       (STRLEN)RETVAL_len_ * sizeof(jint))));\r
-               }\r
-               else\r
-                   PUSHs(&PL_sv_no);\r
-           }\r
-           (*env)->ReleaseIntArrayElements(env, array,RETVAL,JNI_ABORT);\r
-           RESTOREENV;\r
-       }\r
-\r
-jlong *\r
-GetLongArrayElements(array)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   RETVAL_len_ = NO_INIT;\r
-       jlongArray              array\r
-       jboolean                isCopy = NO_INIT;\r
-    PPCODE:\r
-       {\r
-           RETVAL = (*env)->GetLongArrayElements(env, array,&isCopy);\r
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
-           if (GIMME == G_ARRAY) {\r
-               int i;\r
-               jlong* r = RETVAL;\r
-               EXTEND(sp, RETVAL_len_);\r
-               for (i = RETVAL_len_; i; --i) {\r
-                   PUSHs(sv_2mortal(newSViv(*r++)));\r
-               }\r
-           }\r
-           else {\r
-               if (RETVAL_len_) {\r
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
-                       (STRLEN)RETVAL_len_ * sizeof(jlong))));\r
-               }\r
-               else\r
-                   PUSHs(&PL_sv_no);\r
-           }\r
-           (*env)->ReleaseLongArrayElements(env, array,RETVAL,JNI_ABORT);\r
-           RESTOREENV;\r
-       }\r
-\r
-jfloat *\r
-GetFloatArrayElements(array)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   RETVAL_len_ = NO_INIT;\r
-       jfloatArray             array\r
-       jboolean                isCopy = NO_INIT;\r
-    PPCODE:\r
-       {\r
-           RETVAL = (*env)->GetFloatArrayElements(env, array,&isCopy);\r
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
-           if (GIMME == G_ARRAY) {\r
-               int i;\r
-               jfloat* r = RETVAL;\r
-               EXTEND(sp, RETVAL_len_);\r
-               for (i = RETVAL_len_; i; --i) {\r
-                   PUSHs(sv_2mortal(newSVnv(*r++)));\r
-               }\r
-           }\r
-           else {\r
-               if (RETVAL_len_) {\r
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
-                       (STRLEN)RETVAL_len_ * sizeof(jfloat))));\r
-               }\r
-               else\r
-                   PUSHs(&PL_sv_no);\r
-           }\r
-           (*env)->ReleaseFloatArrayElements(env, array,RETVAL,JNI_ABORT);\r
-           RESTOREENV;\r
-       }\r
-\r
-jdouble *\r
-GetDoubleArrayElements(array)\r
-       JNIEnv *                env = FETCHENV;\r
-       jsize                   RETVAL_len_ = NO_INIT;\r
-       jdoubleArray            array\r
-       jboolean                isCopy = NO_INIT;\r
-    PPCODE:\r
-       {\r
-           RETVAL = (*env)->GetDoubleArrayElements(env, array,&isCopy);\r
-           RETVAL_len_ = (*env)->GetArrayLength(env, array);\r
-           if (GIMME == G_ARRAY) {\r
-               int i;\r
-               jdouble* r = RETVAL;\r
-               EXTEND(sp, RETVAL_len_);\r
-               for (i = RETVAL_len_; i; --i) {\r
-                   PUSHs(sv_2mortal(newSVnv(*r++)));\r
-               }\r
-           }\r
-           else {\r
-               if (RETVAL_len_) {\r
-                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,\r
-                       (STRLEN)RETVAL_len_ * sizeof(jdouble))));\r
-               }\r
-               else\r
-                   PUSHs(&PL_sv_no);\r
-           }\r
-           (*env)->ReleaseDoubleArrayElements(env, array,RETVAL,JNI_ABORT);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-GetBooleanArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       jbooleanArray           array\r
-       jsize                   start\r
-       jsize                   len\r
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
-       jboolean *              buf = (jboolean*)sv_grow(ST(3),len * sizeof(jboolean)+1);\r
-    CODE:\r
-       {\r
-           (*env)->GetBooleanArrayRegion(env, array,start,len,buf);\r
-           SvCUR_set(ST(3), len * sizeof(jboolean));\r
-           *SvEND(ST(3)) = '\0';\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-GetByteArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       jbyteArray              array\r
-       jsize                   start\r
-       jsize                   len\r
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
-       jbyte *                 buf = (jbyte*)sv_grow(ST(3),len * sizeof(jbyte)+1);\r
-    CODE:\r
-       {\r
-           (*env)->GetByteArrayRegion(env, array,start,len,buf);\r
-           SvCUR_set(ST(3), len * sizeof(jbyte));\r
-           *SvEND(ST(3)) = '\0';\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-GetCharArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       jcharArray              array\r
-       jsize                   start\r
-       jsize                   len\r
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
-       jchar *                 buf = (jchar*)sv_grow(ST(3),len * sizeof(jchar)+1);\r
-    CODE:\r
-       {\r
-           (*env)->GetCharArrayRegion(env, array,start,len,buf);\r
-           SvCUR_set(ST(3), len * sizeof(jchar));\r
-           *SvEND(ST(3)) = '\0';\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-GetShortArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       jshortArray             array\r
-       jsize                   start\r
-       jsize                   len\r
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
-       jshort *                buf = (jshort*)sv_grow(ST(3),len * sizeof(jshort)+1);\r
-    CODE:\r
-       {\r
-           (*env)->GetShortArrayRegion(env, array,start,len,buf);\r
-           SvCUR_set(ST(3), len * sizeof(jshort));\r
-           *SvEND(ST(3)) = '\0';\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-GetIntArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       jintArray               array\r
-       jsize                   start\r
-       jsize                   len\r
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
-       jint *                  buf = (jint*)sv_grow(ST(3),len * sizeof(jint)+1);\r
-    CODE:\r
-       {\r
-           (*env)->GetIntArrayRegion(env, array,start,len,buf);\r
-           SvCUR_set(ST(3), len * sizeof(jint));\r
-           *SvEND(ST(3)) = '\0';\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-GetLongArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       jlongArray              array\r
-       jsize                   start\r
-       jsize                   len\r
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
-       jlong *                 buf = (jlong*)sv_grow(ST(3),len * sizeof(jlong)+1);\r
-    CODE:\r
-       {\r
-           (*env)->GetLongArrayRegion(env, array,start,len,buf);\r
-           SvCUR_set(ST(3), len * sizeof(jlong));\r
-           *SvEND(ST(3)) = '\0';\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-GetFloatArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       jfloatArray             array\r
-       jsize                   start\r
-       jsize                   len\r
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
-       jfloat *                buf = (jfloat*)sv_grow(ST(3),len * sizeof(jfloat)+1);\r
-    CODE:\r
-       {\r
-           (*env)->GetFloatArrayRegion(env, array,start,len,buf);\r
-           SvCUR_set(ST(3), len * sizeof(jfloat));\r
-           *SvEND(ST(3)) = '\0';\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-GetDoubleArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       jdoubleArray            array\r
-       jsize                   start\r
-       jsize                   len\r
-       STRLEN                  tmplen = len * sizeof(jboolean) + 1;\r
-       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);\r
-       jdouble *               buf = (jdouble*)sv_grow(ST(3),len * sizeof(jdouble)+1);\r
-    CODE:\r
-       {\r
-           (*env)->GetDoubleArrayRegion(env, array,start,len,buf);\r
-           SvCUR_set(ST(3), len * sizeof(jdouble));\r
-           *SvEND(ST(3)) = '\0';\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetBooleanArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jbooleanArray           array\r
-       jsize                   start\r
-       jsize                   len\r
-       jsize                   buf_len_ = NO_INIT;\r
-       jboolean *              buf\r
-    CODE:\r
-       {\r
-           if (buf_len_ < len)\r
-               croak("string is too short");\r
-           else if (buf_len_ > len && PL_dowarn)\r
-               warn("string is too long");\r
-           (*env)->SetBooleanArrayRegion(env, array,start,len,buf);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetByteArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jbyteArray              array\r
-       jsize                   start\r
-       jsize                   len\r
-       jsize                   buf_len_ = NO_INIT;\r
-       jbyte *                 buf\r
-    CODE:\r
-       {\r
-           if (buf_len_ < len)\r
-               croak("string is too short");\r
-           else if (buf_len_ > len && PL_dowarn)\r
-               warn("string is too long");\r
-           (*env)->SetByteArrayRegion(env, array,start,len,buf);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetCharArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jcharArray              array\r
-       jsize                   start\r
-       jsize                   len\r
-       jsize                   buf_len_ = NO_INIT;\r
-       jchar *                 buf\r
-    CODE:\r
-       {\r
-           if (buf_len_ < len)\r
-               croak("string is too short");\r
-           else if (buf_len_ > len && PL_dowarn)\r
-               warn("string is too long");\r
-           (*env)->SetCharArrayRegion(env, array,start,len,buf);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetShortArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jshortArray             array\r
-       jsize                   start\r
-       jsize                   len\r
-       jsize                   buf_len_ = NO_INIT;\r
-       jshort *                buf\r
-    CODE:\r
-       {\r
-           if (buf_len_ < len)\r
-               croak("string is too short");\r
-           else if (buf_len_ > len && PL_dowarn)\r
-               warn("string is too long");\r
-           (*env)->SetShortArrayRegion(env, array,start,len,buf);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetIntArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jintArray               array\r
-       jsize                   start\r
-       jsize                   len\r
-       jsize                   buf_len_ = NO_INIT;\r
-       jint *                  buf\r
-    CODE:\r
-       {\r
-           if (buf_len_ < len)\r
-               croak("string is too short");\r
-           else if (buf_len_ > len && PL_dowarn)\r
-               warn("string is too long");\r
-           (*env)->SetIntArrayRegion(env, array,start,len,buf);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetLongArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jlongArray              array\r
-       jsize                   start\r
-       jsize                   len\r
-       jsize                   buf_len_ = NO_INIT;\r
-       jlong *                 buf\r
-    CODE:\r
-       {\r
-           if (buf_len_ < len)\r
-               croak("string is too short");\r
-           else if (buf_len_ > len && PL_dowarn)\r
-               warn("string is too long");\r
-           (*env)->SetLongArrayRegion(env, array,start,len,buf);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetFloatArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jfloatArray             array\r
-       jsize                   start\r
-       jsize                   len\r
-       jsize                   buf_len_ = NO_INIT;\r
-       jfloat *                buf\r
-    CODE:\r
-       {\r
-           if (buf_len_ < len)\r
-               croak("string is too short");\r
-           else if (buf_len_ > len && PL_dowarn)\r
-               warn("string is too long");\r
-           (*env)->SetFloatArrayRegion(env, array,start,len,buf);\r
-           RESTOREENV;\r
-       }\r
-\r
-void\r
-SetDoubleArrayRegion(array,start,len,buf)\r
-       JNIEnv *                env = FETCHENV;\r
-       STRLEN                  tmplen = NO_INIT;\r
-       jdoubleArray            array\r
-       jsize                   start\r
-       jsize                   len\r
-       jsize                   buf_len_ = NO_INIT;\r
-       jdouble *               buf\r
-    CODE:\r
-       {\r
-           if (buf_len_ < len)\r
-               croak("string is too short");\r
-           else if (buf_len_ > len && PL_dowarn)\r
-               warn("string is too long");\r
-           (*env)->SetDoubleArrayRegion(env, array,start,len,buf);\r
-           RESTOREENV;\r
-       }\r
-\r
-SysRet\r
-RegisterNatives(clazz,methods,nMethods)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-       JNINativeMethod *       methods\r
-       jint                    nMethods\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->RegisterNatives(env, clazz,methods,nMethods);\r
-       }\r
-\r
-SysRet\r
-UnregisterNatives(clazz)\r
-       JNIEnv *                env = FETCHENV;\r
-       jclass                  clazz\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->UnregisterNatives(env, clazz);\r
-       }\r
-    OUTPUT:\r
-       RETVAL  \r
-   \r
-SysRet\r
-MonitorEnter(obj)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->MonitorEnter(env, obj);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-SysRet\r
-MonitorExit(obj)\r
-       JNIEnv *                env = FETCHENV;\r
-       jobject                 obj\r
-    CODE:\r
-       {\r
-           RETVAL = (*env)->MonitorExit(env, obj);\r
-           RESTOREENV;\r
-       }\r
-    OUTPUT:\r
-       RETVAL\r
-\r
-JavaVM *\r
-GetJavaVM(...)\r
-       JNIEnv *                env = FETCHENV;\r
-    CODE:\r
-       {\r
-#ifdef JPL_DEBUG\r
-           jpldebug = 1;\r
-#else\r
-           jpldebug = 0;\r
-#endif\r
-           if (env) {  /* We're embedded. */\r
-               if ((*env)->GetJavaVM(env, &RETVAL) < 0)\r
-                   RETVAL = 0;\r
-           }\r
-           else {      /* We're embedding. */\r
-#ifdef KAFFE\r
-                JavaVMInitArgs vm_args;\r
-#else\r
-                JDK1_1InitArgs vm_args;\r
-#endif\r
-               char *lib;\r
-               if (jpldebug) {\r
-                   fprintf(stderr, "We're embedding Java in Perl.\n");\r
-               }\r
-\r
-               if (items--) {\r
-                   ++mark;\r
-                   lib = SvPV(*mark, PL_na);\r
-               }\r
-               else\r
-                   lib = 0;\r
-               if (jpldebug) {\r
-                   fprintf(stderr, "lib is %s.\n", lib);\r
-               }\r
-#ifdef WIN32\r
-        if (LoadLibrary("jvm.dll")) {\r
-            if (!LoadLibrary("javai.dll")) {\r
-                warn("Can't load javai.dll");\r
-            }\r
-        } else {\r
-            if (lib && !LoadLibrary(lib))\r
-                croak("Can't load javai.dll"); \r
-        }\r
-#else\r
-               if (jpldebug) {\r
-                   fprintf(stderr, "Opening Java shared library.\n");\r
-                }\r
-#ifdef KAFFE\r
-               if (!dlopen("libkaffevm.so", RTLD_LAZY|RTLD_GLOBAL)) {\r
-#else\r
-               if (!dlopen("libjava.so", RTLD_LAZY|RTLD_GLOBAL)) {\r
-#endif\r
-                   if (lib && !dlopen(lib, RTLD_LAZY|RTLD_GLOBAL))\r
-                       croak("Can't load Java shared library.");\r
-               }\r
-#endif\r
-               /* Kaffe seems to get very upset if vm_args.version isn't set */\r
-#ifdef KAFFE\r
-               vm_args.version = JNI_VERSION_1_1;\r
-#endif\r
-               JNI_GetDefaultJavaVMInitArgs(&vm_args);\r
-               vm_args.exit = &call_my_exit;\r
-               if (jpldebug) {\r
-            fprintf(stderr, "items = %d\n", items);\r
-            fprintf(stderr, "mark = %s\n", SvPV(*mark, PL_na));\r
-        }\r
-               while (items > 1) {\r
-                 char *s;\r
-                   ++mark;\r
-                   s = SvPV(*mark,PL_na);\r
-                   ++mark;\r
-                   if (jpldebug) {\r
-                fprintf(stderr, "*s = %s\n", s);\r
-                fprintf(stderr, "val = %s\n", SvPV(*mark, PL_na));\r
-            }\r
-                   items -= 2;\r
-                   if (strEQ(s, "checkSource"))\r
-                       vm_args.checkSource = (jint)SvIV(*mark);\r
-                   else if (strEQ(s, "nativeStackSize"))\r
-                       vm_args.nativeStackSize = (jint)SvIV(*mark);\r
-                   else if (strEQ(s, "javaStackSize"))\r
-                       vm_args.javaStackSize = (jint)SvIV(*mark);\r
-                   else if (strEQ(s, "minHeapSize"))\r
-                       vm_args.minHeapSize = (jint)SvIV(*mark);\r
-                   else if (strEQ(s, "maxHeapSize"))\r
-                       vm_args.maxHeapSize = (jint)SvIV(*mark);\r
-                   else if (strEQ(s, "verifyMode"))\r
-                       vm_args.verifyMode = (jint)SvIV(*mark);\r
-                   else if (strEQ(s, "classpath"))\r
-                       vm_args.classpath = savepv(SvPV(*mark,PL_na));\r
-                   else if (strEQ(s, "enableClassGC"))\r
-                       vm_args.enableClassGC = (jint)SvIV(*mark);\r
-                   else if (strEQ(s, "enableVerboseGC"))\r
-                       vm_args.enableVerboseGC = (jint)SvIV(*mark);\r
-                   else if (strEQ(s, "disableAsyncGC"))\r
-                       vm_args.disableAsyncGC = (jint)SvIV(*mark);\r
-#ifdef KAFFE\r
-                   else if (strEQ(s, "libraryhome"))\r
-                       vm_args.libraryhome = savepv(SvPV(*mark,PL_na));\r
-                   else if (strEQ(s, "classhome"))\r
-                       vm_args.classhome = savepv(SvPV(*mark,PL_na));\r
-                   else if (strEQ(s, "enableVerboseJIT"))\r
-                       vm_args.enableVerboseJIT = (jint)SvIV(*mark); \r
-                   else if (strEQ(s, "enableVerboseClassloading"))\r
-                       vm_args.enableVerboseClassloading = (jint)SvIV(*mark); \r
-                   else if (strEQ(s, "enableVerboseCall"))\r
-                       vm_args.enableVerboseCall = (jint)SvIV(*mark); \r
-                   else if (strEQ(s, "allocHeapSize"))\r
-                       vm_args.allocHeapSize = (jint)SvIV(*mark); \r
-#else\r
-                   else if (strEQ(s, "verbose"))\r
-                       vm_args.verbose = (jint)SvIV(*mark); \r
-                   else if (strEQ(s, "debugging"))\r
-                       vm_args.debugging = (jboolean)SvIV(*mark);\r
-                   else if (strEQ(s, "debugPort"))\r
-                       vm_args.debugPort = (jint)SvIV(*mark); \r
-#endif\r
-                   else\r
-                       croak("unrecognized option: %s", s);\r
-               }\r
-\r
-               if (jpldebug) {\r
-                   fprintf(stderr, "Creating Java VM...\n");\r
-                   fprintf(stderr, "Working CLASSPATH: %s\n", \r
-                       vm_args.classpath);\r
-               }\r
-               if (JNI_CreateJavaVM(&RETVAL, &jplcurenv, &vm_args) < 0) {\r
-                  croak("Unable to create instance of JVM");\r
-                }\r
-               if (jpldebug) {\r
-                   fprintf(stderr, "Created Java VM.\n");\r
-               }\r
-\r
-           }\r
-       }\r
-\r
+/*
+ * Copyright 1997, O'Reilly & Associate, Inc.
+ *
+ * This package may be copied under the same terms as Perl itself.
+ */
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include <stdio.h>
+#include <jni.h>
+
+#ifndef PERL_VERSION
+#  include <patchlevel.h>
+#  define PERL_REVISION                5
+#  define PERL_VERSION         PATCHLEVEL
+#  define PERL_SUBVERSION      SUBVERSION
+#endif
+
+#if PERL_REVISION == 5 && (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION <= 75))
+#  define PL_na                na
+#  define PL_sv_no     sv_no
+#  define PL_sv_undef  sv_undef
+#  define PL_dowarn    dowarn
+#endif
+
+#ifndef newSVpvn
+#  define newSVpvn(a,b)        newSVpv(a,b)
+#endif
+
+#ifndef pTHX
+#  define pTHX         void
+#  define pTHX_
+#  define aTHX
+#  define aTHX_
+#  define dTHX         extern int JNI___notused
+#endif
+
+#ifndef WIN32
+#  include <dlfcn.h>
+#endif
+
+#ifdef EMBEDDEDPERL
+extern JNIEnv* jplcurenv;
+extern int jpldebug;
+#else
+JNIEnv* jplcurenv;
+int jpldebug = 1;
+#endif
+
+#define SysRet jint
+
+#ifdef WIN32
+static void JNICALL call_my_exit(jint status)
+{
+    my_exit(status);
+}
+#else
+static void call_my_exit(jint status)
+{
+    my_exit(status);
+}
+#endif
+
+jvalue*
+makeargs(char *sig, SV** svp, int items)
+{
+    jvalue* jv = (jvalue*)safemalloc(sizeof(jvalue) * items);
+    int ix = 0;
+    char *s = sig;
+    JNIEnv* env = jplcurenv;
+    char *start;
+    STRLEN n_a;
+
+    if (jpldebug)
+       fprintf(stderr, "sig = %s, items = %d\n", sig, items);
+    if (*s++ != '(')
+       goto cleanup;
+
+    while (items--) {
+       SV *sv = *svp++;
+       start = s;
+       switch (*s++) {
+       case 'Z':
+           jv[ix++].z = (jboolean)(SvIV(sv) != 0);
+           break;
+       case 'B':
+           jv[ix++].b = (jbyte)SvIV(sv);
+           break;
+       case 'C':
+           jv[ix++].c = (jchar)SvIV(sv);
+           break;
+       case 'S':
+           jv[ix++].s = (jshort)SvIV(sv);
+           break;
+       case 'I':
+           jv[ix++].i = (jint)SvIV(sv);
+           break;
+       case 'J':
+           jv[ix++].j = (jlong)SvNV(sv);
+           break;
+       case 'F':
+           jv[ix++].f = (jfloat)SvNV(sv);
+           break;
+       case 'D':
+           jv[ix++].d = (jdouble)SvNV(sv);
+           break;
+       case '[':
+           switch (*s++) {
+           case 'Z':
+               if (SvROK(sv)) {
+                   SV* rv = (SV*)SvRV(sv);
+                   if (SvOBJECT(rv))
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);
+                   else if (SvTYPE(rv) == SVt_PVAV) {
+                       jsize len = av_len((AV*)rv) + 1;
+                       jboolean* buf = (jboolean*)malloc(len * sizeof(jboolean));
+                       int i;
+                       SV** esv;
+
+                       jbooleanArray ja = (*env)->NewBooleanArray(env, len);
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
+                           buf[i] = (jboolean)SvIV(*esv);
+                       (*env)->SetBooleanArrayRegion(env, ja, 0, len, buf);
+                       free((void*)buf);
+                       jv[ix++].l = (jobject)ja;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+               }
+               else if (SvPOK(sv)) {
+                   jsize len = sv_len(sv) / sizeof(jboolean);
+
+                   jbooleanArray ja = (*env)->NewBooleanArray(env, len);
+                   (*env)->SetBooleanArrayRegion(env, ja, 0, len, (jboolean*)SvPV(sv,n_a));
+                   jv[ix++].l = (jobject)ja;
+               }
+               else
+                   jv[ix++].l = (jobject)(void*)0;
+               break;
+           case 'B':
+               if (SvROK(sv)) {
+                   SV* rv = (SV*)SvRV(sv);
+                   if (SvOBJECT(rv))
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);
+                   else if (SvTYPE(rv) == SVt_PVAV) {
+                       jsize len = av_len((AV*)rv) + 1;
+                       jbyte* buf = (jbyte*)malloc(len * sizeof(jbyte));
+                       int i;
+                       SV** esv;
+
+                       jbyteArray ja = (*env)->NewByteArray(env, len);
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
+                           buf[i] = (jbyte)SvIV(*esv);
+                       (*env)->SetByteArrayRegion(env, ja, 0, len, buf);
+                       free((void*)buf);
+                       jv[ix++].l = (jobject)ja;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+               }
+               else if (SvPOK(sv)) {
+                   jsize len = sv_len(sv) / sizeof(jbyte);
+
+                   jbyteArray ja = (*env)->NewByteArray(env, len);
+                   (*env)->SetByteArrayRegion(env, ja, 0, len, (jbyte*)SvPV(sv,n_a));
+                   jv[ix++].l = (jobject)ja;
+               }
+               else
+                   jv[ix++].l = (jobject)(void*)0;
+               break;
+           case 'C':
+               if (SvROK(sv)) {
+                   SV* rv = (SV*)SvRV(sv);
+                   if (SvOBJECT(rv))
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);
+                   else if (SvTYPE(rv) == SVt_PVAV) {
+                       jsize len = av_len((AV*)rv) + 1;
+                       jchar* buf = (jchar*)malloc(len * sizeof(jchar));
+                       int i;
+                       SV** esv;
+
+                       jcharArray ja = (*env)->NewCharArray(env, len);
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
+                           buf[i] = (jchar)SvIV(*esv);
+                       (*env)->SetCharArrayRegion(env, ja, 0, len, buf);
+                       free((void*)buf);
+                       jv[ix++].l = (jobject)ja;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+               }
+               else if (SvPOK(sv)) {
+                   jsize len = sv_len(sv) / sizeof(jchar);
+
+                   jcharArray ja = (*env)->NewCharArray(env, len);
+                   (*env)->SetCharArrayRegion(env, ja, 0, len, (jchar*)SvPV(sv,n_a));
+                   jv[ix++].l = (jobject)ja;
+               }
+               else
+                   jv[ix++].l = (jobject)(void*)0;
+               break;
+           case 'S':
+               if (SvROK(sv)) {
+                   SV* rv = (SV*)SvRV(sv);
+                   if (SvOBJECT(rv))
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);
+                   else if (SvTYPE(rv) == SVt_PVAV) {
+                       jsize len = av_len((AV*)rv) + 1;
+                       jshort* buf = (jshort*)malloc(len * sizeof(jshort));
+                       int i;
+                       SV** esv;
+
+                       jshortArray ja = (*env)->NewShortArray(env, len);
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
+                           buf[i] = (jshort)SvIV(*esv);
+                       (*env)->SetShortArrayRegion(env, ja, 0, len, buf);
+                       free((void*)buf);
+                       jv[ix++].l = (jobject)ja;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+               }
+               else if (SvPOK(sv)) {
+                   jsize len = sv_len(sv) / sizeof(jshort);
+
+                   jshortArray ja = (*env)->NewShortArray(env, len);
+                   (*env)->SetShortArrayRegion(env, ja, 0, len, (jshort*)SvPV(sv,n_a));
+                   jv[ix++].l = (jobject)ja;
+               }
+               else
+                   jv[ix++].l = (jobject)(void*)0;
+               break;
+           case 'I':
+               if (SvROK(sv)) {
+                   SV* rv = (SV*)SvRV(sv);
+                   if (SvOBJECT(rv))
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);
+                   else if (SvTYPE(rv) == SVt_PVAV) {
+                       jsize len = av_len((AV*)rv) + 1;
+                       jint* buf = (jint*)malloc(len * sizeof(jint));
+                       int i;
+                       SV** esv;
+
+                       jintArray ja = (*env)->NewIntArray(env, len);
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
+                           buf[i] = (jint)SvIV(*esv);
+                       (*env)->SetIntArrayRegion(env, ja, 0, len, buf);
+                       free((void*)buf);
+                       jv[ix++].l = (jobject)ja;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+               }
+               else if (SvPOK(sv)) {
+                   jsize len = sv_len(sv) / sizeof(jint);
+
+                   jintArray ja = (*env)->NewIntArray(env, len);
+                   (*env)->SetIntArrayRegion(env, ja, 0, len, (jint*)SvPV(sv,n_a));
+                   jv[ix++].l = (jobject)ja;
+               }
+               else
+                   jv[ix++].l = (jobject)(void*)0;
+               break;
+           case 'J':
+               if (SvROK(sv)) {
+                   SV* rv = (SV*)SvRV(sv);
+                   if (SvOBJECT(rv))
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);
+                   else if (SvTYPE(rv) == SVt_PVAV) {
+                       jsize len = av_len((AV*)rv) + 1;
+                       jlong* buf = (jlong*)malloc(len * sizeof(jlong));
+                       int i;
+                       SV** esv;
+
+                       jlongArray ja = (*env)->NewLongArray(env, len);
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
+                           buf[i] = (jlong)SvNV(*esv);
+                       (*env)->SetLongArrayRegion(env, ja, 0, len, buf);
+                       free((void*)buf);
+                       jv[ix++].l = (jobject)ja;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+               }
+               else if (SvPOK(sv)) {
+                   jsize len = sv_len(sv) / sizeof(jlong);
+
+                   jlongArray ja = (*env)->NewLongArray(env, len);
+                   (*env)->SetLongArrayRegion(env, ja, 0, len, (jlong*)SvPV(sv,n_a));
+                   jv[ix++].l = (jobject)ja;
+               }
+               else
+                   jv[ix++].l = (jobject)(void*)0;
+               break;
+           case 'F':
+               if (SvROK(sv)) {
+                   SV* rv = (SV*)SvRV(sv);
+                   if (SvOBJECT(rv))
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);
+                   else if (SvTYPE(rv) == SVt_PVAV) {
+                       jsize len = av_len((AV*)rv) + 1;
+                       jfloat* buf = (jfloat*)malloc(len * sizeof(jfloat));
+                       int i;
+                       SV** esv;
+
+                       jfloatArray ja = (*env)->NewFloatArray(env, len);
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
+                           buf[i] = (jfloat)SvNV(*esv);
+                       (*env)->SetFloatArrayRegion(env, ja, 0, len, buf);
+                       free((void*)buf);
+                       jv[ix++].l = (jobject)ja;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+               }
+               else if (SvPOK(sv)) {
+                   jsize len = sv_len(sv) / sizeof(jfloat);
+
+                   jfloatArray ja = (*env)->NewFloatArray(env, len);
+                   (*env)->SetFloatArrayRegion(env, ja, 0, len, (jfloat*)SvPV(sv,n_a));
+                   jv[ix++].l = (jobject)ja;
+               }
+               else
+                   jv[ix++].l = (jobject)(void*)0;
+               break;
+           case 'D':
+               if (SvROK(sv)) {
+                   SV* rv = (SV*)SvRV(sv);
+                   if (SvOBJECT(rv))
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);
+                   else if (SvTYPE(rv) == SVt_PVAV) {
+                       jsize len = av_len((AV*)rv) + 1;
+                       jdouble* buf = (jdouble*)malloc(len * sizeof(jdouble));
+                       int i;
+                       SV** esv;
+
+                       jdoubleArray ja = (*env)->NewDoubleArray(env, len);
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++)
+                           buf[i] = (jdouble)SvNV(*esv);
+                       (*env)->SetDoubleArrayRegion(env, ja, 0, len, buf);
+                       free((void*)buf);
+                       jv[ix++].l = (jobject)ja;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+               }
+               else if (SvPOK(sv)) {
+                   jsize len = sv_len(sv) / sizeof(jdouble);
+
+                   jdoubleArray ja = (*env)->NewDoubleArray(env, len);
+                   (*env)->SetDoubleArrayRegion(env, ja, 0, len, (jdouble*)SvPV(sv,n_a));
+                   jv[ix++].l = (jobject)ja;
+               }
+               else
+                   jv[ix++].l = (jobject)(void*)0;
+               break;
+           case 'L':
+               while (*s != ';') s++;
+               s++;
+               if (strnEQ(start, "[Ljava/lang/String;", 19)) {
+                   if (SvROK(sv)) {
+                       SV* rv = (SV*)SvRV(sv);
+                       if (SvOBJECT(rv))
+                           jv[ix++].l = (jobject)(void*)SvIV(rv);
+                       else if (SvTYPE(rv) == SVt_PVAV) {
+                           jsize len = av_len((AV*)rv) + 1;
+                           int i;
+                           SV** esv;
+                           static jclass jcl = 0;
+                           jobjectArray ja;
+
+                           if (!jcl)
+                               jcl = (*env)->FindClass(env, "java/lang/String");
+                           ja = (*env)->NewObjectArray(env, len, jcl, 0);
+                           for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {
+                               jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));
+                               (*env)->SetObjectArrayElement(env, ja, i, str);
+                           }
+                           jv[ix++].l = (jobject)ja;
+                       }
+                       else
+                           jv[ix++].l = (jobject)(void*)0;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+                   break;
+               }
+               /* FALL THROUGH */
+           default:
+               if (SvROK(sv)) {
+                   SV* rv = (SV*)SvRV(sv);
+                   if (SvOBJECT(rv))
+                       jv[ix++].l = (jobject)(void*)SvIV(rv);
+                   else if (SvTYPE(rv) == SVt_PVAV) {
+                       jsize len = av_len((AV*)rv) + 1;
+                       int i;
+                       SV** esv;
+                      static jclass jcl = 0;
+                       jobjectArray ja;
+
+                       if (!jcl)
+                           jcl = (*env)->FindClass(env, "java/lang/Object");
+                       ja = (*env)->NewObjectArray(env, len, jcl, 0);
+                       for (esv = AvARRAY((AV*)rv), i = 0; i < len; esv++, i++) {
+                           if (SvROK(*esv) && (rv = SvRV(*esv)) && SvOBJECT(rv)) {
+                               (*env)->SetObjectArrayElement(env, ja, i, (jobject)(void*)SvIV(rv));
+                           }
+                           else {
+                               jobject str = (jobject)(*env)->NewStringUTF(env, SvPV(*esv,n_a));
+                               (*env)->SetObjectArrayElement(env, ja, i, str);
+                           }
+                       }
+                       jv[ix++].l = (jobject)ja;
+                   }
+                   else
+                       jv[ix++].l = (jobject)(void*)0;
+               }
+               else
+                   jv[ix++].l = (jobject)(void*)0;
+               break;
+           }
+           break;
+       case 'L':
+           if (!SvROK(sv) || strnEQ(s, "java/lang/String;", 17)) {
+               s += 17;
+               jv[ix++].l = (jobject)(*env)->NewStringUTF(env, (char*) SvPV(sv,n_a));
+               break;
+           }
+           while (*s != ';') s++;
+           s++;
+           if (SvROK(sv)) {
+               SV* rv = SvRV(sv);
+               jv[ix++].l = (jobject)(void*)SvIV(rv);
+           }
+           break;
+       case ')':
+           croak("too many arguments, signature: %s", sig);
+           goto cleanup;
+       default:
+           croak("panic: malformed signature: %s", s-1);
+           goto cleanup;
+       }
+
+    }
+    if (*s != ')') {
+       croak("not enough arguments, signature: %s", sig);
+       goto cleanup;
+    }
+    return jv;
+
+cleanup:
+    safefree((char*)jv);
+    return 0;
+}
+
+static int
+not_here(char *s)
+{
+    croak("%s not implemented on this architecture", s);
+    return -1;
+}
+
+static double
+constant(char *name, int arg)
+{
+    errno = 0;
+    switch (*name) {
+    case 'A':
+       break;
+    case 'B':
+       break;
+    case 'C':
+       break;
+    case 'D':
+       break;
+    case 'E':
+       break;
+    case 'F':
+       break;
+    case 'G':
+       break;
+    case 'H':
+       break;
+    case 'I':
+       break;
+    case 'J':
+       if (strEQ(name, "JNI_ABORT"))
+#ifdef JNI_ABORT
+           return JNI_ABORT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "JNI_COMMIT"))
+#ifdef JNI_COMMIT
+           return JNI_COMMIT;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "JNI_ERR"))
+#ifdef JNI_ERR
+           return JNI_ERR;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "JNI_FALSE"))
+#ifdef JNI_FALSE
+           return JNI_FALSE;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "JNI_H"))
+#ifdef JNI_H
+#ifdef WIN32
+           return 1;
+#else
+           return JNI_H;
+#endif
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "JNI_OK"))
+#ifdef JNI_OK
+           return JNI_OK;
+#else
+           goto not_there;
+#endif
+       if (strEQ(name, "JNI_TRUE"))
+#ifdef JNI_TRUE
+           return JNI_TRUE;
+#else
+           goto not_there;
+#endif
+       break;
+    case 'K':
+       break;
+    case 'L':
+       break;
+    case 'M':
+       break;
+    case 'N':
+       break;
+    case 'O':
+       break;
+    case 'P':
+       break;
+    case 'Q':
+       break;
+    case 'R':
+       break;
+    case 'S':
+       break;
+    case 'T':
+       break;
+    case 'U':
+       break;
+    case 'V':
+       break;
+    case 'W':
+       break;
+    case 'X':
+       break;
+    case 'Y':
+       break;
+    case 'Z':
+       break;
+    }
+    errno = EINVAL;
+    return 0;
+
+not_there:
+    errno = ENOENT;
+    return 0;
+}
+
+#define FETCHENV jplcurenv
+#define RESTOREENV jplcurenv = env
+
+MODULE = JNI           PACKAGE = JNI           
+
+PROTOTYPES: ENABLE
+
+double
+constant(name,arg)
+       char *          name
+       int             arg
+
+jint
+GetVersion()
+       JNIEnv *                env = FETCHENV;
+    CODE:
+       {
+           RETVAL = (*env)->GetVersion(env);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jclass
+DefineClass(name, loader, buf)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jsize                   buf_len_ = NO_INIT;
+       const char *            name
+       jobject                 loader
+       const jbyte *           buf
+    CODE:
+       {
+#ifdef KAFFE
+           RETVAL = (*env)->DefineClass(env,  loader, buf, (jsize)buf_len_);
+#else
+           RETVAL = (*env)->DefineClass(env,  name, loader, buf, (jsize)buf_len_); 
+#endif
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jclass
+FindClass(name)
+       JNIEnv *                env = FETCHENV;
+       const char *            name
+    CODE:
+       {
+           RETVAL = (*env)->FindClass(env,  name);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jclass
+GetSuperclass(sub)
+       JNIEnv *                env = FETCHENV;
+       jclass                  sub
+    CODE:
+       {
+           RETVAL = (*env)->GetSuperclass(env,  sub);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+IsAssignableFrom(sub, sup)
+       JNIEnv *                env = FETCHENV;
+       jclass                  sub
+       jclass                  sup
+    CODE:
+       {
+           RETVAL = (*env)->IsAssignableFrom(env,  sub, sup);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+SysRet
+Throw(obj)
+       JNIEnv *                env = FETCHENV;
+       jthrowable              obj
+    CODE:
+       {
+           RETVAL = (*env)->Throw(env,  obj);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL    
+
+SysRet
+ThrowNew(clazz, msg)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       const char *            msg
+    CODE:
+       {
+           RETVAL = (*env)->ThrowNew(env,  clazz, msg);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jthrowable
+ExceptionOccurred()
+       JNIEnv *                env = FETCHENV;
+    CODE:
+       {
+           RETVAL = (*env)->ExceptionOccurred(env);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+void
+ExceptionDescribe()
+       JNIEnv *                env = FETCHENV;
+    CODE:
+       {
+           (*env)->ExceptionDescribe(env);
+           RESTOREENV;
+       }
+
+void
+ExceptionClear()
+       JNIEnv *                env = FETCHENV;
+    CODE:
+       {
+           (*env)->ExceptionClear(env);
+           RESTOREENV;
+       }
+
+void
+FatalError(msg)
+       JNIEnv *                env = FETCHENV;
+       const char *            msg
+    CODE:
+       {
+           (*env)->FatalError(env,  msg);
+           RESTOREENV;
+       }
+
+jobject
+NewGlobalRef(lobj)
+       JNIEnv *                env = FETCHENV;
+       jobject                 lobj
+    CODE:
+       {
+           RETVAL = (*env)->NewGlobalRef(env, lobj);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+void
+DeleteGlobalRef(gref)
+       JNIEnv *                env = FETCHENV;
+       jobject                 gref
+    CODE:
+       {
+           (*env)->DeleteGlobalRef(env, gref);
+           RESTOREENV;
+       }
+
+void
+DeleteLocalRef(obj)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+    CODE:
+       {
+           (*env)->DeleteLocalRef(env,  obj);
+           RESTOREENV;
+       }
+
+jboolean
+IsSameObject(obj1,obj2)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj1
+       jobject                 obj2
+    CODE:
+       {
+           RETVAL = (*env)->IsSameObject(env, obj1,obj2);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+AllocObject(clazz)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+    CODE:
+       {
+           RETVAL = (*env)->AllocObject(env, clazz);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+NewObject(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+NewObjectA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->NewObjectA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jclass
+GetObjectClass(obj)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+    CODE:
+       {
+           RETVAL = (*env)->GetObjectClass(env, obj);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+IsInstanceOf(obj,clazz)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+    CODE:
+       {
+           RETVAL = (*env)->IsInstanceOf(env, obj,clazz);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jmethodID
+GetMethodID(clazz,name,sig)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       const char *            name
+       const char *            sig
+    CODE:
+       {
+           RETVAL = (*env)->GetMethodID(env, clazz,name,sig);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+CallObjectMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+CallObjectMethodA(obj,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallObjectMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+CallBooleanMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+CallBooleanMethodA(obj,methodID, args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallBooleanMethodA(env, obj,methodID, args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jbyte
+CallByteMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jbyte
+CallByteMethodA(obj,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallByteMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jchar
+CallCharMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jchar
+CallCharMethodA(obj,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallCharMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jshort
+CallShortMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jshort
+CallShortMethodA(obj,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallShortMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jint
+CallIntMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jint
+CallIntMethodA(obj,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallIntMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jlong
+CallLongMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jlong
+CallLongMethodA(obj,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallLongMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jfloat
+CallFloatMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jfloat
+CallFloatMethodA(obj,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallFloatMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jdouble
+CallDoubleMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jdouble
+CallDoubleMethodA(obj,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallDoubleMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+void
+CallVoidMethod(obj,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           (*env)->CallVoidMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+
+void
+CallVoidMethodA(obj,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           (*env)->CallVoidMethodA(env, obj,methodID,args);
+           RESTOREENV;
+       }
+
+jobject
+CallNonvirtualObjectMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+CallNonvirtualObjectMethodA(obj,clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallNonvirtualObjectMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+CallNonvirtualBooleanMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+CallNonvirtualBooleanMethodA(obj,clazz,methodID, args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallNonvirtualBooleanMethodA(env, obj,clazz,methodID, args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jbyte
+CallNonvirtualByteMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jbyte
+CallNonvirtualByteMethodA(obj,clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallNonvirtualByteMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jchar
+CallNonvirtualCharMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jchar
+CallNonvirtualCharMethodA(obj,clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallNonvirtualCharMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jshort
+CallNonvirtualShortMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jshort
+CallNonvirtualShortMethodA(obj,clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallNonvirtualShortMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jint
+CallNonvirtualIntMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jint
+CallNonvirtualIntMethodA(obj,clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallNonvirtualIntMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jlong
+CallNonvirtualLongMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jlong
+CallNonvirtualLongMethodA(obj,clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallNonvirtualLongMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jfloat
+CallNonvirtualFloatMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jfloat
+CallNonvirtualFloatMethodA(obj,clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallNonvirtualFloatMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jdouble
+CallNonvirtualDoubleMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jdouble
+CallNonvirtualDoubleMethodA(obj,clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallNonvirtualDoubleMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+void
+CallNonvirtualVoidMethod(obj,clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+
+void
+CallNonvirtualVoidMethodA(obj,clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           (*env)->CallNonvirtualVoidMethodA(env, obj,clazz,methodID,args);
+           RESTOREENV;
+       }
+
+jfieldID
+GetFieldID(clazz,name,sig)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       const char *            name
+       const char *            sig
+    CODE:
+       {
+           RETVAL = (*env)->GetFieldID(env, clazz,name,sig);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+GetObjectField(obj,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetObjectField(env, obj,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+GetBooleanField(obj,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetBooleanField(env, obj,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jbyte
+GetByteField(obj,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetByteField(env, obj,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jchar
+GetCharField(obj,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetCharField(env, obj,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jshort
+GetShortField(obj,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetShortField(env, obj,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jint
+GetIntField(obj,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetIntField(env, obj,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jlong
+GetLongField(obj,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetLongField(env, obj,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jfloat
+GetFloatField(obj,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetFloatField(env, obj,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jdouble
+GetDoubleField(obj,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetDoubleField(env, obj,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+void
+SetObjectField(obj,fieldID,val)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jobject                 val
+    CODE:
+       {
+           (*env)->SetObjectField(env, obj,fieldID,val);
+           RESTOREENV;
+       }
+
+void
+SetBooleanField(obj,fieldID,val)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jboolean                val
+    CODE:
+       {
+           (*env)->SetBooleanField(env, obj,fieldID,val);
+           RESTOREENV;
+       }
+
+void
+SetByteField(obj,fieldID,val)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jbyte                   val
+    CODE:
+       {
+           (*env)->SetByteField(env, obj,fieldID,val);
+           RESTOREENV;
+       }
+
+void
+SetCharField(obj,fieldID,val)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jchar                   val
+    CODE:
+       {
+           (*env)->SetCharField(env, obj,fieldID,val);
+           RESTOREENV;
+       }
+
+void
+SetShortField(obj,fieldID,val)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jshort                  val
+    CODE:
+       {
+           (*env)->SetShortField(env, obj,fieldID,val);
+           RESTOREENV;
+       }
+
+void
+SetIntField(obj,fieldID,val)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jint                    val
+    CODE:
+       {
+           (*env)->SetIntField(env, obj,fieldID,val);
+           RESTOREENV;
+       }
+
+void
+SetLongField(obj,fieldID,val)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jlong                   val
+    CODE:
+       {
+           (*env)->SetLongField(env, obj,fieldID,val);
+           RESTOREENV;
+       }
+
+void
+SetFloatField(obj,fieldID,val)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jfloat                  val
+    CODE:
+       {
+           (*env)->SetFloatField(env, obj,fieldID,val);
+           RESTOREENV;
+       }
+
+void
+SetDoubleField(obj,fieldID,val)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jdouble                 val
+    CODE:
+       {
+           (*env)->SetDoubleField(env, obj,fieldID,val);
+           RESTOREENV;
+       }
+
+jmethodID
+GetStaticMethodID(clazz,name,sig)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       const char *            name
+       const char *            sig
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticMethodID(env, clazz,name,sig);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+CallStaticObjectMethod(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+CallStaticObjectMethodA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallStaticObjectMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+CallStaticBooleanMethod(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+CallStaticBooleanMethodA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallStaticBooleanMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jbyte
+CallStaticByteMethod(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jbyte
+CallStaticByteMethodA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallStaticByteMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jchar
+CallStaticCharMethod(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jchar
+CallStaticCharMethodA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallStaticCharMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jshort
+CallStaticShortMethod(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jshort
+CallStaticShortMethodA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallStaticShortMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jint
+CallStaticIntMethod(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jint
+CallStaticIntMethodA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallStaticIntMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jlong
+CallStaticLongMethod(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jlong
+CallStaticLongMethodA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallStaticLongMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jfloat
+CallStaticFloatMethod(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jfloat
+CallStaticFloatMethodA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallStaticFloatMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jdouble
+CallStaticDoubleMethod(clazz,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jdouble
+CallStaticDoubleMethodA(clazz,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           RETVAL = (*env)->CallStaticDoubleMethodA(env, clazz,methodID,args);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+void
+CallStaticVoidMethod(cls,methodID,...)
+       JNIEnv *                env = FETCHENV;
+       jclass                  cls
+       jmethodID               methodID
+       char *                  sig = 0;
+       int                     argoff = $min_args;
+    CODE:
+       {
+           jvalue * args = makeargs(sig, &ST(argoff), items - argoff);
+           (*env)->CallStaticVoidMethodA(env, cls,methodID,args);
+           RESTOREENV;
+       }
+
+void
+CallStaticVoidMethodA(cls,methodID,args)
+       JNIEnv *                env = FETCHENV;
+       jclass                  cls
+       jmethodID               methodID
+       char *                  sig = 0;
+       jvalue *                args
+    CODE:
+       {
+           (*env)->CallStaticVoidMethodA(env, cls,methodID,args);
+           RESTOREENV;
+       }
+
+jfieldID
+GetStaticFieldID(clazz,name,sig)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       const char *            name
+       const char *            sig
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticFieldID(env, clazz,name,sig);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+GetStaticObjectField(clazz,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticObjectField(env, clazz,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean
+GetStaticBooleanField(clazz,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticBooleanField(env, clazz,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jbyte
+GetStaticByteField(clazz,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticByteField(env, clazz,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jchar
+GetStaticCharField(clazz,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticCharField(env, clazz,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jshort
+GetStaticShortField(clazz,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticShortField(env, clazz,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jint
+GetStaticIntField(clazz,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticIntField(env, clazz,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jlong
+GetStaticLongField(clazz,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticLongField(env, clazz,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jfloat
+GetStaticFloatField(clazz,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticFloatField(env, clazz,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jdouble
+GetStaticDoubleField(clazz,fieldID)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+    CODE:
+       {
+           RETVAL = (*env)->GetStaticDoubleField(env, clazz,fieldID);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+void
+SetStaticObjectField(clazz,fieldID,value)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jobject                 value
+    CODE:
+       {
+         (*env)->SetStaticObjectField(env, clazz,fieldID,value);
+           RESTOREENV;
+       }
+
+void
+SetStaticBooleanField(clazz,fieldID,value)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jboolean                value
+    CODE:
+       {
+         (*env)->SetStaticBooleanField(env, clazz,fieldID,value);
+           RESTOREENV;
+       }
+
+void
+SetStaticByteField(clazz,fieldID,value)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jbyte                   value
+    CODE:
+       {
+         (*env)->SetStaticByteField(env, clazz,fieldID,value);
+           RESTOREENV;
+       }
+
+void
+SetStaticCharField(clazz,fieldID,value)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jchar                   value
+    CODE:
+       {
+         (*env)->SetStaticCharField(env, clazz,fieldID,value);
+           RESTOREENV;
+       }
+
+void
+SetStaticShortField(clazz,fieldID,value)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jshort                  value
+    CODE:
+       {
+         (*env)->SetStaticShortField(env, clazz,fieldID,value);
+           RESTOREENV;
+       }
+
+void
+SetStaticIntField(clazz,fieldID,value)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jint                    value
+    CODE:
+       {
+         (*env)->SetStaticIntField(env, clazz,fieldID,value);
+           RESTOREENV;
+       }
+
+void
+SetStaticLongField(clazz,fieldID,value)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jlong                   value
+    CODE:
+       {
+         (*env)->SetStaticLongField(env, clazz,fieldID,value);
+           RESTOREENV;
+       }
+
+void
+SetStaticFloatField(clazz,fieldID,value)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jfloat                  value
+    CODE:
+       {
+         (*env)->SetStaticFloatField(env, clazz,fieldID,value);
+           RESTOREENV;
+       }
+
+void
+SetStaticDoubleField(clazz,fieldID,value)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       jfieldID                fieldID
+       char *                  sig = 0;
+       jdouble                 value
+    CODE:
+       {
+         (*env)->SetStaticDoubleField(env, clazz,fieldID,value);
+           RESTOREENV;
+       }
+
+jstring
+NewString(unicode)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jsize                   unicode_len_ = NO_INIT;
+       const jchar *           unicode
+    CODE:
+       {
+           RETVAL = (*env)->NewString(env, unicode, unicode_len_);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jsize
+GetStringLength(str)
+       JNIEnv *                env = FETCHENV;
+       jstring                 str
+    CODE:
+       {
+           RETVAL = (*env)->GetStringLength(env, str);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+const jchar *
+GetStringChars(str)
+       JNIEnv *                env = FETCHENV;
+       jstring                 str
+       jboolean                isCopy = NO_INIT;
+       jsize                   RETVAL_len_ = NO_INIT;
+    CODE:
+       {
+           RETVAL = (*env)->GetStringChars(env, str,&isCopy);
+           RETVAL_len_ = (*env)->GetStringLength(env, str);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+    CLEANUP:
+           (*env)->ReleaseStringChars(env, str,RETVAL);
+
+jstring
+NewStringUTF(utf)
+       JNIEnv *                env = FETCHENV;
+       const char *            utf
+    CODE:
+       {
+           RETVAL = (*env)->NewStringUTF(env, utf);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jsize
+GetStringUTFLength(str)
+       JNIEnv *                env = FETCHENV;
+       jstring                 str
+    CODE:
+       {
+           RETVAL = (*env)->GetStringUTFLength(env, str);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+const char *
+GetStringUTFChars(str)
+       JNIEnv *                env = FETCHENV;
+       jstring                 str
+       jboolean                isCopy = NO_INIT;
+    CODE:
+       {
+           RETVAL = (*env)->GetStringUTFChars(env, str,&isCopy);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+    CLEANUP:
+       (*env)->ReleaseStringUTFChars(env, str, RETVAL);
+
+
+jsize
+GetArrayLength(array)
+       JNIEnv *                env = FETCHENV;
+       jarray                  array
+    CODE:
+       {
+           RETVAL = (*env)->GetArrayLength(env, array);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobjectArray
+NewObjectArray(len,clazz,init)
+       JNIEnv *                env = FETCHENV;
+       jsize                   len
+       jclass                  clazz
+       jobject                 init
+    CODE:
+       {
+           RETVAL = (*env)->NewObjectArray(env, len,clazz,init);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jobject
+GetObjectArrayElement(array,index)
+       JNIEnv *                env = FETCHENV;
+       jobjectArray            array
+       jsize                   index
+    CODE:
+       {
+           RETVAL = (*env)->GetObjectArrayElement(env, array,index);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+void
+SetObjectArrayElement(array,index,val)
+       JNIEnv *                env = FETCHENV;
+       jobjectArray            array
+       jsize                   index
+       jobject                 val
+    CODE:
+       {
+           (*env)->SetObjectArrayElement(env, array,index,val);
+           RESTOREENV;
+       }
+
+jbooleanArray
+NewBooleanArray(len)
+       JNIEnv *                env = FETCHENV;
+       jsize                   len
+    CODE:
+       {
+           RETVAL = (*env)->NewBooleanArray(env, len);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jbyteArray
+NewByteArray(len)
+       JNIEnv *                env = FETCHENV;
+       jsize                   len
+    CODE:
+       {
+           RETVAL = (*env)->NewByteArray(env, len);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jcharArray
+NewCharArray(len)
+       JNIEnv *                env = FETCHENV;
+       jsize                   len
+    CODE:
+       {
+           RETVAL = (*env)->NewCharArray(env, len);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jshortArray
+NewShortArray(len)
+       JNIEnv *                env = FETCHENV;
+       jsize                   len
+    CODE:
+       {
+           RETVAL = (*env)->NewShortArray(env, len);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jintArray
+NewIntArray(len)
+       JNIEnv *                env = FETCHENV;
+       jsize                   len
+    CODE:
+       {
+           RETVAL = (*env)->NewIntArray(env, len);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jlongArray
+NewLongArray(len)
+       JNIEnv *                env = FETCHENV;
+       jsize                   len
+    CODE:
+       {
+           RETVAL = (*env)->NewLongArray(env, len);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jfloatArray
+NewFloatArray(len)
+       JNIEnv *                env = FETCHENV;
+       jsize                   len
+    CODE:
+       {
+           RETVAL = (*env)->NewFloatArray(env, len);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jdoubleArray
+NewDoubleArray(len)
+       JNIEnv *                env = FETCHENV;
+       jsize                   len
+    CODE:
+       {
+           RETVAL = (*env)->NewDoubleArray(env, len);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+jboolean *
+GetBooleanArrayElements(array)
+       JNIEnv *                env = FETCHENV;
+       jsize                   RETVAL_len_ = NO_INIT;
+       jbooleanArray           array
+       jboolean                isCopy = NO_INIT;
+    PPCODE:
+       {
+           RETVAL = (*env)->GetBooleanArrayElements(env, array,&isCopy);
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);
+           if (GIMME == G_ARRAY) {
+               int i;
+               jboolean* r = RETVAL;
+               EXTEND(sp, RETVAL_len_);
+               for (i = RETVAL_len_; i; --i) {
+                   PUSHs(sv_2mortal(newSViv(*r++)));
+               }
+           }
+           else {
+               if (RETVAL_len_) {
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
+                       (STRLEN)RETVAL_len_ * sizeof(jboolean))));
+               }
+               else
+                   PUSHs(&PL_sv_no);
+           }
+           (*env)->ReleaseBooleanArrayElements(env, array,RETVAL,JNI_ABORT);
+           RESTOREENV;
+       }
+
+jbyte *
+GetByteArrayElements(array)
+       JNIEnv *                env = FETCHENV;
+       jsize                   RETVAL_len_ = NO_INIT;
+       jbyteArray              array
+       jboolean                isCopy = NO_INIT;
+    PPCODE:
+       {
+           RETVAL = (*env)->GetByteArrayElements(env, array,&isCopy);
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);
+           if (GIMME == G_ARRAY) {
+               int i;
+               jbyte* r = RETVAL;
+               EXTEND(sp, RETVAL_len_);
+               for (i = RETVAL_len_; i; --i) {
+                   PUSHs(sv_2mortal(newSViv(*r++)));
+               }
+           }
+           else {
+               if (RETVAL_len_) {
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
+                       (STRLEN)RETVAL_len_ * sizeof(jbyte))));
+               }
+               else
+                   PUSHs(&PL_sv_no);
+           }
+           (*env)->ReleaseByteArrayElements(env, array,RETVAL,JNI_ABORT);
+           RESTOREENV;
+       }
+
+jchar *
+GetCharArrayElements(array)
+       JNIEnv *                env = FETCHENV;
+       jsize                   RETVAL_len_ = NO_INIT;
+       jcharArray              array
+       jboolean                isCopy = NO_INIT;
+    PPCODE:
+       {
+           RETVAL = (*env)->GetCharArrayElements(env, array,&isCopy);
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);
+           if (GIMME == G_ARRAY) {
+               int i;
+               jchar* r = RETVAL;
+               EXTEND(sp, RETVAL_len_);
+               for (i = RETVAL_len_; i; --i) {
+                   PUSHs(sv_2mortal(newSViv(*r++)));
+               }
+           }
+           else {
+               if (RETVAL_len_) {
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
+                       (STRLEN)RETVAL_len_ * sizeof(jchar))));
+               }
+               else
+                   PUSHs(&PL_sv_no);
+           }
+           (*env)->ReleaseCharArrayElements(env, array,RETVAL,JNI_ABORT);
+           RESTOREENV;
+       }
+
+jshort *
+GetShortArrayElements(array)
+       JNIEnv *                env = FETCHENV;
+       jsize                   RETVAL_len_ = NO_INIT;
+       jshortArray             array
+       jboolean                isCopy = NO_INIT;
+    PPCODE:
+       {
+           RETVAL = (*env)->GetShortArrayElements(env, array,&isCopy);
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);
+           if (GIMME == G_ARRAY) {
+               int i;
+               jshort* r = RETVAL;
+               EXTEND(sp, RETVAL_len_);
+               for (i = RETVAL_len_; i; --i) {
+                   PUSHs(sv_2mortal(newSViv(*r++)));
+               }
+           }
+           else {
+               if (RETVAL_len_) {
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
+                       (STRLEN)RETVAL_len_ * sizeof(jshort))));
+               }
+               else
+                   PUSHs(&PL_sv_no);
+           }
+           (*env)->ReleaseShortArrayElements(env, array,RETVAL,JNI_ABORT);
+           RESTOREENV;
+       }
+
+jint *
+GetIntArrayElements(array)
+       JNIEnv *                env = FETCHENV;
+       jsize                   RETVAL_len_ = NO_INIT;
+       jintArray               array
+       jboolean                isCopy = NO_INIT;
+    PPCODE:
+       {
+           RETVAL = (*env)->GetIntArrayElements(env, array,&isCopy);
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);
+           if (GIMME == G_ARRAY) {
+               int i;
+               jint* r = RETVAL;
+               EXTEND(sp, RETVAL_len_);
+               for (i = RETVAL_len_; i; --i) {
+                   PUSHs(sv_2mortal(newSViv(*r++)));
+               }
+           }
+           else {
+               if (RETVAL_len_) {
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
+                       (STRLEN)RETVAL_len_ * sizeof(jint))));
+               }
+               else
+                   PUSHs(&PL_sv_no);
+           }
+           (*env)->ReleaseIntArrayElements(env, array,RETVAL,JNI_ABORT);
+           RESTOREENV;
+       }
+
+jlong *
+GetLongArrayElements(array)
+       JNIEnv *                env = FETCHENV;
+       jsize                   RETVAL_len_ = NO_INIT;
+       jlongArray              array
+       jboolean                isCopy = NO_INIT;
+    PPCODE:
+       {
+           RETVAL = (*env)->GetLongArrayElements(env, array,&isCopy);
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);
+           if (GIMME == G_ARRAY) {
+               int i;
+               jlong* r = RETVAL;
+               EXTEND(sp, RETVAL_len_);
+               for (i = RETVAL_len_; i; --i) {
+                   PUSHs(sv_2mortal(newSViv(*r++)));
+               }
+           }
+           else {
+               if (RETVAL_len_) {
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
+                       (STRLEN)RETVAL_len_ * sizeof(jlong))));
+               }
+               else
+                   PUSHs(&PL_sv_no);
+           }
+           (*env)->ReleaseLongArrayElements(env, array,RETVAL,JNI_ABORT);
+           RESTOREENV;
+       }
+
+jfloat *
+GetFloatArrayElements(array)
+       JNIEnv *                env = FETCHENV;
+       jsize                   RETVAL_len_ = NO_INIT;
+       jfloatArray             array
+       jboolean                isCopy = NO_INIT;
+    PPCODE:
+       {
+           RETVAL = (*env)->GetFloatArrayElements(env, array,&isCopy);
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);
+           if (GIMME == G_ARRAY) {
+               int i;
+               jfloat* r = RETVAL;
+               EXTEND(sp, RETVAL_len_);
+               for (i = RETVAL_len_; i; --i) {
+                   PUSHs(sv_2mortal(newSVnv(*r++)));
+               }
+           }
+           else {
+               if (RETVAL_len_) {
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
+                       (STRLEN)RETVAL_len_ * sizeof(jfloat))));
+               }
+               else
+                   PUSHs(&PL_sv_no);
+           }
+           (*env)->ReleaseFloatArrayElements(env, array,RETVAL,JNI_ABORT);
+           RESTOREENV;
+       }
+
+jdouble *
+GetDoubleArrayElements(array)
+       JNIEnv *                env = FETCHENV;
+       jsize                   RETVAL_len_ = NO_INIT;
+       jdoubleArray            array
+       jboolean                isCopy = NO_INIT;
+    PPCODE:
+       {
+           RETVAL = (*env)->GetDoubleArrayElements(env, array,&isCopy);
+           RETVAL_len_ = (*env)->GetArrayLength(env, array);
+           if (GIMME == G_ARRAY) {
+               int i;
+               jdouble* r = RETVAL;
+               EXTEND(sp, RETVAL_len_);
+               for (i = RETVAL_len_; i; --i) {
+                   PUSHs(sv_2mortal(newSVnv(*r++)));
+               }
+           }
+           else {
+               if (RETVAL_len_) {
+                   PUSHs(sv_2mortal(newSVpvn((char*)RETVAL,
+                       (STRLEN)RETVAL_len_ * sizeof(jdouble))));
+               }
+               else
+                   PUSHs(&PL_sv_no);
+           }
+           (*env)->ReleaseDoubleArrayElements(env, array,RETVAL,JNI_ABORT);
+           RESTOREENV;
+       }
+
+void
+GetBooleanArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       jbooleanArray           array
+       jsize                   start
+       jsize                   len
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
+       jboolean *              buf = (jboolean*)sv_grow(ST(3),len * sizeof(jboolean)+1);
+    CODE:
+       {
+           (*env)->GetBooleanArrayRegion(env, array,start,len,buf);
+           SvCUR_set(ST(3), len * sizeof(jboolean));
+           *SvEND(ST(3)) = '\0';
+           RESTOREENV;
+       }
+
+void
+GetByteArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       jbyteArray              array
+       jsize                   start
+       jsize                   len
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
+       jbyte *                 buf = (jbyte*)sv_grow(ST(3),len * sizeof(jbyte)+1);
+    CODE:
+       {
+           (*env)->GetByteArrayRegion(env, array,start,len,buf);
+           SvCUR_set(ST(3), len * sizeof(jbyte));
+           *SvEND(ST(3)) = '\0';
+           RESTOREENV;
+       }
+
+void
+GetCharArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       jcharArray              array
+       jsize                   start
+       jsize                   len
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
+       jchar *                 buf = (jchar*)sv_grow(ST(3),len * sizeof(jchar)+1);
+    CODE:
+       {
+           (*env)->GetCharArrayRegion(env, array,start,len,buf);
+           SvCUR_set(ST(3), len * sizeof(jchar));
+           *SvEND(ST(3)) = '\0';
+           RESTOREENV;
+       }
+
+void
+GetShortArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       jshortArray             array
+       jsize                   start
+       jsize                   len
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
+       jshort *                buf = (jshort*)sv_grow(ST(3),len * sizeof(jshort)+1);
+    CODE:
+       {
+           (*env)->GetShortArrayRegion(env, array,start,len,buf);
+           SvCUR_set(ST(3), len * sizeof(jshort));
+           *SvEND(ST(3)) = '\0';
+           RESTOREENV;
+       }
+
+void
+GetIntArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       jintArray               array
+       jsize                   start
+       jsize                   len
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
+       jint *                  buf = (jint*)sv_grow(ST(3),len * sizeof(jint)+1);
+    CODE:
+       {
+           (*env)->GetIntArrayRegion(env, array,start,len,buf);
+           SvCUR_set(ST(3), len * sizeof(jint));
+           *SvEND(ST(3)) = '\0';
+           RESTOREENV;
+       }
+
+void
+GetLongArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       jlongArray              array
+       jsize                   start
+       jsize                   len
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
+       jlong *                 buf = (jlong*)sv_grow(ST(3),len * sizeof(jlong)+1);
+    CODE:
+       {
+           (*env)->GetLongArrayRegion(env, array,start,len,buf);
+           SvCUR_set(ST(3), len * sizeof(jlong));
+           *SvEND(ST(3)) = '\0';
+           RESTOREENV;
+       }
+
+void
+GetFloatArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       jfloatArray             array
+       jsize                   start
+       jsize                   len
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
+       jfloat *                buf = (jfloat*)sv_grow(ST(3),len * sizeof(jfloat)+1);
+    CODE:
+       {
+           (*env)->GetFloatArrayRegion(env, array,start,len,buf);
+           SvCUR_set(ST(3), len * sizeof(jfloat));
+           *SvEND(ST(3)) = '\0';
+           RESTOREENV;
+       }
+
+void
+GetDoubleArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       jdoubleArray            array
+       jsize                   start
+       jsize                   len
+       STRLEN                  tmplen = len * sizeof(jboolean) + 1;
+       char *                  tmpbuf = (char*)sv_pvn_force(ST(3), &tmplen);
+       jdouble *               buf = (jdouble*)sv_grow(ST(3),len * sizeof(jdouble)+1);
+    CODE:
+       {
+           (*env)->GetDoubleArrayRegion(env, array,start,len,buf);
+           SvCUR_set(ST(3), len * sizeof(jdouble));
+           *SvEND(ST(3)) = '\0';
+           RESTOREENV;
+       }
+
+void
+SetBooleanArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jbooleanArray           array
+       jsize                   start
+       jsize                   len
+       jsize                   buf_len_ = NO_INIT;
+       jboolean *              buf
+    CODE:
+       {
+           if (buf_len_ < len)
+               croak("string is too short");
+           else if (buf_len_ > len && PL_dowarn)
+               warn("string is too long");
+           (*env)->SetBooleanArrayRegion(env, array,start,len,buf);
+           RESTOREENV;
+       }
+
+void
+SetByteArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jbyteArray              array
+       jsize                   start
+       jsize                   len
+       jsize                   buf_len_ = NO_INIT;
+       jbyte *                 buf
+    CODE:
+       {
+           if (buf_len_ < len)
+               croak("string is too short");
+           else if (buf_len_ > len && PL_dowarn)
+               warn("string is too long");
+           (*env)->SetByteArrayRegion(env, array,start,len,buf);
+           RESTOREENV;
+       }
+
+void
+SetCharArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jcharArray              array
+       jsize                   start
+       jsize                   len
+       jsize                   buf_len_ = NO_INIT;
+       jchar *                 buf
+    CODE:
+       {
+           if (buf_len_ < len)
+               croak("string is too short");
+           else if (buf_len_ > len && PL_dowarn)
+               warn("string is too long");
+           (*env)->SetCharArrayRegion(env, array,start,len,buf);
+           RESTOREENV;
+       }
+
+void
+SetShortArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jshortArray             array
+       jsize                   start
+       jsize                   len
+       jsize                   buf_len_ = NO_INIT;
+       jshort *                buf
+    CODE:
+       {
+           if (buf_len_ < len)
+               croak("string is too short");
+           else if (buf_len_ > len && PL_dowarn)
+               warn("string is too long");
+           (*env)->SetShortArrayRegion(env, array,start,len,buf);
+           RESTOREENV;
+       }
+
+void
+SetIntArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jintArray               array
+       jsize                   start
+       jsize                   len
+       jsize                   buf_len_ = NO_INIT;
+       jint *                  buf
+    CODE:
+       {
+           if (buf_len_ < len)
+               croak("string is too short");
+           else if (buf_len_ > len && PL_dowarn)
+               warn("string is too long");
+           (*env)->SetIntArrayRegion(env, array,start,len,buf);
+           RESTOREENV;
+       }
+
+void
+SetLongArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jlongArray              array
+       jsize                   start
+       jsize                   len
+       jsize                   buf_len_ = NO_INIT;
+       jlong *                 buf
+    CODE:
+       {
+           if (buf_len_ < len)
+               croak("string is too short");
+           else if (buf_len_ > len && PL_dowarn)
+               warn("string is too long");
+           (*env)->SetLongArrayRegion(env, array,start,len,buf);
+           RESTOREENV;
+       }
+
+void
+SetFloatArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jfloatArray             array
+       jsize                   start
+       jsize                   len
+       jsize                   buf_len_ = NO_INIT;
+       jfloat *                buf
+    CODE:
+       {
+           if (buf_len_ < len)
+               croak("string is too short");
+           else if (buf_len_ > len && PL_dowarn)
+               warn("string is too long");
+           (*env)->SetFloatArrayRegion(env, array,start,len,buf);
+           RESTOREENV;
+       }
+
+void
+SetDoubleArrayRegion(array,start,len,buf)
+       JNIEnv *                env = FETCHENV;
+       STRLEN                  tmplen = NO_INIT;
+       jdoubleArray            array
+       jsize                   start
+       jsize                   len
+       jsize                   buf_len_ = NO_INIT;
+       jdouble *               buf
+    CODE:
+       {
+           if (buf_len_ < len)
+               croak("string is too short");
+           else if (buf_len_ > len && PL_dowarn)
+               warn("string is too long");
+           (*env)->SetDoubleArrayRegion(env, array,start,len,buf);
+           RESTOREENV;
+       }
+
+SysRet
+RegisterNatives(clazz,methods,nMethods)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+       JNINativeMethod *       methods
+       jint                    nMethods
+    CODE:
+       {
+           RETVAL = (*env)->RegisterNatives(env, clazz,methods,nMethods);
+       }
+
+SysRet
+UnregisterNatives(clazz)
+       JNIEnv *                env = FETCHENV;
+       jclass                  clazz
+    CODE:
+       {
+           RETVAL = (*env)->UnregisterNatives(env, clazz);
+       }
+    OUTPUT:
+       RETVAL  
+   
+SysRet
+MonitorEnter(obj)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+    CODE:
+       {
+           RETVAL = (*env)->MonitorEnter(env, obj);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+SysRet
+MonitorExit(obj)
+       JNIEnv *                env = FETCHENV;
+       jobject                 obj
+    CODE:
+       {
+           RETVAL = (*env)->MonitorExit(env, obj);
+           RESTOREENV;
+       }
+    OUTPUT:
+       RETVAL
+
+JavaVM *
+GetJavaVM(...)
+       JNIEnv *                env = FETCHENV;
+    CODE:
+       {
+#ifdef JPL_DEBUG
+           jpldebug = 1;
+#else
+           jpldebug = 0;
+#endif
+           if (env) {  /* We're embedded. */
+               if ((*env)->GetJavaVM(env, &RETVAL) < 0)
+                   RETVAL = 0;
+           }
+           else {      /* We're embedding. */
+#ifdef KAFFE
+                JavaVMInitArgs vm_args;
+#else
+                JDK1_1InitArgs vm_args;
+#endif
+               char *lib;
+               if (jpldebug) {
+                   fprintf(stderr, "We're embedding Java in Perl.\n");
+               }
+
+               if (items--) {
+                   ++mark;
+                   lib = SvPV(*mark, PL_na);
+               }
+               else
+                   lib = 0;
+               if (jpldebug) {
+                   fprintf(stderr, "lib is %s.\n", lib);
+               }
+#ifdef WIN32
+        if (LoadLibrary("jvm.dll")) {
+            if (!LoadLibrary("javai.dll")) {
+                warn("Can't load javai.dll");
+            }
+        } else {
+            if (lib && !LoadLibrary(lib))
+                croak("Can't load javai.dll"); 
+        }
+#else
+               if (jpldebug) {
+                   fprintf(stderr, "Opening Java shared library.\n");
+                }
+#ifdef KAFFE
+               if (!dlopen("libkaffevm.so", RTLD_LAZY|RTLD_GLOBAL)) {
+#else
+               if (!dlopen("libjava.so", RTLD_LAZY|RTLD_GLOBAL)) {
+#endif
+                   if (lib && !dlopen(lib, RTLD_LAZY|RTLD_GLOBAL))
+                       croak("Can't load Java shared library.");
+               }
+#endif
+               /* Kaffe seems to get very upset if vm_args.version isn't set */
+#ifdef KAFFE
+               vm_args.version = JNI_VERSION_1_1;
+#endif
+               JNI_GetDefaultJavaVMInitArgs(&vm_args);
+               vm_args.exit = &call_my_exit;
+               if (jpldebug) {
+            fprintf(stderr, "items = %d\n", items);
+            fprintf(stderr, "mark = %s\n", SvPV(*mark, PL_na));
+        }
+               while (items > 1) {
+                 char *s;
+                   ++mark;
+                   s = SvPV(*mark,PL_na);
+                   ++mark;
+                   if (jpldebug) {
+                fprintf(stderr, "*s = %s\n", s);
+                fprintf(stderr, "val = %s\n", SvPV(*mark, PL_na));
+            }
+                   items -= 2;
+                   if (strEQ(s, "checkSource"))
+                       vm_args.checkSource = (jint)SvIV(*mark);
+                   else if (strEQ(s, "nativeStackSize"))
+                       vm_args.nativeStackSize = (jint)SvIV(*mark);
+                   else if (strEQ(s, "javaStackSize"))
+                       vm_args.javaStackSize = (jint)SvIV(*mark);
+                   else if (strEQ(s, "minHeapSize"))
+                       vm_args.minHeapSize = (jint)SvIV(*mark);
+                   else if (strEQ(s, "maxHeapSize"))
+                       vm_args.maxHeapSize = (jint)SvIV(*mark);
+                   else if (strEQ(s, "verifyMode"))
+                       vm_args.verifyMode = (jint)SvIV(*mark);
+                   else if (strEQ(s, "classpath"))
+                       vm_args.classpath = savepv(SvPV(*mark,PL_na));
+                   else if (strEQ(s, "enableClassGC"))
+                       vm_args.enableClassGC = (jint)SvIV(*mark);
+                   else if (strEQ(s, "enableVerboseGC"))
+                       vm_args.enableVerboseGC = (jint)SvIV(*mark);
+                   else if (strEQ(s, "disableAsyncGC"))
+                       vm_args.disableAsyncGC = (jint)SvIV(*mark);
+#ifdef KAFFE
+                   else if (strEQ(s, "libraryhome"))
+                       vm_args.libraryhome = savepv(SvPV(*mark,PL_na));
+                   else if (strEQ(s, "classhome"))
+                       vm_args.classhome = savepv(SvPV(*mark,PL_na));
+                   else if (strEQ(s, "enableVerboseJIT"))
+                       vm_args.enableVerboseJIT = (jint)SvIV(*mark); 
+                   else if (strEQ(s, "enableVerboseClassloading"))
+                       vm_args.enableVerboseClassloading = (jint)SvIV(*mark); 
+                   else if (strEQ(s, "enableVerboseCall"))
+                       vm_args.enableVerboseCall = (jint)SvIV(*mark); 
+                   else if (strEQ(s, "allocHeapSize"))
+                       vm_args.allocHeapSize = (jint)SvIV(*mark); 
+#else
+                   else if (strEQ(s, "verbose"))
+                       vm_args.verbose = (jint)SvIV(*mark); 
+                   else if (strEQ(s, "debugging"))
+                       vm_args.debugging = (jboolean)SvIV(*mark);
+                   else if (strEQ(s, "debugPort"))
+                       vm_args.debugPort = (jint)SvIV(*mark); 
+#endif
+                   else
+                       croak("unrecognized option: %s", s);
+               }
+
+               if (jpldebug) {
+                   fprintf(stderr, "Creating Java VM...\n");
+                   fprintf(stderr, "Working CLASSPATH: %s\n", 
+                       vm_args.classpath);
+               }
+               if (JNI_CreateJavaVM(&RETVAL, &jplcurenv, &vm_args) < 0) {
+                  croak("Unable to create instance of JVM");
+                }
+               if (jpldebug) {
+                   fprintf(stderr, "Created Java VM.\n");
+               }
+
+           }
+       }
+
index 146e3d0..a4865b5 100644 (file)
-#!/usr/bin/perl\r
-use ExtUtils::MakeMaker;\r
-use Getopt::Std;\r
-use Config;\r
-$ARCHNAME = $Config{archname};\r
-use File::Basename;\r
-\r
-getopts('e'); # embedding?\r
-\r
-$CCFLAGS .= $ENV{CCFLAGS} if defined $ENV{CCFLAGS};\r
-\r
-# $USE_KAFFE is a boolean that tells us whether or not we should use Kaffe.\r
-# Set by find_includes (it seemed as good a place as any).\r
-\r
-# Note that we don't check to see the version of Kaffe is one we support.\r
-#  Currently, the only one we support is the one from CVS.\r
-\r
-my $USE_KAFFE = 0;\r
-\r
-#require "JNIConfig";\r
-\r
-if ($^O eq 'solaris') {\r
-    $LIBPATH = " -R$Config{archlib}/CORE -L$Config{archlib}/CORE";\r
-} elsif ($^O eq 'MSWin32') {\r
-    $LIBPATH = " -L$Config{archlib}\\CORE";\r
-    # MSR - added MS VC++ default library path\r
-    # bjepson - fixed to support path names w/spaces in them.\r
-    push(@WINLIBS, (split"\;",$ENV{LIB}));\r
-    grep s/\\$//, @WINLIBS; # eliminate trailing \\r
-    grep s/\/$//, @WINLIBS; # eliminate trailing /\r
-    $LIBPATH .= join(" ", "", map { qq["-L$_" ] } @WINLIBS);\r
-} else {\r
-    $LIBPATH = " -L$Config{archlib}/CORE";\r
-}\r
-#$LIBS = " -lperl";\r
-\r
-# Figure out where Java might live\r
-#\r
-# MSR - added JDK 1.3\r
-#\r
-\r
-my @JAVA_HOME_GUESSES = qw(/usr/local/java /usr/java /usr/local/jdk117_v3\r
-                         C:\\JDK1.1.8 C:\\JDK1.2.1 C:\\JDK1.2.2 C:\\JDK1.3 );\r
-\r
-my @KAFFE_PREFIX_GUESSES = qw(/usr/local /usr);\r
-\r
-if (! defined $ENV{JAVA_HOME}) {\r
-        print "You didn't define JAVA_HOME, so I'm trying a few guesses.\n";\r
-        print "If this fails, you might want to try setting JAVA_HOME and\n";\r
-        print "running me again.\n";\r
-} else {\r
-        @JAVA_HOME_GUESSES = ( $ENV{JAVA_HOME} );\r
-}\r
-\r
-if (! defined $ENV{KAFFE_PREFIX}) {\r
-        print "\nYou didn't define KAFFE_PREFIX, so I'm trying a few guesses.",\r
-          "\nIf this fails, and you are using Kaffe, you might want to try\n",\r
-          "setting KAFFE_PREFIX and running me again.\n",\r
-          "If you want to ignore any possible Kaffe installation, set the\n",\r
-          "KAFFE_PREFIX to and empty string.\n\n";\r
-} else {\r
-        @KAFFE_PREFIX_GUESSES = ($ENV{KAFFE_PREFIX} eq "") ? () :\r
-                                                       ( $ENV{KAFFE_PREFIX} );\r
-}\r
-\r
-my(@KAFFE_INCLUDE_GUESSES, @KAFFE_LIB_GUESSES);\r
-foreach my $kaffePrefix (@KAFFE_PREFIX_GUESSES) {\r
-     push(@KAFFE_INCLUDE_GUESSES, "$kaffePrefix/include/kaffe");\r
-     push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib");\r
-     push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib/kaffe");\r
-}\r
-    $guess .= "/include/kaffe";\r
-\r
-# Let's find out where jni.h lives\r
-#\r
-my @INCLUDE = find_includes();\r
-\r
-if ($^O eq 'MSWin32') {\r
-  # MSR - added MS VC++ default include path\r
-  push(@INCLUDE,(split"\;",$ENV{INCLUDE}));\r
-  grep s/\\$//, @INCLUDE; # remove trailing \\r
-  grep s/\/$//, @INCLUDE; # remove trailing \\r
-  $INC = join("", map { qq["-I$_" ] } @INCLUDE);\r
-\r
-} else {\r
-  $INC = join(" -I", ("", @INCLUDE));\r
-}\r
-\r
-# Let's find out the name of the Java shared library\r
-#\r
-my @JAVALIBS = find_libs();\r
-\r
-# Find out some defines based on the library we are linking to\r
-#\r
-foreach (@JAVALIBS) {\r
-    if ( $^O eq 'MSWin32') { # We're on Win32\r
-        $INC =~ s#/#\\#g;\r
-        $INC =~ s#\\$##;\r
-         print $INC, "\n";\r
-        $CCFLAGS .= " -DWIN32 -Z7 -D_DEBUG";\r
-        $MYEXTLIB = "$libjava";\r
-      }\r
-}\r
-\r
-$CCFLAGS .= " -DKAFFE" if ($USE_KAFFE);\r
-\r
-# Let's find out the path of the library we need to link against.\r
-#\r
-foreach (@JAVALIBS) {\r
-    if ($^O eq 'MSWin32') { # We're on Win32\r
-        $_ =~ s#/#\\\\#g;\r
-    }\r
-    my ($libname, $libpath, $libsuffix) = fileparse($_, ("\.so", "\.lib"));\r
-    $libname =~ s/^lib//;\r
-    if ($^O eq 'solaris') {\r
-        $LIBPATH .= " -R$libpath -L$libpath"\r
-    } else {\r
-        $LIBPATH .= " -L$libpath"\r
-    }\r
-    $LIBS .= " -l$libname";\r
-}\r
-\r
-# Do we need -D_REENTRANT?\r
-if ($LIBPATH =~ /native/) {\r
-    print "Looks like native threads...\n";\r
-    $CCFLAGS .= " -D_REENTRANT";\r
-}\r
-\r
-if ($opt_e) {\r
-    print "We're embedding Perl in Java via libPerlInterpreter.so.\n";\r
-    eval `../setvars -perl`;\r
-    $CCFLAGS .= " -DEMBEDDEDPERL";\r
-    $LIBPATH .= " -R$ENV{JPL_HOME}/lib/$ARCHNAME -L$ENV{JPL_HOME}/lib/$ARCHNAME";\r
-    $LIBS    .= " -lPerlInterpreter";\r
-}\r
-\r
-# Needed for JNI.\r
-if ($^O eq 'solaris') {\r
-    $LIBS = " -lthread -lc $LIBS"; #-lthread must be first!!!\r
-    $CCFLAGS .= " -D_REENTRANT";\r
-}\r
-\r
-# MSR - clean up LIBS\r
-$LIBS =~ s/-l$//;\r
-\r
-#\r
-# Next, build JNI/Config.pm.  This is a superfluous thing for the SUN and\r
-# Microsoft JDKs, but absolutely necessary for Kaffe.  I think at some\r
-# point, the Microsoft and SUN implementations should use JNI::Config, too.\r
-#\r
-\r
-if (! -d "JNI") {\r
-    mkdir("JNI", 0755) || die "Unable to make JNI directory: $!";\r
-}\r
-open(JNICONFIG, ">JNI/Config.pm") || die "Unable to open JNI/Config.pm: $!";\r
-\r
-print JNICONFIG "# DO NOT EDIT!   Autogenerated by JNI/Makefile.PL\n\n",\r
-                "package JNI::Config;\nuse strict;\nuse Carp;\n",\r
-                "\nuse vars qw(\$KAFFE \$LIB_JAVA \$CLASS_HOME ",\r
-                "\$LIB_HOME);\n\n",\r
-                "\$KAFFE = $USE_KAFFE;\n\$LIB_JAVA = \"$JAVALIBS[0]\";\n";\r
-if ($USE_KAFFE) {\r
-  my $path = $JAVALIBS[0];\r
-  $path =~ s%/(kaffe/)?libkaffevm.so$%%;\r
-\r
-  print JNICONFIG "\$LIB_HOME = \"$path/kaffe\";\n";\r
-  $path =~ s%/lib%%;\r
-  print JNICONFIG "\$CLASS_HOME = \"$path/share/kaffe\";\n";\r
-}\r
-print JNICONFIG "\n\n1;\n";\r
-close JNICONFIG;\r
-\r
-\r
-my %Makefile = (\r
-    NAME        => 'JNI',\r
-    VERSION_FROM => 'JNI.pm',\r
-    DEFINE        => '',\r
-    LINKTYPE => 'dynamic',\r
-    INC        => $INC,\r
-    CCFLAGS => "$Config{ccflags} $CCFLAGS", \r
-    ($Config{archname} =~ /mswin32.*-object/i ? ('CAPI' => 'TRUE') : ()),\r
-\r
-    clean => {FILES => "JNI/* JNI"}\r
-);\r
-\r
-$Makefile{LIBS} = ["$LIBPATH $LIBS"];\r
-if ($MYEXTLIB) {\r
-    $Makefile{MYEXTLIB} = $MYEXTLIB;\r
-}\r
-\r
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence\r
-# the contents of the Makefile that is written.\r
-#\r
-WriteMakefile(%Makefile);\r
-\r
-if ($USE_KAFFE) {\r
-  my $path = $JAVALIBS[0];\r
-  $path =~ s%/libkaffevm.so$%%;\r
-  print "\n\n***NOTE: be sure to have:\n",\r
-            "              LD_LIBRARY_PATH=$path\n",\r
-            "         in your enviornment (or installed as a system dynamic\n",\r
-            "         library location) when you compile and run this.\n";\r
-}\r
-\r
-# subroutine to find a library\r
-#\r
-sub find_stuff {\r
-\r
-    my ($candidates, $locations) = @_;\r
-    my $lib;\r
-    $wanted = sub {\r
-        foreach my $name (@$candidates) {\r
-            if (/$name$/ and ! /green_threads/ and !/include-old/) {\r
-                    $lib = $File::Find::name;\r
-            }\r
-        }\r
-    };\r
-    \r
-    use File::Find;\r
-    foreach my $guess (@$locations) {\r
-        next unless -d $guess;\r
-        find (\&$wanted, $guess);\r
-    }\r
-    if (! $lib) {\r
-        print "Could not find @$candidates\n";\r
-    } else {\r
-        print "Found @$candidates as $lib\n\n";\r
-    }\r
-    return $lib;\r
-}\r
-\r
-# Extra lib for Java 1.2\r
-#\r
-#  if we want KAFFE, check for it, otherwise search for Java\r
-\r
-sub find_libs {\r
-  my($libjava, $libawt, $libjvm);\r
-\r
-  if ($USE_KAFFE) {\r
-    $libjava = find_stuff(['libkaffevm.so'], \@KAFFE_LIB_GUESSES);\r
-    $libawt = find_stuff(['libawt.so'], \@KAFFE_LIB_GUESSES);\r
-  } else {\r
-    $libjava = find_stuff(['libjava.so', 'javai.lib', 'jvm.lib'],\r
-                             \@JAVA_HOME_GUESSES);\r
-    $libjvm  = find_stuff(['libjvm.so'],  \@JAVA_HOME_GUESSES);\r
-    $libawt  = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);\r
-    if (defined $libjvm) { # JDK 1.2\r
-      my $libhpi  = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);\r
-      return($libjava, $libjvm, $libhpi, $libawt);\r
-    }\r
-  }\r
-  return($libjava, $libawt);\r
-}\r
-\r
-# We need to find jni.h and jni_md.h\r
-#\r
-\r
-# Always do find_includes as the first operation, as it has the side effect\r
-# of deciding whether or not we are looking for Kaffe.  --bkuhn\r
-\r
-sub find_includes {\r
-\r
-  my @CANDIDATES = qw(jni.h jni_md.h);\r
-  my @includes;\r
-\r
-  sub find_inc {\r
-    foreach my $name (@CANDIDATES) {\r
-      if (/$name$/) {\r
-       my ($hname, $hpath, $hsuffix) = \r
-         fileparse($File::Find::name, ("\.h", "\.H"));\r
-       unless ($hpath =~ /include-old/) {\r
-         print "Found $hname$hsuffix in $hpath\n";\r
-         push @includes, $hpath;\r
-       } \r
-      }\r
-    }\r
-  }\r
-    \r
-  use File::Find;\r
-  foreach my $guess (@KAFFE_INCLUDE_GUESSES) {\r
-    next unless -d $guess;\r
-    find (\&find_inc, $guess);\r
-  }\r
-  # If we have found includes, then we are using Kaffe.\r
-  if (@includes > 0) {\r
-    $USE_KAFFE = 1;\r
-  } else {\r
-    foreach my $guess (@JAVA_HOME_GUESSES) {\r
-      next unless -d $guess;\r
-      find (\&find_inc, $guess);\r
-    }\r
-  }\r
-  die "Could not find Java includes!" unless (@includes);\r
-\r
-  return @includes;\r
-}\r
-\r
+#!/usr/bin/perl
+use ExtUtils::MakeMaker;
+use Getopt::Std;
+use Config;
+$ARCHNAME = $Config{archname};
+use File::Basename;
+
+getopts('e'); # embedding?
+
+$CCFLAGS .= $ENV{CCFLAGS} if defined $ENV{CCFLAGS};
+
+# $USE_KAFFE is a boolean that tells us whether or not we should use Kaffe.
+# Set by find_includes (it seemed as good a place as any).
+
+# Note that we don't check to see the version of Kaffe is one we support.
+#  Currently, the only one we support is the one from CVS.
+
+my $USE_KAFFE = 0;
+
+#require "JNIConfig";
+
+if ($^O eq 'solaris') {
+    $LIBPATH = " -R$Config{archlib}/CORE -L$Config{archlib}/CORE";
+} elsif ($^O eq 'MSWin32') {
+    $LIBPATH = " -L$Config{archlib}\\CORE";
+    # MSR - added MS VC++ default library path
+    # bjepson - fixed to support path names w/spaces in them.
+    push(@WINLIBS, (split"\;",$ENV{LIB}));
+    grep s/\\$//, @WINLIBS; # eliminate trailing \
+    grep s/\/$//, @WINLIBS; # eliminate trailing /
+    $LIBPATH .= join(" ", "", map { qq["-L$_" ] } @WINLIBS);
+} else {
+    $LIBPATH = " -L$Config{archlib}/CORE";
+}
+#$LIBS = " -lperl";
+
+# Figure out where Java might live
+#
+# MSR - added JDK 1.3
+#
+
+my @JAVA_HOME_GUESSES = qw(/usr/local/java /usr/java /usr/local/jdk117_v3
+                         C:\\JDK1.1.8 C:\\JDK1.2.1 C:\\JDK1.2.2 C:\\JDK1.3 );
+
+my @KAFFE_PREFIX_GUESSES = qw(/usr/local /usr);
+
+if (! defined $ENV{JAVA_HOME}) {
+        print "You didn't define JAVA_HOME, so I'm trying a few guesses.\n";
+        print "If this fails, you might want to try setting JAVA_HOME and\n";
+        print "running me again.\n";
+} else {
+        @JAVA_HOME_GUESSES = ( $ENV{JAVA_HOME} );
+}
+
+if (! defined $ENV{KAFFE_PREFIX}) {
+        print "\nYou didn't define KAFFE_PREFIX, so I'm trying a few guesses.",
+          "\nIf this fails, and you are using Kaffe, you might want to try\n",
+          "setting KAFFE_PREFIX and running me again.\n",
+          "If you want to ignore any possible Kaffe installation, set the\n",
+          "KAFFE_PREFIX to and empty string.\n\n";
+} else {
+        @KAFFE_PREFIX_GUESSES = ($ENV{KAFFE_PREFIX} eq "") ? () :
+                                                       ( $ENV{KAFFE_PREFIX} );
+}
+
+my(@KAFFE_INCLUDE_GUESSES, @KAFFE_LIB_GUESSES);
+foreach my $kaffePrefix (@KAFFE_PREFIX_GUESSES) {
+     push(@KAFFE_INCLUDE_GUESSES, "$kaffePrefix/include/kaffe");
+     push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib");
+     push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib/kaffe");
+}
+    $guess .= "/include/kaffe";
+
+# Let's find out where jni.h lives
+#
+my @INCLUDE = find_includes();
+
+if ($^O eq 'MSWin32') {
+  # MSR - added MS VC++ default include path
+  push(@INCLUDE,(split"\;",$ENV{INCLUDE}));
+  grep s/\\$//, @INCLUDE; # remove trailing \
+  grep s/\/$//, @INCLUDE; # remove trailing \
+  $INC = join("", map { qq["-I$_" ] } @INCLUDE);
+
+} else {
+  $INC = join(" -I", ("", @INCLUDE));
+}
+
+# Let's find out the name of the Java shared library
+#
+my @JAVALIBS = find_libs();
+
+# Find out some defines based on the library we are linking to
+#
+foreach (@JAVALIBS) {
+    if ( $^O eq 'MSWin32') { # We're on Win32
+        $INC =~ s#/#\\#g;
+        $INC =~ s#\\$##;
+         print $INC, "\n";
+        $CCFLAGS .= " -DWIN32 -Z7 -D_DEBUG";
+        $MYEXTLIB = "$libjava";
+      }
+}
+
+$CCFLAGS .= " -DKAFFE" if ($USE_KAFFE);
+
+# Let's find out the path of the library we need to link against.
+#
+foreach (@JAVALIBS) {
+    if ($^O eq 'MSWin32') { # We're on Win32
+        $_ =~ s#/#\\\\#g;
+    }
+    my ($libname, $libpath, $libsuffix) = fileparse($_, ("\.so", "\.lib"));
+    $libname =~ s/^lib//;
+    if ($^O eq 'solaris') {
+        $LIBPATH .= " -R$libpath -L$libpath"
+    } else {
+        $LIBPATH .= " -L$libpath"
+    }
+    $LIBS .= " -l$libname";
+}
+
+# Do we need -D_REENTRANT?
+if ($LIBPATH =~ /native/) {
+    print "Looks like native threads...\n";
+    $CCFLAGS .= " -D_REENTRANT";
+}
+
+if ($opt_e) {
+    print "We're embedding Perl in Java via libPerlInterpreter.so.\n";
+    eval `../setvars -perl`;
+    $CCFLAGS .= " -DEMBEDDEDPERL";
+    $LIBPATH .= " -R$ENV{JPL_HOME}/lib/$ARCHNAME -L$ENV{JPL_HOME}/lib/$ARCHNAME";
+    $LIBS    .= " -lPerlInterpreter";
+}
+
+# Needed for JNI.
+if ($^O eq 'solaris') {
+    $LIBS = " -lthread -lc $LIBS"; #-lthread must be first!!!
+    $CCFLAGS .= " -D_REENTRANT";
+}
+
+# MSR - clean up LIBS
+$LIBS =~ s/-l$//;
+
+#
+# Next, build JNI/Config.pm.  This is a superfluous thing for the SUN and
+# Microsoft JDKs, but absolutely necessary for Kaffe.  I think at some
+# point, the Microsoft and SUN implementations should use JNI::Config, too.
+#
+
+if (! -d "JNI") {
+    mkdir("JNI", 0755) || die "Unable to make JNI directory: $!";
+}
+open(JNICONFIG, ">JNI/Config.pm") || die "Unable to open JNI/Config.pm: $!";
+
+print JNICONFIG "# DO NOT EDIT!   Autogenerated by JNI/Makefile.PL\n\n",
+                "package JNI::Config;\nuse strict;\nuse Carp;\n",
+                "\nuse vars qw(\$KAFFE \$LIB_JAVA \$CLASS_HOME ",
+                "\$LIB_HOME);\n\n",
+                "\$KAFFE = $USE_KAFFE;\n\$LIB_JAVA = \"$JAVALIBS[0]\";\n";
+if ($USE_KAFFE) {
+  my $path = $JAVALIBS[0];
+  $path =~ s%/(kaffe/)?libkaffevm.so$%%;
+
+  print JNICONFIG "\$LIB_HOME = \"$path/kaffe\";\n";
+  $path =~ s%/lib%%;
+  print JNICONFIG "\$CLASS_HOME = \"$path/share/kaffe\";\n";
+}
+print JNICONFIG "\n\n1;\n";
+close JNICONFIG;
+
+
+my %Makefile = (
+    NAME        => 'JNI',
+    VERSION_FROM => 'JNI.pm',
+    DEFINE        => '',
+    LINKTYPE => 'dynamic',
+    INC        => $INC,
+    CCFLAGS => "$Config{ccflags} $CCFLAGS", 
+    ($Config{archname} =~ /mswin32.*-object/i ? ('CAPI' => 'TRUE') : ()),
+
+    clean => {FILES => "JNI/* JNI"}
+);
+
+$Makefile{LIBS} = ["$LIBPATH $LIBS"];
+if ($MYEXTLIB) {
+    $Makefile{MYEXTLIB} = $MYEXTLIB;
+}
+
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+#
+WriteMakefile(%Makefile);
+
+if ($USE_KAFFE) {
+  my $path = $JAVALIBS[0];
+  $path =~ s%/libkaffevm.so$%%;
+  print "\n\n***NOTE: be sure to have:\n",
+            "              LD_LIBRARY_PATH=$path\n",
+            "         in your enviornment (or installed as a system dynamic\n",
+            "         library location) when you compile and run this.\n";
+}
+
+# subroutine to find a library
+#
+sub find_stuff {
+
+    my ($candidates, $locations) = @_;
+    my $lib;
+    $wanted = sub {
+        foreach my $name (@$candidates) {
+            if (/$name$/ and ! /green_threads/ and !/include-old/) {
+                    $lib = $File::Find::name;
+            }
+        }
+    };
+    
+    use File::Find;
+    foreach my $guess (@$locations) {
+        next unless -d $guess;
+        find (\&$wanted, $guess);
+    }
+    if (! $lib) {
+        print "Could not find @$candidates\n";
+    } else {
+        print "Found @$candidates as $lib\n\n";
+    }
+    return $lib;
+}
+
+# Extra lib for Java 1.2
+#
+#  if we want KAFFE, check for it, otherwise search for Java
+
+sub find_libs {
+  my($libjava, $libawt, $libjvm);
+
+  if ($USE_KAFFE) {
+    $libjava = find_stuff(['libkaffevm.so'], \@KAFFE_LIB_GUESSES);
+    $libawt = find_stuff(['libawt.so'], \@KAFFE_LIB_GUESSES);
+  } else {
+    $libjava = find_stuff(['libjava.so', 'javai.lib', 'jvm.lib'],
+                             \@JAVA_HOME_GUESSES);
+    $libjvm  = find_stuff(['libjvm.so'],  \@JAVA_HOME_GUESSES);
+    $libawt  = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);
+    if (defined $libjvm) { # JDK 1.2
+      my $libhpi  = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);
+      return($libjava, $libjvm, $libhpi, $libawt);
+    }
+  }
+  return($libjava, $libawt);
+}
+
+# We need to find jni.h and jni_md.h
+#
+
+# Always do find_includes as the first operation, as it has the side effect
+# of deciding whether or not we are looking for Kaffe.  --bkuhn
+
+sub find_includes {
+
+  my @CANDIDATES = qw(jni.h jni_md.h);
+  my @includes;
+
+  sub find_inc {
+    foreach my $name (@CANDIDATES) {
+      if (/$name$/) {
+       my ($hname, $hpath, $hsuffix) = 
+         fileparse($File::Find::name, ("\.h", "\.H"));
+       unless ($hpath =~ /include-old/) {
+         print "Found $hname$hsuffix in $hpath\n";
+         push @includes, $hpath;
+       } 
+      }
+    }
+  }
+    
+  use File::Find;
+  foreach my $guess (@KAFFE_INCLUDE_GUESSES) {
+    next unless -d $guess;
+    find (\&find_inc, $guess);
+  }
+  # If we have found includes, then we are using Kaffe.
+  if (@includes > 0) {
+    $USE_KAFFE = 1;
+  } else {
+    foreach my $guess (@JAVA_HOME_GUESSES) {
+      next unless -d $guess;
+      find (\&find_inc, $guess);
+    }
+  }
+  die "Could not find Java includes!" unless (@includes);
+
+  return @includes;
+}
+
index 1192663..e27692f 100644 (file)
@@ -1,6 +1,6 @@
 package Net::Ping;
 
-# $Id: Ping.pm,v 1.33 2002/10/19 05:02:43 rob Exp $
+# $Id: Ping.pm,v 1.46 2002/12/02 19:17:09 rob Exp $
 
 require 5.002;
 require Exporter;
@@ -11,13 +11,13 @@ use vars qw(@ISA @EXPORT $VERSION
 use Fcntl qw( F_GETFL F_SETFL O_NONBLOCK );
 use Socket qw( SOCK_DGRAM SOCK_STREAM SOCK_RAW PF_INET SOL_SOCKET
                inet_aton inet_ntoa sockaddr_in );
-use POSIX qw( ECONNREFUSED EINPROGRESS WNOHANG );
+use POSIX qw( ECONNREFUSED EINPROGRESS EAGAIN WNOHANG );
 use FileHandle;
 use Carp;
 
 @ISA = qw(Exporter);
 @EXPORT = qw(pingecho);
-$VERSION = "2.23";
+$VERSION = "2.26";
 
 # Constants
 
@@ -157,6 +157,8 @@ sub new
       $self->{"fork_wr"} = FileHandle->new();
       pipe($self->{"fork_rd"}, $self->{"fork_wr"});
       $self->{"fh"} = FileHandle->new();
+      $self->{"good"} = {};
+      $self->{"bad"} = {};
     } else {
       $self->{"wbits"} = "";
       $self->{"bad"} = {};
@@ -665,7 +667,8 @@ sub open
 # of time.  Return the result of our efforts.
 
 use constant UDP_FLAGS => 0; # Nothing special on send or recv
-
+# XXX - Use concept by rdw @ perlmonks
+# http://perlmonks.thepen.com/42898.html
 sub ping_udp
 {
   my ($self,
@@ -761,8 +764,11 @@ sub ping_syn
   }
 
   # Set O_NONBLOCK property on filehandle
-  if (my $flags = fcntl($fh, F_GETFL, 0)) {
-    fcntl($fh, F_SETFL, $flags | O_NONBLOCK);
+  my $flags = 0;
+  if (fcntl($fh, F_GETFL, $flags)) {
+    if (!fcntl($fh, F_SETFL, $flags | O_NONBLOCK)) {
+      croak("fcntl F_SETFL: $!");
+    }
   } else {
     croak("fcntl F_GETFL: $!");
   }
@@ -771,16 +777,18 @@ sub ping_syn
   # by just sending the TCP SYN packet
   if (connect($fh, $saddr)) {
     # Non-blocking, yet still connected?
-    # Must have connected very quickly.
-    # Can this ever really happen?
-  }
-  else {
+    # Must have connected very quickly,
+    # or else it wasn't very non-blocking.
+    #warn "WARNING: Nonblocking connect connected anyway? ($^O)";
+  else {
     # Error occurred connecting.
-    # Hopefully the connection is just still in progress.
-    if ($! != EINPROGRESS) {
-      # If not, then it really is something bad.
+    if ($! == EINPROGRESS) {
+      # The connection is just still in progress.
+      # This is the expected condition.
+    } else {
+      # Just save the error and continue on.
+      # The ack() can check the status later.
       $self->{"bad"}->{$host} = $!;
-      return undef;
     }
   }
 
@@ -863,7 +871,16 @@ sub ack
     if (my $host = shift) {
       # Host passed as arg
       if (exists $self->{"bad"}->{$host}) {
-        return ();
+        if (!$self->{"tcp_econnrefused"} &&
+            $self->{"bad"}->{ $host } &&
+            (($! = ECONNREFUSED)>0) &&
+            $self->{"bad"}->{ $host } eq "$!") {
+          # "Connection refused" means reachable
+          # Good, continue
+        } else {
+          # ECONNREFUSED means no good
+          return ();
+        }
       }
       my $host_fd = undef;
       foreach my $fd (keys %{ $self->{"syn"} }) {
@@ -889,46 +906,75 @@ sub ack
     while ($wbits !~ /^\0*$/) {
       my $timeout = $stop_time - &time();
       # Force a minimum of 10 ms timeout.
-      $timeout = 0.01 if $timeout <= .01;
-      if (my $nfound = select(undef, (my $wout=$wbits), undef, $timeout)) {
-        # Done waiting for one of the ACKs
-        my $fd = 0;
-        # Determine which one
-        while (length $wout &&
-               !vec($wout, $fd, 1)) {
-          $fd++;
+      $timeout = 0.01 if $timeout <= 0.01;
+
+      my $winner_fd = undef;
+      my $wout = $wbits;
+      my $fd = 0;
+      # Do "bad" fds from $wbits first
+      while ($wout !~ /^\0*$/) {
+        if (vec($wout, $fd, 1)) {
+          # Wipe it from future scanning.
+          vec($wout, $fd, 1) = 0;
+          if (my $entry = $self->{"syn"}->{$fd}) {
+            if ($self->{"bad"}->{ $entry->[0] }) {
+              $winner_fd = $fd;
+              last;
+            }
+          }
+        }
+        $fd++;
+      }
+
+      if (defined($winner_fd) or my $nfound = select(undef, ($wout=$wbits), undef, $timeout)) {
+        if (defined $winner_fd) {
+          $fd = $winner_fd;
+        } else {
+          # Done waiting for one of the ACKs
+          $fd = 0;
+          # Determine which one
+          while ($wout !~ /^\0*$/ &&
+                 !vec($wout, $fd, 1)) {
+            $fd++;
+          }
         }
         if (my $entry = $self->{"syn"}->{$fd}) {
-          if (getpeername($entry->[2])) {
+          # Wipe it from future scanning.
+          delete $self->{"syn"}->{$fd};
+          vec($self->{"wbits"}, $fd, 1) = 0;
+          vec($wbits, $fd, 1) = 0;
+          if (!$self->{"tcp_econnrefused"} &&
+              $self->{"bad"}->{ $entry->[0] } &&
+              (($! = ECONNREFUSED)>0) &&
+              $self->{"bad"}->{ $entry->[0] } eq "$!") {
+            # "Connection refused" means reachable
+            # Good, continue
+          } elsif (getpeername($entry->[2])) {
             # Connection established to remote host
-            delete $self->{"syn"}->{$fd};
-            vec($self->{"wbits"}, $fd, 1) = 0;
-            return wantarray ?
-              ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]))
-              : $entry->[0];
+            # Good, continue
           } else {
             # TCP ACK will never come from this host
             # because there was an error connecting.
 
-            # Wipe it from future scanning.
-            delete $self->{"syn"}->{$fd};
-            vec($self->{"wbits"}, $fd, 1) = 0;
-            vec($wbits, $fd, 1) = 0;
-
             # This should set $! to the correct error.
             my $char;
             read($entry->[2],$char,1);
             # Store the excuse why the connection failed.
             $self->{"bad"}->{$entry->[0]} = $!;
             if (!$self->{"tcp_econnrefused"} &&
-                $! == ECONNREFUSED) {
+                (($! == ECONNREFUSED) ||
+                 ($! == EAGAIN && $^O =~ /cygwin/i))) {
               # "Connection refused" means reachable
-              return wantarray ?
-                ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]))
-                : $entry->[0];
+              # Good, continue
+            } else {
+              # No good, try the next socket...
+              next;
             }
-            # Try another socket...
           }
+          # Everything passed okay, return the answer
+          return wantarray ?
+            ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]))
+            : $entry->[0];
         } else {
           warn "Corrupted SYN entry: unknown fd [$fd] ready!";
           vec($wbits, $fd, 1) = 0;
@@ -957,26 +1003,34 @@ sub ack
 }
 
 sub ack_unfork {
-  my $self = shift;
+  my ($self,$host) = @_;
   my $stop_time = $self->{"stop_time"};
-  if (my $host = shift) {
+  if ($host) {
     # Host passed as arg
-    warn "Cannot specify host for ack on win32\n";
+    if (my $entry = $self->{"good"}->{$host}) {
+      delete $self->{"good"}->{$host};
+      return ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]));
+    }
   }
 
   my $rbits = "";
   my $timeout;
+
   if (keys %{ $self->{"syn"} }) {
     # Scan all hosts that are left
     vec($rbits, fileno($self->{"fork_rd"}), 1) = 1;
     $timeout = $stop_time - &time();
+    # Force a minimum of 10 ms timeout.
+    $timeout = 0.01 if $timeout < 0.01;
   } else {
     # No hosts left to wait for
     $timeout = 0;
   }
 
   if ($timeout > 0) {
-    if (my $nfound = select((my $rout=$rbits), undef, undef, $timeout)) {
+    my $nfound;
+    while ( keys %{ $self->{"syn"} } and
+           $nfound = select((my $rout=$rbits), undef, undef, $timeout)) {
       # Done waiting for one of the ACKs
       if (!sysread($self->{"fork_rd"}, $_, 10)) {
         # Socket closed, which means all children are done.
@@ -992,6 +1046,13 @@ sub ack_unfork {
           if (!$how || # If there was no error connecting
               (!$self->{"tcp_econnrefused"} &&
                $how == ECONNREFUSED)) {  # "Connection refused" means reachable
+            if ($host && $entry->[0] ne $host) {
+              # A good connection, but not the host we need.
+              # Move it from the "syn" hash to the "good" hash.
+              $self->{"good"}->{$entry->[0]} = $entry;
+              # And wait for the next winner
+              next;
+            }
             return ($entry->[0], &time() - $entry->[3], inet_ntoa($entry->[1]));
           }
         } else {
@@ -1001,7 +1062,8 @@ sub ack_unfork {
       } else {
         die "Empty response from status socket?";
       }
-    } elsif (defined $nfound) {
+    }
+    if (defined $nfound) {
       # Timed out waiting for ACK status
     } else {
       # Weird error occurred with select()
@@ -1051,7 +1113,7 @@ __END__
 
 Net::Ping - check a remote host for reachability
 
-$Id: Ping.pm,v 1.33 2002/10/19 05:02:43 rob Exp $
+$Id: Ping.pm,v 1.46 2002/12/02 19:17:09 rob Exp $
 
 =head1 SYNOPSIS
 
index 3b84af7..29022d2 100644 (file)
@@ -37,13 +37,14 @@ my $webs = {
   # Hopefully this is never a routeable host
   "172.29.249.249" => 0,
 
-  # Hopefully all these web servers are on
+  # Hopefully all these web ports are open
   "www.geocities.com." => 1,
   "www.freeservers.com." => 1,
   "yahoo.com." => 1,
   "www.yahoo.com." => 1,
   "www.about.com." => 1,
   "www.microsoft.com." => 1,
+  "127.0.0.1" => 1,
 };
 
 use strict;
@@ -54,6 +55,12 @@ plan tests => ((keys %{ $webs }) * 2 + 3);
 # Everything loaded fine
 ok 1;
 
+alarm(50);
+$SIG{ALRM} = sub {
+  ok 0;
+  die "TIMED OUT!";
+};
+
 my $p = new Net::Ping "syn", 10;
 
 # new() worked?
@@ -66,29 +73,23 @@ ok ($p -> {port_num} = getservbyname("http", "tcp"));
 foreach my $host (keys %{ $webs }) {
   # ping() does dns resolution and
   # only sends the SYN at this point
-  if ($p -> ping($host)) {
-    ok 1;
-  } else {
-    print STDERR "CANNOT RESOLVE $host\n";
-    ok 0;
+  alarm(50); # (Plenty for a DNS lookup)
+  if (!ok $p -> ping($host)) {
+    print STDERR "CANNOT RESOLVE $host $p->{bad}->{$host}\n";
   }
 }
 
+alarm(20);
 while (my $host = $p->ack()) {
-  if ($webs->{$host}) {
-    ok 1;
-  } else {
+  if (!ok $webs->{$host}) {
     print STDERR "SUPPOSED TO BE DOWN: http://$host/\n";
-    ok 0;
   }
   delete $webs->{$host};
 }
 
+alarm(0);
 foreach my $host (keys %{ $webs }) {
-  if ($webs->{$host}) {
-    print STDERR "DOWN: http://$host/\n";
-    ok 0;
-  } else {
-    ok 1;
+  if (!ok !$webs->{$host}) {
+    print STDERR "DOWN: http://$host/ [$p->{bad}->{$host}]\n";
   }
 }
diff --git a/lib/Net/Ping/t/410_syn_host.t b/lib/Net/Ping/t/410_syn_host.t
new file mode 100644 (file)
index 0000000..38bc7f2
--- /dev/null
@@ -0,0 +1,99 @@
+# Same as 400_ping_syn.t but testing ack( $host ) instead of ack( ).
+
+BEGIN {
+  if ($ENV{PERL_CORE}) {
+    unless ($ENV{PERL_TEST_Net_Ping}) {
+      print "1..0 # Skip: network dependent test\n";
+        exit;
+    }
+    chdir 't' if -d 't';
+    @INC = qw(../lib);
+  }
+  unless (eval "require Socket") {
+    print "1..0 \# Skip: no Socket\n";
+    exit;
+  }
+  unless (getservbyname('echo', 'tcp')) {
+    print "1..0 \# Skip: no echo port\n";
+    exit;
+  }
+  unless (getservbyname('http', 'tcp')) {
+    print "1..0 \# Skip: no http port\n";
+    exit;
+  }
+}
+
+# Remote network test using syn protocol.
+#
+# NOTE:
+#   Network connectivity will be required for all tests to pass.
+#   Firewalls may also cause some tests to fail, so test it
+#   on a clear network.  If you know you do not have a direct
+#   connection to remote networks, but you still want the tests
+#   to pass, use the following:
+#
+# $ PERL_CORE=1 make test
+
+# Try a few remote servers
+my $webs = {
+  # Hopefully this is never a routeable host
+  "172.29.249.249" => 0,
+
+  # Hopefully all these web ports are open
+  "www.geocities.com." => 1,
+  "www.freeservers.com." => 1,
+  "yahoo.com." => 1,
+  "www.yahoo.com." => 1,
+  "www.about.com." => 1,
+  "www.microsoft.com." => 1,
+  "127.0.0.1" => 1,
+};
+
+use strict;
+use Test;
+use Net::Ping;
+plan tests => ((keys %{ $webs }) * 2 + 3);
+
+# Everything loaded fine
+ok 1;
+
+alarm(50);
+$SIG{ALRM} = sub {
+  ok 0;
+  die "TIMED OUT!";
+};
+
+my $p = new Net::Ping "syn", 10;
+
+# new() worked?
+ok !!$p;
+
+# Change to use the more common web port.
+# (Make sure getservbyname works in scalar context.)
+ok ($p -> {port_num} = getservbyname("http", "tcp"));
+
+foreach my $host (keys %{ $webs }) {
+  # ping() does dns resolution and
+  # only sends the SYN at this point
+  alarm(50); # (Plenty for a DNS lookup)
+  if (!ok($p -> ping($host))) {
+    print STDERR "CANNOT RESOLVE $host $p->{bad}->{$host}\n";
+  }
+}
+
+alarm(20);
+foreach my $host (sort keys %{ $webs }) {
+  my $on = $p->ack($host);
+  if (!ok (($on && $webs->{$host}) ||
+           (!$on && !$webs->{$host}))) {
+    if ($on) {
+      print STDERR "SUPPOSED TO BE DOWN: http://$host/\n";
+    } else {
+      print STDERR "DOWN: http://$host/ $p->{bad}->{$host}\n";
+    }
+  }
+  delete $webs->{$host};
+  alarm(20);
+}
+
+alarm(0);
index 2ee856c..97d3caf 100644 (file)
@@ -9,50 +9,37 @@ BEGIN {
     print "1..0 \# Skip: no echo port\n";
     exit;
   }
-  unless (0) {
-    print "1..0 \# Skip: too many problems right now\n";
-    exit;
-  }
 }
 
 use strict;
 use Test;
 use Net::Ping;
-use IO::Socket;
 
 # I'm lazy so I'll just use IO::Socket
 # for the TCP Server stuff instead of doing
 # all that direct socket() junk manually.
 
-plan tests => 37;
+plan tests => 26;
 
 # Everything loaded fine
 ok 1;
 
-"0" =~ /(0)/; # IO::Socket::INET ephemeral buttwag hack
-
 # Start a tcp listen server on ephemeral port
 my $sock1 = new IO::Socket::INET
-  LocalAddr => "127.1.1.1",
+  LocalAddr => "127.0.0.1",
   Proto => "tcp",
   Listen => 8,
-  Reuse => 1,
-  Type => SOCK_STREAM,
-  ;
+  or warn "bind: $!";
 
 # Make sure it worked.
 ok !!$sock1;
 
-"0" =~ /(0)/; # IO::Socket::INET ephemeral buttwag hack
-
 # Start listening on another ephemeral port
 my $sock2 = new IO::Socket::INET
-  LocalAddr => "127.2.2.2",
+  LocalAddr => "127.0.0.1",
   Proto => "tcp",
   Listen => 8,
-  Reuse => 1,
-  Type => SOCK_STREAM,
-  ;
+  or warn "bind: $!";
 
 # Make sure it worked too.
 ok !!$sock2;
@@ -66,11 +53,11 @@ ok $port2;
 # Make sure the sockets are listening on different ports.
 ok ($port1 != $port2);
 
+$sock2->close;
+
 # This is how it should be:
-# 127.1.1.1:$port1 - service ON
-# 127.2.2.2:$port2 - service ON
-# 127.1.1.1:$port2 - service OFF
-# 127.2.2.2:$port1 - service OFF
+# 127.0.0.1:$port1 - service ON
+# 127.0.0.1:$port2 - service OFF
 
 #####
 # First, we test using the "tcp" protocol.
@@ -86,20 +73,15 @@ $p->tcp_service_check(0);
 # Try on the first port
 $p->{port_num} = $port1;
 
-# Make sure IP1 is reachable
-ok $p -> ping("127.1.1.1");
-
-# Make sure IP2 is reachable
-ok $p -> ping("127.2.2.2");
+# Make sure it is reachable
+ok $p -> ping("127.0.0.1");
 
 # Try on the other port
 $p->{port_num} = $port2;
 
-# Make sure IP1 is reachable
-ok $p -> ping("127.1.1.1");
+# Make sure it is reachable
+ok $p -> ping("127.0.0.1");
 
-# Make sure IP2 is reachable
-ok $p -> ping("127.2.2.2");
 
 
 # Enable service checking
@@ -108,21 +90,16 @@ $p->tcp_service_check(1);
 # Try on the first port
 $p->{port_num} = $port1;
 
-# Make sure service on IP1 
-ok $p -> ping("127.1.1.1");
-
-# Make sure not service on IP2
-ok !$p -> ping("127.2.2.2");
+# Make sure service is on
+ok $p -> ping("127.0.0.1");
 
 # Try on the other port
 $p->{port_num} = $port2;
 
-# Make sure not service on IP1
-ok !$p -> ping("127.1.1.1");
-
-# Make sure service on IP2
-ok $p -> ping("127.2.2.2");
+# Make sure service is off
+ok !$p -> ping("127.0.0.1");
 
+# test 11 just finished.
 
 #####
 # Lastly, we test using the "syn" protocol.
@@ -137,12 +114,10 @@ $p->tcp_service_check(0);
 # Try on the first port
 $p->{port_num} = $port1;
 
-# Send SYN to both IPs
-ok $p -> ping("127.1.1.1");
-ok $p -> ping("127.2.2.2");
+# Send SYN
+if (!ok $p -> ping("127.0.0.1")) {warn "ERRNO: $!";}
 
-# Both IPs should be reachable
-ok $p -> ack();
+# IP should be reachable
 ok $p -> ack();
 # No more sockets?
 ok !$p -> ack();
@@ -160,12 +135,10 @@ $p->tcp_service_check(0);
 # Try on the other port
 $p->{port_num} = $port2;
 
-# Send SYN to both IPs
-ok $p -> ping("127.1.1.1");
-ok $p -> ping("127.2.2.2");
+# Send SYN
+if (!ok $p -> ping("127.0.0.1")) {warn "ERRNO: $!";}
 
-# Both IPs should be reachable
-ok $p -> ack();
+# IP should still be reachable
 ok $p -> ack();
 # No more sockets?
 ok !$p -> ack();
@@ -184,12 +157,11 @@ $p->tcp_service_check(1);
 # Try on the first port
 $p->{port_num} = $port1;
 
-# Send SYN to both IPs
-ok $p -> ping("127.1.1.1");
-ok $p -> ping("127.2.2.2");
+# Send SYN
+ok $p -> ping("127.0.0.1");
 
-# Only IP1 should have service
-ok "127.1.1.1",$p -> ack();
+# Should have service on
+ok ($p -> ack(),"127.0.0.1");
 # No more good sockets?
 ok !$p -> ack();
 
@@ -207,11 +179,8 @@ $p->tcp_service_check(1);
 # Try on the other port
 $p->{port_num} = $port2;
 
-# Send SYN to both IPs
-ok $p -> ping("127.1.1.1");
-ok $p -> ping("127.2.2.2");
+# Send SYN
+if (!ok $p -> ping("127.0.0.1")) {warn "ERRNO: $!";}
 
-# Only IP2 should have service
-ok "127.2.2.2",$p -> ack();
-# No more good sockets?
+# No sockets should have service on
 ok !$p -> ack();
index e20b2a6..4ae4541 100644 (file)
@@ -106,6 +106,7 @@ sub Complete {
            $tty_saved_state = undef;
        }
        else {
+           chomp $tty_saved_state;
            $tty_restore = qq($stty "$tty_saved_state");
        }
     }
index a1bae2d..b2a4ac6 100644 (file)
@@ -112,6 +112,63 @@ $ENV{PROCESSOR_ARCHITECTURE}. This might not work on Win9X.
 does not return a UNC path, since the functionality required for such
 a feature is not available under Windows 95.
 
+=item Win32::GetFolderPath(FOLDER [, CREATE])
+
+[EXT] Returns the full pathname of one of the Windows special folders.
+The folder will be created if it doesn't exist and the optional CREATE
+argument is true.  The following FOLDER constants are defined by the
+Win32 module, but only exported on demand:
+
+        CSIDL_ADMINTOOLS
+        CSIDL_APPDATA
+        CSIDL_CDBURN_AREA
+        CSIDL_COMMON_ADMINTOOLS
+        CSIDL_COMMON_APPDATA
+        CSIDL_COMMON_DESKTOPDIRECTORY
+        CSIDL_COMMON_DOCUMENTS
+        CSIDL_COMMON_FAVORITES
+        CSIDL_COMMON_MUSIC
+        CSIDL_COMMON_PICTURES
+        CSIDL_COMMON_PROGRAMS
+        CSIDL_COMMON_STARTMENU
+        CSIDL_COMMON_STARTUP
+        CSIDL_COMMON_TEMPLATES
+        CSIDL_COMMON_VIDEO
+        CSIDL_COOKIES
+        CSIDL_DESKTOP
+        CSIDL_DESKTOPDIRECTORY
+        CSIDL_FAVORITES
+        CSIDL_FONTS
+        CSIDL_HISTORY
+        CSIDL_INTERNET_CACHE
+        CSIDL_LOCAL_APPDATA
+        CSIDL_MYMUSIC
+        CSIDL_MYPICTURES
+        CSIDL_MYVIDEO
+        CSIDL_NETHOOD
+        CSIDL_PERSONAL
+        CSIDL_PRINTHOOD
+        CSIDL_PROFILE
+        CSIDL_PROGRAMS
+        CSIDL_PROGRAM_FILES
+        CSIDL_PROGRAM_FILES_COMMON
+        CSIDL_RECENT
+        CSIDL_RESOURCES
+        CSIDL_RESOURCES_LOCALIZED
+        CSIDL_SENDTO
+        CSIDL_STARTMENU
+        CSIDL_STARTUP
+        CSIDL_SYSTEM
+        CSIDL_TEMPLATES
+        CSIDL_WINDOWS
+
+Note that not all folders are defined on all versions of Windows.
+
+Please refer to the MSDN documentation of the CSIDL constants,
+currently available at:
+
+http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp
+
 =item Win32::GetFullPathName(FILENAME)
 
 [CORE] GetFullPathName combines the FILENAME with the current drive
index 04222c8..08de291 100644 (file)
@@ -10,7 +10,7 @@ use vars qw{ @warnings };
 BEGIN {                                # ...and save 'em for later
     $SIG{'__WARN__'} = sub { push @warnings, @_ }
 }
-END { print @warnings }
+END { print STDERR @warnings }
 
 ######################### We start with some black magic to print on failure.
 
index 1f4cf05..9b6902f 100755 (executable)
@@ -10,7 +10,7 @@ BEGIN {
            $w++;
            return;
        }
-       print $_[0];
+       print STDERR $_[0];
    };
 }
 
index 9085a4d..7a53b11 100644 (file)
@@ -2739,6 +2739,7 @@ B<W> I<*>             Delete all watch-expressions.
 B<V> [I<pkg> [I<vars>]]        List some (default all) variables in package (default current).
                Use B<~>I<pattern> and B<!>I<pattern> for positive and negative regexps.
 B<X> [I<vars>] Same as \"B<V> I<currentpackage> [I<vars>]\".
+B<y> [I<n> [I<Vars>]]   List lexicals in higher scope <n>.  Vars same as B<V>.
 B<x> I<expr>           Evals expression in list context, dumps the result.
 B<m> I<expr>           Evals expression in list context, prints methods callable
                on the first element of the result.
index f171047..016c799 100644 (file)
@@ -24,7 +24,7 @@ BEGIN {                       # Remap I/O to the parent's window
 }
 
 use strict;
-use Test::More tests => 227;
+use Test::More tests => 230;
 use OS2::Process;
 
 sub SWP_flags ($) {
@@ -237,21 +237,25 @@ ok hWindowPos_set({behind => 4}, $k_hwnd),        # HWND_BOTTOM
 # This does not work, the result is the handle of "Window List"
 # is((hWindowPos $k_hwnd)->{behind}, 4, 'kis is at back');
 
-my (@list, $next);
+my (@list, $next, @list1);
 { my $force_PM = OS2::localMorphPM->new(0);
   ok $force_PM, 'morphed to PM locally again';
   $enum_handle = BeginEnumWindows 1;           # HWND_DESKTOP
   ok $enum_handle, 'start enumeration';
   push @list, $next while $next = GetNextWindow $enum_handle;
+  @list1 = ChildWindows;
+  ok 1, 'embedded ChildWindows()';
   ok EndEnumWindows($enum_handle), 'end enumeration';
 
+  is_deeply \@list, \@list1, 'Manual list same as by ChildWindows()';
   # Apparently, the 'Desktop' window is still behind us;
   # Note that this window is *not* what is returned by DesktopWindow
   pop @list if WindowText($list[-1]) eq 'Desktop';
 }
 is ($list[-1], $k_hwnd, 'kid is the last in z-order enumeration');
 # print "# kid=$k_hwnd in @list\n";
-@list = ChildWindows;                          # HWND_DESKTOP
+@list = ChildWindows;
+is_deeply \@list, \@list1, 'Other ChildWindows(), same result';
 ok scalar @list, 'ChildWindows works';
 is $list[-2], $k_hwnd, 'kid is the last but one in ChildWindows';
 
index c3ddcb4..10ee7ec 100644 (file)
@@ -72,7 +72,8 @@ exec_in_REXX_with(pTHX_ char *cmd, int c, char **handlerNames, RexxFunctionHandl
     LONG rc;
     SV *res;
     char *subs = 0;
-    int n = c;
+    int n = c, have_nl = 0;
+    char *ocmd = cmd, *s, *t;
 
     incompartment++;
 
@@ -84,6 +85,23 @@ exec_in_REXX_with(pTHX_ char *cmd, int c, char **handlerNames, RexxFunctionHandl
            subs[n] = 1;
     }
 
+    s = cmd;
+    while (*s) {
+       if (*s == '\n') {               /* Is not preceeded by \r! */
+           New(728, cmd, 2*strlen(cmd)+1, char);
+           s = ocmd;
+           t = cmd;
+           while (*s) {
+               if (*s == '\n')
+                   *t++ = '\r';
+               *t++ = *s++;
+           }
+           *t = 0;
+           break;
+       } else if (*s == '\r')
+           s++;
+       s++;
+    }
     MAKERXSTRING(args[0], NULL, 0);
     MAKERXSTRING(inst[0], cmd,  strlen(cmd));
     MAKERXSTRING(inst[1], NULL, 0);
@@ -105,6 +123,8 @@ exec_in_REXX_with(pTHX_ char *cmd, int c, char **handlerNames, RexxFunctionHandl
            pRexxDeregisterFunction(handlerNames[n]);
     if (c)
        Safefree(subs);
+    if (cmd != ocmd)
+       Safefree(cmd);
 #if 0                                  /* Do we want to restore these? */
     DosFreeModule(hRexxAPI);
     DosFreeModule(hRexx);
index fcf1bfd..37717f5 100644 (file)
--- a/os2/os2.c
+++ b/os2/os2.c
@@ -1587,11 +1587,10 @@ Perl_hab_GET()                  /* Needed if perl.h cannot be included */
 HMQ
 Perl_Register_MQ(int serve)
 {
+  if (Perl_hmq_refcnt <= 0) {
     PPIB pib;
     PTIB tib;
 
-    if (Perl_hmq_refcnt > 0)
-       return Perl_hmq;
     Perl_hmq_refcnt = 0;               /* Be extra safe */
     DosGetInfoBlocks(&tib, &pib);
     Perl_os2_initial_mode = pib->pib_ultype;
@@ -1609,6 +1608,7 @@ Perl_Register_MQ(int serve)
            _exit(188);                 /* Panic can try to create a window. */
        Perl_croak_nocontext("Cannot create a message queue, or morph to a PM application");
     }
+  }
     if (serve) {
        if ( Perl_hmq_servers <= 0      /* Safe to inform us on shutdown, */
             && Perl_hmq_refcnt > 0 )   /* this was switched off before... */
@@ -2795,18 +2795,30 @@ my_tmpfile ()
 
 #undef rmdir
 
+/* EMX flavors do not tolerate trailing slashes.  t/op/mkdir.t has many
+   trailing slashes, so we need to support this as well. */
+
 int
 my_rmdir (__const__ char *s)
 {
-    char buf[MAXPATHLEN];
+    char b[MAXPATHLEN];
+    char *buf = b;
     STRLEN l = strlen(s);
+    int rc;
 
-    if (s[l-1] == '/' || s[l-1] == '\\') {     /* EMX rmdir fails... */
+    if (s[l-1] == '/' || s[l-1] == '\\') {     /* EMX mkdir fails... */
+       if (l >= sizeof b)
+           New(1305, buf, l + 1, char);
        strcpy(buf,s);
-       buf[l - 1] = 0;
+       while (l > 1 && (s[l-1] == '/' || s[l-1] == '\\'))
+           l--;
+       buf[l] = 0;
        s = buf;
     }
-    return rmdir(s);
+    rc = rmdir(s);
+    if (b != buf)
+       Safefree(buf);
+    return rc;
 }
 
 #undef mkdir
@@ -2814,15 +2826,24 @@ my_rmdir (__const__ char *s)
 int
 my_mkdir (__const__ char *s, long perm)
 {
-    char buf[MAXPATHLEN];
+    char b[MAXPATHLEN];
+    char *buf = b;
     STRLEN l = strlen(s);
+    int rc;
 
     if (s[l-1] == '/' || s[l-1] == '\\') {     /* EMX mkdir fails... */
+       if (l >= sizeof b)
+           New(1305, buf, l + 1, char);
        strcpy(buf,s);
-       buf[l - 1] = 0;
+       while (l > 1 && (s[l-1] == '/' || s[l-1] == '\\'))
+           l--;
+       buf[l] = 0;
        s = buf;
     }
-    return mkdir(s, perm);
+    rc = mkdir(s, perm);
+    if (b != buf)
+       Safefree(buf);
+    return rc;
 }
 
 #undef flock
diff --git a/perl.h b/perl.h
index 6254a54..d27a078 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -2221,6 +2221,7 @@ union any {
     I32                any_i32;
     IV         any_iv;
     long       any_long;
+    bool       any_bool;
     void       (*any_dptr) (void*);
     void       (*any_dxptr) (pTHX_ void*);
 };
index 1164ea3..1c8319b 100644 (file)
@@ -512,6 +512,35 @@ Found in file handy.h
 
 Create and return a new interpreter by cloning the current one.
 
+perl_clone takes these flags as paramters:
+
+CLONEf_COPY_STACKS - is used to, well, copy the stacks also, 
+without it we only clone the data and zero the stacks, 
+with it we copy the stacks and the new perl interpreter is 
+ready to run at the exact same point as the previous one. 
+The pseudo-fork code uses COPY_STACKS while the 
+threads->new doesn't.
+
+CLONEf_KEEP_PTR_TABLE
+perl_clone keeps a ptr_table with the pointer of the old 
+variable as a key and the new variable as a value, 
+this allows it to check if something has been cloned and not 
+clone it again but rather just use the value and increase the 
+refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill 
+the ptr_table using the function 
+C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>, 
+reason to keep it around is if you want to dup some of your own 
+variable who are outside the graph perl scans, example of this 
+code is in threads.xs create
+
+CLONEf_CLONE_HOST
+This is a win32 thing, it is ignored on unix, it tells perls 
+win32host code (which is c++) to clone itself, this is needed on 
+win32 if you want to run two threads at the same time, 
+if you just want to do some stuff in a separate perl interpreter 
+and then throw it away and return to the original one, 
+you don't need to do anything.
+
        PerlInterpreter*        perl_clone(PerlInterpreter* interp, UV flags)
 
 =for hackers
index 3c54580..cdeeb99 100644 (file)
@@ -196,7 +196,7 @@ C<$a> minus the largest multiple of C<$b> that is not greater than
 C<$a>.  If C<$b> is negative, then C<$a % $b> is C<$a> minus the
 smallest multiple of C<$b> that is not less than C<$a> (i.e. the
 result will be less than or equal to zero). 
-Note than when C<use integer> is in scope, "%" gives you direct access
+Note that when C<use integer> is in scope, "%" gives you direct access
 to the modulus operator as implemented by your C compiler.  This
 operator is not as well defined for negative operands, but it will
 execute faster.
index 5f254bb..0f5333d 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -2841,7 +2841,7 @@ PP(pp_stat)
        PUSHs(sv_2mortal(newSVpvn("", 0)));
 #endif
 #if Off_t_size > IVSIZE
-       PUSHs(sv_2mortal(newSVnv(PL_statcache.st_size)));
+       PUSHs(sv_2mortal(newSVnv((NV)PL_statcache.st_size)));
 #else
        PUSHs(sv_2mortal(newSViv(PL_statcache.st_size)));
 #endif
diff --git a/proto.h b/proto.h
index 77cb81b..f9b06fd 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -674,6 +674,7 @@ PERL_CALLCONV void  Perl_save_aelem(pTHX_ AV* av, I32 idx, SV **sptr);
 PERL_CALLCONV I32      Perl_save_alloc(pTHX_ I32 size, I32 pad);
 PERL_CALLCONV void     Perl_save_aptr(pTHX_ AV** aptr);
 PERL_CALLCONV AV*      Perl_save_ary(pTHX_ GV* gv);
+PERL_CALLCONV void     Perl_save_bool(pTHX_ bool* boolp);
 PERL_CALLCONV void     Perl_save_clearsv(pTHX_ SV** svp);
 PERL_CALLCONV void     Perl_save_delete(pTHX_ HV* hv, char* key, I32 klen);
 PERL_CALLCONV void     Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p);
index 1edea14..344ad88 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -5065,7 +5065,7 @@ Perl_save_re_context(pTHX)
     SAVEVPTR(PL_reg_re);               /* from regexec.c */
     SAVEPPTR(PL_reg_ganch);            /* from regexec.c */
     SAVESPTR(PL_reg_sv);               /* from regexec.c */
-    SAVEI8(PL_reg_match_utf8);         /* from regexec.c */
+    SAVEBOOL(PL_reg_match_utf8);       /* from regexec.c */
     SAVEVPTR(PL_reg_magic);            /* from regexec.c */
     SAVEI32(PL_reg_oldpos);                    /* from regexec.c */
     SAVEVPTR(PL_reg_oldcurpm);         /* from regexec.c */
index 14dd72e..eeea6f2 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -2110,6 +2110,7 @@ S_regtry(pTHX_ regexp *prog, char *startpos)
     PL_reglastparen = &prog->lastparen;
     PL_reglastcloseparen = &prog->lastcloseparen;
     prog->lastparen = 0;
+    prog->lastcloseparen = 0;
     PL_regsize = 0;
     DEBUG_r(PL_reg_starttry = startpos);
     if (PL_reg_start_tmpl <= prog->nparens) {
diff --git a/scope.c b/scope.c
index 673b64c..0482cc4 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -391,6 +391,15 @@ Perl_save_long(pTHX_ long int *longp)
 }
 
 void
+Perl_save_bool(pTHX_ bool *boolp)
+{
+    SSCHECK(3);
+    SSPUSHBOOL(*boolp);
+    SSPUSHPTR(boolp);
+    SSPUSHINT(SAVEt_BOOL);
+}
+
+void
 Perl_save_I32(pTHX_ I32 *intp)
 {
     SSCHECK(3);
@@ -795,6 +804,10 @@ Perl_leave_scope(pTHX_ I32 base)
            ptr = SSPOPPTR;
            *(long*)ptr = (long)SSPOPLONG;
            break;
+       case SAVEt_BOOL:                        /* bool reference */
+           ptr = SSPOPPTR;
+           *(bool*)ptr = (bool)SSPOPBOOL;
+           break;
        case SAVEt_I32:                         /* I32 reference */
            ptr = SSPOPPTR;
            *(I32*)ptr = (I32)SSPOPINT;
diff --git a/scope.h b/scope.h
index 6cfe124..c3de60a 100644 (file)
--- a/scope.h
+++ b/scope.h
@@ -45,6 +45,7 @@
 #define SAVEt_PADSV            35
 #define SAVEt_MORTALIZESV      36
 #define SAVEt_SHARED_PVREF     37
+#define SAVEt_BOOL             38
 
 #ifndef SCOPE_SAVES_SIGNAL_MASK
 #define SCOPE_SAVES_SIGNAL_MASK 0
 #define SSCHECK(need) if (PL_savestack_ix + need > PL_savestack_max) savestack_grow()
 #define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i))
 #define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i))
+#define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p))
 #define SSPUSHIV(i) (PL_savestack[PL_savestack_ix++].any_iv = (IV)(i))
 #define SSPUSHPTR(p) (PL_savestack[PL_savestack_ix++].any_ptr = (void*)(p))
 #define SSPUSHDPTR(p) (PL_savestack[PL_savestack_ix++].any_dptr = (p))
 #define SSPUSHDXPTR(p) (PL_savestack[PL_savestack_ix++].any_dxptr = (p))
 #define SSPOPINT (PL_savestack[--PL_savestack_ix].any_i32)
 #define SSPOPLONG (PL_savestack[--PL_savestack_ix].any_long)
+#define SSPOPBOOL (PL_savestack[--PL_savestack_ix].any_bool)
 #define SSPOPIV (PL_savestack[--PL_savestack_ix].any_iv)
 #define SSPOPPTR (PL_savestack[--PL_savestack_ix].any_ptr)
 #define SSPOPDPTR (PL_savestack[--PL_savestack_ix].any_dptr)
@@ -116,6 +119,7 @@ Closing bracket on a callback.  See C<ENTER> and L<perlcall>.
 #define SAVEINT(i)     save_int(SOFT_CAST(int*)&(i))
 #define SAVEIV(i)      save_iv(SOFT_CAST(IV*)&(i))
 #define SAVELONG(l)    save_long(SOFT_CAST(long*)&(l))
+#define SAVEBOOL(b)    save_bool(SOFT_CAST(bool*)&(b))
 #define SAVESPTR(s)    save_sptr((SV**)&(s))
 #define SAVEPPTR(s)    save_pptr(SOFT_CAST(char**)&(s))
 #define SAVEVPTR(s)    save_vptr((void*)&(s))
diff --git a/sv.c b/sv.c
index 348e6c6..4ce12e7 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -9817,6 +9817,12 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
            sv = (SV*)POPPTR(ss,ix);
            TOPPTR(nss,ix) = sv_dup(sv, param);
            break;
+       case SAVEt_BOOL:
+           ptr = POPPTR;
+           TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
+           longval = (long)POPBOOL;
+           TOPBOOL(nss,ix) = (bool)longval;
+           break;
        default:
            Perl_croak(aTHX_ "panic: ss_dup inconsistency");
        }
@@ -9830,6 +9836,35 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
 
 Create and return a new interpreter by cloning the current one.
 
+perl_clone takes these flags as paramters:
+
+CLONEf_COPY_STACKS - is used to, well, copy the stacks also, 
+without it we only clone the data and zero the stacks, 
+with it we copy the stacks and the new perl interpreter is 
+ready to run at the exact same point as the previous one. 
+The pseudo-fork code uses COPY_STACKS while the 
+threads->new doesn't.
+
+CLONEf_KEEP_PTR_TABLE
+perl_clone keeps a ptr_table with the pointer of the old 
+variable as a key and the new variable as a value, 
+this allows it to check if something has been cloned and not 
+clone it again but rather just use the value and increase the 
+refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill 
+the ptr_table using the function 
+C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>, 
+reason to keep it around is if you want to dup some of your own 
+variable who are outside the graph perl scans, example of this 
+code is in threads.xs create
+
+CLONEf_CLONE_HOST
+This is a win32 thing, it is ignored on unix, it tells perls 
+win32host code (which is c++) to clone itself, this is needed on 
+win32 if you want to run two threads at the same time, 
+if you just want to do some stuff in a separate perl interpreter 
+and then throw it away and return to the original one, 
+you don't need to do anything.
+
 =cut
 */
 
index f3a5a06..9acad00 100644 (file)
@@ -39,6 +39,10 @@ sub runperl {
 
   $stdout = '' unless defined $stdout;
   $stderr = '' unless defined $stderr;
+  local %ENV = %ENV;
+  delete $ENV{PERLLIB};
+  delete $ENV{PERL5LIB};
+  delete $ENV{PERL5OPT};
   my $pid = fork;
   return (0, "Couldn't fork: $!") unless defined $pid;   # failure
   if ($pid) {                   # parent
@@ -149,22 +153,22 @@ try({PERL5OPT => '-t'},
     '1',
     '');
 
-try({PERLLIB => "foobar:42"},
+try({PERLLIB => "foobar$Config{path_sep}42"},
     ['-e', 'print grep { $_ eq "foobar" } @INC'],
     'foobar',
     '');
 
-try({PERLLIB => "foobar:42"},
+try({PERLLIB => "foobar$Config{path_sep}42"},
     ['-e', 'print grep { $_ eq "42" } @INC'],
     '42',
     '');
 
-try({PERL5LIB => "foobar:42"},
+try({PERL5LIB => "foobar$Config{path_sep}42"},
     ['-e', 'print grep { $_ eq "foobar" } @INC'],
     'foobar',
     '');
 
-try({PERL5LIB => "foobar:42"},
+try({PERL5LIB => "foobar$Config{path_sep}42"},
     ['-e', 'print grep { $_ eq "42" } @INC'],
     '42',
     '');
diff --git a/util.c b/util.c
index e645217..d3d35f5 100644 (file)
--- a/util.c
+++ b/util.c
@@ -3271,7 +3271,7 @@ Perl_get_vtbl(pTHX_ int vtbl_id)
 I32
 Perl_my_fflush_all(pTHX)
 {
-#if defined(FFLUSH_NULL)
+#if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
     return PerlIO_flush(NULL);
 #else
 # if defined(HAS__FWALK)
index 04dc132..f4b04f9 100644 (file)
@@ -42,6 +42,11 @@ use Config;
 use File::Path qw(mkpath);
 use Getopt::Std;
 
+# Make sure read permissions for all are set:
+if (defined umask && (umask() & 0444)) {
+    umask (umask() & ~0444);
+}
+
 getopts('Dd:rlhaQe');
 use vars qw($opt_D $opt_d $opt_r $opt_l $opt_h $opt_a $opt_Q $opt_e);
 die "-r and -a options are mutually exclusive\n" if ($opt_r and $opt_a);
index 46b78bb..bd69dbd 100644 (file)
@@ -74,6 +74,12 @@ USE_IMP_SYS = define
 USE_PERLIO     = define
 
 #
+# Comment this out if you don't want to enable large file support for
+# some reason.  Should normally only be changed to maintain compatibility
+# with an older release of perl.
+USE_LARGE_FILES = define
+
+#
 # WARNING! This option is deprecated and will eventually go away (enable
 # USE_ITHREADS instead).
 #
@@ -88,7 +94,7 @@ USE_PERLIO    = define
 # Visual C++ 2.x or Visual C++ 6.x (aka Visual Studio 98)
 #
 #CCTYPE                = MSVC20
-#CCTYPE                = MSVC60
+CCTYPE         = MSVC60
 
 #
 # uncomment next line if you want debug version of perl (big,slow)
@@ -234,6 +240,10 @@ USE_IMP_SYS        = undef
 USE_PERLIO     = undef
 !ENDIF
 
+!IF "$(USE_LARGE_FILES)" == ""
+USE_LARGE_FILES        = undef
+!ENDIF
+
 !IF "$(USE_PERLCRT)" == ""
 USE_PERLCRT    = undef
 !ENDIF
@@ -792,6 +802,7 @@ CFG_VARS    =                                       \
                "usethreads=$(USE_5005THREADS)"         \
                "usemultiplicity=$(USE_MULTI)"          \
                "useperlio=$(USE_PERLIO)"               \
+               "uselargefiles=$(USE_LARGE_FILES)"      \
                "LINK_FLAGS=$(LINK_FLAGS:"=\")"         \
                "optimize=$(OPTIMIZE:"=\")"
 
@@ -1000,6 +1011,8 @@ utils: $(PERLEXE) $(X2P)
        cd ..\win32
        $(PERLEXE) $(PL2BAT) $(UTILS)
 
+# the doubled rmdir calls are needed because older cmd shells
+# don't understand /q
 distclean: clean
        -del /f $(MINIPERL) $(PERLEXE) $(PERLDLL) $(GLOBEXE) \
                $(PERLIMPLIB) ..\miniperl.lib $(MINIMOD)
@@ -1030,22 +1043,23 @@ distclean: clean
        -del /f $(LIBDIR)\XS\Typemap.pm
        -del /f $(LIBDIR)\Unicode\Normalize.pm
        -if exist $(LIBDIR)\IO rmdir /s /q $(LIBDIR)\IO
-       -rmdir /s $(LIBDIR)\IO
+       -if exist $(LIBDIR)\IO rmdir /s $(LIBDIR)\IO
        -if exist $(LIBDIR)\B rmdir /s /q $(LIBDIR)\B
-       -rmdir /s $(LIBDIR)\B
+       -if exist $(LIBDIR)\B rmdir /s $(LIBDIR)\B
        -if exist $(LIBDIR)\Data rmdir /s /q $(LIBDIR)\Data
-       -rmdir /s $(LIBDIR)\Data
+       -if exist $(LIBDIR)\Data rmdir /s $(LIBDIR)\Data
        -if exist $(LIBDIR)\Filter\Util rmdir /s /q $(LIBDIR)\Filter\Util
+       -if exist $(LIBDIR)\Filter\Util rmdir /s $(LIBDIR)\Filter\Util
        -if exist $(LIBDIR)\Digest rmdir /s /q $(LIBDIR)\Digest
-       -rmdir /s $(LIBDIR)\Digest
+       -if exist $(LIBDIR)\Digest rmdir /s $(LIBDIR)\Digest
        -if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
-       -rmdir /s $(LIBDIR)\MIME
+       -if exist $(LIBDIR)\MIME rmdir /s $(LIBDIR)\MIME
        -if exist $(LIBDIR)\List rmdir /s /q $(LIBDIR)\List
-       -rmdir /s $(LIBDIR)\List
+       -if exist $(LIBDIR)\List rmdir /s $(LIBDIR)\List
        -if exist $(LIBDIR)\Scalar rmdir /s /q $(LIBDIR)\Scalar
-       -rmdir /s $(LIBDIR)\Scalar
+       -if exist $(LIBDIR)\Scalar rmdir /s $(LIBDIR)\Scalar
        -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
-       -rmdir /s $(LIBDIR)\XS
+       -if exist $(LIBDIR)\XS rmdir /s $(LIBDIR)\XS
        cd $(PODDIR)
        -del /f *.html *.bat checkpods \
            perlaix.pod perlamiga.pod perlapollo.pod perlbeos.pod \
@@ -1077,9 +1091,9 @@ distclean: clean
        -del /s *.def Makefile Makefile.old
        cd ..\win32
        -if exist $(AUTODIR) rmdir /s /q $(AUTODIR)
-       -rmdir /s $(AUTODIR)
+       -if exist $(AUTODIR) rmdir /s $(AUTODIR)
        -if exist $(COREDIR) rmdir /s /q $(COREDIR)
-       -rmdir /s $(COREDIR)
+       -if exist $(COREDIR) rmdir /s $(COREDIR)
 
 install : all installbare installhtml
 
@@ -1156,7 +1170,7 @@ clean : Extensions_clean
        -@$(DEL) $(PERLDLL)
        -@$(DEL) $(CORE_OBJ)
        -if exist $(MINIDIR) rmdir /s /q $(MINIDIR)
-       -rmdir /s $(MINIDIR)
+       -if exist $(MINIDIR) rmdir /s $(MINIDIR)
        -@$(DEL) $(WIN32_OBJ)
        -@$(DEL) $(DLL_OBJ)
        -@$(DEL) $(X2P_OBJ)
index 42c8449..27adca5 100644 (file)
@@ -697,8 +697,8 @@ longsize='4'
 lp=''
 lpr=''
 ls='dir'
-lseeksize='4'
-lseektype='off_t'
+lseeksize='8'
+lseektype='__int64'
 mail=''
 mailx=''
 make='dmake'
@@ -769,7 +769,7 @@ pm_apiversion='5.005'
 pmake=''
 pr=''
 prefix='~INST_TOP~'
-prefixexp='~INST_DRV~'
+prefixexp='~INST_TOP~'
 privlib='~INST_TOP~~INST_VER~\lib'
 privlibexp='~INST_TOP~~INST_VER~\lib'
 procselfexe=''
@@ -905,7 +905,7 @@ use64bitint='undef'
 usecrosscompile='undef'
 usedl='define'
 useithreads='undef'
-uselargefiles='undef'
+uselargefiles='define'
 uselongdouble='undef'
 usemorebits='undef'
 usemultiplicity='undef'
index 3c2fc0c..20ebc66 100644 (file)
@@ -697,8 +697,8 @@ longsize='4'
 lp=''
 lpr=''
 ls='dir'
-lseeksize='4'
-lseektype='off_t'
+lseeksize='8'
+lseektype='long long'
 mail=''
 mailx=''
 make='dmake'
@@ -769,7 +769,7 @@ pm_apiversion='5.005'
 pmake=''
 pr=''
 prefix='~INST_TOP~'
-prefixexp='~INST_DRV~'
+prefixexp='~INST_TOP~'
 privlib='~INST_TOP~~INST_VER~\lib'
 privlibexp='~INST_TOP~~INST_VER~\lib'
 procselfexe=''
@@ -905,7 +905,7 @@ use64bitint='undef'
 usecrosscompile='undef'
 usedl='define'
 useithreads='undef'
-uselargefiles='undef'
+uselargefiles='define'
 uselongdouble='undef'
 usemorebits='undef'
 usemultiplicity='undef'
index 8d94c56..e8ac62c 100644 (file)
@@ -697,8 +697,8 @@ longsize='4'
 lp=''
 lpr=''
 ls='dir'
-lseeksize='4'
-lseektype='off_t'
+lseeksize='8'
+lseektype='__int64'
 mail=''
 mailx=''
 make='nmake'
@@ -769,7 +769,7 @@ pm_apiversion='5.005'
 pmake=''
 pr=''
 prefix='~INST_TOP~'
-prefixexp='~INST_DRV~'
+prefixexp='~INST_TOP~'
 privlib='~INST_TOP~~INST_VER~\lib'
 privlibexp='~INST_TOP~~INST_VER~\lib'
 procselfexe=''
@@ -905,7 +905,7 @@ use64bitint='undef'
 usecrosscompile='undef'
 usedl='define'
 useithreads='undef'
-uselargefiles='undef'
+uselargefiles='define'
 uselongdouble='undef'
 usemorebits='undef'
 usemultiplicity='undef'
index fbc4308..43a8107 100644 (file)
@@ -769,7 +769,7 @@ pm_apiversion='5.005'
 pmake=''
 pr=''
 prefix='~INST_TOP~'
-prefixexp='~INST_DRV~'
+prefixexp='~INST_TOP~'
 privlib='~INST_TOP~~INST_VER~\lib'
 privlibexp='~INST_TOP~~INST_VER~\lib'
 procselfexe=''
@@ -905,7 +905,7 @@ use64bitint='define'
 usecrosscompile='undef'
 usedl='define'
 useithreads='undef'
-uselargefiles='undef'
+uselargefiles='define'
 uselongdouble='undef'
 usemorebits='undef'
 usemultiplicity='undef'
index e89d0c8..986c8d2 100644 (file)
 /* Off_t_size:
  *     This symbol holds the number of bytes used by the Off_t.
  */
-#define Off_t off_t            /* <offset> type */
-#define LSEEKSIZE 4            /* <offset> size */
-#define Off_t_size 4   /* <offset> size */
+#define Off_t __int64          /* <offset> type */
+#define LSEEKSIZE 8            /* <offset> size */
+#define Off_t_size 8   /* <offset> size */
 
 /* Free_t:
  *     This variable contains the return type of free().  It is usually
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-/*#define      USE_LARGE_FILES         /**/
+#define        USE_LARGE_FILES         /**/
 #endif
 
 /* USE_LONG_DOUBLE:
index 5564a41..8c164b4 100644 (file)
 /* Off_t_size:
  *     This symbol holds the number of bytes used by the Off_t.
  */
-#define Off_t off_t            /* <offset> type */
-#define LSEEKSIZE 4            /* <offset> size */
-#define Off_t_size 4   /* <offset> size */
+#define Off_t long long                /* <offset> type */
+#define LSEEKSIZE 8            /* <offset> size */
+#define Off_t_size 8   /* <offset> size */
 
 /* Free_t:
  *     This variable contains the return type of free().  It is usually
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-/*#define      USE_LARGE_FILES         /**/
+#define        USE_LARGE_FILES         /**/
 #endif
 
 /* USE_LONG_DOUBLE:
index f45fe40..389180c 100644 (file)
 /* Off_t_size:
  *     This symbol holds the number of bytes used by the Off_t.
  */
-#define Off_t off_t            /* <offset> type */
-#define LSEEKSIZE 4            /* <offset> size */
-#define Off_t_size 4   /* <offset> size */
+#define Off_t __int64          /* <offset> type */
+#define LSEEKSIZE 8            /* <offset> size */
+#define Off_t_size 8   /* <offset> size */
 
 /* Free_t:
  *     This variable contains the return type of free().  It is usually
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-/*#define      USE_LARGE_FILES         /**/
+#define        USE_LARGE_FILES         /**/
 #endif
 
 /* USE_LONG_DOUBLE:
index dcc2592..045e21d 100644 (file)
  *     should be used when available.
  */
 #ifndef USE_LARGE_FILES
-/*#define      USE_LARGE_FILES         /**/
+#define        USE_LARGE_FILES         /**/
 #endif
 
 /* USE_LONG_DOUBLE:
index cea5fef..2b8a37e 100644 (file)
@@ -93,6 +93,11 @@ if (defined(&Win32::IsWin95) && Win32::IsWin95()) {
     $opt{d_link} = 'undef';
 }
 
+if ($opt{uselargefiles} ne 'define') {
+    $opt{lseeksize} = 4;
+    $opt{lseektype} = 'off_t';
+}
+
 while (<>) {
     s/~([\w_]+)~/$opt{$1}/g;
     if (/^([\w_]+)=(.*)$/) {
index 0c3f7a4..87a7052 100644 (file)
@@ -73,7 +73,13 @@ USE_IMP_SYS  *= define
 # then get a number of fails from make test i.e. bugs - complain to them not us ;-). 
 # You will also be unable to take full advantage of perl5.8's support for multiple 
 # encodings and may see lower IO performance. You have been warned.
-USE_PERLIO     = define
+USE_PERLIO     *= define
+
+#
+# Comment this out if you don't want to enable large file support for
+# some reason.  Should normally only be changed to maintain compatibility
+# with an older release of perl.
+USE_LARGE_FILES *= define
 
 #
 # WARNING! This option is deprecated and will eventually go away (enable
@@ -249,6 +255,7 @@ USE_MULTI   *= undef
 USE_ITHREADS   *= undef
 USE_IMP_SYS    *= undef
 USE_PERLIO     *= undef
+USE_LARGE_FILES        *= undef
 USE_PERLCRT    *= undef
 
 .IF "$(USE_IMP_SYS)$(USE_MULTI)$(USE_5005THREADS)" == "defineundefundef"
@@ -834,7 +841,8 @@ CFG_VARS    =                                       \
                usethreads=$(USE_5005THREADS)   ~       \
                usemultiplicity=$(USE_MULTI)    ~       \
                useperlio=$(USE_PERLIO)         ~       \
-               LINK_FLAGS=$(LINK_FLAGS:s/\/\\/)                ~       \
+               uselargefiles=$(USE_LARGE_FILES) ~      \
+               LINK_FLAGS=$(LINK_FLAGS:s/\/\\/) ~      \
                optimize=$(OPTIMIZE)
 
 #
@@ -1173,15 +1181,24 @@ distclean: clean
        -del /f $(LIBDIR)\List\Util.pm
        -del /f $(LIBDIR)\Scalar\Util.pm
        -del /f $(LIBDIR)\Unicode\Normalize.pm
-       -if exist $(LIBDIR)\IO rmdir /s /q $(LIBDIR)\IO || rmdir /s $(LIBDIR)\IO
-       -if exist $(LIBDIR)\B rmdir /s /q $(LIBDIR)\B || rmdir /s $(LIBDIR)\B
-       -if exist $(LIBDIR)\Data rmdir /s /q $(LIBDIR)\Data || rmdir /s $(LIBDIR)\Data
-       -if exist $(LIBDIR)\Filter\Util\Call rmdir /s /q $(LIBDIR)\Filter\Util\Call || rmdir /s $(LIBDIR)\Filter
-       -if exist $(LIBDIR)\Filter\Util rmdir /s /q $(LIBDIR)\Filter\Util || rmdir /s $(LIBDIR)\Filter
-       -if exist $(LIBDIR)\Digest rmdir /s /q $(LIBDIR)\Digest || rmdir /s $(LIBDIR)\Digest
-       -if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME || rmdir /s $(LIBDIR)\MIME
-       -if exist $(LIBDIR)\List rmdir /s /q $(LIBDIR)\List || rmdir /s $(LIBDIR)\List
-       -if exist $(LIBDIR)\Scalar rmdir /s /q $(LIBDIR)\Scalar || rmdir /s $(LIBDIR)\Scalar
+       -if exist $(LIBDIR)\IO rmdir /s /q $(LIBDIR)\IO
+       -if exist $(LIBDIR)\IO rmdir /s $(LIBDIR)\IO
+       -if exist $(LIBDIR)\B rmdir /s /q $(LIBDIR)\B
+       -if exist $(LIBDIR)\B rmdir /s $(LIBDIR)\B
+       -if exist $(LIBDIR)\Data rmdir /s /q $(LIBDIR)\Data
+       -if exist $(LIBDIR)\Data rmdir /s $(LIBDIR)\Data
+       -if exist $(LIBDIR)\Filter\Util rmdir /s /q $(LIBDIR)\Filter\Util
+       -if exist $(LIBDIR)\Filter\Util rmdir /s $(LIBDIR)\Filter\Util
+       -if exist $(LIBDIR)\Digest rmdir /s /q $(LIBDIR)\Digest
+       -if exist $(LIBDIR)\Digest rmdir /s $(LIBDIR)\Digest
+       -if exist $(LIBDIR)\MIME rmdir /s /q $(LIBDIR)\MIME
+       -if exist $(LIBDIR)\MIME rmdir /s $(LIBDIR)\MIME
+       -if exist $(LIBDIR)\List rmdir /s /q $(LIBDIR)\List
+       -if exist $(LIBDIR)\List rmdir /s $(LIBDIR)\List
+       -if exist $(LIBDIR)\Scalar rmdir /s /q $(LIBDIR)\Scalar
+       -if exist $(LIBDIR)\Scalar rmdir /s $(LIBDIR)\Scalar
+       -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
+       -if exist $(LIBDIR)\XS rmdir /s $(LIBDIR)\XS
        -cd $(PODDIR) && del /f *.html *.bat checkpods \
            perlaix.pod perlamiga.pod perlapollo.pod \
            perlbeos.pod perlbs2000.pod perlce.pod perlcygwin.pod perldgux.pod \
@@ -1202,8 +1219,10 @@ distclean: clean
        -del /f bin\*.bat
        -cd .. && del /s *$(a) *.map *.pdb *.ilk *.bs *$(o) .exists pm_to_blib
        -cd $(EXTDIR) && del /s *.def Makefile Makefile.old
-       -if exist $(AUTODIR) rmdir /s /q $(AUTODIR) || rmdir /s $(AUTODIR)
-       -if exist $(COREDIR) rmdir /s /q $(COREDIR) || rmdir /s $(COREDIR)
+       -if exist $(AUTODIR) rmdir /s /q $(AUTODIR)
+       -if exist $(AUTODIR) rmdir /s $(AUTODIR)
+       -if exist $(COREDIR) rmdir /s /q $(COREDIR)
+       -if exist $(COREDIR) rmdir /s $(COREDIR)
 
 install : all installbare installhtml
 
@@ -1280,7 +1299,8 @@ clean : Extensions_clean
        -@erase $(WPERLEXE)
        -@erase $(PERLDLL)
        -@erase $(CORE_OBJ)
-       -if exist $(MINIDIR) rmdir /s /q $(MINIDIR) || rmdir /s $(MINIDIR)
+       -if exist $(MINIDIR) rmdir /s /q $(MINIDIR)
+       -if exist $(MINIDIR) rmdir /s $(MINIDIR)
        -@erase $(WIN32_OBJ)
        -@erase $(DLL_OBJ)
        -@erase $(X2P_OBJ)
index 7926142..b68f5c7 100644 (file)
@@ -939,9 +939,9 @@ PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t g
 }
 
 int
-PerlLIOChsize(struct IPerlLIO* piPerl, int handle, long size)
+PerlLIOChsize(struct IPerlLIO* piPerl, int handle, Off_t size)
 {
-    return chsize(handle, size);
+    return win32_chsize(handle, size);
 }
 
 int
index 3a13c45..fad3f98 100644 (file)
@@ -3073,6 +3073,55 @@ win32_setmode(int fd, int mode)
     return setmode(fd, mode);
 }
 
+DllExport int
+win32_chsize(int fd, Off_t size)
+{
+#if defined(WIN64) || defined(USE_LARGE_FILES)
+    int retval = 0;
+    Off_t cur, end, extend;
+
+    cur = win32_tell(fd);
+    if (cur < 0)
+       return -1;
+    end = win32_lseek(fd, 0, SEEK_END);
+    if (end < 0)
+       return -1;
+    extend = size - end;
+    if (extend == 0) {
+       /* do nothing */
+    }
+    else if (extend > 0) {
+       /* must grow the file, padding with nulls */
+       char b[4096];
+       int oldmode = win32_setmode(fd, O_BINARY);
+       size_t count;
+       memset(b, '\0', sizeof(b));
+       do {
+           count = extend >= sizeof(b) ? sizeof(b) : (size_t)extend;
+           count = win32_write(fd, b, count);
+           if (count < 0) {
+               retval = -1;
+               break;
+           }
+       } while ((extend -= count) > 0);
+       win32_setmode(fd, oldmode);
+    }
+    else {
+       /* shrink the file */
+       win32_lseek(fd, size, SEEK_SET);
+       if (!SetEndOfFile((HANDLE)_get_osfhandle(fd))) {
+           errno = EACCES;
+           retval = -1;
+       }
+    }
+finish:
+    win32_lseek(fd, cur, SEEK_SET);
+    return retval;
+#else
+    return chsize(fd, size);
+#endif
+}
+
 DllExport Off_t
 win32_lseek(int fd, Off_t offset, int origin)
 {
@@ -4628,8 +4677,13 @@ XS(w32_GetFullPathName)
     if (len) {
        if (GIMME_V == G_ARRAY) {
            EXTEND(SP,1);
-           XST_mPV(1,filepart);
-           len = filepart - SvPVX(fullpath);
+           if (filepart) {
+               XST_mPV(1,filepart);
+               len = filepart - SvPVX(fullpath);
+           }
+           else {
+               XST_mPVN(1,"",0);
+           }
            items = 2;
        }
        SvCUR_set(fullpath,len);
index 52c59b4..e835b2e 100644 (file)
@@ -77,6 +77,7 @@ DllExport  PerlIO*    win32_popenlist(const char *mode, IV narg, SV **args);
 DllExport  int         win32_pclose( PerlIO *pf);
 DllExport  int         win32_rename( const char *oname, const char *newname);
 DllExport  int         win32_setmode( int fd, int mode);
+DllExport  int         win32_chsize(int fd, Off_t size);
 DllExport  Off_t       win32_lseek( int fd, Off_t offset, int origin);
 DllExport  Off_t       win32_tell( int fd);
 DllExport  int         win32_dup( int fd);
@@ -236,6 +237,7 @@ END_EXTERN_C
 #define longpath(pth)          win32_longpath(pth)
 #define rename(old,new)                win32_rename(old,new)
 #define setmode(fd,mode)       win32_setmode(fd,mode)
+#define chsize(fd,sz)          win32_chsize(fd,sz)
 #define lseek(fd,offset,orig)  win32_lseek(fd,offset,orig)
 #define tell(fd)               win32_tell(fd)
 #define dup(fd)                        win32_dup(fd)