/*******************************************************************************
* Copyright (c) 2005, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.jsdt.internal.core.interpret;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.wst.jsdt.internal.compiler.util.HashtableOfObject;
import org.eclipse.wst.jsdt.internal.core.interpret.builtin.BuiltInHelper;
public class InterpreterContext implements ValueReference{
protected HashtableOfObject values=new HashtableOfObject();
protected InterpreterContext parent;
InterpreterContext lastReference;
public Value returnValue;
ValueReference thisObject;
public int returnCode;
public InterpreterContext() {
this(null,null);
}
public InterpreterContext(InterpreterContext parent,ObjectValue thisObject) {
this.parent=parent;
this.thisObject= (thisObject!=null) ? thisObject : (ValueReference)globalContext();
}
public Value getValue(char [] name) {
InterpreterContext checkContext=this;
do {
this.lastReference=checkContext;
Value value=(Value) checkContext.values.get(name);
if (value!=null)
{
return value;
}
checkContext=checkContext.parent;
} while (checkContext!=null);
return Value.UndefinedObjectValue;
}
public void setValue(char [] name, Value value) {
values.put(name, value);
}
public ValueReference getReference(char [] name) {
if (parent==null || values.containsKey(name))
return this;
return parent.getReference(name);
}
public void initailizeBuiltins() {
BuiltInHelper.initializeBuiltinObjects(this);
}
public InterpreterContext globalContext()
{
InterpreterContext checkContext=this;
while (checkContext.parent!=null)
checkContext=checkContext.parent;
return checkContext;
}
public List getContextStack()
{
ArrayList list=new ArrayList();
InterpreterContext currentContext=this;
while (currentContext!=null)
{
list.add(0, currentContext);
currentContext=currentContext.parent;
}
return list;
}
public ValueReference getThisObject() {
return thisObject;
}
public InterpreterContext getParent()
{
return this.parent;
}
}