You can test the "internal type" you get as a result of the eval().

TclObject tobj;

// Do a thread safe Tcl eval and set tobj to the interp result.

InternalRep rep = tobj.getInternalRep(); 

if (rep instanceof TclString) {
  String s = rep.toString();
} else if (rep instanceof TclInteger) {
  int i = TclInteger.get(interp, rep);
} else if (rep instanceof TclDouble) {
  double d = TclDouble.get(interp, rep);
} else if (rep instanceof ReflectObject) {
  Object o = ReflectObject.get(interp, rep);
  Class cl =  ReflectObject.getClass(interp, rep);
}

I hope that clears things up.

Mo Dejong
Red Hat Inc.

On Wed, 19 Apr 2000, Paul Eng wrote:

> Mo,
> 
> Thanks for the reply.
> 
> Suppose I want to use Jacl to process users' scripts so that I have no idea
> what the return type is going to be.  I understand how I could check to see
> if the return object is a ReflectObject and how I could unwrap it to get the
> Java object if it was.  But, let's say a proc simply has "return 1".  This
> comes back from interp.getResult() as a TclObject, but what I really want is
> a java.lang.Integer.  Can I somehow convert it or is my only choice to get
> it as a java.lang.String?
> 
> I'm new to Tcl/Jacl, so forgive me if this doesn't make sense.
> 
> Thanks,
> Paul Eng
> 
> 
> -----Original Message-----
> From: Mo DeJong [mailto:[EMAIL PROTECTED]]
> Sent: Friday, April 14, 2000 3:29 PM
> To: Paul Eng
> Cc: [EMAIL PROTECTED]
> Subject: Re: [Tcl Java] Converting Interp.getResult TclObject to Java
> 
> 
> On Fri, 14 Apr 2000, Paul Eng wrote:
> 
> > I am looking into using Jacl to call Tcl scripts.  I can call
> interp.eval()
> > and then interp.getResult() to get the return value, but the return value
> is
> > a TclObject.  What I would like to do is convert this TclObject result
> into
> > it's appropriate java object, so that if it's a reflected object, I would
> > get the java object, if it's a TclString, I would get java.lang.String,
> etc.
> >
> > I found the convertTclObject() method in JavaInvoke which looks like what
> I
> > want, but the method is not public.  Is there a way I can do this or am I
> > missing something?
> >
> > Thanks,
> > Paul Eng
> 
> The "trick" here is that Tcl objects have "internal representations",
> that could be a float, a Java object, or whatever. Because a Tcl
> object is a "wrapper" around an InternalRep, you need to "unwrap"
> the TclObject in you Java code if you want to do something with it.
> Lets say you invoke a Tcl proc that does some Java related stuff,
> it sets the interp result to a ReflectObject, a Tcl "wrapper" for
> a Java object.
> 
> interp.eval("some_java_func");
> 
> Now you can "unwrap" the Java object like so.
> 
> TclObject result = interp.getResult();
> 
> Object jobj = ReflectObject.get(interp, result);
> 
> If you want to know what the Java Class of the reflected
> Java object is, you can find that out like this.
> 
> Class jcl = ReflectObject.getClass(interp, result);
> 
> (WARNING: YOU MUST GET THE REFLECTED CLASS TYPE LIKE THIS,
> DO NOT CALL THE jobj.getClass() METHOD TO GET THE
> REFLECTED CLASS TYPE, THEY ARE NOT THE SAME THINGS).
> 
> To get the "string rep" of a TclObject just call the
> toString() method on the TclObject.
> 
> I hope that helps.
> Mo Dejong
> Red Hat Inc.
> 
> ----------------------------------------------------------------
> The TclJava mailing list is sponsored by Scriptics Corporation.
> To subscribe:    send mail to [EMAIL PROTECTED]  
>                  with the word SUBSCRIBE as the subject.
> To unsubscribe:  send mail to [EMAIL PROTECTED] 
>                  with the word UNSUBSCRIBE as the subject.
> To send to the list, send email to '[EMAIL PROTECTED]'. 
> An archive is available at http://www.mail-archive.com/tcljava@scriptics.com
> 
> 

----------------------------------------------------------------
The TclJava mailing list is sponsored by Scriptics Corporation.
To subscribe:    send mail to [EMAIL PROTECTED]  
                 with the word SUBSCRIBE as the subject.
To unsubscribe:  send mail to [EMAIL PROTECTED] 
                 with the word UNSUBSCRIBE as the subject.
To send to the list, send email to '[EMAIL PROTECTED]'. 
An archive is available at http://www.mail-archive.com/tcljava@scriptics.com

Reply via email to