[libinline-java-perl] 127/398: *** empty log message ***
Jonas Smedegaard
dr at jones.dk
Thu Feb 26 11:42:56 UTC 2015
This is an automated email from the git hooks/post-receive script.
js pushed a commit to tag 0.55
in repository libinline-java-perl.
commit b214691274283509e17c81a144e039285bf80cc5
Author: Patrick LeBoutillier <patl at cpan.org>
Date: Tue Dec 18 22:23:24 2001 +0000
*** empty log message ***
---
Java.pm | 2 ++
Java/Callback.pm | 74 ++++++++++++++++++++++++++++++++-----------
Java/Init.pm | 30 ++++++++++++++++--
Java/JNI.pm | 3 +-
Java/Makefile.PL | 16 ++++------
Java/Protocol.pm | 27 +++++++++++++---
TODO | 10 ++++--
t/13_callbacks.t | 96 ++++++++++++++++++++++++++++++++++++++++++--------------
8 files changed, 194 insertions(+), 64 deletions(-)
diff --git a/Java.pm b/Java.pm
index 7fee281..5133f76 100644
--- a/Java.pm
+++ b/Java.pm
@@ -1238,6 +1238,7 @@ sub portable {
PATH_SEP => '/',
PATH_SEP_RE => '/',
RE_FILE => [],
+ RE_FILE_JAVA => [],
IO_REDIR => '2>&1',
GOT_ALARM => 1,
COMMAND_COM => 0,
@@ -1252,6 +1253,7 @@ sub portable {
PATH_SEP => '\\',
PATH_SEP_RE => '\\\\',
RE_FILE => ['/', '\\'],
+ RE_FILE_JAVA => ['\\\\', '\\\\'],
# 2>&1 doesn't work under command.com
IO_REDIR => ($COMMAND_COM ? '' : undef),
GOT_ALARM => 0,
diff --git a/Java/Callback.pm b/Java/Callback.pm
index 1c23638..40c7003 100644
--- a/Java/Callback.pm
+++ b/Java/Callback.pm
@@ -14,8 +14,8 @@ sub InterceptCallback {
my $resp = shift ;
# With JNI we need to store the object somewhere since we
- # can't drag it along all the wat through Java land...
- if (! defined($inline)){
+ # can't drag it along all the way through Java land...
+ if (! defined($inline)){
$inline = $Inline::Java::JNI::INLINE_HOOK ;
}
@@ -37,18 +37,30 @@ sub ProcessCallback {
my @sargs = @_ ;
my $pc = new Inline::Java::Protocol(undef, $inline) ;
- my @args = map {$pc->DeserializeObject(0, $_)} @sargs ;
-
- Inline::Java::debug(" processing callback $module" . "::" . "$function(" .
- join(", ", @args) . ")") ;
-
- no strict 'refs' ;
- my $sub = "$module" . "::" . $function ;
- my $ret = $sub->(@args) ;
+ my $thrown = 'false' ;
+ my $ret = undef ;
+ eval {
+ my @args = map {$pc->DeserializeObject(0, $_)} @sargs ;
+
+ Inline::Java::debug(" processing callback $module" . "::" . "$function(" .
+ join(", ", @args) . ")") ;
+
+ no strict 'refs' ;
+ my $sub = "$module" . "::" . $function ;
+ $ret = $sub->(@args) ;
+ } ;
+ if ($@){
+ $ret = $@ ;
+ $thrown = 'true' ;
+
+ if ((ref($ret))&&(! UNIVERSAL::isa($ret, "Inline::Java::Object"))){
+ croak "Can't propagate non-Inline::Java reference exception ($ret) to Java" ;
+ }
+ }
($ret) = $pc->ValidateArgs([$ret]) ;
- return "callback $ret" ;
+ return "callback $thrown $ret" ;
}
@@ -59,26 +71,50 @@ __DATA__
*/
public class InlineJavaPerlCaller {
public InlineJavaPerlCaller(){
- if (InlineJavaServer.instance == null){
- System.err.println("Can't use InlineJavaPerlCaller outside of an Inline::Java context") ;
- System.err.flush() ;
+ }
+
+
+ class InlineJavaException extends Exception {
+ private InlineJavaServer.InlineJavaException ije = null ;
+
+ InlineJavaException(InlineJavaServer.InlineJavaException e) {
+ ije = e ;
+ }
+
+ public InlineJavaServer.InlineJavaException GetException(){
+ return ije ;
}
}
- class InlineJavaPerlCallerException extends Exception {
- InlineJavaPerlCallerException(String s) {
- super(s) ;
+ class PerlException extends Exception {
+ private Object obj = null ;
+
+ PerlException(Object o) {
+ obj = o ;
+ }
+
+ public Object GetObject(){
+ return obj ;
}
}
- public Object CallPerl(String pkg, String method, Object args[]) throws InlineJavaPerlCallerException {
+ public Object CallPerl(String pkg, String method, Object args[]) throws InlineJavaException, PerlException {
+ if (InlineJavaServer.instance == null){
+ System.err.println("Can't use InlineJavaPerlCaller outside of an Inline::Java context") ;
+ System.err.flush() ;
+ System.exit(1) ;
+ }
+
try {
return InlineJavaServer.instance.Callback(pkg, method, args) ;
}
catch (InlineJavaServer.InlineJavaException e){
- throw new InlineJavaPerlCallerException(e.getMessage()) ;
+ throw new InlineJavaException(e) ;
+ }
+ catch (InlineJavaServer.InlineJavaPerlException e){
+ throw new PerlException(e.GetObject()) ;
}
}
}
diff --git a/Java/Init.pm b/Java/Init.pm
index 4d234ad..90e4eac 100644
--- a/Java/Init.pm
+++ b/Java/Init.pm
@@ -254,7 +254,7 @@ public class InlineJavaServer {
}
- public Object Callback(String pkg, String method, Object args[]) throws InlineJavaException {
+ public Object Callback(String pkg, String method, Object args[]) throws InlineJavaException, InlineJavaPerlException {
Object ret = null ;
try {
@@ -290,8 +290,14 @@ public class InlineJavaServer {
StringTokenizer st = new StringTokenizer(resp, " ") ;
String c = st.nextToken() ;
if (c.equals("callback")){
+ boolean thrown = new Boolean(st.nextToken()).booleanValue() ;
String arg = st.nextToken() ;
ret = ijc.CastArgument(java.lang.Object.class, arg) ;
+
+ if (thrown){
+ throw new InlineJavaPerlException(ret) ;
+ }
+
break ;
}
else{
@@ -392,6 +398,23 @@ public class InlineJavaServer {
/*
+ Exception thrown by Perl callbacks.
+ */
+ class InlineJavaPerlException extends Exception {
+ private Object obj = null ;
+
+
+ InlineJavaPerlException(Object o) {
+ obj = o ;
+ }
+
+ public Object GetObject(){
+ return obj ;
+ }
+ }
+
+
+ /*
Exception thrown by this code while trying to cast arguments
*/
class InlineJavaCastException extends InlineJavaException {
@@ -401,6 +424,7 @@ public class InlineJavaServer {
}
+
class InlineJavaInvocationTargetException extends InlineJavaException {
Throwable t = null ;
@@ -409,7 +433,7 @@ public class InlineJavaServer {
t = _t ;
}
- public Throwable getThrowable(){
+ public Throwable GetThrowable(){
return t ;
}
}
@@ -471,7 +495,7 @@ class InlineJavaServerThrown {
t = _t ;
}
- public Throwable getThrowable(){
+ public Throwable GetThrowable(){
return t ;
}
}
diff --git a/Java/JNI.pm b/Java/JNI.pm
index 653ab93..3476a8b 100644
--- a/Java/JNI.pm
+++ b/Java/JNI.pm
@@ -39,7 +39,8 @@ sub dl_load_flags {
my $f = basename($so) ;
my $sep = Inline::Java::portable("PATH_SEP") ;
- $Inline::Java::JNI::SO = Cwd::abs_path($dir) . $sep . $f ;
+ $Inline::Java::JNI::SO = Inline::Java::portable("RE_FILE", Cwd::abs_path($dir) . $sep . $f) ;
+ $Inline::Java::JNI::SO = Inline::Java::portable("RE_FILE_JAVA", $Inline::Java::JNI::SO) ;
return DynaLoader::dl_load_flags() ;
}
diff --git a/Java/Makefile.PL b/Java/Makefile.PL
index 76cdc35..d7d83be 100644
--- a/Java/Makefile.PL
+++ b/Java/Makefile.PL
@@ -117,19 +117,15 @@ sub wanted {
$java_include_os = $File::Find::dir ;
}
if ($file eq $jvm_lib){
- if ($File::Find::dir =~ /$JNI_VM/){
- print "Found $jvm_lib in $File::Find::dir...\n" ;
- $java_lib = $File::Find::dir ;
- }
+ print "Found $jvm_lib in $File::Find::dir...\n" ;
+ $java_lib = $File::Find::dir ;
}
if ($file eq $jvm_so){
- if ($File::Find::dir =~ /$JNI_VM/){
- print "Found $jvm_so in $File::Find::dir...\n" ;
- if (! defined($java_so)){
- $java_so = [] ;
- }
- push @{$java_so}, $File::Find::dir ;
+ print "Found $jvm_so in $File::Find::dir...\n" ;
+ if (! defined($java_so)){
+ $java_so = [] ;
}
+ push @{$java_so}, $File::Find::dir ;
}
}
diff --git a/Java/Protocol.pm b/Java/Protocol.pm
index 01070a6..bc6f006 100644
--- a/Java/Protocol.pm
+++ b/Java/Protocol.pm
@@ -3,7 +3,7 @@ package Inline::Java::Protocol ;
use strict ;
-$Inline::Java::Protocol::VERSION = '0.30' ;
+$Inline::Java::Protocol::VERSION = '0.31' ;
use Inline::Java::Object ;
use Inline::Java::Array ;
@@ -352,7 +352,13 @@ sub DeserializeObject {
if ($thrown){
Inline::Java::debug("throwing stub...") ;
- die $obj ;
+ my ($msg, $score) = $obj->__isa('InlineJavaPerlCaller$PerlException') ;
+ if ($msg){
+ die $obj ;
+ }
+ else{
+ die $obj->GetObject() ;
+ }
}
else{
Inline::Java::debug("returning stub...") ;
@@ -541,7 +547,13 @@ class InlineJavaProtocol {
SetResponse(o) ;
}
catch (InlineJavaInvocationTargetException ite){
- SetResponse(new InlineJavaServerThrown(ite.getThrowable())) ;
+ Throwable t = ite.GetThrowable() ;
+ if (t instanceof InlineJavaPerlCaller.InlineJavaException){
+ throw ((InlineJavaPerlCaller.InlineJavaException)t).GetException() ;
+ }
+ else{
+ SetResponse(new InlineJavaServerThrown(t)) ;
+ }
}
}
else{
@@ -610,7 +622,12 @@ class InlineJavaProtocol {
String type = t.getClass().getName() ;
String msg = t.getMessage() ;
ijs.debug("Method " + name + " in class " + class_name + " threw exception " + type + ": " + msg) ;
- SetResponse(new InlineJavaServerThrown(t)) ;
+ if (t instanceof InlineJavaPerlCaller.InlineJavaException){
+ throw ((InlineJavaPerlCaller.InlineJavaException)t).GetException() ;
+ }
+ else{
+ SetResponse(new InlineJavaServerThrown(t)) ;
+ }
}
}
}
@@ -944,7 +961,7 @@ class InlineJavaProtocol {
boolean thrown = false ;
if (o instanceof InlineJavaServerThrown){
thrown = true ;
- o = ((InlineJavaServerThrown)o).getThrowable() ;
+ o = ((InlineJavaServerThrown)o).GetThrowable() ;
}
int id = ijs.objid ;
ijs.PutObject(id, o) ;
diff --git a/TODO b/TODO
index eb58166..152e437 100644
--- a/TODO
+++ b/TODO
@@ -1,6 +1,12 @@
CODE:
-- Callbacks
+- Add comments to place that may not be thread safe (in Perl)
+- Do more research on JNI and threads to make JNI mode
+ more robust
+
TEST:
-- Add test script for configuration options (other than BIN)
+
+
+DOCUMENTATION:
+- Callbacks
diff --git a/t/13_callbacks.t b/t/13_callbacks.t
index a44b347..418feac 100644
--- a/t/13_callbacks.t
+++ b/t/13_callbacks.t
@@ -14,7 +14,7 @@ use Inline::Java qw(caught) ;
BEGIN {
- plan(tests => 14) ;
+ plan(tests => 17) ;
}
my $t = new t10() ;
@@ -37,20 +37,24 @@ my $t = new t10() ;
ok($t->cat_via_perl("Inline", "Java"), "InlineJava") ;
- eval {$t->death_via_perl()} ; ok($@, qr/death/) ;
+ ok(twister(20, 0, 0), "return perl twister") ;
+ ok($t->twister(20, 0, 0), "return java twister") ;
+ eval {twister(20, 0, 1)} ; ok($@, qr/^throw perl twister/) ;
+
my $msg = '' ;
- eval {$t->except()} ;
+ eval {$t->twister(20, 0, 1)} ;
if ($@) {
- if (caught('InlineJavaPerlCaller$InlineJavaPerlCallerException')){
+ if (caught('t10$OwnException')){
$msg = $@->getMessage() ;
}
else{
die $@ ;
}
}
- ok($msg, "test") ;
-
+ ok($msg, "throw java twister") ;
+
+ eval {$t->bug()} ; ok($@, qr/^bug/) ;
} ;
if ($@){
if (caught("java.lang.Throwable")){
@@ -107,8 +111,22 @@ sub add_via_java_t {
}
-sub death {
- die("death") ;
+sub twister {
+ my $max = shift ;
+ my $cnt = shift ;
+ my $explode = shift ;
+
+ if ($cnt == $max){
+ if ($explode){
+ die("throw perl twister") ;
+ }
+ else{
+ return "return perl twister" ;
+ }
+ }
+ else{
+ return $t->twister($max, $cnt+1, $explode) ;
+ }
}
@@ -120,6 +138,13 @@ __Java__
import java.io.* ;
class t10 extends InlineJavaPerlCaller {
+ class OwnException extends Exception {
+ OwnException(String msg){
+ super(msg) ;
+ }
+ }
+
+
public t10() {
}
@@ -139,7 +164,7 @@ class t10 extends InlineJavaPerlCaller {
return a * b ;
}
- public int silly_mul_via_perl(int a, int b) throws InlineJavaPerlCallerException {
+ public int silly_mul_via_perl(int a, int b) throws InlineJavaException, PerlException {
int ret = 0 ;
for (int i = 0 ; i < b ; i++){
ret = add_via_perl(ret, a) ;
@@ -148,44 +173,37 @@ class t10 extends InlineJavaPerlCaller {
}
- public int add_via_perl(int a, int b) throws InlineJavaPerlCallerException {
+ public int add_via_perl(int a, int b) throws InlineJavaException, PerlException {
String val = (String)CallPerl("main", "add",
new Object [] {new Integer(a), new Integer(b)}) ;
return new Integer(val).intValue() ;
}
- public void death_via_perl() throws InlineJavaPerlCallerException {
+ public void death_via_perl() throws InlineJavaException, PerlException {
InlineJavaPerlCaller c = new InlineJavaPerlCaller() ;
c.CallPerl("main", "death", null) ;
}
- public void except() throws InlineJavaPerlCallerException {
- throw new InlineJavaPerlCaller.InlineJavaPerlCallerException("test") ;
+ public void except() throws InlineJavaException, PerlException {
+ throw new PerlException("test") ;
}
- public int mul_via_perl(int a, int b) throws InlineJavaPerlCallerException {
+ public int mul_via_perl(int a, int b) throws InlineJavaException, PerlException {
String val = (String)CallPerl("main", "mul",
new Object [] {new Integer(a), new Integer(b)}) ;
return new Integer(val).intValue() ;
}
- public String cat_via_perl(String a, String b) throws InlineJavaPerlCallerException {
- String val = (String)CallPerl("main", "cat",
- new Object [] {a, b}) ;
-
- return val ;
- }
-
- public int add_via_perl_via_java(int a, int b) throws InlineJavaPerlCallerException {
+ public int add_via_perl_via_java(int a, int b) throws InlineJavaException, PerlException {
String val = (String)CallPerl("main", "add_via_java",
new Object [] {new Integer(a), new Integer(b)}) ;
return new Integer(val).intValue() ;
}
- static public int add_via_perl_via_java_t(t10 t, int a, int b) throws InlineJavaPerlCallerException {
+ static public int add_via_perl_via_java_t(t10 t, int a, int b) throws InlineJavaException, PerlException {
InlineJavaPerlCaller c = new InlineJavaPerlCaller() ;
String val = (String)c.CallPerl("main", "add_via_java_t",
new Object [] {t, new Integer(a), new Integer(b)}) ;
@@ -193,7 +211,8 @@ class t10 extends InlineJavaPerlCaller {
return new Integer(val).intValue() ;
}
- public int silly_mul_via_perl_via_java(int a, int b) throws InlineJavaPerlCallerException {
+
+ public int silly_mul_via_perl_via_java(int a, int b) throws InlineJavaException, PerlException {
int ret = 0 ;
for (int i = 0 ; i < b ; i++){
String val = (String)CallPerl("main", "add_via_java",
@@ -202,5 +221,34 @@ class t10 extends InlineJavaPerlCaller {
}
return ret ;
}
+
+
+ public String cat_via_perl(String a, String b) throws InlineJavaException, PerlException {
+ String val = (String)CallPerl("main", "cat",
+ new Object [] {a, b}) ;
+
+ return val ;
+ }
+
+ public String twister(int max, int cnt, int explode) throws InlineJavaException, PerlException, OwnException {
+ if (cnt == max){
+ if (explode > 0){
+ throw new OwnException("throw java twister") ;
+ }
+ else{
+ return "return java twister" ;
+ }
+ }
+ else{
+ return (String)CallPerl("main", "twister",
+ new Object [] {new Integer(max), new Integer(cnt+1), new Integer(explode)}) ;
+ }
+ }
+
+
+ public void bug() throws InlineJavaException {
+ throw new InlineJavaException(
+ InlineJavaServer.instance. new InlineJavaException("bug")) ;
+ }
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libinline-java-perl.git
More information about the Pkg-perl-cvs-commits
mailing list