This is the mail archive of the java@gcc.gnu.org mailing list for the Java 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]

Re: Announcement: micro-libgcj


Andrew Haley wrote:
That would suit me well, but there may be some quasi-religious
objections to preprocessing.  As in "How can you do this?  Java
doesn't have a preprocessor!"  :-)

In all seriousness, we only have two routes: either preprocess or keep
micro-libgcj on a separate branch and repeatedly merge.  I don't like
either objection, but it seems to me the second is worse.

Kawa takes an approach to pre-proprocessing that may be suitable. Both the input and output to the pre-processor is a regular Java file, but with differenent sections commented out.

The default CVS-checked in Java file assume JDK 1.4 functionality.
For example:

  /* #ifdef use:java.net.URI */
  static URI URLtoURI (URL url)
    throws java.net.URISyntaxException
  {
    /* #ifdef JAVA5 */
    // return url.toURI();
    /* #else */
    return new URI(url.toString());
    /* #endif */
  }
  /* #else */
  // static String URLtoURI (URL url)
  // {
  //   return url.toString();
  // }
  /* #endif */

If you run gnu.kawa.util.PreProcess +JAVA5 +use:java.net.URI you get:

  /* #ifdef use:java.net.URI */
  static URI URLtoURI (URL url)
    throws java.net.URISyntaxException
  {
    /* #ifdef JAVA5 */
    return url.toURI();
    /* #else */
    // return new URI(url.toString());
    /* #endif */
  }
  /* #else */
  // static String URLtoURI (URL url)
  // {
  //   return url.toString();
  // }
  /* #endif */

If you run gnu.kawa.util.PreProcess -JAVA5 -use:java.net.URI you get:

  /* #ifdef use:java.net.URI */
  // static URI URLtoURI (URL url)
  //   throws java.net.URISyntaxException
  // {
  //   /* #ifdef JAVA5 */
  //   return url.toURI();
  //   /* #else */
  //   return new URI(url.toString());
  //   /* #endif */
  // }
  /* #else */
  static String URLtoURI (URL url)
  {
    return url.toString();
  }
  /* #endif */

The PreProcess class modifies each source file in place, but it can
easily be modified to write the output to a new file.

So how does this solve the current problem?  Basically, you can use
various directives to control which features should be skipped for
(various configurations of) micro-libgcj.  The default checked-in
code has all the standard features.  To generate a micro-libgcj
configuration, you preprocess the relavant files, creating a
separate tree of modified files.  You can use apropriate CLASSPATH
options to make sure the modified versions are found before the
standard versions.

http://sources.redhat.com/cgi-bin/cvsweb.cgi/kawa/gnu/kawa/util/PreProcess.java?rev=1.5&content-type=text/x-cvsweb-markup&cvsroot=kawa
--
	--Per Bothner
per@bothner.com   http://per.bothner.com/


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