Improve performance of string comparison.

This commit is contained in:
James Roseborough
2010-04-16 05:02:04 +00:00
parent a77b93681f
commit 991b8a274c
2 changed files with 19 additions and 12 deletions

View File

@@ -261,22 +261,28 @@ public class LuaString extends LuaValue {
// object comparison, used in key comparison // object comparison, used in key comparison
public boolean equals( Object o ) { public boolean equals( Object o ) {
if ( o instanceof LuaString ) { if ( o instanceof LuaString ) {
LuaString s = (LuaString) o; return eq_b( (LuaString) o );
if ( s.m_length != m_length )
return false;
if ( s.hashCode() != hashCode() )
return false;
for ( int i=0; i<m_length; i++ )
if ( s.m_bytes[s.m_offset+i] != m_bytes[m_offset+i] )
return false;
return true;
} else {
return false;
} }
return false;
} }
public boolean eq_b( LuaString s ) {
if ( s == this )
return true;
if ( s.m_length != m_length )
return false;
if ( s.m_bytes == m_bytes && s.m_offset == m_offset )
return true;
if ( s.hashCode() != hashCode() )
return false;
for ( int i=0; i<m_length; i++ )
if ( s.m_bytes[s.m_offset+i] != m_bytes[m_offset+i] )
return false;
return true;
}
public boolean eq_b( LuaValue val ) { public boolean eq_b( LuaValue val ) {
return equals( val ); return val.eq_b( this );
} }
public static boolean equals( LuaString a, int i, LuaString b, int j, int n ) { public static boolean equals( LuaString a, int i, LuaString b, int j, int n ) {

View File

@@ -229,6 +229,7 @@ public class LuaValue extends Varargs {
// arithmetic equality // arithmetic equality
public LuaValue eq( LuaValue val ) { return valueOf(eq_b(val)); } public LuaValue eq( LuaValue val ) { return valueOf(eq_b(val)); }
public boolean eq_b( LuaValue val ) { return this == val; } public boolean eq_b( LuaValue val ) { return this == val; }
public boolean eq_b( LuaString val ) { return this == val; }
public boolean eq_b( double val ) { return false; } public boolean eq_b( double val ) { return false; }
public boolean eq_b( int val ) { return false; } public boolean eq_b( int val ) { return false; }
public LuaValue neq( LuaValue val ) { return valueOf(!eq_b(val)); } public LuaValue neq( LuaValue val ) { return valueOf(!eq_b(val)); }