001: /*
002: * Copyright (c) 1998-2006 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License as published by
011: * the Free Software Foundation; either version 2 of the License, or
012: * (at your option) any later version.
013: *
014: * Resin Open Source is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
017: * of NON-INFRINGEMENT. See the GNU General Public License for more
018: * details.
019: *
020: * You should have received a copy of the GNU General Public License
021: * along with Resin Open Source; if not, write to the
022: * Free SoftwareFoundation, Inc.
023: * 59 Temple Place, Suite 330
024: * Boston, MA 02111-1307 USA
025: *
026: * @author Scott Ferguson
027: */
028:
029: package com.caucho.es;
030:
031: import com.caucho.util.IntMap;
032:
033: import java.util.Iterator;
034:
035: /**
036: * JavaScript object
037: */
038: class ESArrayWrap extends ESJavaWrapper {
039: static ESId LENGTH = ESId.intern("length");
040:
041: protected ESArrayWrap() {
042: }
043:
044: protected int length() {
045: return 0;
046: }
047:
048: public ESBase getProperty(int i) throws Throwable {
049: return esEmpty;
050: }
051:
052: public ESBase delete(int i) throws ESException {
053: return ESBoolean.FALSE;
054: }
055:
056: public void setProperty(int i, ESBase value) throws Throwable {
057: }
058:
059: public ESBase getProperty(ESString name) throws Throwable {
060: if (name.equals(LENGTH))
061: return ESNumber.create(length());
062:
063: try { // XXX: to fix mips bugs
064: double value = name.toNum();
065: int iValue = (int) value;
066:
067: if (iValue == value)
068: return getProperty(iValue);
069:
070: return super .getProperty(name);
071: } catch (Exception e) {
072: return super .getProperty(name);
073: }
074: }
075:
076: public void setProperty(ESString name, ESBase value)
077: throws Throwable {
078: if (name.equals(LENGTH))
079: return;
080:
081: try { // XXX: to fix mips bugs
082: double dIndex = name.toNum();
083: int index = (int) dIndex;
084:
085: if (index == dIndex)
086: setProperty(index, value);
087: else
088: super .setProperty(name, value);
089: } catch (Exception e) {
090: super .setProperty(name, value);
091: }
092: }
093:
094: public ESBase delete(ESString name) throws Throwable {
095: if (name.equals(LENGTH))
096: return ESBoolean.FALSE;
097:
098: try {
099: double dIndex = name.toNum();
100: int index = (int) dIndex;
101:
102: if (index == dIndex)
103: return delete(index);
104: else
105: return super .delete(name);
106: } catch (Exception e) {
107: return super .delete(name);
108: }
109: }
110:
111: class ArrayIterator implements Iterator {
112: int length;
113: int i;
114:
115: public boolean hasNext() {
116: return i < length;
117: }
118:
119: public Object next() {
120: try {
121: return i < length ? getProperty(i++) : ESBase.esNull;
122: } catch (Throwable e) {
123: return ESBase.esNull;
124: }
125: }
126:
127: public void remove() {
128: }
129:
130: ArrayIterator() {
131: length = length();
132: }
133: }
134:
135: public Iterator keys() throws ESException {
136: return new ArrayIterator();
137: }
138:
139: public ESString toStr() throws Throwable {
140: return (ESString) NativeArray.toString(this );
141: }
142:
143: public ESString toSource(IntMap map, boolean isLoopPass)
144: throws Throwable {
145: return ESArray.arrayToSource(this , map, isLoopPass);
146: }
147:
148: protected ESArrayWrap(ESBase proto, Object value) {
149: super(proto, value);
150: }
151: }
|