Index: trunk/src/lua/lua_path.cc
===================================================================
--- trunk/src/lua/lua_path.cc	(revision 358)
+++ trunk/src/lua/lua_path.cc	(revision 359)
@@ -11,64 +11,36 @@
 using namespace nv;
 
-lua::path::path( nv::string p )
-	: m_count(0), m_path( std::move( p ) )
+void lua::path::parse()
 {
-	parse();
+	if ( m_elements[0].length == 0 || m_elements[0].str == nullptr ) return;
+	string_ref spath( m_elements[0].str, m_elements[0].length );
+	m_count = 0;
+	size_t point = spath.find( '.' );
+
+	while ( point != std::string::npos )
+	{
+		m_elements[m_count].str    = spath.data();
+		m_elements[m_count].length = point;
+		m_count++;
+		spath.remove_prefix( point + 1 );
+		point = spath.find( '.' );
+	}
+
+	m_elements[m_count].str    = spath.data();
+	m_elements[m_count].length = spath.length();
+	m_count++;
 }
 
-lua::path::path( const char* p )
-	: m_count(0), m_path( p )
+void lua::path::push( size_t value )
 {
-	parse();
-}
-
-lua::path::path( unsigned i )
-	: m_count(0)
-{
-	push( i );
-}
-
-void lua::path::parse()
-{
-	size_t start = 0;
-	size_t point = m_path.find('.');
-
-	while( point != std::string::npos )
-	{
-		push( start, point-start );
-		start = point+1;
-		point = m_path.find( '.', start );
-	}
-
-	push( start, m_path.length() - start );
-}
-
-void lua::path::push( size_t e )
-{
-	m_elements[ m_count ].value  = e;
+	m_elements[ m_count ].value  = value;
 	m_elements[ m_count ].length = 0;
 	m_count++;
 }
 
-void lua::path::push( size_t start, size_t length )
+void nv::lua::path::push( string_ref p )
 {
-	m_elements[ m_count ].value  = start;
-	m_elements[ m_count ].length = length;
-	m_count++;
-}
-
-void lua::path::push( const char* p, size_t length )
-{
-	m_elements[ m_count ].value  = m_path.length();
-	m_elements[ m_count ].length = length;
-	m_path.append( p, length );
-	m_count++;
-}
-
-void lua::path::push( const std::string& s, size_t length )
-{
-	m_elements[ m_count ].value  = m_path.length();
-	m_elements[ m_count ].length = length;
-	m_path.append( s, 0, length );
+	m_elements[ m_count ].str    = p.data();
+	m_elements[ m_count ].length = p.length();
 	m_count++;
 }
@@ -84,5 +56,5 @@
 			if ( m_elements[i].length > 0 )
 			{
-				lua_pushlstring( L, m_path.c_str() + m_elements[i].value, m_elements[i].length );
+				lua_pushlstring( L, m_elements[i].str, m_elements[i].length );
 			}
 			else
@@ -105,5 +77,5 @@
 {
 	std::string result;
-	result.reserve( 2 * m_path.length() );
+	result.reserve( 64 );
 	bool dot = false;
 	for ( const element& e : m_elements )
@@ -117,5 +89,5 @@
 		else
 		{
-			result.append( m_path, e.value, e.length );
+			result.append( e.str, e.length );
 			dot = true;
 		}
