[libinline-java-perl] 124/398: ,.
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 5d28caa378e4e096fabe16ea83fc82a3a8a93b00
Author: Patrick LeBoutillier <patl at cpan.org>
Date: Fri Dec 14 13:15:29 2001 +0000
,.
---
Java/Makefile.PL | 27 ++++++++++-----
Java/Protocol.pm | 103 +++++++++++++++++++++++++++++++++++++++++--------------
2 files changed, 96 insertions(+), 34 deletions(-)
diff --git a/Java/Makefile.PL b/Java/Makefile.PL
index 3f66487..76cdc35 100644
--- a/Java/Makefile.PL
+++ b/Java/Makefile.PL
@@ -8,9 +8,13 @@ use strict ;
if (! defined($main::JNI_BUILD)){
$main::JNI_BUILD = 0 ;
}
+if (! defined($main::JNI_VM)){
+ $main::JNI_VM = "classic" ;
+}
my $JNI_BUILD = $main::JNI_BUILD ;
+my $JNI_VM = $main::JNI_VM ;
# Define these variables with the correct values to bypass the
@@ -32,7 +36,7 @@ if ($JNI_BUILD){
(! defined($java_include_os))&&
(! defined($java_lib))&&
(! defined($java_so))){
- print "\nBuilding JNI extension.\n" ;
+ print "\nBuilding JNI extension, $JNI_VM VM.\n" ;
# We need to find the files in order to be able to build
my $q = "\nEnter the path to your Java 2 SDK installation" ;
@@ -71,8 +75,9 @@ if ($JNI_BUILD){
}
print "\nNote: In order for Inline::Java to use the JNI extension, you " .
- "will need to set the PERL_INLINE_JAVA_JNI environment variable to " .
- "a true value. See README.JNI for more information.\n" ;
+ "will need to use the JNI configuration option or set the " .
+ "PERL_INLINE_JAVA_JNI environment variable to a true value. " .
+ "See README.JNI for more information.\n" ;
print "\n" ;
}
@@ -112,15 +117,19 @@ sub wanted {
$java_include_os = $File::Find::dir ;
}
if ($file eq $jvm_lib){
- print "Found $jvm_lib in $File::Find::dir...\n" ;
- $java_lib = $File::Find::dir ;
+ if ($File::Find::dir =~ /$JNI_VM/){
+ print "Found $jvm_lib in $File::Find::dir...\n" ;
+ $java_lib = $File::Find::dir ;
+ }
}
if ($file eq $jvm_so){
- print "Found $jvm_so in $File::Find::dir...\n" ;
- if (! defined($java_so)){
- $java_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 ;
}
- push @{$java_so}, $File::Find::dir ;
}
}
diff --git a/Java/Protocol.pm b/Java/Protocol.pm
index 1ecf930..01070a6 100644
--- a/Java/Protocol.pm
+++ b/Java/Protocol.pm
@@ -213,6 +213,7 @@ sub ValidateMember {
sub ValidateArgs {
my $this = shift ;
my $args = shift ;
+ my $callback = shift ;
my @ret = () ;
foreach my $arg (@{$args}){
@@ -221,7 +222,12 @@ sub ValidateArgs {
}
elsif (ref($arg)){
if ((! UNIVERSAL::isa($arg, "Inline::Java::Object"))&&(! UNIVERSAL::isa($arg, "Inline::Java::Array"))){
- croak "A Java method or member can only have Java objects, Java arrays or scalars as arguments" ;
+ if (! $callback){
+ croak "A Java method or member can only have Java objects, Java arrays or scalars as arguments" ;
+ }
+ else{
+ croak "A Java callback function can only return Java objects, Java arrays or scalars" ;
+ }
}
my $obj = $arg ;
@@ -259,23 +265,44 @@ sub Send {
my $data = shift ;
my $const = shift ;
- my $resp = Inline::Java::get_JVM()->process_command($data) ;
+ my $inline = Inline::Java::get_INLINE($this->{module}) ;
+ my $resp = Inline::Java::get_JVM()->process_command($inline, $data) ;
if ($resp =~ /^error scalar:([\d.]*)$/){
my $msg = pack("C*", split(/\./, $1)) ;
Inline::Java::debug(" packet recv error: $msg") ;
croak $msg ;
}
- elsif ($resp =~ /^ok scalar:([\d.]*)$/){
+ elsif ($resp =~ s/^ok //){
+ return $this->DeserializeObject($const, $resp) ;
+ }
+
+ croak "Malformed response from server: $resp" ;
+}
+
+
+sub DeserializeObject {
+ my $this = shift ;
+ my $const = shift ;
+ my $resp = shift ;
+
+ if ($resp =~ /^scalar:([\d.]*)$/){
return pack("C*", split(/\./, $1)) ;
}
- elsif ($resp =~ /^ok undef:$/){
+ elsif ($resp =~ /^undef:$/){
return undef ;
}
- elsif ($resp =~ /^ok object:(\d+):(.*)$/){
+ elsif ($resp =~ /^object:([01]):(\d+):(.*)$/){
# Create the Perl object wrapper and return it.
- my $id = $1 ;
- my $class = $2 ;
+ my $thrown = $1 ;
+ my $id = $2 ;
+ my $class = $3 ;
+
+ if ($thrown){
+ # If we receive a thrown object, we jump out of 'constructor
+ # mode' and process the returned object.
+ $const = 0 ;
+ }
if ($const){
$this->{obj_priv}->{java_class} = $class ;
@@ -299,7 +326,7 @@ sub Send {
my $perl_class = Inline::Java::java2perl($pkg, $elem_class) ;
if (Inline::Java::Class::ClassIsReference($elem_class)){
if (! Inline::Java::known_to_perl($pkg, $elem_class)){
- if ($inline->get_java_config('AUTOSTUDY')){
+ if (($thrown)||($inline->get_java_config('AUTOSTUDY'))){
$inline->_study([$elem_class]) ;
}
else{
@@ -323,10 +350,19 @@ sub Send {
$obj = $perl_class->__new($class, $inline, $id) ;
}
- Inline::Java::debug("returning stub...") ;
- return $obj ;
+ if ($thrown){
+ Inline::Java::debug("throwing stub...") ;
+ die $obj ;
+ }
+ else{
+ Inline::Java::debug("returning stub...") ;
+ return $obj ;
+ }
}
}
+ else{
+ croak "Malformed response from server: $resp" ;
+ }
}
@@ -350,11 +386,11 @@ __DATA__
the request type and then we proceed to serve it.
*/
class InlineJavaProtocol {
- InlineJavaServer ijs ;
- InlineJavaClass ijc ;
- InlineJavaArray ija ;
- String cmd ;
- String response ;
+ private InlineJavaServer ijs ;
+ private InlineJavaClass ijc ;
+ private InlineJavaArray ija ;
+ private String cmd ;
+ private String response ;
InlineJavaProtocol(InlineJavaServer _ijs, String _cmd) {
ijs = _ijs ;
@@ -500,8 +536,13 @@ class InlineJavaProtocol {
Object p[] = (Object [])f.get(1) ;
Class clist[] = (Class [])f.get(2) ;
- Object o = CreateObject(c, p, clist) ;
- SetResponse(o) ;
+ try {
+ Object o = CreateObject(c, p, clist) ;
+ SetResponse(o) ;
+ }
+ catch (InlineJavaInvocationTargetException ite){
+ SetResponse(new InlineJavaServerThrown(ite.getThrowable())) ;
+ }
}
else{
// Here we send the type of array we want, but CreateArray
@@ -568,8 +609,8 @@ class InlineJavaProtocol {
Throwable t = e.getTargetException() ;
String type = t.getClass().getName() ;
String msg = t.getMessage() ;
- throw new InlineJavaException(
- "Method " + name + " in class " + class_name + " threw exception " + type + ": " + msg) ;
+ ijs.debug("Method " + name + " in class " + class_name + " threw exception " + type + ": " + msg) ;
+ SetResponse(new InlineJavaServerThrown(t)) ;
}
}
}
@@ -718,8 +759,9 @@ class InlineJavaProtocol {
Throwable t = e.getTargetException() ;
String type = t.getClass().getName() ;
String msg = t.getMessage() ;
- throw new InlineJavaException(
- "Constructor for class " + name + " with signature " + ijs.CreateSignature(proto) + " threw exception " + type + ": " + msg) ;
+ throw new InlineJavaInvocationTargetException(
+ "Constructor for class " + name + " with signature " + ijs.CreateSignature(proto) + " threw exception " + type + ": " + msg,
+ t) ;
}
return ret ;
@@ -881,27 +923,38 @@ class InlineJavaProtocol {
script
*/
void SetResponse (Object o) throws InlineJavaException {
+ response = "ok " + SerializeObject(o) ;
+ }
+
+
+ String SerializeObject(Object o) throws InlineJavaException {
if (o == null){
- response = "ok undef:" ;
+ return "undef:" ;
}
else if ((ijc.ClassIsNumeric(o.getClass()))||(ijc.ClassIsChar(o.getClass()))||(ijc.ClassIsString(o.getClass()))){
- response = "ok scalar:" + unpack(o.toString()) ;
+ return "scalar:" + unpack(o.toString()) ;
}
else if (ijc.ClassIsBool(o.getClass())){
String b = o.toString() ;
- response = "ok scalar:" + unpack((b.equals("true") ? "1" : "0")) ;
+ return "scalar:" + unpack((b.equals("true") ? "1" : "0")) ;
}
else {
// Here we need to register the object in order to send
// it back to the Perl script.
+ boolean thrown = false ;
+ if (o instanceof InlineJavaServerThrown){
+ thrown = true ;
+ o = ((InlineJavaServerThrown)o).getThrowable() ;
+ }
int id = ijs.objid ;
ijs.PutObject(id, o) ;
- response = "ok object:" + String.valueOf(id) +
+ return "object:" + (thrown ? "1" : "0") + ":" + String.valueOf(id) +
":" + o.getClass().getName() ;
}
}
+
/* Equivalent to Perl pack */
public String pack(String s){
StringTokenizer st = new StringTokenizer(s, ".") ;
--
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