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