001: /*=============================================================================
002: * Copyright Texas Instruments 2000. All Rights Reserved.
003: *
004: * This program is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2 of the License, or (at your option) any later version.
008: *
009: * This program is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: * $ProjectHeader: OSCRIPT 0.155 Fri, 20 Dec 2002 18:34:22 -0800 rclark $
019: */
020:
021: package oscript.data;
022:
023: import oscript.exceptions.*;
024: import oscript.util.*;
025:
026: /**
027: * Inner class are basically just regular classes, except that we insert
028: * an extra arg when calling the constructor... the instance of the
029: * enclosing java object.
030: * <p>
031: * The way this works now is a bunch of extra overhead, and a bit lame,
032: * because we end up creating a <code>JavaInnerClassWrapper</code> for
033: * every access to the inner class (ie. OuterClass.InnerClass), because
034: * we need to associate the object with the class instance. This means
035: * we end up doing the init stuff, not once per class, but once per
036: * class per outer object.
037: *
038: * @author Rob Clark (rob@ti.com)
039: * <!--$Format: " * @version $Revision$"$-->
040: * @version 1.4
041: */
042: public class JavaInnerClassWrapper extends JavaClassWrapper {
043: /**
044: * The instance of the enclosing java class.
045: */
046: private Value obj;
047:
048: /*=======================================================================*/
049: /**
050: * Class Constructor.
051: *
052: * @param obj the instance of the outer object
053: * @param javaClass the java class this object is a wrapper for
054: */
055: public JavaInnerClassWrapper(Value obj, Class javaClass) {
056: super (oscript.classwrap.ClassWrapGen
057: .getNonWrapperClass(javaClass));
058:
059: this .obj = obj;
060: }
061:
062: /*=======================================================================*/
063: /**
064: * Overloaded to add the "this" object to the argument list, because it
065: * is an implicit arg to the inner class constructor.
066: */
067: protected Object doConstruct(StackFrame sf, MemberTable args,
068: boolean isWrapper) {
069: if (args == null)
070: args = new OArray(1);
071: int len = args.length();
072: args.ensureCapacity(len + 1);
073: for (int i = len - 1; i >= 0; i--)
074: args.referenceAt(i + 1).opAssign(args.referenceAt(i));
075: args.referenceAt(0).opAssign(obj);
076: return super .doConstruct(sf, args, isWrapper);
077: }
078:
079: /*=======================================================================*/
080: /**
081: * For testing... see test/testJava.os
082: */
083: static class StaticClass {
084: public StaticClass() {
085: System.err.println("static class constructor");
086: }
087:
088: class NonStaticClass {
089: public NonStaticClass() {
090: System.err.println("non-static class constructor");
091: }
092: }
093: }
094: }
095:
096: /*
097: * Local Variables:
098: * tab-width: 2
099: * indent-tabs-mode: nil
100: * mode: java
101: * c-indentation-style: java
102: * c-basic-offset: 2
103: * eval: (c-set-offset 'substatement-open '0)
104: * eval: (c-set-offset 'case-label '+)
105: * eval: (c-set-offset 'inclass '+)
106: * eval: (c-set-offset 'inline-open '0)
107: * End:
108: */
|