| /* |
| * $Id: LuaStackTraceElement.java 39 2012-01-04 23:48:16Z andre@naef.com $ |
| * See LICENSE.txt for license terms. |
| */ |
| |
| package com.naef.jnlua; |
| |
| /** |
| * Represents an execution point in a Lua stack trace. |
| */ |
| public class LuaStackTraceElement { |
| // -- State |
| private String functionName; |
| private String sourceName; |
| private int lineNumber; |
| |
| // -- Construction |
| /** |
| * Creates a new instance. |
| * |
| * @param sourceName |
| * the source name, or <code>null</code> if unavailable |
| * @param functionName |
| * the function name, or <code>null</code> if unavailable |
| * @param lineNumber |
| * the line number, or a negative number if unavailable |
| */ |
| public LuaStackTraceElement(String functionName, String sourceName, |
| int lineNumber) { |
| this.functionName = functionName; |
| this.sourceName = sourceName; |
| this.lineNumber = lineNumber; |
| } |
| |
| // -- Properties |
| /** |
| * Returns the name of the function containing the execution point |
| * represented by this stack trace element. If there is no function name for |
| * the execution point, the method returns <code>null</code>. |
| * |
| * @return the name of the function containing the execution point |
| * represented by this stack trace element, or <code>null</code> |
| */ |
| public String getFunctionName() { |
| return functionName; |
| } |
| |
| /** |
| * Returns the name of the source containing the execution point represented |
| * by this this stack trace element. The source name is passed to the Lua |
| * state when the Lua source code is loaded. If there is no source name for |
| * the execution point, the method returns <code>null</code>. |
| * |
| * @return the source name, or <code>null</code> |
| * @see LuaState#load(java.io.InputStream, String, String) |
| * @see LuaState#load(String, String) |
| */ |
| public String getSourceName() { |
| return sourceName; |
| } |
| |
| /** |
| * Returns the line number in the source containing the execution point |
| * represented by this stack trace element. If there is no line number for |
| * the execution point, the method returns a negative number. |
| * |
| * @return the line number, or a negative number if there is no line number |
| */ |
| public int getLineNumber() { |
| return lineNumber; |
| } |
| |
| // Object methods |
| @Override |
| public int hashCode() { |
| int result = functionName != null ? functionName.hashCode() : 0; |
| result = result * 65599 + sourceName != null ? sourceName.hashCode() |
| : 0; |
| result = result * 65599 + lineNumber; |
| return result; |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (obj == this) { |
| return true; |
| } |
| if (!(obj instanceof LuaStackTraceElement)) { |
| return false; |
| } |
| LuaStackTraceElement other = (LuaStackTraceElement) obj; |
| return safeEquals(functionName, other.functionName) |
| && safeEquals(sourceName, other.sourceName) |
| && lineNumber == other.lineNumber; |
| } |
| |
| @Override |
| public String toString() { |
| StringBuffer sb = new StringBuffer(); |
| if (functionName != null) { |
| sb.append(functionName); |
| } else { |
| sb.append("(Unknown Function)"); |
| } |
| sb.append(" ("); |
| if (sourceName != null) { |
| sb.append(sourceName); |
| if (lineNumber >= 0) { |
| sb.append(':'); |
| sb.append(lineNumber); |
| } |
| } else { |
| sb.append("External Function"); |
| } |
| sb.append(')'); |
| return sb.toString(); |
| } |
| |
| // -- Private methods |
| /** |
| * Returns whether two objects are equal, handling <code>null</code>. |
| */ |
| private boolean safeEquals(Object a, Object b) { |
| return a == b || a != null && a.equals(b); |
| } |
| } |