From: <as...@pr...> - 2004-01-02 22:49:46
|
I wonder what code should the class generator generate for methods returning a boolean. To put this in context, here's what generated code for other primitive types look like (this is jreverspro's output): public long testil(int i) { Test.ci = ClassInfo.getClassInfo("Test"); Function function = Test.ci.getLispMethod("testil|int"); LispObject[] lispobject = new LispObject[1]; try { lispobject[0] = ClassInfo.makeLispObject(i); return ((Bignum)function.execute(lispobject).getValue()); } catch (ConditionThrowable conditionthrowable) { conditionthrowable.printStackTrace(); return (0); } } The interesting part is the return statement. I'd like to return a boolean (and it wouldn't hurt if the general shape of the expression would be like the one above). Andras |
From: Peter G. <pe...@ar...> - 2004-01-02 23:59:21
|
On Fri, 2 Jan 2004 at 23:49:40 +0100, Andr=E1s_Simon wrote: > I wonder what code should the class generator generate for methods > returning a boolean. To put this in context, here's what generated > code for other primitive types look like (this is jreverspro's > output): > > > public long testil(int i) > { > Test.ci =3D ClassInfo.getClassInfo("Test"); > Function function =3D Test.ci.getLispMethod("testil|int"); > LispObject[] lispobject =3D new LispObject[1]; > try { > lispobject[0] =3D ClassInfo.makeLispObject(i); > return ((Bignum)function.execute(lispobject).getValue());= > } > catch (ConditionThrowable conditionthrowable) { > conditionthrowable.printStackTrace(); > return (0); > } > } > > The interesting part is the return statement. I'd like to return a > boolean (and it wouldn't hurt if the general shape of the expression > would be like the one above). Once again I'm confused. How is that code even legal? The function is declared to return a long, but is actually (in the try block) returning a Bignum, which is a Lisp object. Or is this simply an artifact of work-in-progress on the class generator? How (generally speaking) are you generating this code? -Peter (who is even more obtuse than usual today, because of the flu...) |
From: <as...@pr...> - 2004-01-03 00:26:46
|
On Fri, 2 Jan 2004, Peter Graves wrote: > On Fri, 2 Jan 2004 at 23:49:40 +0100, Andr=E1s_Simon wrote: > > > > public long testil(int i) > > { > > Test.ci =3D ClassInfo.getClassInfo("Test"); > > Function function =3D Test.ci.getLispMethod("testil|int"); > > LispObject[] lispobject =3D new LispObject[1]; > > try { > > lispobject[0] =3D ClassInfo.makeLispObject(i); > > return ((Bignum)function.execute(lispobject).getValue());= > > > } > > catch (ConditionThrowable conditionthrowable) { > > conditionthrowable.printStackTrace(); > > return (0); > > } > > } > > > > The interesting part is the return statement. I'd like to return a > > boolean (and it wouldn't hurt if the general shape of the expression > > would be like the one above). > > Once again I'm confused. > > How is that code even legal? The function is declared to return a long, > but is actually (in the try block) returning a Bignum, which is a Lisp > object. > > Or is this simply an artifact of work-in-progress on the class > generator? No, it's a bug in jreversepro I haven't noticed when copy/pasting the code. Sorry! jad correctly gives ((Bignum)function.execute(lispobject)).getValue(); but has trouble decompiling the try/catch blocks. BTW, > > catch (ConditionThrowable conditionthrowable) { > > conditionthrowable.printStackTrace(); > > return (0); > > } is meant to be > > catch (ConditionThrowable conditionthrowable) { > > conditionthrowable.printStackTrace(); > > } > > return (0); but I'm not sure if this is the code generator's bug or jreversepro's. > How (generally speaking) are you generating this code? With ASM (http://asm.objectweb.org/), driven from Lisp. Which may cause some headaches later (mainly packaging problems), but is infinitely easier than writing class files directly. This is, for example, how the LispObject[] above is filled with the arguments: (loop for arg-type in arg-types and i from 0 and j = 1 then (+ j (size arg-type)) do (visit-var-insn-2 cv constants.aload index) (visit-int-insn-2 cv constants.bipush i) (visit-var-insn-2 cv (load-instruction arg-type) j) (visit-method-insn-4 cv constants.invokestatic "org/armedbear/lisp/ClassInfo" "makeLispObject" (format nil "(~a)~a" (arg-type-for-make-lisp-object arg-type) (decorate-type-name (return-type-for-make-lisp-object arg-type)))) (visit-insn-1 cv constants.aastore)) (jparse now defines symbol macros for static fields, that's where the constants.xxxx's come from) ASM is my only hope to get away without understanding the JVM :-) > > -Peter (who is even more obtuse than usual today, because of the flu...) > :-( Andras |
From: Peter G. <pe...@ar...> - 2004-01-03 00:56:20
|
OK, so you can already do this: return ((Bignum)function.execute(lispobject)).getValue(); And you want to return a boolean (if I'm understanding the question correctly). So why not something like: LispObject result = function.execute(lispobject); return result != NIL ? true : false; But this is too easy, so I'm sure I've misunderstood the question. Of course I have no idea how to generate that code with ASM; I hope that's not what you're asking... ;) (I believe jvm.lisp dodges this particular issue, but my head is too foggy at the moment to be sure.) -Peter |
From: <as...@pr...> - 2004-01-03 10:01:13
|
On Fri, 2 Jan 2004, Peter Graves wrote: > OK, so you can already do this: > > return ((Bignum)function.execute(lispobject)).getValue(); > > And you want to return a boolean (if I'm understanding the question > correctly). > > So why not something like: > > LispObject result = function.execute(lispobject); > return result != NIL ? true : false; > > But this is too easy, so I'm sure I've misunderstood the question. > Oops. (incf *embarrassments-counter*) And I don't even have the flu :-) Since I do this in the opposite direction, i.e., public static final LispObject makeLispObject(boolean i) throws ConditionThrowable { return i ? T : NIL; } it may have been that I was looking for something like return ((SomeLispType)function.execute(lispobject)).getValue(); but that's no excuse of course. Though perhaps it would make sense to have a getBooleanValue() method for LispObject's (which would always return true, but would be overridden in Symbol.java to return false for NIL), since everything can be used as a boolean in Lisp. Andras |
From: Peter G. <pe...@ar...> - 2004-01-03 14:33:40
|
On Sat, 3 Jan 2004 at 11:01:10 +0100, Andr=E1s_Simon wrote: > Though perhaps it would make sense to have a getBooleanValue() method > for LispObject's (which would always return true, but would be > overridden in Symbol.java to return false for NIL), since everything > can be used as a boolean in Lisp. This sounds reasonable, but the override should go in Nil.java. -Peter |
From: <as...@pr...> - 2004-01-04 01:27:15
|
On Sat, 3 Jan 2004, Peter Graves wrote: > On Sat, 3 Jan 2004 at 11:01:10 +0100, Andr=E1s_Simon wrote: > > Though perhaps it would make sense to have a getBooleanValue() method > > for LispObject's (which would always return true, but would be > > overridden in Symbol.java to return false for NIL), since everything > > can be used as a boolean in Lisp. > > This sounds reasonable, but the override should go in Nil.java. OK. Having getBooleanValue() made it very easy to handle methods returning boolean. So jnew-runtime-class is now able to create classes with methods of arbitary argument and return types. This solves my original problem, creating subclasses of javax.swing.table.AbstractTableModel. Not being a Java programmer however, I don't know what features it needs to be generally useful. I guess that its primary use would be to create subclasses of abstract classes, instances of which can be passed as arguments to constructors/methods of Java classes in some Java libraries. Now for that, should it provide means to define/specify - constructors (?) - fields (no) - exceptions for methods (yes) - static or private/protected modifiers (no) - anything else (no) My guesses are in parentheses. Note that jnew-runtime-class is not meant to let users create arbitrary classes; if you're into OOP and want to program in Lisp, use CLOS. Sorry if my question is somewhat vague. Andras |
From: Peter G. <pe...@ar...> - 2004-01-05 16:13:21
|
On Sun, 4 Jan 2004 at 02:27:05 +0100, Andr=E1s_Simon wrote: > OK. Having getBooleanValue() made it very easy to handle methods > returning boolean. So jnew-runtime-class is now able to create classes > with methods of arbitary argument and return types. This solves my > original problem, creating subclasses of > javax.swing.table.AbstractTableModel. > > Not being a Java programmer however, I don't know what features it > needs to be generally useful. I guess that its primary use would be to > create subclasses of abstract classes, instances of which can be > passed as arguments to constructors/methods of Java classes in some > Java libraries. Now for that, should it provide means to > define/specify > > - constructors (?) > - fields (no) > - exceptions for methods (yes) > - static or private/protected modifiers (no) > - anything else (no) > > My guesses are in parentheses. > > Note that jnew-runtime-class is not meant to let users create > arbitrary classes; if you're into OOP and want to program in Lisp, use > CLOS. > > Sorry if my question is somewhat vague. I don't know the answer to this. I don't think I quite count as a Java programmer either. My suggestion would be, if you've solved your original problem, that's probably good enough for now. If we try to imagine what other folks are going to need, we'll probably guess wrong. Then we might implement features that will turn out not to be used, and those features won't get adequate testing. So I'd rather put off implementing additional features until someone comes along (it could even be you) that actually needs them and will use them enough so that we'll know that they work (and so that we'll notice later when they break). Fight entropy! -Peter |
From: Doug M. <do...@mc...> - 2004-01-05 16:21:44
|
Peter Graves <pe...@ar...> writes: > On Sun, 4 Jan 2004 at 02:27:05 +0100, András_Simon wrote: >> OK. Having getBooleanValue() made it very easy to handle methods >> returning boolean. So jnew-runtime-class is now able to create classes >> with methods of arbitary argument and return types. This solves my >> original problem, creating subclasses of >> javax.swing.table.AbstractTableModel. This is pretty much what I would like to do--in my case it would be subclassing org.xml.sax.helpers.DefaultHandler and overriding some of the methods, so I can parse XML. [I tried to run the XMLS Common Lisp XML parser but got weird failures and haven't had a chance to write a proper bug report.] -Doug |
From: Peter G. <pe...@ar...> - 2004-01-05 19:39:34
|
On Mon, 05 Jan 2004 at 11:21:37 -0500, Doug McNaught wrote: > I tried to run the XMLS Common Lisp XML parser but got weird > failures and haven't had a chance to write a proper bug report. I think the only important problem was the lack of PEEK-CHAR. That's fixed now in CVS. There may have been other (weirder) issues at various times recently because of the work-in-progress on pathnames, which has introduced a lot of temporary breakage. At the moment, XMLS seems to work for me; at least it parses j's top- level build.xml file without complaint. -Peter |
From: <as...@ma...> - 2004-01-05 20:01:05
|
On Mon, 5 Jan 2004, Peter Graves wrote: > On Mon, 05 Jan 2004 at 11:21:37 -0500, Doug McNaught wrote: > > I tried to run the XMLS Common Lisp XML parser but got weird > > failures and haven't had a chance to write a proper bug report. > > I think the only important problem was the lack of PEEK-CHAR. That's > fixed now in CVS. Nevertheless, it'd be great if Doug tried the Java version, too. I'll clean up and commit the class generator stuff tomorrow. Andras |