blob: d1f49effce7dbb94a6ad80abe11001533ec8b263 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 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.debug.internal.rhino.jsdi;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference;
import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
/**
* Rhino implementation of {@link ObjectReference}
*
* @see MirrorImpl
* @see ObjectReference
* @see Property
* @since 1.0
*/
public class ObjectReferenceImpl extends MirrorImpl implements ObjectReference {
protected static final ArrayList NO_PROPERTIES = new ArrayList(0);
/**
* The name of the class backing this object
*/
private final String className;
/**
* The reference id to the constructor for this object
*/
private final Number constructorRef;
/**
* The reference id to the prototype for this object
*/
private final Number prototypeRef;
/**
* The reference id for this object
*/
private final Number id;
/**
* The stackframe context for this object
*/
protected StackFrameImpl frame;
/**
* The JSDI handle to the constructor for this object - lazily computed in {@link #constructor()}
*/
private Value constructor = null;
/**
* The JSDI handle to the prototype for this object - lazily computed in {@link #prototype()}
*/
private Value prototype = null;
/**
* The backing list of {@link PropertyReference}s for this object
*/
private List properties = null;
/**
* Constructor
*
* @param vm
* @param body
* @param frame
*/
public ObjectReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl frame) {
super(vm);
this.frame = frame;
this.className = (String) body.get(JSONConstants.CLASS_NAME);
this.id = (Number) body.get(JSONConstants.REF);
this.constructorRef = (Number) body.get(JSONConstants.CONSTRUCTOR_FUNCTION);
this.prototypeRef = (Number) body.get(JSONConstants.PROTOTYPE_OBJECT);
List proplist = (List) body.get(JSONConstants.PROPERTIES);
if (proplist != null) {
this.properties = new ArrayList(proplist.size());
Map props = null;
for (Iterator iter = proplist.iterator(); iter.hasNext();) {
props = (Map) iter.next();
this.properties.add(new PropertyImpl(vm, frame, props.get(JSONConstants.NAME).toString(), (Number) props.get(JSONConstants.REF)));
}
} else {
this.properties = NO_PROPERTIES;
}
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#className()
*/
public String className() {
return this.className;
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#constructor()
*/
public Value constructor() {
synchronized (this.frame) {
if (this.constructor == null) {
this.constructor = this.frame.lookupValue(constructorRef);
if (this.constructor == null) {
this.constructor = this.vm.mirrorOfNull();
}
}
}
return this.constructor;
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#prototype()
*/
public Value prototype() {
synchronized (this.frame) {
if (this.prototype == null) {
this.prototype = this.frame.lookupValue(prototypeRef);
if (this.prototype == null) {
this.prototype = this.vm.mirrorOfNull();
}
}
}
return this.prototype;
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#properties()
*/
public List properties() {
return this.properties;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("Object Reference\n"); //$NON-NLS-1$
return buffer.toString();
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
*/
public String valueString() {
return "Object"; //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#id()
*/
public Number id() {
return this.id;
}
}