/* | |
* $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); | |
} | |
} |