Files
Mozilla/mozilla/js2/jsc/src/java/semantics/values/ObjectValue.java
jeff.dyer%compilercompany.com c66ef4b453 Updating JSC with framework for semantics in cpp.
git-svn-id: svn://10.0.0.236/trunk@90437 18797224-902f-48f8-a5cc-f745e15eee43
2001-03-26 22:31:11 +00:00

202 lines
3.8 KiB
Java

package com.compilercompany.es3c.v1;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Enumeration;
/**
* An object value.
*/
public class ObjectValue extends Value implements Attributes, Scope {
private static final boolean debug = false;
/**
*
*/
Hashtable slots = new Hashtable();
String name;
/**
*
*/
public ObjectValue() {
this.type = null;
}
/**
*
*/
public ObjectValue( TypeValue type ) throws Exception {
if( debug ) {
Debugger.trace("ObjectValue.ObjectValue() with type = " + type);
}
type.init(this);
this.type = type;
}
/**
*
*/
public ObjectValue( String name, TypeValue type ) throws Exception {
type.init(this);
this.type = type;
}
/**
*
*/
public ObjectValue( Init initializer ) throws Exception {
this.type = ObjectType.type;
initializer.init(this);
}
/**
*
*/
public ObjectValue( String name, Init initializer ) throws Exception {
this.name = name;
this.type = ObjectType.type;
initializer.init(this);
}
/**
*
*/
public String toString() {
if( name != null ) {
return "object("+name+")"+slots;
} else {
return "object("+type+")"+slots;
}
}
/**
*
*/
public Value getValue(Context context) throws Exception {
return this;
};
/**
*
*/
public boolean has(Value namespace, String name) {
return get(namespace,name) != null;
}
/**
*
*/
public Slot get(Value namespace, String name) {
if( debug ) {
Debugger.trace("ObjectValue.get() namespace="+namespace+", name="+name);
}
Slot slot;
if( namespace == null ) {
slot = (Slot) slots.get(name);
} else {
ObjectValue names = (ObjectValue)slots.get(namespace);
if( names == null ) {
slot = null;
} else {
slot = (Slot) names.slots.get(name);
}
}
return slot;
}
/**
* Add a name to a namespace and return the resulting slot.
*/
public Slot add(Value namespace, String name) throws Exception {
if( debug ) {
Debugger.trace("ObjectType.add() to " + this.name + " namespace = " + namespace + " name = " + name);
}
Hashtable slots;
ObjectValue names;
if( namespace == null ) {
slots = this.slots;
} else {
names = (ObjectValue) this.slots.get(namespace);
if( names==null ) {
names = new ObjectValue(new NamespaceType(namespace.toString()));
this.slots.put(namespace,names);
slots = names.slots;
} else {
slots = names.slots;
}
}
Slot slot = new Slot();
slot.type = ObjectType.type;
slot.value = UndefinedValue.undefinedValue;
slots.put(name,slot);
return slot;
}
/**
*
*/
int size() {
return slots.size();
}
/**
*
*/
public Value construct(Context context, Value args) throws Exception {
Scope thisScope = context.getThisClass();
if( debug ) {
Debugger.trace("calling object constructor with this = " + thisScope + ", args = " + args);
}
return (Value) thisScope;
}
/**
*
*/
public Value call(Context context, Value args) throws Exception {
Scope thisScope = context.getThisClass();
if( debug ) {
Debugger.trace("calling function with this = " + thisScope + ", args = " + args);
}
Value value = UndefinedValue.undefinedValue;
return value;
}
}
/*
* The end.
*/