blob: 1f97e9e0fd2e028a1581694f05023e460fef2dcc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package flash.tools.debugger;
import flash.tools.debugger.concrete.DVariable;
/**
* An ActionScript value, for example, the value of a variable or constant.
*
* @author mmorearty
*/
public interface Value
{
/**
* A special object representing ActionScript's "undefined" value.
*/
public static final Object UNDEFINED = new Object() {
@Override
public String toString() {
return "undefined"; //$NON-NLS-1$
}
};
/**
* The value returned if somone calls getId() for a Variable
* which stores a variable of simple type such as String or
* integer, rather than an Object or MovieClip.
* @see getId()
*/
public static final long UNKNOWN_ID = -1;
/**
* The special ID for pseudo-variable "_global". (Note, this only
* exists in AS2, not AS3.)
* @see getId()
*/
public static final long GLOBAL_ID = -2;
/**
* The special ID for pseudo-variable "this".
* @see getId()
*/
public static final long THIS_ID = -3;
/**
* The special ID for pseudo-variable "_root". (Note, this only
* exists in AS2, not AS3.)
* @see getId()
*/
public static final long ROOT_ID = -4;
/**
* The special ID for the top frame of the stack. Locals and
* arguments are "members" of this pseudo-variable.
*
* All the stack frames have IDs counting down from here. For example,
* the top stack frame has ID <code>BASE_ID</code>; the next
* stack frame has ID <code>BASE_ID - 1</code>; and so on.
*
* @see getId()
*/
public static final long BASE_ID = -100;
/**
* _level0 == LEVEL_ID, _level1 == LEVEL_ID-1, ...
*
* all IDs below this line are dynamic.
*/
public static final long LEVEL_ID = -300;
/**
* The return value of getTypeName() if this value represents the traits of a class.
*/
public static final String TRAITS_TYPE_NAME = "traits"; //$NON-NLS-1$
/**
* Variable type can be one of VariableType.OBJECT,
* VariableType.FUNCTION, VariableType.NUMBER, VariableType.STRING,
* VariableType.UNDEFINED, VariableType.NULL.
*/
public int getType();
/**
* The type name of the value:
*
* <ul>
* <li> <code>"Number"</code> </li>
* <li> <code>"Boolean"</code> </li>
* <li> <code>"String"</code> </li>
* <li> <code>"null"</code> </li>
* <li> <code>"undefined"</code> </li>
* <li> <code>Value.TRAITS_TYPE_NAME</code> if this value represents the
* traits of a class </li>
* <li> <code>"[package::]Classname@hexaddr"</code> if this value
* represents an instance of a non-primitive object. For example, if this is
* an instance of mx.core.Application, the type name might be
* "mx.core::Application@1234abcd". </li>
* </ul>
*/
public String getTypeName();
/**
* The class name of the value. This isn't actually very useful, and should
* probably go away; it had more relevant in ActionScript 2, when the return
* value from this function could have been any one of the strings returned
* by {@link DVariable#classNameFor(long, boolean)}.
*
* In the AS3 world, the only possible return values from this function are:
*
* <ul>
* <li> <code>"Object"</code> for instances of non-primitive classes such
* as Object, Array, etc. </li>
* <li> <code>""</code> all primitive values (Number, Boolean, String,
* null, undefined), or the traits of a class. </li>
* </ul>
*/
public String getClassName();
/**
* Variable attributes define further information
* regarding the variable. They are bitfields identified
* as VariableAttribute.xxx
*
* @see VariableAttribute
*/
public int getAttributes();
/**
* @see VariableAttribute
*/
public boolean isAttributeSet(int variableAttribute);
/**
* Returns a unique ID for the object referred to by this variable.
* If two variables point to the same underlying object, their
* getId() functions will return the same value.
*
* This is only meaningful for variables that store an Object or
* MovieClip. For other types of variables (e.g. integers and
* strings), this returns <code>UNKNOWN_ID</code>.
*/
public long getId();
/**
* Returns the value of the variable, as an Object. The return
* value will always be one of the following:
*
* <ul>
* <li> <code>null</code> </li>
* <li> <code>Value.UNDEFINED</code> </li>
* <li> a <code>Boolean</code> </li>
* <li> a <code>Double</code> (careful, it might be <code>Double.NaN</code>) </li>
* <li> a <code>String</code> </li>
* <li> a <code>Long</code> if this value represents a non-primitive
* type, such as an Object. If it is a Long, then it is the id of
* the Value (the same value returned by <code>getId()</code>).
* </ul>
*/
public Object getValueAsObject();
/**
* Returns the value of the variable, converted to a string. Strings
* are returned as the exact value of the string itself, with no
* extra quotation marks and no escaping of characters within the
* string.
*/
public String getValueAsString();
/**
* Returns all child members of this variable. Can only be called for
* variables of type Object or MovieClip.
* @throws NotConnectedException
* @throws NoResponseException
* @throws NotSuspendedException
*/
public Variable[] getMembers(Session s) throws NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Returns a specific child member of this variable. Can only be called for
* variables of type <code>Object<code> or <code>MovieClip<code>.
* @param s the session
* @param name just a varname name, without its namespace (see <code>getName()</code>)
* @return the specified child member, or null if there is no such child.
* @throws NotConnectedException
* @throws NoResponseException
* @throws NotSuspendedException
*/
public Variable getMemberNamed(Session s, String name) throws NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Returns the number of child members of this variable. If called for
* a variable which has a simple type such as integer or string,
* returns zero.
* @throws NotConnectedException
* @throws NoResponseException
* @throws NotSuspendedException
*/
public int getMemberCount(Session s) throws NotSuspendedException, NoResponseException, NotConnectedException;
/**
* Returns the list of classes that contributed members to this object, from
* the class itself all the way down to <code>Object</code> (or, if
* allLevels == false, down to the lowest-level class that actually
* contributed members).
*
* @param allLevels
* if <code>true</code>, the caller wants the entire class
* hierarchy. If <code>false</code>, the caller wants only
* that portion of the class hierarchy that actually contributed
* member variables to the object. For example,
* <code>Object</code> has no members, so if the caller passes
* <code>true</code> then the returned array of strings will
* always end with <code>Object</code>, but if the caller
* passes <code>false</code> then the returned array of strings
* will <em>never</em> end with <code>Object</code>.
* @return an array of fully qualified class names.
*/
public String[] getClassHierarchy(boolean allLevels);
/**
* Returns all child members of this variable that are private and are present
* in its inheritance chain. Only relevant after a call to getMembers().
*
* Warning: This may contain variables with the same name (when there is more
* than two level inheritance).
*/
public Variable[] getPrivateInheritedMembers();
/**
* Get all the private variables with the given name. Usually one, but more
* may be present if the inheritance chain is long.
* @param name Variable name.
*/
public Variable[] getPrivateInheritedMemberNamed(String name);
/**
* Get the worker id of the isolate to which this value belongs.
*/
public int getIsolateId();
}