http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/flex/tools/debugger/cli/DisplayAction.java ---------------------------------------------------------------------- diff --git a/debugger/src/flex/tools/debugger/cli/DisplayAction.java b/debugger/src/flex/tools/debugger/cli/DisplayAction.java deleted file mode 100644 index d8612d5..0000000 --- a/debugger/src/flex/tools/debugger/cli/DisplayAction.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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 flex.tools.debugger.cli; - -import flash.tools.debugger.expression.ValueExp; - -/** - * An object that relates a CLI debugger 'display' command - * with the contents of the display - */ -public class DisplayAction -{ - private static int s_uniqueIdentifier = 1; - - boolean m_enabled; - int m_id; - ValueExp m_expression; - String m_content; - int m_isolateId; - - public DisplayAction(ValueExp expr, String content, int isolateId) - { - init(); - m_expression = expr; - m_content = content; - m_isolateId = isolateId; - } - - void init() - { - m_enabled = true; - m_id = s_uniqueIdentifier++; - } - - /* getters */ - public String getContent() { return m_content; } - public int getId() { return m_id; } - - public int getIsolateId() { - return m_isolateId; - } - public boolean isEnabled() { return m_enabled; } - public ValueExp getExpression() { return m_expression; } - - /* setters */ - public void setEnabled(boolean enable) { m_enabled = enable; } -}
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/flex/tools/debugger/cli/ExpressionCache.java ---------------------------------------------------------------------- diff --git a/debugger/src/flex/tools/debugger/cli/ExpressionCache.java b/debugger/src/flex/tools/debugger/cli/ExpressionCache.java deleted file mode 100644 index 95698d5..0000000 --- a/debugger/src/flex/tools/debugger/cli/ExpressionCache.java +++ /dev/null @@ -1,596 +0,0 @@ -/* - * 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 flex.tools.debugger.cli; - -import java.io.IOException; -import java.io.StringReader; -import java.text.ParseException; -import java.util.NoSuchElementException; -import java.util.Set; -import java.util.Vector; - -import flash.localization.LocalizationManager; -import flash.tools.debugger.Bootstrap; -import flash.tools.debugger.NoResponseException; -import flash.tools.debugger.NotConnectedException; -import flash.tools.debugger.NotSuspendedException; -import flash.tools.debugger.PlayerDebugException; -import flash.tools.debugger.Session; -import flash.tools.debugger.Value; -import flash.tools.debugger.ValueAttribute; -import flash.tools.debugger.Variable; -import flash.tools.debugger.VariableAttribute; -import flash.tools.debugger.VariableType; -import flash.tools.debugger.concrete.DValue; -import flash.tools.debugger.expression.ASTBuilder; -import flash.tools.debugger.expression.IASTBuilder; -import flash.tools.debugger.expression.NoSuchVariableException; -import flash.tools.debugger.expression.PlayerFaultException; -import flash.tools.debugger.expression.ValueExp; - -public class ExpressionCache -{ - Session m_session; - IASTBuilder m_builder; - Vector<Object> m_expressions; - IntProperties m_props; - DebugCLI m_cli; - - /** - * Returned by evaluate(). - */ - public static class EvaluationResult - { - /** - * The value to which the expression evaluated. - */ - public Object value; - - /** - * The context that was used to evaluate the expression. Sometimes used - * to convert the <code>value</code> field to a <code>Value</code> - * with <code>context.toValue()</code>. - */ - public ExpressionContext context; - } - - /** - * We can get at files by name or module id, eventually we will put functions in here too - */ - - public ExpressionCache(DebugCLI cli) - { - m_builder = new ASTBuilder(true); // allow fdb's "*x" and "x." indirection operators - m_expressions = new Vector<Object>(); - m_props = new IntProperties(); - m_cli = cli; - } - - public void clear() { m_expressions.clear(); } - public void unbind() { m_session = null; } - public int size() { return m_expressions.size(); } - public Object at(int i) { return m_expressions.elementAt(i); } - - void setSession(Session s) { m_session = s; } - - public Session getSession() { return m_session; } - public String getPackageName(int id) { return m_cli.module2ClassName(id); } - - public void bind(Session s) - { - setSession(s); - - // propagates our properties to the session / non-critical if fails - try { ((flash.tools.debugger.concrete.PlayerSession)s).setPreferences(m_props.map()); } catch(Exception e) {} - } - - public EvaluationResult evaluate(ValueExp e, int isolateId) throws NumberFormatException, NoSuchVariableException, PlayerFaultException, PlayerDebugException - { - EvaluationResult result = new EvaluationResult(); - result.context = new ExpressionContext(this); - result.context.setIsolateId(isolateId); - result.value = e.evaluate(result.context); - return result; - } - - public ValueExp parse(String s) throws IOException, ParseException - { - return m_builder.parse(new StringReader(s)); - } - - public int add(Object e) - { - int at = m_expressions.size(); - m_expressions.add(e); - return at+1; - } - - // - // Interface for accessing previous expression values and also the properties - // - public boolean propertyEnabled(String which) - { - boolean enabled = false; - try - { - Number number = (Number) get(which); - if (number != null) - enabled = (number.intValue() != 0); - } - catch (Exception e) - { - // nothing; leave 'enabled' as false - } - return enabled; - } - - // this goes in properties - public void put(String s, int value) { m_props.put(s, value); setSessionProperty(s, value); } - public Set<String> keySet() { return m_props.keySet(); } - - /** - * Allow the session to receive property updates - */ - void setSessionProperty(String s, int value) - { - Session sess = getSession(); - if (sess != null) - sess.setPreference(s, value); - Bootstrap.sessionManager().setPreference(s, value); - } - - /** - * We are able to fetch properties or expressions (i.e previous expression) - * using this single call, despite the fact that each of these types of - * results lie in different data structures m_expressions and m_props. - * This allows us to easily perform expression evaluation without - * need or concern over which 'type' of $ reference we are dealing with - */ - public Object get(String s) throws NumberFormatException, ArrayIndexOutOfBoundsException, NoSuchElementException - { - Object exp = null; - - // should be of form '$n' where n is a number 0..size() - if (s.charAt(0) != '$') - throw new NoSuchElementException(s); - - String num = s.substring(1); - if (num == null || num.length() == 0) - exp = at(size()-1); - else if (num.equals("$")) //$NON-NLS-1$ - exp = at(size()-2); - else - { - try - { - int index = Integer.parseInt(num); - exp = at(index-1); - } - catch(NumberFormatException nfe) - { - // must be in the property list - exp = m_props.getInteger(s); - } - } - return exp; - } - - // - // Statics for formatting stuff - // - - /** - * Formatting function for variable - */ - public void appendVariable(StringBuilder sb, Variable v, int isolateId) - { - //sb.append('\''); - String name = v.getName(); - sb.append(name); - //sb.append('\''); - sb.append(" = "); //$NON-NLS-1$ - appendVariableValue(sb, v.getValue(), name, isolateId); - //appendVariableAttributes(sb, v); - } - - /** - * Given any arbitrary constant value, such as a Double, a String, etc., - * format its value appropriately. For example, strings will be quoted. - * - * @param sb - * a StringBuilder to which the formatted value will be appended. - * @param o - * the value to format. - */ - public void appendVariableValue(StringBuilder sb, final Object o, final int isolateId) - { - Value v; - - if (o instanceof Value) { - v = (Value) o; - } else { - v = new Value() { - public int getAttributes() { - return 0; - } - - public String[] getClassHierarchy(boolean allLevels) { - return new String[0]; - } - - public String getClassName() { - return ""; //$NON-NLS-1$ - } - - public long getId() { - return UNKNOWN_ID; - } - - public int getMemberCount(Session s) throws NotSuspendedException, - NoResponseException, NotConnectedException { - return 0; - } - - public Variable getMemberNamed(Session s, String name) - throws NotSuspendedException, NoResponseException, - NotConnectedException { - return null; - } - - public Variable[] getMembers(Session s) - throws NotSuspendedException, NoResponseException, - NotConnectedException { - return new Variable[0]; - } - - public int getType() { - if (o instanceof Number) - return VariableType.NUMBER; - else if (o instanceof Boolean) - return VariableType.BOOLEAN; - else if (o instanceof String) - return VariableType.STRING; - else if (o == Value.UNDEFINED) - return VariableType.UNDEFINED; - else if (o == null) - return VariableType.NULL; - - assert false; - return VariableType.UNKNOWN; - } - - public String getTypeName() { - return ""; //$NON-NLS-1$ - } - - public Object getValueAsObject() { - return o; - } - - public String getValueAsString() { - return DValue.getValueAsString(o); - } - - public boolean isAttributeSet(int variableAttribute) { - return false; - } - - public Variable[] getPrivateInheritedMembers() { - return new Variable[0]; - } - - public Variable[] getPrivateInheritedMemberNamed(String name) { - return new Variable[0]; - } - - public int getIsolateId() { - return isolateId; - } - }; - } - - appendVariableValue(sb, v, isolateId); - } - - public void appendVariableValue(StringBuilder sb, Value val, final int isolateId) { appendVariableValue(sb,val,"", isolateId); } //$NON-NLS-1$ - - public void appendVariableValue(StringBuilder sb, Value val, String variableName, final int isolateId) - { - int type = val.getType(); - String typeName = val.getTypeName(); - String className = val.getClassName(); - - // if no string or empty then typeName is blank - if (typeName != null && typeName.length() == 0) - typeName = null; - - switch (type) - { - case VariableType.NUMBER: - { - double value = ((Number)val.getValueAsObject()).doubleValue(); - long longValue = (long) value; - // The value is stored as a double; however, in practice most values are - // actually integers. Check to see if this is the case, and if it is, - // then display it: - // - without a fraction, and - // - with its hex equivalent in parentheses. - // Note, we use 'long' instead of 'int', in order to deal with the - // ActionScript type 'uint'. - if (longValue == value) - { - sb.append(longValue); - sb.append(" (0x"); //$NON-NLS-1$ - sb.append(Long.toHexString(longValue)); - sb.append(")"); //$NON-NLS-1$ - } - else - { - sb.append(value); - } - break; - } - - case VariableType.BOOLEAN: - { - Boolean b = (Boolean)val.getValueAsObject(); - if (b.booleanValue()) - sb.append("true"); //$NON-NLS-1$ - else - sb.append("false"); //$NON-NLS-1$ - break; - } - - case VariableType.STRING: - { - // Exceptions are displayed in angle brackets, e.g. - // foo = <Text of exception here> - // Strings are displayed quoted: - // foo = "Value of string here" - // - // Note that quotation marks within the string are not escaped. This - // is sort of weird, but it's what we want to do, at least for now; - // the debugger's output is intended to be human-readable, not - // machine-readable, and it's easier for a person to read the string - // if there is no escaping of quotation marks. - // - // As a small step in the direction of avoiding that weirdness, if - // the string contains double-quotes but no single-quotes, we will - // quote it in single quotes. - String s = val.getValueAsString(); - char start, end; - - if (val.isAttributeSet(ValueAttribute.IS_EXCEPTION)) - { - start = '<'; - end = '>'; - } - else if (s.indexOf('"') != -1 && s.indexOf('\'') == -1) - { - start = end = '\''; - } - else - { - start = end = '"'; - } - - sb.append(start); - sb.append(escapeIfIde(s)); - sb.append(end); - break; - } - - case VariableType.OBJECT: - { - sb.append("["); //$NON-NLS-1$ - sb.append(className); - - // Normally, we include the object id after the class name. - // However, when running fdbunit, don't show object IDs, so that - // results can reproduce consistently from one run to the next. - if (System.getProperty("fdbunit") == null) //$NON-NLS-1$ - { - sb.append(" "); //$NON-NLS-1$ - sb.append(escapeIfIde(String.valueOf(val.getValueAsObject()))); // object id - } - if (typeName != null && !typeName.equals(className)) - { - sb.append(", class='"); //$NON-NLS-1$ - - // Often the typename is of the form 'classname@hexaddress', - // but the hex address is the same as the object id which - // is returned by getValue() -- we don't want to display it - // here. - int at = typeName.indexOf('@'); - if (at != -1) - typeName = typeName.substring(0, at); - - sb.append(typeName); - sb.append('\''); - } - sb.append(']'); - break; - } - - case VariableType.FUNCTION: - { - // here we have a special case for getters/setters which - // look like functions to us, except the attribute is set. - sb.append('['); - if (val.isAttributeSet(VariableAttribute.HAS_GETTER)) - sb.append(getLocalizationManager().getLocalizedTextString("getterFunction")); //$NON-NLS-1$ - else if (val.isAttributeSet(VariableAttribute.HAS_SETTER)) - sb.append(getLocalizationManager().getLocalizedTextString("setterFunction")); //$NON-NLS-1$ - else - sb.append(getLocalizationManager().getLocalizedTextString("function")); //$NON-NLS-1$ - sb.append(' '); - - sb.append(escapeIfIde(String.valueOf(val.getValueAsObject()))); - if (typeName != null && !typeName.equals(variableName)) - { - sb.append(", name='"); //$NON-NLS-1$ - sb.append(typeName); - sb.append('\''); - } - sb.append(']'); - break; - } - - case VariableType.MOVIECLIP: - { - sb.append("["); //$NON-NLS-1$ - sb.append(className); - sb.append(" "); //$NON-NLS-1$ - sb.append(escapeIfIde(String.valueOf(val.getValueAsObject()))); - if (typeName != null && !typeName.equals(className)) - { - sb.append(", named='"); //$NON-NLS-1$ - sb.append(typeName); - sb.append('\''); - } - sb.append(']'); - break; - } - - case VariableType.NULL: - { - sb.append("null"); //$NON-NLS-1$ - break; - } - - case VariableType.UNDEFINED: - { - sb.append("undefined"); //$NON-NLS-1$ - break; - } - - case VariableType.UNKNOWN: - { - sb.append(getLocalizationManager().getLocalizedTextString("unknownVariableType")); //$NON-NLS-1$ - break; - } - } - } - - private static LocalizationManager getLocalizationManager() - { - return DebugCLI.getLocalizationManager(); - } - - public static void appendVariableAttributes(StringBuilder sb, Variable v) - { - if (v.getAttributes() == 0) - return; - - sb.append(" "); //$NON-NLS-1$ - - if (v.isAttributeSet(VariableAttribute.DONT_ENUMERATE)) - sb.append(", " + getLocalizationManager().getLocalizedTextString("variableAttribute_dontEnumerate")); //$NON-NLS-1$ //$NON-NLS-2$ - - if (v.isAttributeSet(VariableAttribute.READ_ONLY)) - sb.append(", " + getLocalizationManager().getLocalizedTextString("variableAttribute_readOnly")); //$NON-NLS-1$ //$NON-NLS-2$ - - if (v.isAttributeSet(VariableAttribute.IS_LOCAL)) - sb.append(", " + getLocalizationManager().getLocalizedTextString("variableAttribute_localVariable")); //$NON-NLS-1$ //$NON-NLS-2$ - - if (v.isAttributeSet(VariableAttribute.IS_ARGUMENT)) - sb.append(", " + getLocalizationManager().getLocalizedTextString("variableAttribute_functionArgument")); //$NON-NLS-1$ //$NON-NLS-2$ - - if (v.isAttributeSet(VariableAttribute.HAS_GETTER)) - sb.append(", " + getLocalizationManager().getLocalizedTextString("variableAttribute_getterFunction")); //$NON-NLS-1$ //$NON-NLS-2$ - - if (v.isAttributeSet(VariableAttribute.HAS_SETTER)) - sb.append(", " + getLocalizationManager().getLocalizedTextString("variableAttribute_setterFunction")); //$NON-NLS-1$ //$NON-NLS-2$ - - if (v.isAttributeSet(VariableAttribute.IS_DYNAMIC)) - sb.append(", dynamic"); //$NON-NLS-1$ - - if (v.isAttributeSet(VariableAttribute.IS_STATIC)) - sb.append(", static"); //$NON-NLS-1$ - - if (v.isAttributeSet(VariableAttribute.IS_CONST)) - sb.append(", const"); //$NON-NLS-1$ - - if (v.isAttributeSet(VariableAttribute.PRIVATE_SCOPE)) - sb.append(", private"); //$NON-NLS-1$ - - if (v.isAttributeSet(VariableAttribute.PUBLIC_SCOPE)) - sb.append(", public"); //$NON-NLS-1$ - - if (v.isAttributeSet(VariableAttribute.PROTECTED_SCOPE)) - sb.append(", protected"); //$NON-NLS-1$ - - if (v.isAttributeSet(VariableAttribute.INTERNAL_SCOPE)) - sb.append(", internal"); //$NON-NLS-1$ - - if (v.isAttributeSet(VariableAttribute.NAMESPACE_SCOPE)) - sb.append(", " + getLocalizationManager().getLocalizedTextString("variableAttribute_hasNamespace")); //$NON-NLS-1$ //$NON-NLS-2$ - } - - private String escapeIfIde(String s) - { - return m_cli != null && m_cli.isIde() ? escape(s) : s; - } - - public static String escape(final String str) { - final StringBuilder buffer = new StringBuilder(); - - for (int idx = 0; idx < str.length(); idx++) { - char ch = str.charAt(idx); - switch (ch) { - case '\b': - buffer.append("\\b"); - break; - - case '\t': - buffer.append("\\t"); - break; - - case '\n': - buffer.append("\\n"); - break; - - case '\f': - buffer.append("\\f"); - break; - - case '\r': - buffer.append("\\r"); - break; - - case '\\': - buffer.append("\\\\"); - break; - - default: - if (Character.isISOControl(ch)) { - String hexCode = Integer.toHexString(ch).toUpperCase(); - buffer.append("\\u"); - int paddingCount = 4 - hexCode.length(); - while (paddingCount-- > 0) { - buffer.append(0); - } - buffer.append(hexCode); - } else { - buffer.append(ch); - } - } - } - return buffer.toString(); - } -} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/flex/tools/debugger/cli/ExpressionContext.java ---------------------------------------------------------------------- diff --git a/debugger/src/flex/tools/debugger/cli/ExpressionContext.java b/debugger/src/flex/tools/debugger/cli/ExpressionContext.java deleted file mode 100644 index 2bed5ee..0000000 --- a/debugger/src/flex/tools/debugger/cli/ExpressionContext.java +++ /dev/null @@ -1,653 +0,0 @@ -/* - * 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 flex.tools.debugger.cli; - -import java.util.StringTokenizer; -import java.util.Vector; - -import flash.tools.debugger.Isolate; -import flash.tools.debugger.PlayerDebugException; -import flash.tools.debugger.Session; -import flash.tools.debugger.SessionManager; -import flash.tools.debugger.Value; -import flash.tools.debugger.ValueAttribute; -import flash.tools.debugger.Variable; -import flash.tools.debugger.VariableType; -import flash.tools.debugger.concrete.DValue; -import flash.tools.debugger.events.ExceptionFault; -import flash.tools.debugger.events.FaultEvent; -import flash.tools.debugger.expression.Context; -import flash.tools.debugger.expression.ExpressionEvaluatorException; -import flash.tools.debugger.expression.NoSuchVariableException; -import flash.tools.debugger.expression.PlayerFaultException; - -public class ExpressionContext implements Context -{ - ExpressionCache m_cache; - Object m_current; - boolean m_createIfMissing; // set if we need to create a variable if it doesn't exist - Vector<String> m_namedPath; - boolean m_nameLocked; - String m_newline = System.getProperty("line.separator"); //$NON-NLS-1$ - int m_isolateId; - - // used when evaluating an expression - public ExpressionContext(ExpressionCache cache) - { - m_cache = cache; - m_current = null; - m_createIfMissing = false; - m_namedPath = new Vector<String>(); - m_nameLocked = false; - m_isolateId = Isolate.DEFAULT_ID; - } - - public void setIsolateId(int id) { - m_isolateId = id; - } - - void setContext(Object o) { m_current = o; } - - void pushName(String name) { if (m_nameLocked || name.length() < 1) return; m_namedPath.add(name); } - boolean setName(String name) { if (m_nameLocked) return true; m_namedPath.clear(); pushName(name); return true; } - void lockName() { m_nameLocked = true; } - - public String getName() - { - int size = m_namedPath.size(); - StringBuilder sb = new StringBuilder(); - for(int i=0; i<size; i++) - { - String s = m_namedPath.get(i); - if (i > 0) - sb.append('.'); - sb.append(s); - } - return ( sb.toString() ); - } - - String getCurrentPackageName() - { - String s = null; - try - { - Integer o = (Integer)m_cache.get(DebugCLI.LIST_MODULE); - s = m_cache.getPackageName(o.intValue()); - } - catch(NullPointerException npe) - { - } - catch(ClassCastException cce) - { - } - return s; - } - - // - // - // Start of Context API implementation - // - // - public void createPseudoVariables(boolean oui) { m_createIfMissing = oui; } - - // create a new context object by combining the current one and o - public Context createContext(Object o) - { - ExpressionContext c = new ExpressionContext(m_cache); - c.setContext(o); - c.createPseudoVariables(m_createIfMissing); - c.m_namedPath.addAll(m_namedPath); - c.setIsolateId(m_isolateId); - return c; - } - - // assign the object o, the value v - public void assign(Object o, Value v) throws NoSuchVariableException, PlayerFaultException - { - try - { - // first see if it is an internal property (avoids player calls) - InternalProperty prop = resolveToInternalProperty(o); - - // we expect that o is a variable that can be resolved or is a specially marked internal variable - if (prop != null) - { - assignInternal(prop, v); - } - else - { - boolean wasCreateIfMissing = m_createIfMissing; - createPseudoVariables(true); - Variable var = null; - try { - var = resolveToVariable(o); - } finally { - createPseudoVariables(wasCreateIfMissing); - } - - if (var == null) - throw new NoSuchVariableException((var == null) ? m_current : var.getName()); - - // set the value, for the case of a variable that does not exist it will not have a type - // so we try to glean one from v. - FaultEvent faultEvent = var.setValue(getSession(), v.getType(), v.getValueAsString()); - if (faultEvent != null) - throw new PlayerFaultException(faultEvent); - } - } - catch(PlayerDebugException pde) - { - throw new ExpressionEvaluatorException(pde); - } - } - - /** - * The Context interface which goes out and gets values from the session - * Expressions use this interface as a means of evaluation. - * - * We also use this to create a reference to internal variables. - */ - public Object lookup(Object o) throws NoSuchVariableException, PlayerFaultException - { - Object result = null; - try - { - // first see if it is an internal property (avoids player calls) - if ( (result = resolveToInternalProperty(o)) != null) - ; - - // attempt to resolve to a player variable - else if ( (result = resolveToVariable(o)) != null) - ; - - // or value - else if ( (result = resolveToValue(o)) != null) - ; - - else - throw new NoSuchVariableException(o); - - // take on the path to the variable; so 'what' command prints something nice - if ((result != null) && result instanceof VariableFacade) - { - ((VariableFacade)result).setPath(getName()); - } - - // if the attempt to get the variable's value threw an exception inside the - // player (most likely because the variable is actually a getter, and the - // getter threw something), then throw something here - Value resultValue = null; - - if (result instanceof Variable) - { - if (result instanceof VariableFacade && ((VariableFacade)result).getVariable() == null) - resultValue = null; - else - resultValue = ((Variable)result).getValue(); - } - else if (result instanceof Value) - { - resultValue = (Value) result; - } - - if (resultValue != null) - { - if (resultValue.isAttributeSet(ValueAttribute.IS_EXCEPTION)) - { - String value = resultValue.getValueAsString(); - throw new PlayerFaultException(new ExceptionFault(value, false, resultValue, resultValue.getIsolateId())); - } - } - } - catch(PlayerDebugException pde) - { - result = Value.UNDEFINED; - } - return result; - } - - /* returns a string consisting of formatted member names and values */ - public Object lookupMembers(Object o) throws NoSuchVariableException - { - Variable var = null; - Value val = null; - Variable[] mems = null; - try - { - var = resolveToVariable(o); - if (var != null) - val = var.getValue(); - else - val = resolveToValue(o); - mems = val.getMembers(getSession()); - } - catch(NullPointerException npe) - { - throw new NoSuchVariableException(o); - } - catch(PlayerDebugException pde) - { - throw new NoSuchVariableException(o); // not quite right... - } - - StringBuilder sb = new StringBuilder(); - - if (var != null) - m_cache.appendVariable(sb, var, m_isolateId); - else - m_cache.appendVariableValue(sb, val, m_isolateId); - - boolean attrs = m_cache.propertyEnabled(DebugCLI.DISPLAY_ATTRIBUTES); - if (attrs && var != null) - ExpressionCache.appendVariableAttributes(sb, var); - - // [mmorearty] experimenting with hierarchical display of members - String[] classHierarchy = val.getClassHierarchy(false); - if (classHierarchy != null && getSession().getPreference(SessionManager.PREF_HIERARCHICAL_VARIABLES) != 0) - { - for (int c=0; c<classHierarchy.length; ++c) - { - String classname = classHierarchy[c]; - sb.append(m_newline + "(Members of " + classname + ")"); //$NON-NLS-1$ //$NON-NLS-2$ - for (int i=0; i<mems.length; ++i) - { - if (classname.equals(mems[i].getDefiningClass())) - { - sb.append(m_newline + " "); //$NON-NLS-1$ - m_cache.appendVariable(sb, mems[i], m_isolateId); - if (attrs) - ExpressionCache.appendVariableAttributes(sb, mems[i]); - } - } - } - } - else - { - for(int i=0; i<mems.length; i++) - { - sb.append(m_newline + " "); //$NON-NLS-1$ - m_cache.appendVariable(sb, mems[i], m_isolateId); - if (attrs) - ExpressionCache.appendVariableAttributes(sb, mems[i]); - } - } - - return sb.toString(); - } - - // - // - // End of Context API implementation - // - // - - // used to assign a value to an internal variable - private void assignInternal(InternalProperty var, Value v) throws NoSuchVariableException, NumberFormatException, PlayerDebugException - { - // otherwise set it - if (v.getType() != VariableType.NUMBER) - throw new NumberFormatException(v.getValueAsString()); - long l = Long.parseLong(v.getValueAsString()); - m_cache.put(var.getName(), (int)l); - } - - InternalProperty resolveToInternalProperty(Object o) - { - if (o instanceof String && ((String)o).charAt(0) == '$') - { - String key = (String)o; - Object value = null; - - try { value = m_cache.get(key); } catch(Exception e) {} - return new InternalProperty(key, value); - } - - return null; - } - - /** - * Resolve the object into a variable by various means and - * using the current context. - * @return variable, or <code>null</code> - */ - Variable resolveToVariable(Object o) throws PlayerDebugException - { - Variable v = null; - - // if o is a variable already, then we're done! - if (o instanceof Variable) - return (Variable)o; - - /** - * Resolve the name to something - */ - { - // not an id so try as name - String name = o.toString(); - long id = nameAsId(name); - - /** - * if #N was used just pick up the variable, otherwise - * we need to use the current context to resolve - * the name to a member - */ - if (id != Value.UNKNOWN_ID) - { - // TODO what here? - } - else - { - // try to resolve as a member of current context (will set context if null) - id = determineContext(name); - v = locateForNamed(id, name, true); - if (v != null) - v = new VariableFacade(v, id, m_isolateId); - else if (v == null && m_createIfMissing && name.charAt(0) != '$') - v = new VariableFacade(id, name, m_isolateId); - } - } - - /* return the variable */ - return v; - } - - /* - * Resolve the object into a variable by various means and - * using the current context. - */ - Value resolveToValue(Object o) throws PlayerDebugException - { - Value v = null; - - // if o is a variable or a value already, then we're done! - if (o instanceof Value) - return (Value)o; - else if (o instanceof Variable) - return ((Variable)o).getValue(); - else if (o instanceof InternalProperty) - return DValue.forPrimitive(((InternalProperty)o).m_value, m_isolateId); - - /** - * Resolve the name to something - */ - if (m_current == null) - { - // not an id so try as name - String name = o.toString(); - long id = nameAsId(name); - - /** - * if #N was used just pick up the variable, otherwise - * we need to use the current context to resolve - * the name to a member - */ - if (id != Value.UNKNOWN_ID) - { - v = getSession().getWorkerSession(m_isolateId).getValue((int)id); - } - else if (name.equals("undefined")) //$NON-NLS-1$ - { - v = DValue.forPrimitive(Value.UNDEFINED, m_isolateId); - } - else - { - // Ask the player to find something, anything, on the scope chain - // with this name. We'll end up here, for example, when resolving - // things like MyClass, String, Number, etc. - v = getSession().getWorkerSession(m_isolateId).getGlobal(name); - } - } - - /* return the value */ - return v; - } - - // special code for #N support. I.e. naming a variable via an ID - long nameAsId(String name) - { - long id = Value.UNKNOWN_ID; - try - { - if (name.charAt(0) == '#') - id = Long.parseLong(name.substring(1)); - } - catch(Exception e) - { - id = Value.UNKNOWN_ID; - } - return id; - } - - /** - * Using the given id as a parent find the member named - * name. - * @throws NoSuchVariableException if id is UNKNOWN_ID - */ - Variable memberNamed(long id, String name) throws NoSuchVariableException, PlayerDebugException - { - Variable v = null; - Value parent = getSession().getWorkerSession(m_isolateId).getValue(id); - - if (parent == null) - throw new NoSuchVariableException(name); - - /* got a variable now return the member if any */ - v = parent.getMemberNamed(getSession(), name); - - return v; - } - - /** - * All the really good stuff about finding where name exists goes here! - * - * If name is not null, then it implies that we use the existing - * m_current to find a member of m_current. If m_current is null - * Then we need to probe variable context points attempting to locate - * name. When we find a match we set the m_current to this context - * - * If name is null then we simply return the current context. - */ - long determineContext(String name) throws PlayerDebugException - { - long id = Value.UNKNOWN_ID; - - // have we already resolved our context... - if (m_current != null) - { - id = toValue().getId(); - } - - // nothing to go on, so we're done - else if (name == null) - ; - - // use the name and try and resolve where we are... - else - { - // Each stack frame has a root variable under (BASE_ID-depth) - // where depth is the depth of the stack. - // So we query for our current stack depth and use that - // as the context for our base computation - long baseId = Value.BASE_ID; - int depth = ((Integer)m_cache.get(DebugCLI.DISPLAY_FRAME_NUMBER)).intValue(); - baseId -= depth; - - // obtain data about our current state - Variable contextVar = null; - Value contextVal = null; - Value val = null; - - // look for 'name' starting from local scope - if ( (val = locateParentForNamed(baseId, name, false)) != null) - ; - - // get the this pointer, then look for 'name' starting from that point - else if ( ( (contextVar = locateForNamed(baseId, "this", false)) != null ) && //$NON-NLS-1$ - ( setName("this") && (val = locateParentForNamed(contextVar.getValue().getId(), name, true)) != null ) ) //$NON-NLS-1$ - ; - - // now try to see if 'name' exists off of _root - else if ( setName("_root") && (val = locateParentForNamed(Value.ROOT_ID, name, true)) != null ) //$NON-NLS-1$ - ; - - // now try to see if 'name' exists off of _global - else if ( setName("_global") && (val = locateParentForNamed(Value.GLOBAL_ID, name, true)) != null ) //$NON-NLS-1$ - ; - - // now try off of class level, if such a thing can be found - else if ( ( (contextVal = locate(Value.GLOBAL_ID, getCurrentPackageName(), false)) != null ) && - ( setName("_global."+getCurrentPackageName()) && (val = locateParentForNamed(contextVal.getId(), name, true)) != null ) ) //$NON-NLS-1$ - ; - - // if we found it then stake this as our context! - if (val != null) - { - id = val.getId(); - pushName(name); - lockName(); - } - } - - return id; - } - - /** - * Performs a search for a member with the given name using the - * given id as the parent variable. - * - * If a match is found then, we return the parent variable of - * the member that matched. The proto chain is optionally traversed. - * - * No exceptions are thrown - */ - Value locateParentForNamed(long id, String name, boolean traverseProto) throws PlayerDebugException - { - StringBuilder sb = new StringBuilder(); - - Variable var = null; - Value val = null; - try - { - var = memberNamed(id, name); - - // see if we need to traverse the proto chain - while (var == null && traverseProto) - { - // first attempt to get __proto__, then resolve name - Variable proto = memberNamed(id, "__proto__"); //$NON-NLS-1$ - sb.append("__proto__"); //$NON-NLS-1$ - if (proto == null) - traverseProto = false; - else - { - id = proto.getValue().getId(); - var = memberNamed(id, name); - if (var == null) - sb.append('.'); - } - } - } - catch(NoSuchVariableException nsv) - { - // don't worry about this one, it means variable with id couldn't be found - } - catch(NullPointerException npe) - { - // probably no session - } - - // what we really want is the parent not the child variable - if (var != null) - { - pushName(sb.toString()); - val = getSession().getWorkerSession(m_isolateId).getValue(id); - } - - return val; - } - - // variant of locateParentForNamed, whereby we return the child variable - Variable locateForNamed(long id, String name, boolean traverseProto) throws PlayerDebugException - { - Variable var = null; - Value v = locateParentForNamed(id, name, traverseProto); - if (v != null) - { - try - { - var = memberNamed(v.getId(), name); - } - catch(NoSuchVariableException nse) - { - v = null; - } - } - - return var; - } - - /** - * Locates the member via a dotted name starting at the given id. - * It will traverse any and all proto chains if necc. to find the name. - */ - Value locate(long startingId, String dottedName, boolean traverseProto) throws PlayerDebugException - { - if (dottedName == null) - return null; - - // first rip apart the dottedName - StringTokenizer names = new StringTokenizer(dottedName, "."); //$NON-NLS-1$ - Value val = getSession().getWorkerSession(m_isolateId).getValue(startingId); - - while(names.hasMoreTokens() && val != null) - val = locateForNamed(val.getId(), names.nextToken(), traverseProto).getValue(); - - return val; - } - - /* - * @see flash.tools.debugger.expression.Context#toValue(java.lang.Object) - */ - public Value toValue(Object o) - { - // if o is a variable or a value already, then we're done! - if (o instanceof Value) - return (Value)o; - else if (o instanceof Variable) - return ((Variable)o).getValue(); - else if (o instanceof InternalProperty) - return DValue.forPrimitive(((InternalProperty)o).m_value, m_isolateId); - else - return DValue.forPrimitive(o, m_isolateId); - } - - public Value toValue() - { - return toValue(m_current); - } - - public Session getSession() - { - return m_cache.getSession(); - } - - @Override - public int getIsolateId() { - return m_isolateId; - } -} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/flex/tools/debugger/cli/Extensions.java ---------------------------------------------------------------------- diff --git a/debugger/src/flex/tools/debugger/cli/Extensions.java b/debugger/src/flex/tools/debugger/cli/Extensions.java deleted file mode 100644 index 0222290..0000000 --- a/debugger/src/flex/tools/debugger/cli/Extensions.java +++ /dev/null @@ -1,547 +0,0 @@ -/* - * 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 flex.tools.debugger.cli; - -import java.io.PrintWriter; -import java.text.ParseException; -import java.util.HashMap; -import java.util.Map; - -import flash.localization.LocalizationManager; -import flash.swf.tools.Disassembler; -import flash.swf.types.ActionList; -import flash.tools.ActionLocation; -import flash.tools.debugger.Bootstrap; -import flash.tools.debugger.NotConnectedException; -import flash.tools.debugger.PlayerDebugException; -import flash.tools.debugger.Session; -import flash.tools.debugger.SourceFile; -import flash.tools.debugger.SuspendReason; -import flash.tools.debugger.SuspendedException; -import flash.tools.debugger.SwfInfo; -import flash.tools.debugger.Value; -import flash.tools.debugger.concrete.DMessage; -import flash.tools.debugger.concrete.DMessageCounter; -import flash.tools.debugger.concrete.DModule; -import flash.tools.debugger.concrete.DSuspendInfo; -import flash.tools.debugger.concrete.DSwfInfo; -import flash.tools.debugger.concrete.PlayerSession; -import flash.tools.debugger.concrete.PlayerSessionManager; -import flash.util.FieldFormat; - -/** - * Extensions class is a singleton that contains - * every cli method that does not conform to the - * API. Thus we can easily remove these features - * from the cli if the implementation does not - * support these calls. - */ -public class Extensions -{ - public final static String m_newline = System.getProperty("line.separator"); //$NON-NLS-1$ - - public static void doShowStats(DebugCLI cli) throws IllegalStateException - { - /* we do some magic casting */ - Session session = cli.getSession(); - StringBuilder sb = new StringBuilder(); - try - { - PlayerSession p = (PlayerSession)session; - DMessageCounter cnt = p.getMessageCounter(); - - sb.append(getLocalizationManager().getLocalizedTextString("key16")); //$NON-NLS-1$ - sb.append(m_newline); - for(int i=0; i<=DMessage.InSIZE; i++) - { - long amt = cnt.getInCount(i); - if (amt > 0) - { - sb.append('\n'); - sb.append(DMessage.inTypeName(i)); - sb.append(" = "); //$NON-NLS-1$ - sb.append(amt); - } - } - - sb.append("\n\n"); //$NON-NLS-1$ - sb.append(getLocalizationManager().getLocalizedTextString("key17")); //$NON-NLS-1$ - sb.append("\n"); //$NON-NLS-1$ - for(int i=0; i<=DMessage.OutSIZE; i++) - { - long amt = cnt.getOutCount(i); - if (amt > 0) - { - sb.append('\n'); - sb.append(DMessage.outTypeName(i)); - sb.append(" = "); //$NON-NLS-1$ - sb.append(amt); - } - } - - sb.append('\n'); - cli.out( sb.toString() ); - } - catch(NullPointerException e) - { - throw new IllegalStateException(); - } - } - - public static void doShowFuncs(DebugCLI cli) - { - StringBuilder sb = new StringBuilder(); - - String arg = null; - FileInfoCache fileInfo = cli.getFileCache(); - - // we take an optional single arg which specifies a module - try - { - if (cli.hasMoreTokens()) - { - arg = cli.nextToken(); - int id = arg.equals(".") ? cli.propertyGet(DebugCLI.LIST_MODULE) : cli.parseFileArg(cli.getActiveIsolateId(), -1, arg); //$NON - - DModule m = (DModule)fileInfo.getFile(id, cli.getActiveIsolateId()); - m.lineMapping(sb); - } - else - { - SourceFile[] ar = fileInfo.getFileList(); - if (ar == null) - cli.err(getLocalizationManager().getLocalizedTextString("key18")); //$NON-NLS-1$ - else - { - for (int i = 0; ar != null && i < ar.length; i++) - { - DModule m = (DModule)ar[i]; - m.lineMapping(sb); - } - } - } - - cli.out(sb.toString()); - } - catch(NullPointerException npe) - { - cli.err(getLocalizationManager().getLocalizedTextString("key19")); //$NON-NLS-1$ - } - catch(ParseException pe) - { - cli.err(pe.getMessage()); - } - catch(AmbiguousException ae) - { - cli.err(ae.getMessage()); - } - catch(NoMatchException nme) - { - cli.err(nme.getMessage()); - } - } - - /** - * Dump the content of internal variables - */ - public static void doShowProperties(DebugCLI cli) - { - StringBuilder sb = new StringBuilder(); - - Session session = cli.getSession(); - for (String key: cli.propertyKeys()) - { - int value = cli.propertyGet(key); - sb.append(key); - sb.append(" = "); //$NON-NLS-1$ - sb.append(value); - sb.append('\n'); - } - - // session manager - { - PlayerSessionManager mgr = (PlayerSessionManager)Bootstrap.sessionManager(); - sb.append(getLocalizationManager().getLocalizedTextString("key21")); //$NON-NLS-1$ - sb.append('\n'); - for (String key: mgr.keySet()) - { - Object value = mgr.getPreferenceAsObject(key); - sb.append(key); - sb.append(" = "); //$NON-NLS-1$ - sb.append(value); - sb.append('\n'); - } - } - - if (session != null) - { - PlayerSession psession = (PlayerSession)session; - sb.append(getLocalizationManager().getLocalizedTextString("key22")); //$NON-NLS-1$ - sb.append('\n'); - for (String key: psession.keySet()) - { - Object value = psession.getPreferenceAsObject(key); - sb.append(key); - sb.append(" = "); //$NON-NLS-1$ - sb.append(value); - sb.append('\n'); - } - } - - cli.out( sb.toString() ); - } - - /** - * Dump the break reason and offset - */ - public static void doShowBreak(DebugCLI cli) throws NotConnectedException - { - int isolateId = cli.getActiveIsolateId(); - cli.waitTilHalted(isolateId); - try - { - Session session = cli.getSession(); - StringBuilder sb = new StringBuilder(); - if (session.getWorkerSession(isolateId).isSuspended()) - { - sb.append(getLocalizationManager().getLocalizedTextString("stopped")); //$NON-NLS-1$ - sb.append(' '); - appendBreakInfo(cli, sb, true, isolateId); - } - else - sb.append(getLocalizationManager().getLocalizedTextString("key24")); //$NON-NLS-1$ - - cli.out( sb.toString() ); - } - catch(NullPointerException npe) - { - cli.err(getLocalizationManager().getLocalizedTextString("key25")); //$NON-NLS-1$ - } - } - - // Extended low level break information - public static void appendBreakInfo(DebugCLI cli, StringBuilder sb, boolean includeFault, int isolateId) throws NotConnectedException - { - Session session = cli.getSession(); - FileInfoCache fileInfo = cli.getFileCache(); - - int reason = session.suspendReason(); - int offset = ((PlayerSession)session).getSuspendOffset(); - int index = ((PlayerSession)session).getSuspendActionIndex(); - - SwfInfo info = null; - try { info = fileInfo.getSwfs(isolateId)[index]; } catch(ArrayIndexOutOfBoundsException oobe) {} - if (info != null) - { - Map<String, String> args = new HashMap<String, String>(); - args.put("swfName", FileInfoCache.nameOfSwf(info) ); //$NON-NLS-1$ - sb.append(getLocalizationManager().getLocalizedTextString("key35", args)); //$NON-NLS-1$ - sb.append(' '); - } - - Map<String, String> args = new HashMap<String, String>(); - args.put("address", "0x" + FieldFormat.formatLongToHex(new StringBuilder(), offset, 8) + " (" + offset + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - sb.append(getLocalizationManager().getLocalizedTextString("atAddress", args)); //$NON-NLS-1$ - - if (includeFault) - { - args = new HashMap<String, String>(); - StringBuilder reasonBuffer = new StringBuilder(); - cli.appendReason(reasonBuffer, reason); - args.put("fault", reasonBuffer.toString() ); //$NON-NLS-1$ - sb.append(' '); - sb.append(getLocalizationManager().getLocalizedTextString("haltedDueToFault", args)); //$NON-NLS-1$ - } - } - - // Raw direct call to Player - public static void doShowVariable(DebugCLI cli) throws PlayerDebugException - { - int isolateId = cli.getActiveIsolateId(); - cli.waitTilHalted(isolateId); - try - { - // an integer followed by a variable name - Session session = cli.getSession(); - long id = cli.nextLongToken(); - String name = (cli.hasMoreTokens()) ? cli.nextToken() : null; - - StringBuilder sb = new StringBuilder(); - sb.append(name); - sb.append(" = "); //$NON-NLS-1$ - Value v = ((PlayerSession)session).getValue(id, name, isolateId); - cli.m_exprCache.appendVariableValue(sb, v, isolateId); - cli.out( sb.toString() ); - } - catch(NullPointerException npe) - { - cli.err(getLocalizationManager().getLocalizedTextString("key26")); //$NON-NLS-1$ - } - } - - public static void doDisassemble(DebugCLI cli) throws PlayerDebugException - { - /* currentXXX may NOT be invalid! */ - int currentModule = cli.propertyGet(DebugCLI.LIST_MODULE); - int currentLine = cli.propertyGet(DebugCLI.LIST_LINE); - int currentIsolate = cli.propertyGet(DebugCLI.LIST_WORKER); - - String arg1 = null; - int module1 = currentModule; - int line1 = currentLine; - - String arg2 = null; - int line2 = currentLine; - - boolean functionNamed = false; - int numLines = 0; - try - { - FileInfoCache fileInfo = cli.getFileCache(); - Session session = cli.getSession(); - int isolateId = cli.getActiveIsolateId(); - if (cli.hasMoreTokens()) - { - arg1 = cli.nextToken(); - if (arg1.equals("-")) //$NON-NLS-1$ - { - // move back one line - line1 = line2 = line1 - 1; - } - else - { - int wasFunc = 0; - - FileLocation[] fileLocations = cli.parseLocationArg(currentModule, currentLine, arg1, false); - - if (fileLocations.length == 1) { - module1 = fileLocations[0].getModule(); - line2 = line1 = fileLocations[0].getLine(); - functionNamed = (fileLocations[0].getWasFunc() != 0); - } - - if (cli.hasMoreTokens()) { - arg2 = cli.nextToken(); - line2 = cli.parseLineArg(module1, arg2); - } - } - } - else - { - // since no parms test for valid location if none use players concept of where we stopped - if( fileInfo.getFile(currentModule, currentIsolate) == null) - { - //here we simply use the players concept of suspsend - DSuspendInfo info = ((PlayerSession)session).getSuspendInfoIsolate(isolateId); - int at = info.getOffset(); - int which = info.getActionIndex(); - int until = info.getNextOffset(); - if (info.getReason() == SuspendReason.Unknown) - throw new SuspendedException(); - - SwfInfo swf = fileInfo.getSwfs(isolateId)[which]; - outputAssembly(cli, (DSwfInfo)swf, at, until); - throw new AmbiguousException(getLocalizationManager().getLocalizedTextString("key27")); //$NON-NLS-1$ - } - } - - /** - * Check for a few error conditions, otherwise we'll write a listing! - */ - if (cli.hasMoreTokens()) - { - cli.err(getLocalizationManager().getLocalizedTextString("key28")); //$NON-NLS-1$ - } - else - { - SourceFile file = fileInfo.getFile(module1); - numLines = file.getLineCount(); - - // pressing return is ok, otherwise throw the exception - if (line1 > numLines && arg1 != null) - throw new IndexOutOfBoundsException(); - - /* if no arg2 then user list a single line */ - if (arg2 == null) - line2 = line1; - - /* adjust our range of lines to ensure we conform */ - if (line1 < 1) - { - /* shrink line 1, grow line2 */ - line2 += -(line1 - 1); - line1 = 1; - } - - if (line2 > numLines) - line2 = numLines; - - // System.out.println("1="+module1+":"+line1+",2="+module2+":"+line2+",num="+numLines+",half="+half); - - /* nothing to display */ - if (line1 > line2) - throw new IndexOutOfBoundsException(); - - /* now dump the mixed source / assembly */ - // now lets find which swf this in - DSwfInfo swf = (DSwfInfo)fileInfo.swfForFile(file, cli.getActiveIsolateId()); - ActionLocation lStart = null; - ActionLocation lEnd = null; - - if (swf == null) - { - Map<String, String> args = new HashMap<String, String>(); - args.put("arg3", file.getName()); //$NON-NLS-1$ - cli.err(getLocalizationManager().getLocalizedTextString("key29", args)); //$NON-NLS-1$ - } - else if (functionNamed) - { - // if we name a function just dump the whole thing without source. - int offset = file.getOffsetForLine(line1); - lStart = swf.locate(offset); - if (lStart.function == null) - cli.err(getLocalizationManager().getLocalizedTextString("key30")); //$NON-NLS-1$ - else - { - // create a psudeo action list from which to disasemble the function - ActionList al = new ActionList(true); - al.setActionOffset(0, lStart.function); - lStart.actions = al; - lStart.at = 0; - lEnd = new ActionLocation(); - lEnd.actions = al; - lEnd.at = 0; - outputAssembly(cli, swf, lStart, lEnd); - } - } - else - { - ActionLocation lastEnd = null; - for(int i=line1; i<=line2; i++) - { - int offset = file.getOffsetForLine(i); - - // locate the action list associated with this of the swf - if (offset != 0) - { - // get the starting point and try to locate a nice ending - lStart = swf.locate(offset); - lEnd = swf.locateSourceLineEnd(lStart); - - // now see if we skipped some assembly between source lines - if (lastEnd != null) - { - lastEnd.at++; // point our pseudo start to the next action - - // new actions list so attempt to find the end of source in the old actions list - if (lastEnd.actions != lStart.actions && lastEnd.actions.size() != lastEnd.at) - { - String atString = Integer.toHexString(lastEnd.actions.getOffset(lastEnd.at)); - Map<String, String> args = new HashMap<String, String>(); - args.put("arg4", atString); //$NON-NLS-1$ - cli.out(getLocalizationManager().getLocalizedTextString("key31", args)); //$NON-NLS-1$ - - // we are missing some of the dissassembly, so back up a bit and dump it out - ActionLocation gapEnd = swf.locateSourceLineEnd(lastEnd); - outputAssembly(cli, swf, lastEnd, gapEnd); - } - else if (lastEnd.at < lStart.at) - { - // same action list but we skipped some instructions - ActionLocation gapEnd = new ActionLocation(lStart); - gapEnd.at--; - outputAssembly(cli, swf, lastEnd, gapEnd); - } - } - lastEnd = lEnd; - } - - // dump source - cli.outputSource(module1, i, file.getLine(i)); - - // obtain the offset, locate it in the swf - if (offset != 0) - outputAssembly(cli, swf, lStart, lEnd); - } - - /* save away valid context */ - cli.propertyPut(DebugCLI.LIST_MODULE, module1); - cli.propertyPut(DebugCLI.LIST_LINE, line2 + 1); // add one - cli.m_repeatLine = "disassemble"; /* allow repeated listing by typing CR */ //$NON-NLS-1$ - } - } - } - catch(IndexOutOfBoundsException iob) - { - String name = "#"+module1; //$NON-NLS-1$ - Map<String, String> args = new HashMap<String, String>(); - args.put("arg5", Integer.toString(line1)); //$NON-NLS-1$ - args.put("arg6", name); //$NON-NLS-1$ - args.put("arg7", Integer.toString(numLines)); //$NON-NLS-1$ - cli.err(getLocalizationManager().getLocalizedTextString("key32", args)); //$NON-NLS-1$ - } - catch(AmbiguousException ae) - { - cli.err(ae.getMessage()); - } - catch(NullPointerException npe) - { - cli.err(getLocalizationManager().getLocalizedTextString("key33")); //$NON-NLS-1$ - } - catch(ParseException pe) - { - cli.err(pe.getMessage()); - } - catch(NoMatchException nme) - { - cli.err(nme.getMessage()); - } - catch(SuspendedException se) - { - cli.err(getLocalizationManager().getLocalizedTextString("key34")); //$NON-NLS-1$ - } - } - - private static LocalizationManager getLocalizationManager() - { - return DebugCLI.getLocalizationManager(); - } - - /** - * Disassemble part of the swf to the output - */ - public static ActionLocation outputAssembly(DebugCLI cli, DSwfInfo swf, int start, int end) - { - // first we need to locate the action list associated with this - // portion of the swf - ActionLocation lStart = swf.locate(start); - ActionLocation lEnd = (end > -1) ? swf.locate(end) : swf.locateSourceLineEnd(lStart); - - return outputAssembly(cli, swf, lStart, lEnd); - } - - public static ActionLocation outputAssembly(DebugCLI cli, SwfInfo info, ActionLocation lStart, ActionLocation lEnd) - { - // now make sure our actions lists are the same (i.e we haven't spanned past one tag) - if (lStart.actions != lEnd.actions) - lEnd.at = lStart.actions.size()-1; - - Disassembler.disassemble(lStart.actions, lStart.pool, lStart.at, lEnd.at, new PrintWriter(cli.getOut())); - return lEnd; - } -} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/flex/tools/debugger/cli/ExtensionsDisabled.java ---------------------------------------------------------------------- diff --git a/debugger/src/flex/tools/debugger/cli/ExtensionsDisabled.java b/debugger/src/flex/tools/debugger/cli/ExtensionsDisabled.java deleted file mode 100644 index caf33af..0000000 --- a/debugger/src/flex/tools/debugger/cli/ExtensionsDisabled.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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 flex.tools.debugger.cli; - -/** - * ExtensionsDisabled class is a singleton that contains - * every cli method that does not conform to the - * API. There are two implementations of this singleton - * In Extensions the full code is provided in this class - * ExtensionsDisabled emtpy stubs are provided that allow - * for DebugCLI to be fully compliant with the API - */ -public class ExtensionsDisabled -{ - public static void doShowStats(DebugCLI cli) { cli.out("Command not supported."); } //$NON-NLS-1$ - public static void doShowFuncs(DebugCLI cli) { cli.out("Command not supported."); } //$NON-NLS-1$ - public static void doShowProperties(DebugCLI cli) { cli.out("Command not supported."); } //$NON-NLS-1$ - public static void doShowBreak(DebugCLI cli) { cli.out("Command not supported."); } //$NON-NLS-1$ - public static void appendBreakInfo(DebugCLI cli, StringBuilder sb, boolean includeFault) { cli.out("Command not supported."); } //$NON-NLS-1$ - public static void doShowVariable(DebugCLI cli) { cli.out("Command not supported."); } //$NON-NLS-1$ - public static void doDisassemble(DebugCLI cli) { cli.out("Command not supported."); } //$NON-NLS-1$ -} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/flex/tools/debugger/cli/FaultActions.java ---------------------------------------------------------------------- diff --git a/debugger/src/flex/tools/debugger/cli/FaultActions.java b/debugger/src/flex/tools/debugger/cli/FaultActions.java deleted file mode 100644 index 73bc074..0000000 --- a/debugger/src/flex/tools/debugger/cli/FaultActions.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * 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 flex.tools.debugger.cli; - -import java.util.HashMap; - -import flash.localization.LocalizationManager; -import flash.tools.debugger.events.DivideByZeroFault; -import flash.tools.debugger.events.ExceptionFault; -import flash.tools.debugger.events.InvalidTargetFault; -import flash.tools.debugger.events.InvalidURLFault; -import flash.tools.debugger.events.InvalidWithFault; -import flash.tools.debugger.events.ProtoLimitFault; -import flash.tools.debugger.events.RecursionLimitFault; -import flash.tools.debugger.events.ScriptTimeoutFault; -import flash.tools.debugger.events.StackUnderFlowFault; - -/** - * FaultActions proivdes a convenient wrapper for housing the user specified - * behaviour for a set of faults (aka text strings) - * - * The underlying data structure is a HashMap that maps strings (i.e. fault - * names) to Integers. The integers are used as bit fields for holding - * the state of setting per fault. - * - * Add new actions by calling addAction("name") - */ -public class FaultActions -{ - HashMap<String, Integer> m_faults = new HashMap<String, Integer>(); - HashMap<String, String> m_description = new HashMap<String, String>(); // @todo should really use an object within the faults map for this - HashMap<String, Integer> m_actions = new HashMap<String, Integer>(); - - int m_nextBitForAction = 0x1; // the next bit to use for the action - - private FaultActions() {} - - Integer get(String o) { return m_faults.get(o); } - Integer getAction(String o) { return m_actions.get(o); } - void put(String k, Integer v){ m_faults.put(k,v); } - - /* getters */ - public void clear() { m_faults.clear(); } - public int size() { return m_faults.size(); } - public Object[] names() { return m_faults.keySet().toArray(); } - public Object[] actions() { return m_actions.keySet().toArray(); } - public boolean exists(String k) { return (get(k) == null) ? false : true; } - - public void putDescription(String k, String v) { m_description.put(k,v); } - public String getDescription(String k) { return (m_description.get(k) == null) ? "" : m_description.get(k); } //$NON-NLS-1$ - - /** - * Add a new fault to the table, with all actions disabled - */ - public void add(String k) - { - put(k, new Integer(0)); - } - - /** - * Add a new action type to the table - */ - public void addAction(String k) - { - Integer v = new Integer(m_nextBitForAction++); - m_actions.put(k,v); - } - - /** - * Check if the given fault has the action set or not - */ - public boolean is(String fault, String action) - { - int mask = getAction(action).intValue(); - int bits = get(fault).intValue(); - - boolean set = ( (bits & mask) == mask ) ? true : false; - return set; - } - - /** - * Sets the action bits as appropriate for the given fault - * and action - */ - public int action(String fault, String action) - { - // first check if fault is legal - Integer current = get(fault); - if (current == null) - throw new IllegalArgumentException(fault); - - // check for no? - boolean no = action.startsWith("no"); //$NON-NLS-1$ - if (no) - action = action.substring(2); - - // do the search for action - Integer bit = getAction(action); - if (bit == null) - throw new IllegalArgumentException(action); - - // now do the math - int old = current.intValue(); - int mask = bit.intValue(); - - int n = (old & (~mask)); // turn it off - n = (no) ? n : (n | mask); // leave it off or turn it on - - put(fault, new Integer(n)); - - return n; - } - - public static class FaultActionsBuilder { - - private final LocalizationManager localizationManager; - - public FaultActionsBuilder(LocalizationManager localizationManager) { - super(); - this.localizationManager = localizationManager; - } - - public FaultActions build() { - FaultActions faultActions = new FaultActions(); - populateFaultTable(faultActions); - return faultActions; - } - - private void populateFaultTable(FaultActions faultActions) { - // possible actions for our fault table - faultActions.addAction("stop"); //$NON-NLS-1$ - faultActions.addAction("print"); //$NON-NLS-1$ - - // the faults we support - faultActions.add(InvalidTargetFault.name); - faultActions.add(RecursionLimitFault.name); - faultActions.add(InvalidWithFault.name); - faultActions.add(ProtoLimitFault.name); - faultActions.add(InvalidURLFault.name); - faultActions.add(ExceptionFault.name); - faultActions.add(StackUnderFlowFault.name); - faultActions.add(DivideByZeroFault.name); - faultActions.add(ScriptTimeoutFault.name); - // faultActions.add(ConsoleErrorFault.name); - - // nice description of the faults - faultActions.putDescription( - InvalidTargetFault.name, - getLocalizationManager().getLocalizedTextString( - "invalidTargetFault")); //$NON-NLS-1$ - faultActions.putDescription( - RecursionLimitFault.name, - getLocalizationManager().getLocalizedTextString( - "recursionLimitFault")); //$NON-NLS-1$ - faultActions.putDescription( - InvalidWithFault.name, - getLocalizationManager().getLocalizedTextString( - "invalidWithFault")); //$NON-NLS-1$ - faultActions.putDescription( - ProtoLimitFault.name, - getLocalizationManager().getLocalizedTextString( - "protoLimitFault")); //$NON-NLS-1$ - faultActions.putDescription( - InvalidURLFault.name, - getLocalizationManager().getLocalizedTextString( - "invalidUrlFault")); //$NON-NLS-1$ - faultActions.putDescription( - ExceptionFault.name, - getLocalizationManager().getLocalizedTextString( - "exceptionFault")); //$NON-NLS-1$ - faultActions.putDescription( - StackUnderFlowFault.name, - getLocalizationManager().getLocalizedTextString( - "stackUnderflowFault")); //$NON-NLS-1$ - faultActions.putDescription( - DivideByZeroFault.name, - getLocalizationManager().getLocalizedTextString( - "divideByZeroFault")); //$NON-NLS-1$ - faultActions.putDescription( - ScriptTimeoutFault.name, - getLocalizationManager().getLocalizedTextString( - "scriptTimeoutFault")); //$NON-NLS-1$ - // faultActions.putDescription(ConsoleErrorFault.name, - // "ActionScript recoverable error"); - - // default values for the faults - faultActions.action(InvalidTargetFault.name, "stop"); //$NON-NLS-1$ - faultActions.action(InvalidTargetFault.name, "print"); //$NON-NLS-1$ - faultActions.action(RecursionLimitFault.name, "stop"); //$NON-NLS-1$ - faultActions.action(RecursionLimitFault.name, "print"); //$NON-NLS-1$ - faultActions.action(InvalidWithFault.name, "stop"); //$NON-NLS-1$ - faultActions.action(InvalidWithFault.name, "print"); //$NON-NLS-1$ - faultActions.action(ProtoLimitFault.name, "stop"); //$NON-NLS-1$ - faultActions.action(ProtoLimitFault.name, "print"); //$NON-NLS-1$ - faultActions.action(InvalidURLFault.name, "stop"); //$NON-NLS-1$ - faultActions.action(InvalidURLFault.name, "print"); //$NON-NLS-1$ - faultActions.action(ExceptionFault.name, "stop"); //$NON-NLS-1$ - faultActions.action(ExceptionFault.name, "print"); //$NON-NLS-1$ - faultActions.action(StackUnderFlowFault.name, "stop"); //$NON-NLS-1$ - faultActions.action(StackUnderFlowFault.name, "print"); //$NON-NLS-1$ - faultActions.action(DivideByZeroFault.name, "stop"); //$NON-NLS-1$ - faultActions.action(DivideByZeroFault.name, "print"); //$NON-NLS-1$ - faultActions.action(ScriptTimeoutFault.name, "stop"); //$NON-NLS-1$ - faultActions.action(ScriptTimeoutFault.name, "print"); //$NON-NLS-1$ - // faultActions.action(ConsoleErrorFault.name, "print"); //$NON-NLS-1$ - // faultActions.action(ConsoleErrorFault.name, "stop"); //$NON-NLS-1$ - } - - private LocalizationManager getLocalizationManager() { - return localizationManager; - } - } -} http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/07f5a7de/debugger/src/flex/tools/debugger/cli/FileInfoCache.java ---------------------------------------------------------------------- diff --git a/debugger/src/flex/tools/debugger/cli/FileInfoCache.java b/debugger/src/flex/tools/debugger/cli/FileInfoCache.java deleted file mode 100644 index e66b89a..0000000 --- a/debugger/src/flex/tools/debugger/cli/FileInfoCache.java +++ /dev/null @@ -1,569 +0,0 @@ -/* - * 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 flex.tools.debugger.cli; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; - -import flash.tools.debugger.InProgressException; -import flash.tools.debugger.Isolate; -import flash.tools.debugger.NoResponseException; -import flash.tools.debugger.Session; -import flash.tools.debugger.SourceFile; -import flash.tools.debugger.SwfInfo; -import flash.util.IntMap; - -/** - * FileInfoCache manages a list of files that are unique - * across multiple swfs. - */ -public class FileInfoCache implements Comparator<SourceFile> -{ - Session m_session; - - /** - * We can get at files by module id or path - */ - IntMap m_byInt = new IntMap(); - HashMap<Integer, IntMap> m_isolateState = new HashMap<Integer, IntMap> (); - - private IntMap getIsolateState(int isolateId) { - IntMap isolateState = null; - if (!m_isolateState.containsKey(isolateId)) { - isolateState = new IntMap(); - m_isolateState.put(isolateId, isolateState); - } - else - isolateState = m_isolateState.get(isolateId); - return isolateState; - } - - SourceFile[] m_files = null; - SourceFile[] m_isolateFiles = null; - SwfInfo m_swfFilter = null; - int m_swfsLoaded = 0; - boolean m_dirty = false; - int lastActiveIsolate = Isolate.DEFAULT_ID; - - public FileInfoCache() { - - } - - public void bind(Session s) { setSession(s); } - public void unbind() { m_session = null; } - - public SourceFile getFile(int i) { - return getFile(i, Isolate.DEFAULT_ID); - } - - public SourceFile getFile(int i, int isolateId) { - populate(); - if (isolateId == Isolate.DEFAULT_ID) - return (SourceFile) m_byInt.get(i); - else - return (SourceFile)getIsolateState(isolateId).get(i); - } - - public SourceFile[] getFileList() { - populate(); - return m_files; - } - - public SourceFile[] getFileList(int isolateId) { - populate(); - if (isolateId == Isolate.DEFAULT_ID) { - final Object[] valuesToArray = m_byInt.valuesToArray(new Object[m_byInt.size()]); - return Arrays.copyOf(valuesToArray, valuesToArray.length, SourceFile[].class); - } - else if (isolateId != lastActiveIsolate) { - buildIsolateFiles(isolateId); - } - return m_isolateFiles; - } - - private void buildIsolateFiles(int isolateId) { - SwfInfo[] swfs = getSwfs(isolateId); - boolean worked = true; // check that all worked correctly - ArrayList<SourceFile> files = new ArrayList<SourceFile>(); - - for(int i=0; i<swfs.length; i++) - { - if (swfs[i] != null) - worked = loadSwfFiles(files, swfs[i]) ? worked : false; - } - - // trim the file list - ArrayList<SourceFile> fa = trimFileList(files); - m_isolateFiles = fa.toArray( new SourceFile[fa.size()] ); - - // sort this array in place so calls to getFileList will be ordered - Arrays.sort(m_isolateFiles, this); - } - - public Iterator getAllFiles(int isolateId) { - populate(); - if (isolateId == Isolate.DEFAULT_ID) - return m_byInt.iterator(); - else - return getIsolateState(isolateId).iterator(); - } - - public SwfInfo getSwfFilter() { return m_swfFilter; } - public boolean isSwfFilterOn() { return (m_swfFilter != null); } - public void setDirty() { m_dirty = true; } - - void setSession(Session s) - { - m_session = s; - m_swfFilter = null; - clear(); - } - - SwfInfo[] getAllSwfs() { - ArrayList<SwfInfo> result = new ArrayList<SwfInfo>(); - - for ( Isolate isolate : m_session.getWorkers()) { - SwfInfo[] swfs = new SwfInfo[0]; - try { - swfs = m_session.getWorkerSession(isolate.getId()).getSwfs(); - } catch (NoResponseException e) { - swfs = new SwfInfo[0]; - } - - for (SwfInfo swf : swfs) - result.add(swf); - } - - return result.toArray(new SwfInfo[0]); - } - - void populate() - { - // do we have a new swf to load? - if (m_session != null && (m_dirty || getAllSwfs().length > m_swfsLoaded)) - reloadCache(); - } - - void reloadCache() - { - clear(); - loadCache(); - m_dirty = false; - } - - void clear() - { - m_byInt.clear(); - m_isolateState.clear(); - m_files = null; - } - - /** - * Determine if the given SourceFile is in the current fileList - */ - public boolean inFileList(SourceFile f) - { - boolean isIt = false; - - SourceFile[] files = getFileList(); - for(int i=0; i<files.length && !isIt; i++) - { - if (files[i] == f) - isIt = true; - } - return isIt; - } - - /** - * Go out to the session and request a list of files - * But we dump ones that have a name collision. - * Also if selectedSwf is set then we only add files - * that are contained within the given swf. - */ - void loadCache() - { - boolean worked = true; // check that all worked correctly - ArrayList<SourceFile> files = new ArrayList<SourceFile>(); - SwfInfo[] swfs = getAllSwfs(); - for(int i=0; i<swfs.length; i++) - { - if (swfs[i] != null) - worked = loadSwfFiles(files, swfs[i]) ? worked : false; - } - - // trim the file list - ArrayList<SourceFile> fa = trimFileList(files); - m_files = fa.toArray( new SourceFile[fa.size()] ); - - // sort this array in place so calls to getFileList will be ordered - Arrays.sort(m_files, this); - - // mark our cache complete if all was good. - if (worked) - m_swfsLoaded = swfs.length; - } - - boolean loadSwfFiles(ArrayList<SourceFile> ar, SwfInfo swf) - { - boolean worked = true; - try - { - // @todo should we include unloaded swfs? - SourceFile[] files = swf.getSourceList(m_session); - ar.ensureCapacity(ar.size()+files.length); - - // add each file to our global source file IntMap and our list - for(int i=0; i<files.length; i++) - { - putFile(files[i], swf.getIsolateId()); - ar.add(files[i]); - } - } - catch(InProgressException ipe) - { - // can't load this one, its not ready yet - worked = false; - } - return worked; - } - - /** - * Walk the file list looking for name collisions. - * If we find one, then we remove it - */ - ArrayList<SourceFile> trimFileList(ArrayList<SourceFile> files) - { - HashMap<String, String> names = new HashMap<String, String>(); - ArrayList<SourceFile> list = new ArrayList<SourceFile>(); - - int size = files.size(); - for(int i=0; i<size; i++) - { - boolean addIt = false; - - SourceFile fi = files.get(i); - // no filter currently in place so we add the file as long - // as no duplicates exist. We use the original Swd full - // name for matching. - String fName = fi.getRawName(); - if (m_swfFilter == null) - { - // If it exists, then we don't add it! - if (names.get(fName) == null) - addIt = true; - } - else - { - // we have a filter in place so, see - // if the source file is in our currently - // selected swf. - addIt = m_swfFilter.containsSource(fi); - } - - // did we mark this one to add? - if (addIt) - { - names.put(fName, fName); - list.add(fi); - } - } - return list; - } - - /** - * All files from all swfs are placed into our byInt map - * since we know that ids are unique across the entire - * Player session. - * - * This is also important in the case that the player - * halts in one of these files, that the debugger - * be able to locate the SourceFile so that we can - * display the correct context for the user. - */ - void putFile(SourceFile s, int isolateId) - { - int i = s.getId(); - if (isolateId == Isolate.DEFAULT_ID) - m_byInt.put(i, s); - else - getIsolateState(isolateId).put(i, s); - } - - /** - * Attempt to set a swf as a filter - * for the file list that we create - */ - public boolean setSwfFilter(String swfName) - { - // look for a match in our list - boolean worked = false; - if (swfName == null) - { - m_swfFilter = null; - worked = true; - } - else - { - SwfInfo[] swfs = getAllSwfs(); - for(int i=0; i<swfs.length; i++) - { - SwfInfo e = swfs[i]; - if (e != null && nameOfSwf(e).equalsIgnoreCase(swfName)) - { - worked = true; - m_swfFilter = e; - break; - } - } - } - - // reload if it worked - if (worked) - reloadCache(); - - return worked; - } - - // list all swfs we know about - public SwfInfo[] getSwfs(int isolateId) - { - return getSwfsIsolate(isolateId); - } - - public SwfInfo[] getSwfsIsolate(int isolateId) - { - SwfInfo[] swfs = null; - try - { - swfs = m_session.getWorkerSession(isolateId).getSwfs(); - } - catch(NoResponseException nre) - { - swfs = new SwfInfo[] {}; // oh bery bad - } - return swfs; - } - - /** - * Given a SourceFile locate the swf which it came from - */ - public SwfInfo swfForFile(SourceFile f, int isolateId) - { - // We use the id to determine which swf this source files resides in - int id = f.getId(); - SwfInfo info = null; - SwfInfo[] swfs = getSwfs(isolateId);//getAllSwfs(); - for(int i=0; ( i<swfs.length && (info == null) ); i++) - { - if (swfs[i] != null && swfs[i].containsSource(f)) - info = swfs[i]; - } - return info; - } - - // locate the name of the swf - public static String nameOfSwf(SwfInfo e) - { - int at = -1; - String name = e.getUrl(); - if ( (at = e.getUrl().lastIndexOf('/')) > -1) - name = e.getUrl().substring(at+1); - if ( (at = e.getUrl().lastIndexOf('\\')) > -1) - name = e.getUrl().substring(at+1); - else if ( (at = e.getPath().lastIndexOf('\\')) > -1) - name = e.getPath().substring(at+1); - else if ( (at = e.getPath().lastIndexOf('/')) > -1) - name = e.getPath().substring(at+1); - - // now rip off any trailing ? options - at = name.lastIndexOf('?'); - name = (at > -1) ? name.substring(0, at) : name; - - return name; - } - - // locate the name of the swf - public static String shortNameOfSwf(SwfInfo e) - { - String name = nameOfSwf(e); - - // now strip off any leading path - int at = -1; - if ( (at = name.lastIndexOf('/')) > -1) - name = name.substring(at+1); - else if ( (at = name.lastIndexOf('\\')) > -1) - name = name.substring(at+1); - return name; - } - - /** - * Given the URL of a specfic swf determine - * if there is a file within it that appears - * to be the same as the given source file - * @param f - * @return - */ - public SourceFile similarFileInSwf(SwfInfo info, SourceFile f) throws InProgressException - { - SourceFile hit = null; - SourceFile[] files = info.getSourceList(m_session); - if (!info.isProcessingComplete()) - throw new InProgressException(); - - for(int i=0; i<files.length; i++) - { - if (filesMatch(f, files[i])) - hit = files[i]; - } - return hit; - } - - /** - * Comparator interface for sorting SourceFiles - */ - public int compare(SourceFile o1, SourceFile o2) - { - String n1 = o1.getName(); - String n2 = o2.getName(); - - return n1.compareTo(n2); - } - - /** - * Compare two files and determine if they are the same. - * Our criteria included only line count package names - * and the name of the class itself. If there are - * any other differences then we won't be able to detect - * them. We should probably do something like an MD5 - * computation on the characters in ScriptText. Then - * we'd really be sure of a match. - * @param a first file to compare - * @param b second file to compare - * @return true if files appear to be the same - */ - public boolean filesMatch(SourceFile a, SourceFile b) - { - boolean yes = true; - - if (a == null || b == null) - yes = false; - else if (a.getPackageName().compareTo(b.getPackageName()) != 0) - yes = false; - else if (a.getName().compareTo(b.getName()) != 0) - yes = false; - else if (a.getLineCount() != b.getLineCount()) // warning, this is sometimes expensive, so do it last - yes = false; - - return yes; - } - /** - * Return a array of SourceFiles whose names match - * the specified string. The array is sorted by name. - * The input can be mx.controls.xxx which will - */ - public SourceFile[] getFiles(String matchString) - { - return getFiles(matchString, -1); - } - - public SourceFile[] getFiles(String matchString, int isolateId) - { - boolean doStartsWith = false; - boolean doIndexOf = false; - boolean doEndsWith = false; - - boolean leadingAsterisk = matchString.startsWith("*") && matchString.length() > 1; //$NON-NLS-1$ - boolean trailingAsterisk = matchString.endsWith("*"); //$NON-NLS-1$ - boolean usePath = matchString.indexOf('.') > -1; - - if (leadingAsterisk && trailingAsterisk) - { - matchString = matchString.substring(1, matchString.length() - 1); - doIndexOf = true; - } - else if (leadingAsterisk) - { - matchString = matchString.substring(1); - doEndsWith = true; - } - else if (trailingAsterisk) - { - matchString = matchString.substring(0, matchString.length() - 1); - doStartsWith = true; - } - else if (usePath) - { - doIndexOf = true; - } - else - { - doStartsWith = true; - } - - SourceFile[] files = isolateId > -1 ? getFileList(isolateId) : getFileList(); - ArrayList<SourceFile> fileList = new ArrayList<SourceFile>(); - int n = files.length; - int exactHitAt = -1; - // If the matchString already starts with "." (e.g. ".as" or ".mxml"), then dotMatchString - // will be equal to matchString; otherwise, dotMatchString will be "." + matchString - String dotMatchString = (matchString.startsWith(".")) ? matchString : ("." + matchString); //$NON-NLS-1$ //$NON-NLS-2$ - for (int i = 0; i < n; i++) - { - SourceFile sourceFile = files[i]; - boolean pathExists = (usePath && sourceFile.getFullPath().matches(".*[/\\\\].*")); //$NON-NLS-1$ - String name = pathExists ? sourceFile.getFullPath() : sourceFile.getName(); - - // if we are using the full path string, then prefix a '.' to our matching string so that abc.as and Gabc.as don't both hit - String match = (usePath && pathExists) ? dotMatchString : matchString; - - match = match.replace('/', '.'); // get rid of path identifiers and use dots - match = match.replace('\\', '.'); - - name = name.replace('/', '.'); // get rid of path identifiers and use dots - name = name.replace('\\', '.'); // would be better to modify the input string, but we don't know which path char will be used. - - // exact match? We are done - if (name.equals(match)) - { - exactHitAt = i; - break; - } - else if (doStartsWith && name.startsWith(match)) - fileList.add(sourceFile); - else if (doEndsWith && name.endsWith(match)) - fileList.add(sourceFile); - else if (doIndexOf && name.contains(match)) - fileList.add(sourceFile); - } - - // trim all others if we have an exact file match - if (exactHitAt > -1) - { - fileList.clear(); - fileList.add(files[exactHitAt]); - } - - SourceFile[] fileArray = fileList.toArray( new SourceFile[fileList.size()] ); - Arrays.sort(fileArray, this); - return fileArray; - } - -}