This is the mail archive of the kawa@sources.redhat.com mailing list for the Kawa project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

find-class and type->java-class patch


Here's a patch to add two new procedures:

 - Function: find-class value
     Returns the class type named by VALUE.  VALUE is expected to be a
     symbol with the same name as the Java class.

 - Function: type->java-class class-type
     Returns the Java class named by CLASS-TYPE.  CLASS-TYPE is
     expected to be the internal class type of Kawa objects.

I debated for quite a while if this should be called find-class or
find-type, and settled on find-class because that reminds me of the CL
function of the same name.

Regards,
Chris Dean

Index: doc/kawa.texi
===================================================================
RCS file: /cvs/kawa/kawa/doc/kawa.texi,v
retrieving revision 1.150
diff -u -w -r1.150 kawa.texi
--- doc/kawa.texi	28 Jul 2004 22:36:49 -0000	1.150
+++ doc/kawa.texi	3 Aug 2004 03:21:54 -0000
@@ -2676,6 +2676,16 @@
 Not supported for @var{type} to be a primitive type such as @code{<int>}.
 @end defun
 
+@defun find-class value 
+Returns the class type named by @var{value}.  @var{value} is expected to
+be a symbol with the same name as the Java class.
+@end defun
+
+@defun type->java-class class-type 
+Returns the Java class named by @var{class-type}.  @var{class-type} is
+expected to be the internal class type of Kawa objects.
+@end defun
+
 @deffn Syntax synchronized object form ...
 Synchronize on the given @var{object}.  (This means getting an
 exclusive lock on the object, by acquiring its @dfn{monitor}.)
Index: gnu/kawa/reflect/Makefile.am
===================================================================
RCS file: /cvs/kawa/kawa/gnu/kawa/reflect/Makefile.am,v
retrieving revision 1.15
diff -u -w -r1.15 Makefile.am
--- gnu/kawa/reflect/Makefile.am	13 May 2003 15:38:56 -0000	1.15
+++ gnu/kawa/reflect/Makefile.am	3 Aug 2004 03:21:54 -0000
@@ -10,6 +10,7 @@
   ClassMemberConstraint.java \
   ClassMethods.java \
   InstanceOf.java \
+  FindClass.java \
   Invoke.java \
   OccurrenceType.java \
   SlotGet.java \
Index: gnu/kawa/reflect/Makefile.in
===================================================================
RCS file: /cvs/kawa/kawa/gnu/kawa/reflect/Makefile.in,v
retrieving revision 1.32
diff -u -w -r1.32 Makefile.in
--- gnu/kawa/reflect/Makefile.in	29 Oct 2003 03:56:37 -0000	1.32
+++ gnu/kawa/reflect/Makefile.in	3 Aug 2004 03:21:54 -0000
@@ -199,6 +199,7 @@
   ClassMemberConstraint.java \
   ClassMethods.java \
   InstanceOf.java \
+  FindClass.java \
   Invoke.java \
   OccurrenceType.java \
   SlotGet.java \
Index: kawa/lib/reflection.scm
===================================================================
RCS file: /cvs/kawa/kawa/kawa/lib/reflection.scm,v
retrieving revision 1.12
diff -u -w -r1.12 reflection.scm
--- kawa/lib/reflection.scm	6 Nov 2001 01:00:23 -0000	1.12
+++ kawa/lib/reflection.scm	3 Aug 2004 03:21:54 -0000
@@ -135,3 +135,6 @@
                             <kawa.lang.method> (<object> <symbol>))
    object name))
 |#
+
+(define (type->java-class class-type)
+  (gnu.bytecode.ClassType:getReflectClass class-type))
Index: kawa/standard/Scheme.java
===================================================================
RCS file: /cvs/kawa/kawa/kawa/standard/Scheme.java,v
retrieving revision 1.152
diff -u -w -r1.152 Scheme.java
--- kawa/standard/Scheme.java	21 Jul 2004 00:06:11 -0000	1.152
+++ kawa/standard/Scheme.java	3 Aug 2004 03:21:54 -0000
@@ -54,6 +54,7 @@
   static Scheme instance;
 
   public static gnu.kawa.reflect.InstanceOf instanceOf;
+  public static gnu.kawa.reflect.FindClass findClass;;
   public static not not;
   public static kawa.standard.map map;
   public static kawa.standard.map forEach;
@@ -444,6 +445,7 @@
       define_syntax("primitive-array-set", "kawa.lib.reflection");
       define_syntax("primitive-array-length", "kawa.lib.reflection");
       define_proc("subtype?", "kawa.lib.reflection");
+      define_proc("type->java-class", "kawa.lib.reflection");
       define_field("primitive-throw", "kawa.standard.prim_throw", "primitiveThrow");
       define_syntax("try-finally", "kawa.standard.try_finally");
       define_syntax("try-catch", "kawa.standard.try_catch");
@@ -452,6 +454,7 @@
       define_proc("error", "kawa.lib.misc");
       define_proc("as", gnu.kawa.functions.Convert.as);
       define_field("instance?", "kawa.standard.Scheme", "instanceOf");
