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 3dd1db2f73a2827dd1a7e284aed9aa63d74ac211
Author: Patrick LeBoutillier <p...@cpan.org>
Date:   Tue Jan 15 13:28:06 2002 +0000

    Fixed callbacks for JNI.
---
 Java/Callback.pm |  8 +++++++-
 Java/JNI.xs      | 42 +++++++++++++++++++++++++++++++++++-------
 Java/JVM.pm      |  7 +++++--
 3 files changed, 47 insertions(+), 10 deletions(-)

diff --git a/Java/Callback.pm b/Java/Callback.pm
index 4d8c9e7..de02183 100644
--- a/Java/Callback.pm
+++ b/Java/Callback.pm
@@ -9,6 +9,9 @@ $Inline::Java::Callback::VERSION = '0.31' ;
 use Carp ;
 
 
+$Inline::Java::Callback::OBJECT_HOOK = undef ;
+
+
 sub InterceptCallback {
        my $inline = shift ;
        my $resp = shift ;
@@ -80,6 +83,10 @@ sub ProcessCallback {
 }
 
 
+
+1 ;
+
+
 __DATA__
 
 /*
@@ -140,4 +147,3 @@ public class InlineJavaPerlCaller {
        }
 }
 
-
diff --git a/Java/JNI.xs b/Java/JNI.xs
index cee60d3..141c139 100644
--- a/Java/JNI.xs
+++ b/Java/JNI.xs
@@ -46,12 +46,12 @@ void check_exception(JNIEnv *env, char *msg){
 
 
 jstring JNICALL jni_callback(JNIEnv *env, jobject obj, jstring cmd){
-
        dSP ;
-       jstring resp = NULL ;
+       jstring resp ;
        char *c = (char *)((*(env))->GetStringUTFChars(env, cmd, NULL)) ;
        char *r = NULL ;
        int count = 0 ;
+       SV *hook = NULL ;
 
        ENTER ;
        SAVETMPS ;
@@ -63,14 +63,31 @@ jstring JNICALL jni_callback(JNIEnv *env, jobject obj, 
jstring cmd){
 
        (*(env))->ReleaseStringUTFChars(env, cmd, c) ;
        count = perl_call_pv("Inline::Java::Callback::InterceptCallback", 
-               G_SCALAR) ;
+               G_ARRAY|G_EVAL) ;
 
        SPAGAIN ;
 
-       if (count != 1){
-               croak("Invalid return value from 
Inline::Java::Callback::InterceptCallback: %d",
-                       count) ;
+       /* Check the eval */
+       if (SvTRUE(ERRSV)){
+               STRLEN n_a ;
+               croak(SvPV(ERRSV, n_a)) ;
        }
+       else{
+               if (count != 2){
+                       croak("Invalid return value from 
Inline::Java::Callback::InterceptCallback: %d",
+                               count) ;
+               }
+       }
+
+       /* 
+               The first thing to pop is a reference to the returned object,
+               which we must keep around long enough so that it is not deleted
+               before control gets back to Java. This is because this object
+               may be returned be the callback, and when it gets back to Java
+               it will already be deleted.
+       */
+       hook = get_sv("Inline::Java::Callback::OBJECT_HOOK", FALSE) ;
+       sv_setsv(hook, POPs) ;
 
        r = (char *)POPp ;
        resp = (*(env))->NewStringUTF(env, r) ;
@@ -79,7 +96,6 @@ jstring JNICALL jni_callback(JNIEnv *env, jobject obj, 
jstring cmd){
        FREETMPS ;
        LEAVE ;
 
-
        return resp ;
 }
 
@@ -101,6 +117,7 @@ new(CLASS, classpath, debug)
        JavaVMInitArgs vm_args ;
        JavaVMOption options[2] ;
        JNIEnv *env ;
+       JNINativeMethod nm ;
        jint res ;
        char *cp ;
 
@@ -143,6 +160,13 @@ new(CLASS, classpath, debug)
        RETVAL->process_command_mid = (*(env))->GetMethodID(env, 
RETVAL->ijs_class, "ProcessCommand", "(Ljava/lang/String;)Ljava/lang/String;") ;
        check_exception(env, "Can't find method ProcessCommand in class 
InlineJavaServer") ;
 
+       /* Register the callback function */
+       nm.name = "jni_callback" ;
+       nm.signature = "(Ljava/lang/String;)Ljava/lang/String;" ;
+       nm.fnPtr = jni_callback ;
+       (*(env))->RegisterNatives(env, RETVAL->ijs_class, &nm, 1) ;     
+       check_exception(env, "Can't register method jni_callback in class 
InlineJavaServer") ;
+       
     OUTPUT:
        RETVAL
 
@@ -190,6 +214,7 @@ process_command(this, data)
        JNIEnv *env ;
        jstring cmd ;
        jstring resp ;
+       SV *hook = NULL ;
 
        CODE:
        env = get_env(this) ;
@@ -199,6 +224,9 @@ process_command(this, data)
        resp = (*(env))->CallObjectMethod(env, this->ijs, 
this->process_command_mid, cmd) ;
        check_exception(env, "Can't call ProcessCommand in InlineJavaServer") ;
 
+       hook = get_sv("Inline::Java::Callback::OBJECT_HOOK", FALSE) ;
+       sv_setsv(hook, &PL_sv_undef) ;
+
        RETVAL = (char *)((*(env))->GetStringUTFChars(env, resp, NULL)) ;
        
     OUTPUT:
diff --git a/Java/JVM.pm b/Java/JVM.pm
index 2bc0b09..8f0cd8b 100644
--- a/Java/JVM.pm
+++ b/Java/JVM.pm
@@ -269,7 +269,6 @@ sub process_command {
        my $inline = shift ;
        my $data = shift ;
 
-       my $ref = undef ;
        my $resp = undef ;
        while (1){
                Inline::Java::debug("  packet sent is $data") ;
@@ -283,6 +282,10 @@ sub process_command {
                        if (! $resp){
                                croak "Can't receive packet from JVM: $!" ;
                        }
+
+                       # Release the reference since the object has been sent 
back
+                       # to Java.
+                       $Inline::Java::Callback::OBJECT_HOOK = undef ;
                }
                if ($this->{JNI}){
                        $Inline::Java::JNI::INLINE_HOOK = $inline ;
@@ -293,7 +296,7 @@ sub process_command {
 
                # We got an answer from the server. Is it a callback?
                if ($resp =~ /^callback/){
-                       ($data, $ref) = 
Inline::Java::Callback::InterceptCallback($inline, $resp) ;
+                       ($data, $Inline::Java::Callback::OBJECT_HOOK) = 
Inline::Java::Callback::InterceptCallback($inline, $resp) ;
                        next ;
                }
                else{

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-perl/packages/libinline-java-perl.git

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to