/******************************************************************************* * Copyright (c) 2000, 2009 QNX Software Systems 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: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.debug.mi.core.cdi.model; import org.eclipse.cdt.debug.core.cdi.CDIException; import org.eclipse.cdt.debug.core.cdi.model.ICDIValue; import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable; import org.eclipse.cdt.debug.core.cdi.model.type.ICDIType; import org.eclipse.cdt.debug.mi.core.MIException; import org.eclipse.cdt.debug.mi.core.MISession; import org.eclipse.cdt.debug.mi.core.cdi.CdiResources; import org.eclipse.cdt.debug.mi.core.command.CommandFactory; import org.eclipse.cdt.debug.mi.core.command.MIVarEvaluateExpression; import org.eclipse.cdt.debug.mi.core.output.MIVarEvaluateExpressionInfo; /** */ public class Value extends CObject implements ICDIValue { protected Variable fVariable; /** * Indicates whether this Value object is for a C++ reference variable. If * it is, then some decoding is needed on the value string we get from gdb, * since it will contain two things: the address of the variable being * referenced and the value. * @since 6.0 */ protected boolean fIsReference; public Value(Variable v) { super((Target)v.getTarget()); fVariable = v; } protected Variable getVariable() throws CDIException { return fVariable; } /** * @see org.eclipse.cdt.debug.core.cdi.model.ICDIValue#getTypeName() */ public String getTypeName() throws CDIException { return getVariable().getTypeName(); } /** * @see org.eclipse.cdt.debug.core.cdi.model.ICDIValue#getValueString() */ public String getValueString() throws CDIException { // make sure the variable is updated. if (! getVariable().isUpdated()) { getVariable().update(); } String result = ""; //$NON-NLS-1$ MISession mi = ((Target)getTarget()).getMISession(); CommandFactory factory = mi.getCommandFactory(); MIVarEvaluateExpression var = factory.createMIVarEvaluateExpression(getVariable().getMIVar().getVarName()); try { mi.postCommand(var); MIVarEvaluateExpressionInfo info = var.getMIVarEvaluateExpressionInfo(); if (info == null) { throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$ } result = info.getValue(); // Reference variables get back a string with two things: the address of the // variable being referenced and the value of the variable. The expected // format is, by example (for a float&): "@0x22cc98: 3.19616001e-39" // We need to dig out the latter. if (fIsReference) { if (result.startsWith("@0x")) { //$NON-NLS-1$ int index = result.indexOf(':'); if (index > 0 && ((index + 1) < result.length())) { result = result.substring(index+1).trim(); } } } } catch (MIException e) { throw new CDIException(e.getMessage()); } return result; } /** * @see org.eclipse.cdt.debug.core.cdi.model.ICDIValue#getVariables() */ public int getChildrenNumber() throws CDIException { return getVariable().getMIVar().getNumChild(); } /** * @see org.eclipse.cdt.debug.core.cdi.model.ICDIValue#getVariables() */ public boolean hasChildren() throws CDIException { /* int number = 0; MISession mi = getCTarget().getCSession().getMISession(); CommandFactory factory = mi.getCommandFactory(); MIVarInfoNumChildren children = factory.createMIVarInfoNumChildren(variable.getMIVar().getVarName()); try { mi.postCommand(children); MIVarInfoNumChildrenInfo info = children.getMIVarInfoNumChildrenInfo(); if (info == null) { throw new CDIException("No answer"); } number = info.getChildNumber(); } catch (MIException e) { throw new CDIException(e.getMessage()); } return (number > 0); */ return (getChildrenNumber() > 0); } /** * @see org.eclipse.cdt.debug.core.cdi.model.ICDIValue#getVariables() */ public ICDIVariable[] getVariables() throws CDIException { return getVariable().getChildren(); } /* (non-Javadoc) * @see org.eclipse.cdt.debug.core.cdi.model.ICDIValue#getType() */ public ICDIType getType() throws CDIException { return getVariable().getType(); } /** * Call this after construction with 'true' if the Value is for a reference * variable. See {@link #fIsReference}. * * Ideally, this property would be passed to the constructor. However * introducing it that way at this point in time would cause a lot of churn * in the codebase, since this class is not directly instantiated, and it * has many subclasses. * @since 6.0 */ public void setIsReference(boolean isReference) { fIsReference = isReference; } }