/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source 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 of the License, or
* (at your option) any later version.
*
* Resin Open Source 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, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
* Free SoftwareFoundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.es;
import com.caucho.util.IntMap;
import java.util.HashMap;
import java.util.Iterator;
/**
* JavaScript object
*/
class ESThunk extends ESBase {
static final int OBJ_PROTO_THUNK = 0;
static final int OBJ_THUNK = OBJ_PROTO_THUNK + 1;
static final int FUN_PROTO_THUNK = OBJ_THUNK + 1;
static final int FUN_THUNK = FUN_PROTO_THUNK + 1;
static final int ARRAY_PROTO_THUNK = FUN_THUNK + 1;
static final int ARRAY_THUNK = ARRAY_PROTO_THUNK + 1;
static final int STRING_PROTO_THUNK = ARRAY_THUNK + 1;
static final int STRING_THUNK = STRING_PROTO_THUNK + 1;
static final int BOOL_PROTO_THUNK = STRING_THUNK + 1;
static final int BOOL_THUNK = BOOL_PROTO_THUNK + 1;
static final int NUM_PROTO_THUNK = BOOL_THUNK + 1;
static final int NUM_THUNK = NUM_PROTO_THUNK + 1;
static final int DATE_PROTO_THUNK = NUM_THUNK + 1;
static final int DATE_THUNK = DATE_PROTO_THUNK + 1;
static final int MATH_THUNK = DATE_THUNK + 1;
static final int REGEXP_PROTO_THUNK = MATH_THUNK + 1;
static final int REGEXP_THUNK = REGEXP_PROTO_THUNK + 1;
private int index;
/**
* Simple constructor for parentless objects.
*/
ESThunk(int index)
{
this.index = index;
}
ESBase getObject()
{
return getThunk(index);
}
/**
* Puts a new value in the property table with the appropriate flags
*/
public ESBase getProperty(ESString name) throws Throwable
{
ESBase object = getThunk(index);
return object.getProperty(name);
}
/**
* Puts a new value in the property table with the appropriate flags
*/
public ESBase hasProperty(ESString name) throws Throwable
{
ESBase object = getThunk(index);
return object.hasProperty(name);
}
/**
* Puts a new value in the property table with the appropriate flags
*/
public void setProperty(ESString name, ESBase value) throws Throwable
{
ESBase object = getThunk(index);
object.setProperty(name, value);
}
/**
* Deletes the entry. Returns true if successful.
*/
public ESBase delete(ESString name) throws Throwable
{
ESBase object = getThunk(index);
return object.delete(name);
}
public Iterator keys() throws Throwable
{
ESBase object = getThunk(index);
return object.keys();
}
public ESBase typeof() throws ESException
{
ESBase object = getThunk(index);
return object.typeof();
}
/**
* XXX: not right
*/
public ESBase toPrimitive(int hint) throws Throwable
{
ESBase object = getThunk(index);
return object.toPrimitive(hint);
}
public ESObject toObject() throws ESException
{
ESBase object = getThunk(index);
return object.toObject();
}
public Object toJavaObject() throws ESException
{
ESBase object = getThunk(index);
return object.toJavaObject();
}
/**
* Returns a string rep of the object
*/
public double toNum() throws Throwable
{
ESBase object = getThunk(index);
return object.toNum();
}
/**
* Returns a string rep of the object
*/
public ESString toStr() throws Throwable
{
ESBase object = getThunk(index);
return object.toStr();
}
public ESString toSource(IntMap map, boolean isLoopPass) throws Throwable
{
ESBase object = getThunk(index);
return object.toSource(map, isLoopPass);
}
public boolean toBoolean()
{
ESBase object = getThunk(index);
return object.toBoolean();
}
public Object copy(HashMap refs)
{
return this;
}
public boolean ecmaEquals(ESBase b) throws Throwable
{
ESBase object = getThunk(index);
if (this == b)
return true;
else
return object.ecmaEquals(b);
}
public ESBase call(Call call, int length) throws Throwable
{
ESBase object = getThunk(index);
return object.call(call, length);
}
public ESBase construct(Call call, int length) throws Throwable
{
ESBase object = getThunk(index);
return object.construct(call, length);
}
static ESBase getThunk(int index)
{
Global resin = Global.getGlobalProto();
switch (index) {
case OBJ_PROTO_THUNK:
return resin.objProto;
case OBJ_THUNK:
return resin.object;
case FUN_PROTO_THUNK:
return resin.funProto;
case FUN_THUNK:
return resin.fun;
case ARRAY_PROTO_THUNK:
return resin.arrayProto;
case ARRAY_THUNK:
return resin.array;
case STRING_PROTO_THUNK:
return resin.stringProto;
case STRING_THUNK:
return resin.string;
case BOOL_PROTO_THUNK:
return resin.boolProto;
case BOOL_THUNK:
return resin.bool;
case NUM_PROTO_THUNK:
return resin.numProto;
case NUM_THUNK:
return resin.num;
case DATE_PROTO_THUNK:
return resin.dateProto;
case DATE_THUNK:
return resin.date;
case MATH_THUNK:
return resin.math;
case REGEXP_PROTO_THUNK:
return resin.getRegexpProto();
case REGEXP_THUNK:
return resin.getRegexp();
default:
throw new RuntimeException();
}
}
}