+      define_field("find-class", "kawa.standard.Scheme", "findClass");
       define_syntax("synchronized", "kawa.standard.synchronizd");
       object objectSyntax = new kawa.standard.object(lambda);
       define_syntax("object", objectSyntax);
@@ -684,6 +687,7 @@
       {
         instance = this;
         instanceOf = new gnu.kawa.reflect.InstanceOf(this, "instance?");
+        findClass = new gnu.kawa.reflect.FindClass(this, "find-class");
         not = new not(this, "not");
         map = new map(true);
 	forEach = new map(false);
Index: gnu/kawa/reflect/FindClass.java
===================================================================
diff -u /dev/null gnu/kawa/reflect/FindClass.java
--- /dev/null	Fri Jul 30 22:36:19 2004
+++ gnu/kawa/reflect/FindClass.java	Mon Aug  2 20:11:40 2004
@@ -0,0 +1,49 @@
+package gnu.kawa.reflect;
+import gnu.bytecode.*;
+import gnu.mapping.*;
+import gnu.expr.*;
+
+public class FindClass extends Procedure1 implements CanInline
+{
+  Interpreter interpreter;
+
+  public FindClass(Interpreter interpreter)
+  {
+    this.interpreter = interpreter;
+  }
+
+  public FindClass(Interpreter interpreter, String name)
+  {
+    this.interpreter = interpreter;
+    setName(name);
+  }
+
+  public Object apply1 (Object arg1)
+  {
+    return interpreter.asType(arg1);
+  }
+
+  public Expression inline (ApplyExp exp, ExpWalker walker)
+  {
+    Compilation comp = walker.getCompilation();
+    Expression[] args = exp.getArgs();
+    Type type = interpreter.getTypeFor(args[0]);
+    if (type instanceof PairClassType)
+      type = ((PairClassType) type).instanceType;
+    else if (! (type instanceof Type)) 
+      return exp;
+
+    if (type instanceof ClassType && ((ClassType) type).isExisting())
+      {
+        try
+          {
+            type.getReflectClass();
+          }
+        catch (Exception ex)
+          {
+            comp.error('e', "unknown class: " + type.getName());
+          }
+      }
+    return new QuoteExp(type).setLine(exp);
+  }
+}
Index: ChangeLog
===================================================================
RCS file: /cvs/kawa/kawa/ChangeLog,v
retrieving revision 1.426
diff -u -w -r1.426 ChangeLog
--- ChangeLog	31 Jul 2004 19:05:52 -0000	1.426
+++ ChangeLog	3 Aug 2004 03:53:19 -0000
@@ -1,3 +1,8 @@
+2004-08-02  Chris Dean  <ctdean@sokitomi.com>
+
+	* kawa/standard/Scheme.java: Add find-class and type->java-class
+	functions.
+    
 2004-07-31  Per Bothner  <per@bothner.com>
 
 	* kawa/repl.java:  Update copyright year printed by --version.
Index: doc/ChangeLog
===================================================================
RCS file: /cvs/kawa/kawa/doc/ChangeLog,v
retrieving revision 1.122
diff -u -w -r1.122 ChangeLog
--- doc/ChangeLog	28 Jul 2004 22:36:50 -0000	1.122
+++ doc/ChangeLog	3 Aug 2004 03:53:19 -0000
@@ -1,3 +1,8 @@
+2004-08-02  Chris Dean  <ctdean@sokitomi.com>
+
+	* kawa.texi (Miscellaneous): Add find-class and type->java-class
+	functions.
+
 2004-07-27  Chris Dean  <ctdean@sokitomi.com>
 
 	* kawa.texi (Compilation options):  Add --warn-as-error.
Index: gnu/kawa/reflect/ChangeLog
===================================================================
RCS file: /cvs/kawa/kawa/gnu/kawa/reflect/ChangeLog,v
retrieving revision 1.72
diff -u -w -r1.72 ChangeLog
--- gnu/kawa/reflect/ChangeLog	20 Jul 2004 23:41:00 -0000	1.72
+++ gnu/kawa/reflect/ChangeLog	3 Aug 2004 03:53:19 -0000
@@ -1,3 +1,8 @@
+2004-08-02  Chris Dean  <ctdean@sokitomi.com>
+
+	* FindClass.java:  New class.
+	* Makefile.am (java_sources):  Add new file.
+
 2004-07-20  Per Bothner  <per@bothner.com>
 
 	* ArrayLength.java:  Remove unused import statements.
Index: kawa/lib/ChangeLog
===================================================================
RCS file: /cvs/kawa/kawa/kawa/lib/ChangeLog,v
retrieving revision 1.108
diff -u -w -r1.108 ChangeLog
--- kawa/lib/ChangeLog	31 Jul 2004 19:03:30 -0000	1.108
+++ kawa/lib/ChangeLog	3 Aug 2004 03:53:19 -0000
@@ -1,3 +1,7 @@
+2004-08-02  Chris Dean  <ctdean@sokitomi.com>
+
+	* reflection.scm (type->java-class):  New function.
+
 2004-07-31  Per Bothner  <per@bothner.com>
 
 	* syntax.scm (catch):  Add type declarations.  Simplify using invoke.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]