blob: ddf6e6ee0b0132e5d5e83d39d65d57c9e8769d91 [file] [log] [blame]
/*
* $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);
}
}