classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [cp-patches] gnu/java/beans/decoder/GrowableArrayContext.java


From: Robert Schuster
Subject: Re: [cp-patches] gnu/java/beans/decoder/GrowableArrayContext.java
Date: Wed, 02 Feb 2005 00:25:52 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.5) Gecko/20050107

Hi Jeroen,
your solution is basically very good but I added the wanted exception behavior back.

My connection speed is currently extremely low and I would need another working dir of Classpath for this: Thats why send the source file to the list. In the hope anyone else will make a patch and applies that.

The ChangeLog would have been like this:

2005-02-02  Robert Schuster  <address@hidden>

        * gnu/java/beans/decoder/GrowableArrayContext.java: Fixed
        assignment behavior by using java.lang.reflect.Array.set()
        directly.


cu
Robert

Btw: Mauve test for this thing is on my list.

Jeroen Frijters wrote:
Hi Robert,

I've attached a patch to fix GrowableArrayContext. It didn't work
correctly for primitive types (Integer.TYPE.isInstance(new Integer(0))
returns false).

Could you please look this over and commit if you agree?

Thanks.

Regards,
Jeroen
  

Index: gnu/java/beans/decoder/GrowableArrayContext.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/beans/decoder/GrowableArrayContext.java,v retrieving revision 1.1 diff -u -r1.1 GrowableArrayContext.java --- gnu/java/beans/decoder/GrowableArrayContext.java 2 Jan 2005 23:53:42 -0000 1.1 +++ gnu/java/beans/decoder/GrowableArrayContext.java 1 Feb 2005 12:20:57 -0000 @@ -47,13 +47,14 @@ class GrowableArrayContext extends AbstractContext { private Class klass; - private ArrayList list = new ArrayList(); private Object array; + private int length; GrowableArrayContext(String id, Class newClass) { setId(id); klass = newClass; + array = Array.newInstance(klass, 16); } /* (non-Javadoc) @@ -61,15 +62,13 @@ */ public void addParameterObject(Object o) throws AssemblyException { - if (!klass.isInstance(o)) - throw new AssemblyException( - new IllegalArgumentException( - "Cannot add object " - + o - + " to array where the elements are of class " - + klass)); - - list.add(o); + if (length == Array.getLength(array)) + { + Object tmp = Array.newInstance(klass, length * 2); + System.arraycopy(array, 0, tmp, 0, length); + array = tmp; + } + Array.set(array, length++, o); } /* (non-Javadoc) @@ -86,13 +85,12 @@ */ public Object endContext(Context outerContext) throws AssemblyException { - if (array == null) - { - array = Array.newInstance(klass, list.size()); - - for (int i = 0; i < list.size(); i++) - Array.set(array, i, list.get(i)); - } + if (length != Array.getLength(array)) + { + Object tmp = Array.newInstance(klass, length); + System.arraycopy(array, 0, tmp, 0, length); + array = tmp; + } return array; } @@ -112,16 +110,7 @@ */ public void set(int index, Object o) throws AssemblyException { - if (array == null) - { - if (klass.isInstance(o)) - list.add(index, o); - else - throw new AssemblyException( - new IllegalArgumentException("Argument is not compatible to array component type.")); - } - else - Array.set(array, index, o); + Array.set(array, index, o); } /* (non-Javadoc) @@ -129,10 +118,7 @@ */ public Object get(int index) throws AssemblyException { - if (array == null) - return list.get(index); - else - return Array.get(array, index); + return Array.get(array, index); } public Object getResult()

_______________________________________________ Classpath-patches mailing list address@hidden http://lists.gnu.org/mailman/listinfo/classpath-patches
/* gnu.java.beans.decoder.GrowableArrayContext
   Copyright (C) 2004 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
 
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.beans.decoder;

import java.lang.reflect.Array;

/** A Context implementation for a growable array. The array
 * elements have to be set using expressions.
 *
 * @author Robert Schuster
 */
class GrowableArrayContext extends AbstractContext
{
    private static final int INITIAL_SIZE = 16;
    
    private Class klass;
    private Object array;
    private int length;
    
    GrowableArrayContext(String id, Class newClass)
    {
        setId(id);
        klass = newClass;
        array = Array.newInstance(klass, INITIAL_SIZE);
    }

    /* (non-Javadoc)
     * @see gnu.java.beans.decoder.Context#addObject(java.lang.Object)
     */
    public void addParameterObject(Object o) throws AssemblyException
    {
      if (length == Array.getLength(array))
        {
          Object tmp = Array.newInstance(klass, length * 2);
          System.arraycopy(array, 0, tmp, 0, length);
          array = tmp;
        }
        
      try {
        Array.set(array, length++, o);
      } catch(IllegalArgumentException iae) {
        throw new AssemblyException(iae);
      }
    }

    /* (non-Javadoc)
     * @see gnu.java.beans.decoder.Context#reportStatement()
     */
    public void notifyStatement(Context outerContext) throws AssemblyException
    {
        throw new AssemblyException(
            new IllegalArgumentException("Statements inside a growable array 
are not allowed."));
    }

    /* (non-Javadoc)
     * @see 
gnu.java.beans.decoder.Context#endContext(gnu.java.beans.decoder.Context)
     */
    public Object endContext(Context outerContext) throws AssemblyException
    {
        if (length != Array.getLength(array))
          {
            Object tmp = Array.newInstance(klass, length);
            System.arraycopy(array, 0, tmp, 0, length);
            array = tmp;
          }
        
        return array;
    }

    /* (non-Javadoc)
     * @see gnu.java.beans.decoder.Context#subContextFailed()
     */
    public boolean subContextFailed()
    {
        // returns false to indicate that assembling the array does not fail 
only because
        // a subelement failed
        return false;
    }

    /* (non-Javadoc)
     * @see gnu.java.beans.decoder.Context#set(int, java.lang.Object)
     */
    public void set(int index, Object o) throws AssemblyException
    {
      try {
        Array.set(array, index, o);
      } catch(IllegalArgumentException iae) {
        throw new AssemblyException(iae);   
      }
    }

    /* (non-Javadoc)
     * @see gnu.java.beans.decoder.Context#get(int)
     */
    public Object get(int index) throws AssemblyException
    {
      return Array.get(array, index);
    }

    public Object getResult()
    {
        return array;
    }
}

reply via email to

[Prev in Thread] Current Thread [Next in Thread]