gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog libbase/Makefile.am server/Prop...


From: Chad Musick
Subject: [Gnash-commit] gnash ChangeLog libbase/Makefile.am server/Prop...
Date: Sun, 16 Sep 2007 16:48:16 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Chad Musick <cmusick>   07/09/16 16:48:16

Modified files:
        .              : ChangeLog 
        libbase        : Makefile.am 
        server         : PropertyList.cpp PropertyList.h array.cpp 
                         array.h as_environment.cpp as_function.cpp 
                         as_object.cpp as_object.h as_value.cpp 
                         character.cpp edit_text_character.cpp 
                         edit_text_character.h movie_root.cpp 
                         sprite_instance.cpp sprite_instance.h swf.h 
                         swf_function.cpp textformat.cpp timers.cpp 
        server/asobj   : AsBroadcaster.cpp ContextMenu.cpp LoadVars.cpp 
                         MovieClipLoader.cpp NetStream.cpp Object.cpp 
                         Stage.cpp prophelper.h xml.cpp xml.h 
                         xmlsocket.cpp 
        server/parser  : action_buffer.h 
        server/vm      : ASHandlers.cpp ActionExec.cpp action.cpp 
                         action.h 
        testsuite/misc-ming.all: KeyTest-Runner.cpp 
                                 attachMovieTestRunner.cpp 
                                 intervalTestRunner.cpp 
                                 key_event_test2runner.cpp 
                                 key_event_test3runner.cpp 
                                 key_event_test5runner.cpp 
                                 key_event_testrunner.cpp 
        testsuite/movies.all: gravity_embedded-TestRunner.cpp 
        testsuite/server: GetterSetterTest.cpp PropertyListTest.cpp 
Added files:
        libbase        : string_table.cpp string_table.h 

Log message:
        Adding a string table for (so far) property names.  This is preparatory
        work for AS3. It should cut down on the memory used by gnash and perhaps
        speed it up a bit.  Further work on this will be coming over the next
        few weeks.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4326&r2=1.4327
http://cvs.savannah.gnu.org/viewcvs/gnash/libbase/Makefile.am?cvsroot=gnash&r1=1.83&r2=1.84
http://cvs.savannah.gnu.org/viewcvs/gnash/libbase/string_table.cpp?cvsroot=gnash&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/gnash/libbase/string_table.h?cvsroot=gnash&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/gnash/server/PropertyList.cpp?cvsroot=gnash&r1=1.17&r2=1.18
http://cvs.savannah.gnu.org/viewcvs/gnash/server/PropertyList.h?cvsroot=gnash&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/gnash/server/array.cpp?cvsroot=gnash&r1=1.77&r2=1.78
http://cvs.savannah.gnu.org/viewcvs/gnash/server/array.h?cvsroot=gnash&r1=1.34&r2=1.35
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_environment.cpp?cvsroot=gnash&r1=1.87&r2=1.88
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_function.cpp?cvsroot=gnash&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.cpp?cvsroot=gnash&r1=1.61&r2=1.62
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.h?cvsroot=gnash&r1=1.68&r2=1.69
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.73&r2=1.74
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.cpp?cvsroot=gnash&r1=1.53&r2=1.54
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.cpp?cvsroot=gnash&r1=1.112&r2=1.113
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.h?cvsroot=gnash&r1=1.49&r2=1.50
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.91&r2=1.92
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.341&r2=1.342
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.138&r2=1.139
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf.h?cvsroot=gnash&r1=1.40&r2=1.41
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf_function.cpp?cvsroot=gnash&r1=1.33&r2=1.34
http://cvs.savannah.gnu.org/viewcvs/gnash/server/textformat.cpp?cvsroot=gnash&r1=1.27&r2=1.28
http://cvs.savannah.gnu.org/viewcvs/gnash/server/timers.cpp?cvsroot=gnash&r1=1.36&r2=1.37
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/AsBroadcaster.cpp?cvsroot=gnash&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/ContextMenu.cpp?cvsroot=gnash&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/LoadVars.cpp?cvsroot=gnash&r1=1.28&r2=1.29
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/MovieClipLoader.cpp?cvsroot=gnash&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/NetStream.cpp?cvsroot=gnash&r1=1.71&r2=1.72
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Object.cpp?cvsroot=gnash&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Stage.cpp?cvsroot=gnash&r1=1.20&r2=1.21
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/prophelper.h?cvsroot=gnash&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/xml.cpp?cvsroot=gnash&r1=1.44&r2=1.45
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/xml.h?cvsroot=gnash&r1=1.17&r2=1.18
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/xmlsocket.cpp?cvsroot=gnash&r1=1.32&r2=1.33
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/action_buffer.h?cvsroot=gnash&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.132&r2=1.133
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ActionExec.cpp?cvsroot=gnash&r1=1.44&r2=1.45
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/action.cpp?cvsroot=gnash&r1=1.25&r2=1.26
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/action.h?cvsroot=gnash&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/KeyTest-Runner.cpp?cvsroot=gnash&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/attachMovieTestRunner.cpp?cvsroot=gnash&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/intervalTestRunner.cpp?cvsroot=gnash&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/key_event_test2runner.cpp?cvsroot=gnash&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/key_event_test3runner.cpp?cvsroot=gnash&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/key_event_test5runner.cpp?cvsroot=gnash&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/key_event_testrunner.cpp?cvsroot=gnash&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/movies.all/gravity_embedded-TestRunner.cpp?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/server/GetterSetterTest.cpp?cvsroot=gnash&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/server/PropertyListTest.cpp?cvsroot=gnash&r1=1.17&r2=1.18

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.4326
retrieving revision 1.4327
diff -u -b -r1.4326 -r1.4327
--- ChangeLog   16 Sep 2007 05:55:30 -0000      1.4326
+++ ChangeLog   16 Sep 2007 16:48:12 -0000      1.4327
@@ -1,3 +1,34 @@
+2007-09-16 Chad Musick <address@hidden>
+
+       * libbase/string_table.cpp,.h: A string table to cut down on memory
+         usage and lookup time for properties, particularly in inheritance.
+         Preparation for AS3.
+       * libbase/Makefile.am: Add string_table to list of files which the
+         Makefile knows about.
+       * server directory:
+       *  PropertyList.cpp,.h array.cpp,.h as_environment.cpp as_function.cpp
+          as_object.cpp,.h as_value.cpp character.cpp 
edit_text_character.cpp,.h
+          movie_root.cpp sprite_instance.cpp,.h swf_function.cpp textformat.cpp
+          timers.cpp: Update to use string table.
+       * server/asobj directory:
+          AsBroadcaster.cpp ContextMenu.cpp LoadVars.cpp MovieClipLoader.cpp
+          NetStream.cpp Object.cpp Stage.cpp prophelper.h xml.cpp xml.h
+          xmlsocket.cpp: Update to use string table.
+       * server/parser/action_buffer.h: Update to use string table.
+       * server/vm directory:
+          ASHandlers.cpp ActionExec.cpp action.cpp action.h: Update to use 
string
+          table.
+       * testsuite/misc-ming.all directory:
+          KeyTest-Runner.cpp attachMovieTestRunner.cpp intervalTestRunner.cpp
+          key_event_test2runner.cpp key_event_test3runner.cpp
+          key_event_test5runner.cpp key_event_testrunner.cpp: Update to use
+          string table
+       * testsuite/movies.all/gravity_embedded-TestRunner.cpp: Update to use
+         string table
+       * testsuite/server/GetterSetterTest.cpp PropertyListTest.cpp: Update to
+         use string table
+       * server/swf.h: More notes about AS3 operations.
+
 2007-09-16 Zou Lunkai <address@hidden>
 
        * server/gnash.h: add gnashCharacter code for proper key handling.

Index: libbase/Makefile.am
===================================================================
RCS file: /sources/gnash/gnash/libbase/Makefile.am,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -b -r1.83 -r1.84
--- libbase/Makefile.am 15 Sep 2007 17:53:08 -0000      1.83
+++ libbase/Makefile.am 16 Sep 2007 16:48:12 -0000      1.84
@@ -90,6 +90,7 @@
        postscript.cpp \
        rc.cpp \
        sharedlib.cpp \
+       string_table.cpp \
        triangulate_float.cpp \
        triangulate_sint32.cpp \
        tu_file.cpp \
@@ -131,6 +132,7 @@
        ref_counted.h \
        smart_ptr.h \
        sharedlib.h \
+       string_table.h \
        tree.hh \
        triangulate.h \
        triangulate_impl.h \

Index: server/PropertyList.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/PropertyList.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- server/PropertyList.cpp     2 Aug 2007 16:07:28 -0000       1.17
+++ server/PropertyList.cpp     16 Sep 2007 16:48:13 -0000      1.18
@@ -61,7 +61,7 @@
 
 
 bool
-PropertyList::getValue(const std::string& key, as_value& val,
+PropertyList::getValue(const string_table::key key, as_value& val,
                as_object& this_ptr) 
 {
        const_iterator found = _props.find( key );
@@ -78,7 +78,7 @@
 }
 
 bool
-PropertyList::setValue(const std::string& key, const as_value& val,
+PropertyList::setValue(string_table::key key, const as_value& val,
                as_object& this_ptr)
 {
        iterator found = _props.find( key );
@@ -87,7 +87,7 @@
                // create a new member
                SimpleProperty* prop = new SimpleProperty(val);
 #ifdef DEBUG_PROPERTY_ALLOC
-               log_debug("SimpleProperty %s = %p", key.c_str(), (void*)prop);
+               log_debug("SimpleProperty %s = %p", 
string_table::value(key).c_str(), (void*)prop);
 #endif // DEBUG_PROPERTY_ALLOC
                _props[key] = prop;
                return true;
@@ -97,7 +97,8 @@
 
        if ( prop->isReadOnly() )
        {
-               log_error(_("Property %s is read-only, not setting it to %s"), 
key.c_str(), val.to_string().c_str());
+               log_error(_("Property %s is read-only, not setting it to %s"), 
+                       string_table::value(key).c_str(), 
val.to_string().c_str());
                return false;
        }
 
@@ -107,7 +108,7 @@
 }
 
 bool
-PropertyList::setFlags(const std::string& key,
+PropertyList::setFlags(string_table::key key,
                int setFlags, int clearFlags)
 {
        iterator found = _props.find( key );
@@ -137,7 +138,7 @@
 }
 
 Property*
-PropertyList::getProperty(const std::string& key)
+PropertyList::getProperty(string_table::key key)
 {
        iterator it=find(key);
        if ( it == end() ) return NULL;
@@ -145,7 +146,7 @@
 }
 
 std::pair<bool,bool>
-PropertyList::delProperty(const std::string& key)
+PropertyList::delProperty(string_table::key key)
 {
        //GNASH_REPORT_FUNCTION;
        iterator it=find(key);
@@ -173,9 +174,9 @@
 
        for (const_iterator it = props.begin(), itEnd = props.end(); it != 
itEnd; ++it )
        {
-               const std::string& name = it->first;
+               string_table::key key = it->first;
 
-               if ( setFlags(name, flagsSet, flagsClear) ) ++success;
+               if ( setFlags(key, flagsSet, flagsClear) ) ++success;
                else ++failure;
        }
 
@@ -192,7 +193,7 @@
 
                if ( prop->getFlags().get_dont_enum() ) continue;
 
-               env.push(as_value(i->first.c_str()));
+               env.push(as_value(string_table::value(i->first).c_str()));
        }
 }
 
@@ -205,7 +206,7 @@
 
                if ( prop->getFlags().get_dont_enum() ) continue;
 
-               to.insert(make_pair(i->first,
+               to.insert(make_pair(string_table::value(i->first),
                                prop->getValue(this_ptr).to_string()));
        }
 }
@@ -215,7 +216,7 @@
 {
        for ( const_iterator it=begin(), itEnd=end(); it != itEnd; ++it )
        {
-               log_msg("  %s: %s", it->first.c_str(),
+               log_msg("  %s: %s", string_table::value(it->first).c_str(),
                        it->second->getValue(this_ptr).to_string().c_str());
        }
 }
@@ -225,11 +226,11 @@
 {
        for (const_iterator it = o.begin(), itEnd = o.end(); it != itEnd; ++it)
        {
-               const std::string& name = it->first;
+               string_table::key key = it->first;
                const Property* prop = it->second;
 
                // Delete any previous property with this name
-               iterator found = _props.find( name );
+               iterator found = _props.find(key);
                if ( found != _props.end() )
                {
                        delete found->second;
@@ -237,13 +238,13 @@
                }
                else
                {
-                       _props[name] = prop->clone();
+                       _props[key] = prop->clone();
                }
        }
 }
 
 bool
-PropertyList::addGetterSetter(const std::string& key, as_function& getter,
+PropertyList::addGetterSetter(string_table::key key, as_function& getter,
        as_function& setter)
 {
        iterator found = _props.find( key );
@@ -251,7 +252,7 @@
 
        GetterSetterProperty* prop = new 
GetterSetterProperty(GetterSetter(getter, setter));
 #ifdef DEBUG_PROPERTY_ALLOC
-       log_debug("GetterSetterProperty %s = %p", key.c_str(), (void*)prop);
+       log_debug("GetterSetterProperty %s = %p", 
string_table::value(key).c_str(), (void*)prop);
 #endif // DEBUG_PROPERTY_ALLOC
        _props[key] = prop;
        return true;

Index: server/PropertyList.h
===================================================================
RCS file: /sources/gnash/gnash/server/PropertyList.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- server/PropertyList.h       1 Jul 2007 10:54:19 -0000       1.16
+++ server/PropertyList.h       16 Sep 2007 16:48:13 -0000      1.17
@@ -24,6 +24,7 @@
 
 #include "Property.h" // for templated functions
 #include "as_value.h" // for templated functions
+#include "string_table.h"
 
 #include <map> 
 #include <string> // for use within map 
@@ -64,7 +65,7 @@
        ///       overhead and with manager ownerhips. See:
        /// http://www.boost.org/libs/ptr_container/doc/ptr_container.html
        ///
-       typedef std::map<std::string, Property*> container;
+       typedef std::map<string_table::key, Property*> container;
        typedef container::iterator iterator;
        typedef container::const_iterator const_iterator;
        typedef container::reverse_iterator reverse_iterator;
@@ -72,10 +73,10 @@
 
        container _props;
 
-       iterator find(const std::string& key) {
+       iterator find(string_table::key key) {
                return _props.find(key);
        }
-       const_iterator find(const std::string& key) const {
+       const_iterator find(string_table::key key) const {
                return _props.find(key);
        }
        iterator end() {
@@ -125,11 +126,11 @@
                for (const_iterator it = begin(), itEnd = end();
                                it != itEnd; ++it)
                {
-                       const std::string& name = it->first;
+                       string_table::key key = it->first;
                        const Property* prop = it->second;
                        as_value val = prop->getValue(this_ptr);
 
-                       visitor(name, val);
+                       visitor(key, val);
                }
        }
 
@@ -161,7 +162,7 @@
        /// @return true if the value was successfully retrived, false
        ///         otherwise (and value will be untouched)
        ///
-       bool getValue(const std::string& key, as_value& value,
+       bool getValue(string_table::key key, as_value& value,
                        as_object& this_ptr);
 
        /// Set the value of a property, creating a new one if unexistent.
@@ -189,7 +190,7 @@
        /// @return true if the value was successfully set, false
        ///         otherwise (found a read-only property, most likely).
        ///
-       bool setValue(const std::string& key, const as_value& value,
+       bool setValue(string_table::key key, const as_value& value,
                        as_object& this_ptr);
 
        /// Get a property, if existing
@@ -201,7 +202,7 @@
        ///     ownership of returned Propery is kept by the PropertyList,
        ///     so plase *don't* delete it !
        ///
-       Property* getProperty(const std::string& key);
+       Property* getProperty(string_table::key key);
 
        /// Delete a propery, if exising and not protected from deletion.
        //
@@ -217,7 +218,7 @@
        ///     - (true, false) : property protected from deletion
        ///     - (true, true) : property successfully deleted
        ///
-       std::pair<bool,bool> delProperty(const std::string& key);
+       std::pair<bool,bool> delProperty(string_table::key key);
 
        /// \brief
        /// Add a getter/setter property, if not already existing
@@ -237,7 +238,7 @@
        /// @return true if the property was successfully added, false
        ///         otherwise (property already existent?)
        ///
-       bool addGetterSetter(const std::string& key, as_function& getter,
+       bool addGetterSetter(string_table::key key, as_function& getter,
                as_function& setter);
 
        /// Set the flags of a property.
@@ -254,7 +255,7 @@
        /// @return true if the value was successfully set, false
        ///         otherwise (either not found or protected)
        ///
-       bool setFlags(const std::string& key, int setTrue, int setFalse);
+       bool setFlags(string_table::key key, int setTrue, int setFalse);
 
        /// Set the flags of all properties.
        //

Index: server/array.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/array.cpp,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -b -r1.77 -r1.78
--- server/array.cpp    11 Sep 2007 17:01:23 -0000      1.77
+++ server/array.cpp    16 Sep 2007 16:48:13 -0000      1.78
@@ -392,8 +392,8 @@
                boost::intrusive_ptr<as_object> ao = a.to_object();
                boost::intrusive_ptr<as_object> bo = b.to_object();
                
-               ao->get_member(_prop, &av);
-               bo->get_member(_prop, &bv);
+               ao->get_member(string_table::find(_prop), &av);
+               bo->get_member(string_table::find(_prop), &bv);
                return _comp(av, bv);
        }
 };
@@ -424,8 +424,8 @@
                        as_value av, bv;
                        boost::intrusive_ptr<as_object> ao = a.to_object();
                        boost::intrusive_ptr<as_object> bo = b.to_object();
-                       ao->get_member(*pit, &av);
-                       bo->get_member(*pit, &bv);
+                       ao->get_member(string_table::find(*pit), &av);
+                       bo->get_member(string_table::find(*pit), &bv);
 
                        if ( (*cmp)(av, bv) ) return true;
                        if ( (*cmp)(bv, av) ) return false;
@@ -457,8 +457,8 @@
                        as_value av, bv;
                        boost::intrusive_ptr<as_object> ao = a.to_object();
                        boost::intrusive_ptr<as_object> bo = b.to_object();
-                       ao->get_member(*pit, &av);
-                       bo->get_member(*pit, &bv);
+                       ao->get_member(string_table::find(*pit), &av);
+                       bo->get_member(string_table::find(*pit), &bv);
 
                        if ( !(*cmp)(av, bv) ) return false;
                }
@@ -560,10 +560,12 @@
 }
 
 int
-as_array_object::index_requested(const std::string& name)
+as_array_object::index_requested(string_table::key name)
 {
+       string name_str = string_table::value(name);
+
        as_value temp;
-       temp.set_string(name);
+       temp.set_string(name_str);
        double value = temp.to_number();
 
        // if we were sent a string that can't convert like "asdf", it returns 
as NaN. -1 means invalid index
@@ -781,7 +783,7 @@
 
 /* virtual public, overriding as_object::get_member */
 bool
-as_array_object::get_member(const std::string& name, as_value *val)
+as_array_object::get_member(string_table::key name, as_value *val)
 {
        // an index has been requested
        int index = index_requested(name);
@@ -802,7 +804,7 @@
 
 /* virtual public, overriding as_object::set_member */
 void
-as_array_object::set_member(const std::string& name,
+as_array_object::set_member(string_table::key name,
                const as_value& val )
 {
        int index = index_requested(name);
@@ -1378,7 +1380,7 @@
                for (int i = 0; i < int(fn.arg(0).to_number()); i++)
                {
                        index_number.set_int(i);
-                       ao->set_member(index_number.to_string_versioned(sv, 
env).c_str(), undef_value);
+                       
ao->set_member(string_table::find(index_number.to_string_versioned(sv, env)), 
undef_value);
                }
        }
        else

Index: server/array.h
===================================================================
RCS file: /sources/gnash/gnash/server/array.h,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- server/array.h      11 Sep 2007 17:01:23 -0000      1.34
+++ server/array.h      16 Sep 2007 16:48:13 -0000      1.35
@@ -290,10 +290,10 @@
        /// Overridden to provide 'length' member
        //
        /// TODO: use a property for handling 'length'
-       virtual bool get_member(const std::string& name, as_value* val);
+       virtual bool get_member(string_table::key name, as_value* val);
 
        /// Overridden to provide array[#]=x semantic
-       virtual void set_member(const std::string& name,
+       virtual void set_member(string_table::key name,
                const as_value& val );
 
 protected:
@@ -315,7 +315,7 @@
        // this function is used internally by set_member and get_member
        // it takes a string that is the member name of the array and returns -1
        // if the string does not refer to an index, or an appropriate int if 
the string does refer to an index
-       int index_requested(const std::string& name);
+       int index_requested(string_table::key name);
 
 };
 

Index: server/as_environment.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_environment.cpp,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -b -r1.87 -r1.88
--- server/as_environment.cpp   12 Sep 2007 13:48:24 -0000      1.87
+++ server/as_environment.cpp   16 Sep 2007 16:48:13 -0000      1.88
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: as_environment.cpp,v 1.87 2007/09/12 13:48:24 strk Exp $ */
+/* $Id: as_environment.cpp,v 1.88 2007/09/16 16:48:13 cmusick Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -62,7 +62,7 @@
 
        if (target) {
            as_value    val;
-           target->get_member(var.c_str(), &val);
+           target->get_member(string_table::find(var), &val);
            if ( retTarget ) *retTarget = target;
            return val;
        } else {
@@ -111,7 +111,7 @@
     for (size_t i = scopeStack.size(); i > 0; --i) {
         // const_cast needed due to non-const as_object::get_member 
        as_object* obj = const_cast<as_object*>(scopeStack[i-1].get());
-       if (obj && obj->get_member(varname.c_str(), &val)) {
+       if (obj && obj->get_member(string_table::find(varname), &val)) {
            // Found the var in this context.
            if ( retTarget ) *retTarget = obj;
            return val;
@@ -127,7 +127,7 @@
 
 
     // Check target members.
-    if (m_target->get_member(varname.c_str(), &val)) {
+    if (m_target->get_member(string_table::find(varname), &val)) {
        if ( retTarget ) *retTarget = m_target;
        return val;
     }
@@ -162,7 +162,7 @@
        return as_value(global);
     }
 
-    if (global->get_member(varname.c_str(), &val))
+    if (global->get_member(string_table::find(varname), &val))
     {
        if ( retTarget ) *retTarget = global;
        return val;
@@ -197,7 +197,7 @@
                as_object* obj = const_cast<as_object*>(scopeStack[i-1].get());
                if (obj)
                {
-                       std::pair<bool,bool> ret = obj->delProperty(varname);
+                       std::pair<bool,bool> ret = 
obj->delProperty(string_table::find(varname));
                        if (ret.first)
                        {
                            return ret.second;
@@ -213,7 +213,7 @@
 
 
        // Try target
-       std::pair<bool,bool> ret = m_target->delProperty(varname);
+       std::pair<bool,bool> ret = 
m_target->delProperty(string_table::find(varname));
        if ( ret.first )
        {
                return ret.second;
@@ -222,7 +222,7 @@
        // TODO: try 'this' ? Add a testcase for it !
 
        // Try _global 
-       return VM::get().getGlobal()->delProperty(varname).second;
+       return 
VM::get().getGlobal()->delProperty(string_table::find(varname)).second;
 }
 
 // varname must be a plain variable name; no path parsing.
@@ -257,7 +257,7 @@
         target = is_slash_based ? find_object_slashsyntax(path) : 
find_object_dotsyntax(path); 
        if (target)
        {
-           target->set_member(var.c_str(), val);
+           target->set_member(string_table::find(var), val);
        }
        else
        {
@@ -301,15 +301,15 @@
                // const_cast needed due to non-const as_object::get_member 
                as_object* obj = const_cast<as_object*>(scopeStack[i-1].get());
                as_value        dummy;
-               if (obj && obj->get_member(varname.c_str(), &dummy)) {
+               if (obj && obj->get_member(string_table::find(varname), 
&dummy)) {
                    // This object has the member; so set it here.
-                   obj->set_member(varname.c_str(), val);
+                   obj->set_member(string_table::find(varname), val);
                    return;
                }
        }
     
        assert(m_target);
-       m_target->set_member(varname.c_str(), val);
+       m_target->set_member(string_table::find(varname), val);
 }
 
 void
@@ -341,7 +341,7 @@
                assert(varname.length() > 0);   // null varnames are invalid!
                LocalVars& locals = _localFrames.back().locals;
                //locals.push_back(as_environment::frame_slot(varname, val));
-               locals->set_member(varname, val);
+               locals->set_member(string_table::find(varname), val);
        }
 }
        
@@ -357,7 +357,7 @@
                assert(varname.length() > 0);   // null varnames are invalid!
                LocalVars& locals = _localFrames.back().locals;
                //locals.push_back(as_environment::frame_slot(varname, 
as_value()));
-               locals->set_member(varname, as_value());
+               locals->set_member(string_table::find(varname), as_value());
        }
 }
        
@@ -436,7 +436,7 @@
         as_object* target_ptr = is_slash_based ? find_object_slashsyntax(path) 
: find_object_dotsyntax(path); 
        if ( ! target_ptr ) return false;
 
-       target_ptr->get_member(var, &val);
+       target_ptr->get_member(string_table::find(var), &val);
        *target = target_ptr;
        return true;
 }
@@ -663,7 +663,7 @@
 #endif
        as_value tmp;
        // TODO: make sure sprite_instances know about ".."
-       if ( ! env->get_member(subpart.c_str(), &tmp) )
+       if (!env->get_member(string_table::find(subpart), &tmp) )
        {
                // Try this and _global, but only at first iteration...
 
@@ -680,7 +680,7 @@
                {
                        tmp.set_as_object(m_target);
                }
-               else if ( ! VM::get().getGlobal()->get_member(subpart.c_str(), 
&tmp) )
+               else if ( ! 
VM::get().getGlobal()->get_member(string_table::find(subpart), &tmp) )
                {
                        IF_VERBOSE_ASCODING_ERRORS(
                        log_aserror(_("Element '%s' of variable '%s' not found 
in object %p nor in _global (dotsyntax)"),
@@ -815,7 +815,7 @@
 #endif
                as_value tmp;
                // TODO: make sure sprite_instances know about ".."
-               if ( ! env->get_member(subpart.c_str(), &tmp) )
+               if (!env->get_member(string_table::find(subpart), &tmp) )
                {
                        // Try this and _global, but only at first iteration...
 
@@ -833,7 +833,7 @@
                                tmp.set_as_object(m_target);
                        }
 
-                       else if ( ! 
VM::get().getGlobal()->get_member(subpart.c_str(), &tmp) )
+                       else if 
(!VM::get().getGlobal()->get_member(string_table::find(subpart), &tmp) )
                        {
                                IF_VERBOSE_ASCODING_ERRORS(
                                log_aserror(_("Element '%s' of variable '%s' 
not found in object %p nor in _global (slashsyntax)"),
@@ -903,7 +903,7 @@
 }
 
 static void
-dump(const as_environment::LocalVars& locals, std::ostream& out)
+dump(const as_environment::LocalVars& /*locals*/, std::ostream&/* out*/)
 {
        log_msg("FIXME: implement dumper for local variables now that they are 
simple objects");
 #if 0
@@ -966,14 +966,14 @@
 bool
 as_environment::findLocal(LocalVars& locals, const std::string& name, 
as_value& ret)
 {
-       return locals->get_member(name, &ret);
+       return locals->get_member(string_table::find(name), &ret);
 }
 
 /* static private */
 bool
 as_environment::delLocal(LocalVars& locals, const std::string& varname)
 {
-       return locals->delProperty(varname).second;
+       return locals->delProperty(string_table::find(varname)).second;
 }
 
 /* private */
@@ -997,7 +997,7 @@
 as_environment::setLocal(LocalVars& locals,
                const std::string& varname, const as_value& val)
 {
-       Property* prop = locals->getOwnProperty(varname);
+       Property* prop = locals->getOwnProperty(string_table::find(varname));
        if ( ! prop ) return false;
        prop->setValue(*locals, val);
        return true;
@@ -1043,7 +1043,7 @@
        assert(_localFrames.size());
        LocalVars& locals = _localFrames.back().locals;
        //locals.push_back(frame_slot(varname, val));
-       locals->set_member(varname, val);
+       locals->set_member(string_table::find(varname), val);
 }
 
 as_environment::CallFrame::CallFrame(as_function* funcPtr)

Index: server/as_function.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_function.cpp,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- server/as_function.cpp      12 Sep 2007 15:21:43 -0000      1.39
+++ server/as_function.cpp      16 Sep 2007 16:48:13 -0000      1.40
@@ -140,7 +140,7 @@
        //               this function should likely return the *new*
        //               prototype, not the old !!
        as_value proto;
-       get_member("prototype", &proto);
+       get_member(string_table::find("prototype"), &proto);
        return proto.to_object();
 }
 
@@ -354,7 +354,7 @@
                // a literal string in lowercase. (we should likely avoid 
calling
                // get_member as a whole actually, and use a getProto() or 
similar
                // method directly instead) TODO
-               bool func_has_prototype = get_member("prototype", &proto);
+               bool func_has_prototype = 
get_member(string_table::find("prototype"), &proto);
                assert(func_has_prototype);
 
                IF_VERBOSE_ACTION (

Index: server/as_object.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.cpp,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -b -r1.61 -r1.62
--- server/as_object.cpp        11 Sep 2007 19:31:50 -0000      1.61
+++ server/as_object.cpp        16 Sep 2007 16:48:13 -0000      1.62
@@ -62,9 +62,9 @@
        /// Use the set_member function to properly set *inherited* properties
        /// of the given target object
        ///
-       void operator() (const std::string& name, const as_value& val)
+       void operator() (string_table::key name, const as_value& val)
        {
-               if ( name == "__proto__" ) return;
+               if (name == string_table::find("__proto__")) return;
                //log_msg(_("Setting member '%s' to value '%s'"), name.c_str(), 
val.to_debug_string().c_str());
                _tgt.set_member(name, val);
        }
@@ -83,17 +83,17 @@
        {
                std::string name = key;
                boost::to_lower(name, _vm.getLocale());
-               return _members.addGetterSetter(name, getter, setter);
+               return _members.addGetterSetter(string_table::find(name), 
getter, setter);
        }
        else
        {
-               return _members.addGetterSetter(key, getter, setter);
+               return _members.addGetterSetter(string_table::find(key), 
getter, setter);
        }
 }
 
 /*protected*/
 bool
-as_object::get_member_default(const std::string& name, as_value* val)
+as_object::get_member_default(string_table::key name, as_value* val)
 {
        assert(val);
 
@@ -116,10 +116,10 @@
 
 /*private*/
 Property*
-as_object::findProperty(const std::string& key)
+as_object::findProperty(string_table::key key)
 {
        // don't enter an infinite loop looking for __proto__ ...
-       if ( key == "__proto__" )
+       if (key == string_table::find("__proto__"))
        {
                return _members.getProperty(key);
        }
@@ -143,10 +143,10 @@
 
 /*private*/
 Property*
-as_object::findGetterSetter(const std::string& key)
+as_object::findGetterSetter(string_table::key key)
 {
        // don't enter an infinite loop looking for __proto__ ...
-       if ( key == "__proto__" )
+       if (key == string_table::find("__proto__"))
        {
                Property* prop = _members.getProperty(key);
                if ( ! prop ) return NULL;
@@ -180,10 +180,10 @@
 void
 as_object::set_prototype(boost::intrusive_ptr<as_object> proto, int flags)
 {
-       static std::string key ( "__proto__" );
+       static string_table::key key = string_table::find("__proto__");
 
        // TODO: check what happens if __proto__ is set as a user-defined 
getter/setter
-       if ( _members.setValue(key, as_value(proto.get()), *this) )
+       if (_members.setValue(key, as_value(proto.get()), *this) )
        {
                // TODO: optimize this, don't scan again !
                _members.setFlags(key, flags, 0);
@@ -191,7 +191,7 @@
 }
 
 void
-as_object::set_member_default(const std::string& key, const as_value& val )
+as_object::set_member_default(string_table::key key, const as_value& val )
 {
        //log_msg(_("set_member_default(%s)"), key.c_str());
 
@@ -207,7 +207,7 @@
                        {
                                IF_VERBOSE_ASCODING_ERRORS(
                                        log_aserror(_("Attempt to set read-only 
property '%s'"),
-                                                   key.c_str());
+                                                   
string_table::value(key).c_str());
                                );
                        } else
                        {
@@ -217,7 +217,7 @@
                }
                catch (ActionException& exc)
                {
-                       log_msg(_("%s: Exception %s.  Will create a new 
member"), key.c_str(), exc.what());
+                       log_msg(_("%s: Exception %s.  Will create a new 
member"), string_table::value(key).c_str(), exc.what());
                }
        }
 
@@ -225,19 +225,19 @@
 
        // No getter/setter property found, so set (or create) a
        // SimpleProperty (if possible)
-       if ( ! _members.setValue(key, val, *this) )
+       if (!_members.setValue(key, val, *this) )
        {
                IF_VERBOSE_ASCODING_ERRORS(
                log_aserror(_("Attempt to set read-only property ``%s''"
                        " on object ``%p''"),
-                       key.c_str(), (void*)this);
+                       string_table::value(key).c_str(), (void*)this);
                );
        }
 
 }
 
 void
-as_object::init_member(const std::string& key, const as_value& val, int flags)
+as_object::init_member(const std::string& key1, const as_value& val, int flags)
 {
 
        //log_msg(_("Setting member %s (SWF version:%d)"), key.c_str(), 
vm.getSWFVersion());
@@ -246,39 +246,35 @@
 
        if ( vm.getSWFVersion() < 7 )
        {
-               std::string keylower = key;
+               std::string keylower = key1;
                boost::to_lower(keylower, vm.getLocale());
 
                // Set (or create) a SimpleProperty 
-               if ( ! _members.setValue(keylower, val, *this) )
+               if (! _members.setValue(string_table::find(keylower), val, 
*this) )
                {
                        log_error(_("Attempt to initialize read-only property 
``%s''"
                                " (%s) on object ``%p'' twice"),
-                               keylower.c_str(), key.c_str(), (void*)this);
+                               keylower.c_str(), key1.c_str(), (void*)this);
                        // We shouldn't attempt to initialize a member twice, 
should we ?
                        assert(0);
                }
                // TODO: optimize this, don't scan again !
-               _members.setFlags(keylower, flags, 0);
+               _members.setFlags(string_table::find(keylower), flags, 0);
        }
        else
        {
                // Set (or create) a SimpleProperty 
-               if ( ! _members.setValue(key, val, *this) )
+               if ( ! _members.setValue(string_table::find(key1), val, *this) )
                {
                        log_error(_("Attempt to initialize read-only property 
``%s''"
                                " on object ``%p'' twice"),
-                               key.c_str(), (void*)this);
+                               key1.c_str(), (void*)this);
                        // We shouldn't attempt to initialize a member twice, 
should we ?
                        assert(0);
                }
                // TODO: optimize this, don't scan again !
-               _members.setFlags(key, flags, 0);
+               _members.setFlags(string_table::find(key1), flags, 0);
        }
-
-
-
-
 }
 
 void
@@ -290,17 +286,17 @@
        {
                std::string name = key;
                boost::to_lower(name, _vm.getLocale());
-               success = _members.addGetterSetter(name, getter, setter);
+               success = _members.addGetterSetter(string_table::find(name), 
getter, setter);
                //log_msg(_("Initialized property '%s'"), name.c_str());
                // TODO: optimize this, don't scan again !
-               _members.setFlags(name, flags, 0);
+               _members.setFlags(string_table::find(name), flags, 0);
        }
        else
        {
-               success = _members.addGetterSetter(key, getter, setter);
+               success = _members.addGetterSetter(string_table::find(key), 
getter, setter);
                //log_msg(_("Initialized property '%s'"), key.c_str());
                // TODO: optimize this, don't scan again !
-               _members.setFlags(key, flags, 0);
+               _members.setFlags(string_table::find(key), flags, 0);
        }
 
        // We shouldn't attempt to initialize a property twice, should we ?
@@ -312,7 +308,7 @@
 {
        init_property(key, getter, getter, initflags);
 
-       as_prop_flags& flags = getOwnProperty(key)->getFlags();
+       as_prop_flags& flags = 
getOwnProperty(string_table::find(key))->getFlags();
 
        // ActionScript must not change the flags of this builtin property.
        flags.set_is_protected(true);
@@ -323,9 +319,9 @@
 }
 
 std::string
-as_object::asPropName(std::string name)
+as_object::asPropName(string_table::key name)
 {
-       std::string orig = name;
+       std::string orig = string_table::value(name);
        if ( _vm.getSWFVersion() < 7 )
        {
                boost::to_lower(orig, _vm.getLocale());
@@ -336,7 +332,7 @@
 
 
 bool
-as_object::set_member_flags(const std::string& name,
+as_object::set_member_flags(string_table::key name,
                int setTrue, int setFalse)
 {
        // TODO: accept a std::string directly
@@ -396,7 +392,7 @@
 void
 as_object::setPropFlags(as_value& props_val, int set_false, int set_true)
 {
-       if ( props_val.is_string() )
+       if (props_val.is_string())
        {
                std::string propstr = props_val.to_string();
                for(;;)
@@ -414,7 +410,7 @@
                        }
 
                        // set_member_flags will take care of case conversion
-                       if ( ! set_member_flags(prop.c_str(), set_true, 
set_false) )
+                       if (!set_member_flags(string_table::find(prop), 
set_true, set_false) )
                        {
                                IF_VERBOSE_ASCODING_ERRORS(
                                log_aserror(_("Can't set propflags on object "
@@ -560,13 +556,13 @@
 }
 
 std::pair<bool,bool>
-as_object::delProperty(const std::string& name)
+as_object::delProperty(string_table::key name)
 {
        if ( _vm.getSWFVersion() < 7 )
        {
-               std::string key = name;
+               std::string key = string_table::value(name);
                boost::to_lower(key, _vm.getLocale());
-               return _members.delProperty(key);
+               return _members.delProperty(string_table::find(key));
        }
        else
        {
@@ -575,13 +571,13 @@
 }
 
 Property*
-as_object::getOwnProperty(const std::string& name)
+as_object::getOwnProperty(string_table::key name)
 {
        if ( _vm.getSWFVersion() < 7 )
        {
-               std::string key = name;
+               std::string key = string_table::value(name);
                boost::to_lower(key, _vm.getLocale());
-               return _members.getProperty(key);
+               return _members.getProperty(string_table::find(key));
        }
        else
        {
@@ -616,11 +612,11 @@
 boost::intrusive_ptr<as_object>
 as_object::get_prototype()
 {
-       static std::string key ( "__proto__" );
+       static string_table::key key = string_table::find("__proto__");
        as_value tmp;
        // I don't think any subclass should override getting __proto__ 
anyway...
        //if ( ! get_member(key, &tmp) ) return NULL;
-       if ( ! _members.getValue(key, tmp, *this) ) return NULL;
+       if (!_members.getValue(key, tmp, *this) ) return NULL;
        return tmp.to_object();
 
 #if 0 // the inheritance chain MUST end somewhere, handle the SWF4 thing in 
some other way
@@ -650,7 +646,7 @@
                boost::to_lower(handler_name, _vm.getLocale());
        }
 
-       if (get_member(handler_name, &event_handler) )
+       if (get_member(string_table::find(handler_name), &event_handler) )
        {
                call_method(event_handler, NULL, this, 0, 0);
                return true;
@@ -661,20 +657,21 @@
 #endif 
 
 as_value
-as_object::getMember(const std::string& name)
+as_object::getMember(string_table::key name)
 {
        as_value ret;
-       get_member(PROPNAME(name), &ret);
+       get_member(name, &ret);
+       //get_member(PROPNAME(name), &ret);
        return ret;
 }
 
 as_value
-as_object::callMethod(const std::string& methodName, as_environment& env)
+as_object::callMethod(string_table::key methodName, as_environment& env)
 {
        as_value ret;
        as_value method;
 
-       if ( ! get_member(methodName, &method) )
+       if (! get_member(methodName, &method))
        {
                return ret;
        }
@@ -683,12 +680,12 @@
 }
 
 as_value
-as_object::callMethod(const std::string& methodName, as_environment& env, 
const as_value& arg0)
+as_object::callMethod(string_table::key methodName, as_environment& env, const 
as_value& arg0)
 {
        as_value ret;
        as_value method;
 
-       if ( ! get_member(methodName, &method) )
+       if (!get_member(methodName, &method))
        {
                return ret;
        }
@@ -703,12 +700,13 @@
 }
 
 as_value
-as_object::callMethod(const std::string& methodName, as_environment& env, 
const as_value& arg0, const as_value& arg1)
+as_object::callMethod(string_table::key methodName, as_environment& env,
+       const as_value& arg0, const as_value& arg1)
 {
        as_value ret;
        as_value method;
 
-       if ( ! get_member(methodName, &method) )
+       if (! get_member(methodName, &method))
        {
                return ret;
        }

Index: server/as_object.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.h,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -b -r1.68 -r1.69
--- server/as_object.h  11 Sep 2007 19:31:50 -0000      1.68
+++ server/as_object.h  16 Sep 2007 16:48:13 -0000      1.69
@@ -24,6 +24,7 @@
 
 #include "tu_config.h"
 
+#include "string_table.h"
 #include "container.h"
 #include "ref_counted.h" // for inheritance  (to drop)
 #include "GC.h" // for inheritance from GcResource (to complete)
@@ -83,13 +84,13 @@
        //
        /// @returns a Getter/Setter propery if found, NULL if not found
        ///
-       Property* findGetterSetter(const std::string& name);
+       Property* findGetterSetter(string_table::key name);
 
        /// Find a property scanning the inheritance chain
        //
        /// @returns a Propery if found, NULL if not found
        ///
-       Property* findProperty(const std::string& name);
+       Property* findProperty(string_table::key name);
 
 public:
 
@@ -174,7 +175,7 @@
        /// @param val
        ///     Value to assign to the named property.
        ///
-       virtual void set_member(const std::string& name, const as_value& val)
+       virtual void set_member(string_table::key name, const as_value& val)
        {
                return set_member_default(name, val);
        }
@@ -269,7 +270,7 @@
        ///
        /// @return true of the named property was found, false otherwise.
        ///
-       virtual bool get_member(const std::string& name, as_value* val)
+       virtual bool get_member(string_table::key name, as_value* val)
        {
                return get_member_default(name, val);
        }
@@ -290,7 +291,7 @@
        ///     or undefined if not found. Use get_member if you
        ///     need to know wheter it was found or not.
        ///
-       as_value getMember(const std::string& name);
+       as_value getMember(string_table::key name);
 
        /// Call a method of this object in an AS-compatible way
        //
@@ -312,10 +313,10 @@
        ///     or undefined if not found. Use get_member if you
        ///     need to know wheter it was found or not.
        ///
-       as_value callMethod(const std::string& name, as_environment& env);
-       as_value callMethod(const std::string& name, as_environment& env, const 
as_value& arg0);
-       as_value callMethod(const std::string& name, as_environment& env, const 
as_value& arg0, const as_value& arg1);
-       as_value callMethod(const std::string& name, as_environment& env, const 
as_value& arg0, const as_value& arg1, const as_value& arg2);
+       as_value callMethod(string_table::key name, as_environment& env);
+       as_value callMethod(string_table::key name, as_environment& env, const 
as_value& arg0);
+       as_value callMethod(string_table::key name, as_environment& env, const 
as_value& arg0, const as_value& arg1);
+       as_value callMethod(string_table::key name, as_environment& env, const 
as_value& arg0, const as_value& arg1, const as_value& arg2);
 
        /// Delete a property of this object, unless protected from deletion.
        //
@@ -334,7 +335,7 @@
        ///     - (true, false) : property protected from deletion
        ///     - (true, true) : property successfully deleted
        ///
-       std::pair<bool,bool> delProperty(const std::string& name);
+       std::pair<bool,bool> delProperty(string_table::key name);
 
        /// Get this object's own named property, if existing.
        //
@@ -349,7 +350,7 @@
        ///     a Property pointer, or NULL if this object doesn't
        ///     contain the named property.
        ///
-       Property* getOwnProperty(const std::string& name);
+       Property* getOwnProperty(string_table::key name);
 
        /// Set member flags (probably used by ASSetPropFlags)
        //
@@ -367,7 +368,7 @@
        /// @return true on success, false on failure
        ///     (non-existent or protected member)
        ///
-       bool set_member_flags(const std::string& name,
+       bool set_member_flags(string_table::key name,
                        int setTrue, int setFalse=0);
 
        /// Cast to a sprite, or return NULL
@@ -503,7 +504,7 @@
        ///
        void set_prototype(boost::intrusive_ptr<as_object> proto, int 
flags=as_prop_flags::dontDelete|as_prop_flags::dontEnum);
 
-       std::string asPropName(std::string name);
+       std::string asPropName(string_table::key name);
        
        /// @{ Common ActionScript methods for characters
        /// TODO: make protected
@@ -537,7 +538,7 @@
        /// @param val
        ///     The as_value to store a found variable's value in.
        ///
-       bool get_member_default(const std::string& name, as_value* val);
+       bool get_member_default(string_table::key name, as_value* val);
 
        /// Set a member value
        //
@@ -555,7 +556,7 @@
        /// @param val
        ///     Value to assign to the named property.
        ///
-       void set_member_default(const std::string& name, const as_value& val);
+       void set_member_default(string_table::key name, const as_value& val);
 
 #ifdef GNASH_USE_GC
        /// Mark all reachable resources, override from GcResource.

Index: server/as_value.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.cpp,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -b -r1.73 -r1.74
--- server/as_value.cpp 12 Sep 2007 07:24:04 -0000      1.73
+++ server/as_value.cpp 16 Sep 2007 16:48:13 -0000      1.74
@@ -135,7 +135,7 @@
                        bool gotValidToStringResult = false;
                        if ( env )
                        {
-                               std::string methodname = PROPNAME("toString"); 
+                               string_table::key methodname = 
string_table::find(PROPNAME("toString")); 
                                as_value method;
                                if ( obj->get_member(methodname, &method) )
                                {
@@ -148,13 +148,13 @@
                                        else
                                        {
                                                log_msg(_("[object %p].%s() did 
not return a string: %s"),
-                                                               (void*)obj, 
methodname.c_str(),
+                                                               (void*)obj, 
string_table::value(methodname).c_str(),
                                                                
ret.to_debug_string().c_str());
                                        }
                                }
                                else
                                {
-                                       log_msg(_("get_member(%s) returned 
false"), methodname.c_str());
+                                       log_msg(_("get_member(%s) returned 
false"), string_table::value(methodname).c_str());
                                }
                        }
                        if ( ! gotValidToStringResult )
@@ -211,7 +211,7 @@
        if ( m_type == OBJECT || m_type == AS_FUNCTION )
        {
                as_object* obj = m_object_value;
-               std::string methodname = PROPNAME("valueOf"); 
+               string_table::key methodname = 
string_table::find(PROPNAME("valueOf")); 
                as_value method;
                if ( obj->get_member(methodname, &method) )
                {
@@ -219,7 +219,7 @@
                }
                else
                {
-                       log_msg(_("get_member(%s) returned false"), 
methodname.c_str());
+                       log_msg(_("get_member(%s) returned false"), 
string_table::value(methodname).c_str());
                }
        }
 
@@ -290,9 +290,9 @@
                        as_object* obj = m_object_value; 
                        if ( env )
                        {
-                               std::string methodname = PROPNAME("valueOf"); 
+                               string_table::key methodname = 
string_table::find(PROPNAME("valueOf")); 
                                as_value method;
-                               if ( obj->get_member(methodname, &method) )
+                               if (obj->get_member(methodname, &method) )
                                {
                                        as_value ret = call_method0(method, 
env, obj);
                                        if ( ret.is_number() )
@@ -306,7 +306,7 @@
                                        else
                                        {
                                                log_msg(_("[object %p].%s() did 
not return a number: %s"),
-                                                               (void*)obj, 
methodname.c_str(),
+                                                               (void*)obj, 
string_table::value(methodname).c_str(),
                                                                
ret.to_debug_string().c_str());
                                                if ( m_type == AS_FUNCTION && 
swfversion < 6 )
                                                {
@@ -320,7 +320,7 @@
                                }
                                else
                                {
-                                       log_msg(_("get_member(%s) returned 
false"), methodname.c_str());
+                                       log_msg(_("get_member(%s) returned 
false"), string_table::value(methodname).c_str());
                                }
                        }
                        return obj->get_numeric_value(); 

Index: server/character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/character.cpp,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -b -r1.53 -r1.54
--- server/character.cpp        4 Sep 2007 21:50:21 -0000       1.53
+++ server/character.cpp        16 Sep 2007 16:48:13 -0000      1.54
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 // 
 
-/* $Id: character.cpp,v 1.53 2007/09/04 21:50:21 strk Exp $ */
+/* $Id: character.cpp,v 1.54 2007/09/16 16:48:13 cmusick Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -725,7 +725,7 @@
 
        // const cast is needed due to getter/setter members possibly
        // modifying this object even when only get !
-       if ( const_cast<character*>(this)->get_member(method_name, &tmp) )
+       if ( 
const_cast<character*>(this)->get_member(string_table::find(method_name), &tmp) 
)
        {
                func = tmp.to_as_function();
        }

Index: server/edit_text_character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character.cpp,v
retrieving revision 1.112
retrieving revision 1.113
diff -u -b -r1.112 -r1.113
--- server/edit_text_character.cpp      12 Sep 2007 10:57:05 -0000      1.112
+++ server/edit_text_character.cpp      16 Sep 2007 16:48:13 -0000      1.113
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: edit_text_character.cpp,v 1.112 2007/09/12 10:57:05 bwy Exp $ */
+/* $Id: edit_text_character.cpp,v 1.113 2007/09/16 16:48:13 cmusick Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -726,7 +726,7 @@
 }
 
 void
-edit_text_character::set_member(const std::string& name,
+edit_text_character::set_member(string_table::key name,
                const as_value& val)
 {
        //log_msg("edit_text_character.set_member(%s, %s)", name.c_str(), 
val.to_string());
@@ -884,7 +884,7 @@
 }
 
 bool
-edit_text_character::get_member(const std::string& name, as_value* val)
+edit_text_character::get_member(string_table::key name, as_value* val)
 {
        //log_msg("edit_text_character.get_member(%s)", name.c_str());
 
@@ -897,7 +897,7 @@
        default:
                break;
        case M_INVALID_MEMBER:
-               if (name == PROPNAME("htmlText")) {
+               if (string_table::value(name) == PROPNAME("htmlText")) {
                        val->set_string(get_text_value());
                        return true;
                }
@@ -1487,7 +1487,7 @@
        // check if the VariableName already has a value,
        // in that case update text value
        as_value val;
-       if ( sprite->get_member(varname, &val) )
+       if (sprite->get_member(string_table::find(varname), &val) )
        {
 #ifdef DEBUG_DYNTEXT_VARIABLES
                log_msg(_("target sprite (%p) does have a member named %s"), 
(void*)sprite, varname);

Index: server/edit_text_character.h
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character.h,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -b -r1.49 -r1.50
--- server/edit_text_character.h        5 Sep 2007 16:47:55 -0000       1.49
+++ server/edit_text_character.h        16 Sep 2007 16:48:13 -0000      1.50
@@ -101,9 +101,9 @@
        std::string get_text_value() const;
 
        /// We have a "text" member.
-       void set_member(const std::string& name, const as_value& val);
+       void set_member(string_table::key name, const as_value& val);
 
-       bool get_member(const std::string& name, as_value* val);
+       bool get_member(string_table::key name, as_value* val);
 
        /// Draw the dynamic string.
        void    display();

Index: server/movie_root.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -b -r1.91 -r1.92
--- server/movie_root.cpp       13 Sep 2007 15:56:25 -0000      1.91
+++ server/movie_root.cpp       16 Sep 2007 16:48:13 -0000      1.92
@@ -235,7 +235,7 @@
        if ( ! VM::isInitialized() ) return NULL;
        as_object* global = VM::get().getGlobal();
        if ( ! global ) return NULL;
-       if ( ! global->get_member(PROPNAME("Stage"), &v) ) return NULL;
+       if (!global->get_member(string_table::find(PROPNAME("Stage")), &v) ) 
return NULL;
        return boost::dynamic_pointer_cast<Stage>(v.to_object());
 }
                
@@ -292,7 +292,7 @@
        // TODO: test what happens with the global "Key" object
        //       is removed or overridden by the user
 
-       if ( ! _keyobject )
+       if (!_keyobject)
        {
                // This isn't very performant... 
                // it will keep trying to find it even if impossible
@@ -306,7 +306,7 @@
                {
                        boost::to_lower(objName, vm.getLocale());
                }
-               if ( global->get_member(objName, &kval) )
+               if ( global->get_member(string_table::find(objName), &kval) )
                {
                        //log_msg("Found member 'Key' in _global: %s", 
kval.to_string());
                        boost::intrusive_ptr<as_object> obj = kval.to_object();

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.341
retrieving revision 1.342
diff -u -b -r1.341 -r1.342
--- server/sprite_instance.cpp  13 Sep 2007 16:26:13 -0000      1.341
+++ server/sprite_instance.cpp  16 Sep 2007 16:48:13 -0000      1.342
@@ -953,7 +953,7 @@
        float x = 0;
        float y = 0;
 
-       if ( ! obj->get_member("x", &tmp) )
+       if ( ! obj->get_member(string_table::find("x"), &tmp) )
        {
                IF_VERBOSE_ASCODING_ERRORS(
                log_aserror(_("MovieClip.globalToLocal(%s): "
@@ -964,7 +964,7 @@
        }
        x = PIXELS_TO_TWIPS(tmp.to_number(&fn.env()));
 
-       if ( ! obj->get_member("y", &tmp) )
+       if ( ! obj->get_member(string_table::find("y"), &tmp) )
        {
                IF_VERBOSE_ASCODING_ERRORS(
                log_aserror(_("MovieClip.globalToLocal(%s): "
@@ -979,8 +979,8 @@
        matrix world_mat = sprite->get_world_matrix();
        world_mat.transform_by_inverse(pt);
 
-       obj->set_member("x", TWIPS_TO_PIXELS(round(pt.m_x)));
-       obj->set_member("y", TWIPS_TO_PIXELS(round(pt.m_y)));
+       obj->set_member(string_table::find("x"), 
TWIPS_TO_PIXELS(round(pt.m_x)));
+       obj->set_member(string_table::find("y"), 
TWIPS_TO_PIXELS(round(pt.m_y)));
 
        return ret;
 }
@@ -1015,7 +1015,7 @@
        float x = 0;
        float y = 0;
 
-       if ( ! obj->get_member("x", &tmp) )
+       if ( ! obj->get_member(string_table::find("x"), &tmp) )
        {
                IF_VERBOSE_ASCODING_ERRORS(
                log_aserror(_("MovieClip.localToGlobal(%s): "
@@ -1026,7 +1026,7 @@
        }
        x = PIXELS_TO_TWIPS(tmp.to_number(&fn.env()));
 
-       if ( ! obj->get_member("y", &tmp) )
+       if ( ! obj->get_member(string_table::find("y"), &tmp) )
        {
                IF_VERBOSE_ASCODING_ERRORS(
                log_aserror(_("MovieClip.localToGlobal(%s): "
@@ -1041,8 +1041,8 @@
        matrix world_mat = sprite->get_world_matrix();
        world_mat.transform(pt);
 
-       obj->set_member("x", TWIPS_TO_PIXELS(round(pt.m_x)));
-       obj->set_member("y", TWIPS_TO_PIXELS(round(pt.m_y)));
+       obj->set_member(string_table::find("x"), 
TWIPS_TO_PIXELS(round(pt.m_x)));
+       obj->set_member(string_table::find("y"), 
TWIPS_TO_PIXELS(round(pt.m_y)));
 
        return ret;
 
@@ -1765,14 +1765,16 @@
 // Set *val to the value of the named member and
 // return true, if we have the named member.
 // Otherwise leave *val alone and return false.
-bool sprite_instance::get_member(const std::string& name, as_value* val)
+bool sprite_instance::get_member(string_table::key name_key, as_value* val)
 {
+       const std::string& name = string_table::value(name_key);
+
        // FIXME: use addProperty interface for these !!
        // TODO: or at least have a character:: protected method take
        //       care of these ?
        //       Duplicates code in character::get_relative_target_common too..
        //
-       if ( name == "_root" )
+       if (name == "_root" )
        {
                // TODO: handle lockroot
                val->set_as_object( VM::get().getRoot().get_root_movie() );
@@ -1811,7 +1813,7 @@
        //
        // TODO: simplify the next line when get_member_default takes
        //       a std::string
-       if ( get_member_default(name.c_str(), val) )
+       if ( get_member_default(name_key, val) )
        {
 
 // ... trying to be useful to Flash coders ...
@@ -2200,16 +2202,16 @@
        return NULL;
 }
 
-void sprite_instance::set_member(const std::string& name,
+void sprite_instance::set_member(string_table::key name,
                const as_value& val)
 {
 #ifdef DEBUG_DYNTEXT_VARIABLES
-       log_debug(_("sprite[%p]::set_member(%s, %s)"), (void*)this, 
name.c_str(), val.to_debug_string().c_str());
+       log_debug(_("sprite[%p]::set_member(%s, %s)"), (void*)this, 
string_table::value(name), val.to_debug_string().c_str());
 #endif
 
        if ( val.is_function() )
        {
-               checkForKeyOrMouseEvent(name);
+               checkForKeyOrMouseEvent(string_table::value(name));
        }
 
        // Try textfield variables
@@ -2221,7 +2223,7 @@
        //        property (ie: have a textfield use _x as variable name and
        //        be scared)
        //
-       edit_text_character* etc = get_textfield_variable(name.c_str());
+       edit_text_character* etc = 
get_textfield_variable(string_table::value(name).c_str());
        if ( etc )
        {
 #ifdef DEBUG_DYNTEXT_VARIABLES
@@ -3328,10 +3330,10 @@
                //
                if ( swfversion > 5 )
                {
-                       set_member("__constructor__", ctor);
+                       set_member(string_table::find("__constructor__"), ctor);
                        if ( swfversion == 6 )
                        {
-                               set_member("constructor", ctor);
+                               set_member(string_table::find("constructor"), 
ctor);
                        }
                }
        }
@@ -3472,7 +3474,7 @@
                const string& name = it->first;
                const string& val = it->second;
                //log_msg(_("Setting variable '%s' to value '%s'"), 
name.c_str(), val.c_str());
-               set_member(name.c_str(), val.c_str());
+               set_member(string_table::find(name), val.c_str());
        }
 }
 
@@ -3507,7 +3509,7 @@
        {
                const string& name = it->first;
                const string& val = it->second;
-               set_member(PROPNAME(name), val.c_str());
+               set_member(string_table::find(PROPNAME(name)), val.c_str());
        }
 }
 
@@ -3588,7 +3590,7 @@
        as_value enabled;
        // const_cast needed due to get_member being non-const due to the 
        // possibility that a getter-setter would actually modify us ...
-       const_cast<sprite_instance*>(this)->get_member("enabled", &enabled);
+       
const_cast<sprite_instance*>(this)->get_member(string_table::find("enabled"), 
&enabled);
        return enabled.to_bool();
 }
 

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.138
retrieving revision 1.139
diff -u -b -r1.138 -r1.139
--- server/sprite_instance.h    13 Sep 2007 10:14:57 -0000      1.138
+++ server/sprite_instance.h    16 Sep 2007 16:48:13 -0000      1.139
@@ -522,13 +522,13 @@
        //
 
        // See dox in as_object.h
-       bool get_member(const std::string& name, as_value* val);
+       bool get_member(string_table::key name, as_value* val);
                
        /// Set the named member to the value. 
        //
        /// Return true if we have that member; false otherwise.
        ///
-       virtual void set_member(const std::string& name, const as_value& val);
+       virtual void set_member(string_table::key name, const as_value& val);
 
        /// Overridden to look in DisplayList for a match
        virtual character* get_relative_target(const std::string& name);

Index: server/swf.h
===================================================================
RCS file: /sources/gnash/gnash/server/swf.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -b -r1.40 -r1.41
--- server/swf.h        24 Aug 2007 05:49:45 -0000      1.40
+++ server/swf.h        16 Sep 2007 16:48:14 -0000      1.41
@@ -526,6 +526,7 @@
     /// Stack Out:
     ///  .
     /// Do: Throw obj as an exception
+    /// Equivalent: ACTIONTHROW
     ABC_ACTION_THROW               = 0X03,
 
     /// Stream:
@@ -565,6 +566,7 @@
     /// Stream: UV32 frame pointer offset 'offset'
     /// Frame: 
     ///  Kill at offset
+    /// Equivalent: ACTION_DELETE
     ABC_ACTION_KILL                = 0X08,
 
     /// Do: Unknown purpose, Tamarin does nothing.
@@ -611,6 +613,7 @@
 
     /// Stream: S24 jump offset 'jump'
     /// Do: If jump is negative, check for interrupts. Move by jump in stream.
+    /// Equivalent: ACTION_BRANCHALWAYS
     ABC_ACTION_JUMP                = 0X10,
 
     /// Stream: S24 jump offset 'jump'
@@ -619,6 +622,7 @@
     /// Stack Out:
     ///  .
     /// Do: If a is 'true', move by jump in stream, as ABC_ACTION_JUMP does.
+    /// Equivalent: ACTION_BRANCHIFTRUE
     ABC_ACTION_IFTRUE              = 0X11,
 
     /// Stream: S24 jump offset 'jump'

Index: server/swf_function.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf_function.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- server/swf_function.cpp     1 Sep 2007 09:40:05 -0000       1.33
+++ server/swf_function.cpp     16 Sep 2007 16:48:14 -0000      1.34
@@ -87,7 +87,7 @@
        //       returning an as_function ?
        //
        as_value ctor;
-       bool ret = proto->get_member("__constructor__", &ctor);
+       bool ret = proto->get_member(string_table::find("__constructor__"), 
&ctor);
        if ( ! ret )
        {
 #ifdef GNASH_DEBUG_GETSUPER
@@ -114,8 +114,9 @@
 #endif
 
        as_value ctor_proto;
-       ret = ctor_obj->get_member("prototype", &ctor_proto);
+       ret = ctor_obj->get_member(string_table::find("prototype"), 
&ctor_proto);
        if ( ! ret )
+
        {
 #ifdef GNASH_DEBUG_GETSUPER
                log_msg("Object.__proto__.constructor %p doesn't have a 
prototype", ctor_obj.get());
@@ -153,7 +154,7 @@
        {
                arguments->push(fn.arg(i));
        }
-       arguments->set_member("callee", &callee);
+       arguments->set_member(string_table::find("callee"), &callee);
 
        return arguments;
 

Index: server/textformat.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/textformat.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -b -r1.27 -r1.28
--- server/textformat.cpp       1 Jul 2007 10:54:25 -0000       1.27
+++ server/textformat.cpp       16 Sep 2007 16:48:14 -0000      1.28
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 // 
 
-// $Id: textformat.cpp,v 1.27 2007/07/01 10:54:25 bjacques Exp $
+// $Id: textformat.cpp,v 1.28 2007/09/16 16:48:14 cmusick Exp $
 
 #include "log.h"
 #include "textformat.h"
@@ -165,63 +165,63 @@
   //log_msg(_("Change from %f for %f characters for object at %p"), start, 
end, obj);
 
   // Check for the flags that could be set
-  if (obj->get_member("underline", &method)) {
+  if (obj->get_member(string_table::find("underline"), &method)) {
     //log_msg(_("Underline exists and is set to %d"), method.to_bool());
     obj->obj.underlinedSet(method.to_bool());
   }
   
-  if (obj->get_member("italic", &method)) {
+  if (obj->get_member(string_table::find("italic"), &method)) {
     //log_msg(_("Italic exists and is set to %d"), method.to_bool());
     obj->obj.italicedSet(method.to_bool());
   }
   
-  if (obj->get_member("bold", &method)) {
+  if (obj->get_member(string_table::find("bold"), &method)) {
     //log_msg(_("Bold exists and is set to %d"), method.to_bool());
     obj->obj.boldSet(method.to_bool());
   }
   
-  if (obj->get_member("bullet", &method)) {
+  if (obj->get_member(string_table::find("bullet"), &method)) {
     //log_msg(_("Bullet exists and is set to %d"), method.to_bool());
     obj->obj.bulletSet(method.to_bool());
   }
 
-  if (obj->get_member("color", &method)) {
+  if (obj->get_member(string_table::find("color"), &method)) {
     //log_msg(_("Color exists and is set to %f", method.to_number());
     obj->obj.colorSet((uint32_t)method.to_number());
   }
 
-  if (obj->get_member("indent", &method)) {
+  if (obj->get_member(string_table::find("indent"), &method)) {
     //log_msg(_("Indent exists and is set to %f"), method.to_number());
     obj->obj.indentSet(float(method.to_number()));
   }
 
-  if (obj->get_member("align", &method)) {
+  if (obj->get_member(string_table::find("align"), &method)) {
     //log_msg(_("Align exists and is set to %s"), method.to_string());
     const char* align = method.to_string().c_str();
     if ( align ) obj->obj.alignSet(align);
   }
 
-  if (obj->get_member("blockIndent", &method)) {
+  if (obj->get_member(string_table::find("blockIndent"), &method)) {
     //log_msg(_("BlockIndent exists and is set to %f"), method.to_number());
     obj->obj.blockIndentSet(float(method.to_number()));
   }
   
-  if (obj->get_member("leading", &method)) {
+  if (obj->get_member(string_table::find("leading"), &method)) {
     //log_msg(_("Leading exists and is set to %f"), method.to_number());
     obj->obj.leadingSet(float(method.to_number()));
   }
   
-  if (obj->get_member("leftMargin", &method)) {
+  if (obj->get_member(string_table::find("leftMargin"), &method)) {
     //log_msg(_("LeftMargin exists and is set to %f"), method.to_number());
     obj->obj.leftMarginSet(float(method.to_number()));
   }
   
-  if (obj->get_member("RightMargin", &method)) {
+  if (obj->get_member(string_table::find("RightMargin"), &method)) {
     //log_msg(_("RightMargin exists and is set to %f"), method.to_number());
     obj->obj.rightMarginSet(float(method.to_number()));
   }
   
-  if (obj->get_member("size", &method)) {
+  if (obj->get_member(string_table::find("size"), &method)) {
     //log_msg(_("Size exists and is set to %f"), method.to_number());
     obj->obj.sizeSet(float(method.to_number()));
   }

Index: server/timers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/timers.cpp,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -b -r1.36 -r1.37
--- server/timers.cpp   2 Jul 2007 03:20:34 -0000       1.36
+++ server/timers.cpp   16 Sep 2007 16:48:14 -0000      1.37
@@ -19,7 +19,7 @@
 //
 //
 
-/* $Id: timers.cpp,v 1.36 2007/07/02 03:20:34 strk Exp $ */
+/* $Id: timers.cpp,v 1.37 2007/09/16 16:48:14 cmusick Exp $ */
 
 #include "timers.h"
 #include "as_function.h" // for class as_function
@@ -188,7 +188,7 @@
        {
                as_value method;
                const std::string& method_name = fn.arg(1).to_string(&fn.env());
-               if ( ! obj->get_member(method_name, &method) )
+               if (!obj->get_member(string_table::find(method_name), &method) )
                {
                        IF_VERBOSE_ASCODING_ERRORS(
                                std::stringstream ss; fn.dump_args(ss);

Index: server/asobj/AsBroadcaster.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/AsBroadcaster.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- server/asobj/AsBroadcaster.cpp      12 Sep 2007 16:17:04 -0000      1.3
+++ server/asobj/AsBroadcaster.cpp      16 Sep 2007 16:48:14 -0000      1.4
@@ -77,7 +77,7 @@
                if ( ! o ) return;
 
                as_value method;
-               o->get_member(_eventName, &method);
+               o->get_member(string_table::find(_eventName), &method);
 
                if ( method.is_function() )
                {
@@ -106,20 +106,20 @@
 {
        log_debug("Initializing object %p as an AsBroadcaster", (void*)&o);
        // TODO: reserch on protection flags for these methods
-       o.set_member(PROPNAME("addListener"), new 
builtin_function(AsBroadcaster::addListener_method));
-       o.set_member(PROPNAME("removeListener"), new 
builtin_function(AsBroadcaster::removeListener_method));
-       o.set_member(PROPNAME("broadcastMessage"), new 
builtin_function(AsBroadcaster::broadcastMessage_method));
-       o.set_member("_listeners", new as_array_object());
+       o.set_member(string_table::find(PROPNAME("addListener")), new 
builtin_function(AsBroadcaster::addListener_method));
+       o.set_member(string_table::find(PROPNAME("removeListener")), new 
builtin_function(AsBroadcaster::removeListener_method));
+       o.set_member(string_table::find(PROPNAME("broadcastMessage")), new 
builtin_function(AsBroadcaster::broadcastMessage_method));
+       o.set_member(string_table::find("_listeners"), new as_array_object());
 
 #ifndef NDEBUG
        as_value tmp;
-       assert(o.get_member("_listeners", &tmp));
+       assert(o.get_member(string_table::find("_listeners"), &tmp));
        assert(tmp.is_object());
-       assert(o.get_member(PROPNAME("addListener"), &tmp));
+       assert(o.get_member(string_table::find(PROPNAME("addListener")), &tmp));
        assert(tmp.is_function());
-       assert(o.get_member(PROPNAME("removeListener"), &tmp));
+       assert(o.get_member(string_table::find(PROPNAME("removeListener")), 
&tmp));
        assert(tmp.is_function());
-       assert(o.get_member(PROPNAME("broadcastMessage"), &tmp));
+       assert(o.get_member(string_table::find(PROPNAME("broadcastMessage")), 
&tmp));
        assert(tmp.is_function());
 #endif
 }
@@ -164,7 +164,7 @@
        as_value newListener; assert(newListener.is_undefined());
        if ( fn.nargs ) newListener = fn.arg(0);
 
-       obj->callMethod(PROPNAME("removeListener"), fn.env(), newListener);
+       obj->callMethod(string_table::find(PROPNAME("removeListener")), 
fn.env(), newListener);
 
        as_value listenersValue;
 
@@ -172,7 +172,7 @@
        //       inheritance chain in case it's own property _listeners 
        //       has been deleted while another one is found in any base
        //       class.
-       if ( ! obj->get_member("_listeners", &listenersValue) )
+       if ( ! obj->get_member(string_table::find("_listeners"), 
&listenersValue) )
        {
                IF_VERBOSE_ASCODING_ERRORS(
                log_aserror(_("%p.addListener(%s): this object has no 
_listeners member"),
@@ -205,7 +205,7 @@
                        fn.dump_args().c_str(), 
listenersValue.to_debug_string().c_str());
                );
 
-               listenersObj->callMethod(PROPNAME("push"), fn.env(), 
newListener);
+               listenersObj->callMethod(string_table::find(PROPNAME("push")), 
fn.env(), newListener);
 
        }
        else
@@ -229,7 +229,7 @@
        //       inheritance chain in case it's own property _listeners 
        //       has been deleted while another one is found in any base
        //       class.
-       if ( ! obj->get_member("_listeners", &listenersValue) )
+       if (!obj->get_member(string_table::find("_listeners"), &listenersValue) 
)
        {
                IF_VERBOSE_ASCODING_ERRORS(
                log_aserror(_("%p.addListener(%s): this object has no 
_listeners member"),
@@ -266,15 +266,15 @@
                );
 
                // TODO: implement brute force scan of pseudo-array
-               unsigned int length = 
listenersObj->getMember("length").to_int(fn.env());
+               unsigned int length = 
listenersObj->getMember(string_table::find("length")).to_int(fn.env());
                for (unsigned int i=0; i<length; ++i)
                {
                        as_value iVal(i);
                        std::string n = iVal.to_string(&(fn.env()));
-                       as_value v = listenersObj->getMember(n);
+                       as_value v = 
listenersObj->getMember(string_table::find(n));
                        if ( v.equals(listenerToRemove, fn.env()) )
                        {
-                               listenersObj->callMethod("splice", fn.env(), 
iVal, as_value(1));
+                               
listenersObj->callMethod(string_table::find("splice"), fn.env(), iVal, 
as_value(1));
                                return as_value(true); 
                        }
                }
@@ -303,7 +303,7 @@
        //       inheritance chain in case it's own property _listeners 
        //       has been deleted while another one is found in any base
        //       class.
-       if ( ! obj->get_member("_listeners", &listenersValue) )
+       if ( ! obj->get_member(string_table::find("_listeners"), 
&listenersValue) )
        {
                IF_VERBOSE_ASCODING_ERRORS(
                log_aserror(_("%p.addListener(%s): this object has no 
_listeners member"),

Index: server/asobj/ContextMenu.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/ContextMenu.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- server/asobj/ContextMenu.cpp        31 Aug 2007 21:53:31 -0000      1.15
+++ server/asobj/ContextMenu.cpp        16 Sep 2007 16:48:14 -0000      1.16
@@ -73,7 +73,7 @@
        as_function* getCallback() 
        {
                as_value tmp;
-               if (  get_member("onSelect", &tmp) )
+               if (get_member(string_table::find("onSelect"), &tmp))
                        return tmp.to_as_function();
                else return NULL;
        }
@@ -86,7 +86,7 @@
        ///
        void setCallback(const as_value& callback)
        {
-               set_member("onSelect", callback);
+               set_member(string_table::find("onSelect"), callback);
        }
 
        /// Attach the exported interface of this ActionScript class

Index: server/asobj/LoadVars.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/LoadVars.cpp,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -b -r1.28 -r1.29
--- server/asobj/LoadVars.cpp   31 Aug 2007 21:53:32 -0000      1.28
+++ server/asobj/LoadVars.cpp   16 Sep 2007 16:48:14 -0000      1.29
@@ -382,7 +382,7 @@
        for  (ValuesMap::iterator it=vals.begin(), itEnd=vals.end();
                        it != itEnd; ++it)
        {
-               set_member(it->first, as_value(it->second.c_str()));
+               set_member(string_table::find(it->first), 
as_value(it->second.c_str()));
                //log_msg("Setting %s == %s", it->first.c_str(), 
it->second.c_str());
        }
 

Index: server/asobj/MovieClipLoader.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/MovieClipLoader.cpp,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- server/asobj/MovieClipLoader.cpp    5 Sep 2007 00:19:45 -0000       1.29
+++ server/asobj/MovieClipLoader.cpp    16 Sep 2007 16:48:14 -0000      1.30
@@ -281,7 +281,7 @@
        {
                boost::intrusive_ptr<as_object> listener = *it;
                as_value method;
-               if ( ! listener->get_member(event.c_str(), &method) )
+               if (!listener->get_member(string_table::find(event), &method) )
                {
 #if GNASH_DEBUG
 log_msg(_("Listener %p doesn't have an %s event to listen for, skipped"),

Index: server/asobj/NetStream.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/NetStream.cpp,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -b -r1.71 -r1.72
--- server/asobj/NetStream.cpp  10 Sep 2007 16:53:30 -0000      1.71
+++ server/asobj/NetStream.cpp  16 Sep 2007 16:48:14 -0000      1.72
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: NetStream.cpp,v 1.71 2007/09/10 16:53:30 strk Exp $ */
+/* $Id: NetStream.cpp,v 1.72 2007/09/16 16:48:14 cmusick Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -456,7 +456,7 @@
 {
        // TODO: check for System.onStatus too ! use a private 
getStatusHandler() method for this.
        as_value status;
-       if ( ! get_member("onStatus", &status) || ! status.is_function())
+       if (!get_member(string_table::find("onStatus"), &status) || ! 
status.is_function())
        {
                clearStatusQueue();
                return;

Index: server/asobj/Object.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Object.cpp,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- server/asobj/Object.cpp     1 Sep 2007 10:32:44 -0000       1.29
+++ server/asobj/Object.cpp     16 Sep 2007 16:48:14 -0000      1.30
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: Object.cpp,v 1.29 2007/09/01 10:32:44 strk Exp $ */
+/* $Id: Object.cpp,v 1.30 2007/09/16 16:48:14 cmusick Exp $ */
 
 #include "tu_config.h"
 #include "Object.h"
@@ -325,7 +325,7 @@
                );
                return as_value();
        }
-       return as_value(fn.this_ptr->getOwnProperty(propname) != NULL);
+       return 
as_value(fn.this_ptr->getOwnProperty(string_table::find(propname)) != NULL);
 }
 
 as_value
@@ -349,7 +349,7 @@
                return as_value();
        }
 
-       Property* prop = fn.this_ptr->getOwnProperty(propname);
+       Property* prop = 
fn.this_ptr->getOwnProperty(string_table::find(propname));
        if ( ! prop )
        {
                return as_value(false);

Index: server/asobj/Stage.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Stage.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -b -r1.20 -r1.21
--- server/asobj/Stage.cpp      31 Aug 2007 21:53:32 -0000      1.20
+++ server/asobj/Stage.cpp      16 Sep 2007 16:48:14 -0000      1.21
@@ -71,7 +71,7 @@
 Stage::onResize(as_environment* env)
 {
        as_value v;
-       if ( get_member(PROPNAME("scaleMode"), &v) && v.to_string(env) == 
"noScale" )
+       if (get_member(string_table::find(PROPNAME("scaleMode")), &v) && 
v.to_string(env) == "noScale" )
        {
                notifyResize(env);
        }
@@ -92,7 +92,7 @@
 void
 Stage::notifyResize(boost::intrusive_ptr<as_object> obj, as_environment* env)
 {
-       std::string eventname = PROPNAME("onResize");
+       string_table::key eventname = string_table::find(PROPNAME("onResize"));
 
        as_value method;
        if ( ! obj->get_member(eventname, &method) ) {

Index: server/asobj/prophelper.h
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/prophelper.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- server/asobj/prophelper.h   29 Aug 2007 03:32:58 -0000      1.2
+++ server/asobj/prophelper.h   16 Sep 2007 16:48:14 -0000      1.3
@@ -186,7 +186,7 @@
     o.init_member(#sp_name , new builtin_function(sp_code_name))
 
 #define phelp_i_replace(sp_name, sp_code_name) \
-    o.set_member(#sp_name , new builtin_function(sp_code_name))
+    o.set_member(string_table::find(#sp_name), new 
builtin_function(sp_code_name))
 
 #else /* phelp_helper */
 #error phelp_helper must be defined.

Index: server/asobj/xml.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/xml.cpp,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -b -r1.44 -r1.45
--- server/asobj/xml.cpp        1 Jul 2007 10:54:32 -0000       1.44
+++ server/asobj/xml.cpp        16 Sep 2007 16:48:14 -0000      1.45
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: xml.cpp,v 1.44 2007/07/01 10:54:32 bjacques Exp $ */
+/* $Id: xml.cpp,v 1.45 2007/09/16 16:48:14 cmusick Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -133,14 +133,14 @@
 }
 
 bool
-XML::get_member(const std::string& name, as_value *val)
+XML::get_member(string_table::key name, as_value *val)
 {
-        if ( name == "status" ) 
+        if ( string_table::value(name) == "status" ) 
         {
                 val->set_int(_status);
                 return true;
         }
-        else if ( name == "loaded" )
+        else if ( string_table::value(name) == "loaded" )
         {
                 if ( _loaded < 0 ) val->set_undefined();
                 else val->set_bool(_loaded);
@@ -151,14 +151,14 @@
 }
 
 void
-XML::set_member(const std::string& name, const as_value& val)
+XML::set_member(string_table::key name, const as_value& val)
 {
-        if ( name == "status" )
+        if (string_table::value(name) == "status" )
        {
                _status = XML::Status(val.to_number());
                return;
        }
-        else if ( name == "loaded" )
+        else if (string_table::value(name) == "loaded" )
         {
                 bool b = val.to_bool();
                log_msg(_("set_member 'loaded' (%s) became boolean %d"), 
val.to_debug_string().c_str(), b);
@@ -191,14 +191,15 @@
     // In ActionScript 2.0, event method names are CASE SENSITIVE.
     // In ActionScript 1.0, event method names are CASE INSENSITIVE.
     // TODO: move to get_function_name directly ?
-    std::string method_name = "onLoad";
+    std::string method_name1 = "onLoad";
     if ( _vm.getSWFVersion() < 7 )
-        boost::to_lower(method_name, _vm.getLocale());
+        boost::to_lower(method_name1, _vm.getLocale());
 
-    if ( method_name.empty() ) return;
+    if ( method_name1.empty() ) return;
 
+       string_table::key method_name = string_table::find(method_name1);
     as_value   method;
-    if ( ! get_member(method_name, &method) ) return;
+    if (!get_member(method_name, &method) ) return;
     if ( method.is_undefined() ) return;
     if ( ! method.is_function() ) return;
 
@@ -218,14 +219,15 @@
     // In ActionScript 2.0, event method names are CASE SENSITIVE.
     // In ActionScript 1.0, event method names are CASE INSENSITIVE.
     // TODO: move to get_function_name directly ?
-    std::string method_name = "onClose";
+    std::string method_name1 = "onClose";
     if ( _vm.getSWFVersion() < 7 )
-        boost::to_lower(method_name, _vm.getLocale());
+        boost::to_lower(method_name1, _vm.getLocale());
 
-    if ( method_name.empty() ) return;
+    if ( method_name1.empty() ) return;
 
+       string_table::key method_name = string_table::find(method_name1);
     as_value   method;
-    if ( ! get_member(method_name, &method) ) return;
+    if (! get_member(method_name, &method) ) return;
     if ( method.is_undefined() ) return;
     if ( ! method.is_function() ) return;
 
@@ -847,8 +849,9 @@
     if ( VM::get().getSWFVersion() < 7 ) propname = "ignorewhite";
     else propname = "ignoreWhite";
 
+       string_table::key propnamekey = string_table::find(propname);
     as_value val;
-    if ( ! const_cast<XML*>(this)->get_member(propname, &val) ) return false;
+    if (!const_cast<XML*>(this)->get_member(propnamekey, &val) ) return false;
     return val.to_bool();
 }
 

Index: server/asobj/xml.h
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/xml.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- server/asobj/xml.h  1 Jul 2007 10:54:32 -0000       1.17
+++ server/asobj/xml.h  16 Sep 2007 16:48:14 -0000      1.18
@@ -99,13 +99,13 @@
     /// which are NOT proper properties !
     /// See actionscript.all/XML.as
     ///
-    bool get_member(const std::string& name, as_value *val);
+    bool get_member(string_table::key name, as_value *val);
 
     /// This is overridden to provide the 'status' and 'loaded' members,
     /// which are NOT proper properties !
     /// See actionscript.all/XML.as
     ///
-       void set_member(const std::string& name, const as_value& val );
+       void set_member(string_table::key name, const as_value& val );
 
     // Methods
 

Index: server/asobj/xmlsocket.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/xmlsocket.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- server/asobj/xmlsocket.cpp  31 Aug 2007 21:53:32 -0000      1.32
+++ server/asobj/xmlsocket.cpp  16 Sep 2007 16:48:14 -0000      1.33
@@ -642,7 +642,7 @@
                if ( vm.getSWFVersion() < 7 ) boost::to_lower(key, 
vm.getLocale());
 
                as_value tmp;
-               if ( ! get_member(key, &tmp) ) return ret;
+               if (!get_member(string_table::find(key), &tmp) ) return ret;
                ret = tmp.to_as_function();
                return ret;
 }

Index: server/parser/action_buffer.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/action_buffer.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- server/parser/action_buffer.h       22 Aug 2007 17:32:45 -0000      1.16
+++ server/parser/action_buffer.h       16 Sep 2007 16:48:15 -0000      1.17
@@ -121,6 +121,39 @@
                return (const char*)(&m_buffer[pc]);
        }
 
+       /// Get a variable length 32-bit integer from the stream.
+       /// Store its length in the passed uint8_t.
+       uint32_t read_V32(size_t pc, uint8_t& length) const
+       {
+               uint32_t res = m_buffer[pc];
+               if (!(res & 0x00000080))
+               {
+                       length = 1;
+                       return res;
+               }
+               res = res & 0x0000007F | m_buffer[pc + 1] << 7;
+               if (!(res & 0x00004000))
+               {
+                       length = 2;
+                       return res;
+               }
+               res = res & 0x00003FFF | m_buffer[pc + 2] << 14;
+               if (!(res & 0x00200000))
+               {
+                       length = 3;
+                       return res;
+               }
+               res = res & 0x001FFFFF | m_buffer[pc + 3] << 21;
+               if (!(res & 0x10000000))
+               {
+                       length = 4;
+                       return res;
+               }
+               res = res & 0x0FFFFFFF | m_buffer[pc + 4] << 28;
+               length = 5;
+               return res;
+       }
+
         /// Get a pointer to the current instruction within the code
        const unsigned char* getFramePointer(size_t pc) const
        {

Index: server/vm/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -b -r1.132 -r1.133
--- server/vm/ASHandlers.cpp    14 Sep 2007 06:34:08 -0000      1.132
+++ server/vm/ASHandlers.cpp    16 Sep 2007 16:48:15 -0000      1.133
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: ASHandlers.cpp,v 1.132 2007/09/14 06:34:08 nihilus Exp $ */
+/* $Id: ASHandlers.cpp,v 1.133 2007/09/16 16:48:15 cmusick Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -413,8 +413,6 @@
              string("ActionDefineFunction"), 
SWFHandlers::ActionDefineFunction, ARG_HEX);
     handlers[ACTION_SETREGISTER] = ActionHandler(ACTION_SETREGISTER,
              string("ActionSetRegister"), SWFHandlers::ActionSetRegister, 
ARG_U8);
-
-
 }
 
 SWFHandlers::~SWFHandlers()
@@ -2434,7 +2432,7 @@
         // Calling super ? 
         boost::intrusive_ptr<as_object> obj = function.to_object();
             this_ptr = thread.getThisPointer();
-        if ( ! obj->get_member("constructor", &function) )
+        if (!obj->get_member(string_table::find("constructor"), &function) )
         {
             IF_VERBOSE_ASCODING_ERRORS (
             log_aserror(_("Object doensn't have a constructor"));
@@ -3067,7 +3065,7 @@
 
                        // TODO: all this crap should go into an 
as_object::getConstructor instead
                        as_value ctor;
-                       if ( ! obj->get_member("constructor", &ctor) )
+                       if (!obj->get_member(string_table::find("constructor"), 
&ctor) )
                        {
                                IF_VERBOSE_ASCODING_ERRORS(
                                log_aserror(_("ActionCallMethod: object has no 
constructor"));

Index: server/vm/ActionExec.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ActionExec.cpp,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -b -r1.44 -r1.45
--- server/vm/ActionExec.cpp    12 Sep 2007 06:02:14 -0000      1.44
+++ server/vm/ActionExec.cpp    16 Sep 2007 16:48:15 -0000      1.45
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: ActionExec.cpp,v 1.44 2007/09/12 06:02:14 strk Exp $ */
+/* $Id: ActionExec.cpp,v 1.45 2007/09/16 16:48:15 cmusick Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -539,7 +539,7 @@
            boost::to_lower(namei, vm.getLocale());
        } 
 
-       std::pair<bool,bool> ret = obj.delProperty(namei);
+       std::pair<bool,bool> ret = obj.delProperty(string_table::find(namei));
        return ret.second;
 }
 
@@ -609,9 +609,9 @@
        if ( vm.getSWFVersion() < 7 ) {
            std::string vari = var;
            boost::to_lower(vari, vm.getLocale());
-           obj.set_member(vari, val);
+           obj.set_member(string_table::find(vari), val);
        } else {
-           obj.set_member(var, val);
+           obj.set_member(string_table::find(var), val);
        }
        
 }
@@ -624,9 +624,9 @@
        if ( vm.getSWFVersion() < 7 ) {
            std::string vari = var;
            boost::to_lower(vari, vm.getLocale());
-           return obj.get_member(vari, &val);
+           return obj.get_member(string_table::find(vari), &val);
        } else {
-           return obj.get_member(var, &val);
+           return obj.get_member(string_table::find(var), &val);
        }
 
 }

Index: server/vm/action.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/action.cpp,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -b -r1.25 -r1.26
--- server/vm/action.cpp        7 Sep 2007 07:34:37 -0000       1.25
+++ server/vm/action.cpp        16 Sep 2007 16:48:15 -0000      1.26
@@ -124,7 +124,7 @@
 void register_component(const std::string& name, as_c_function_ptr handler)
 {
        as_object* global = VM::get().getGlobal();
-       global->set_member(name, handler);
+       global->set_member(string_table::find(name), handler);
 }
 
 //
@@ -426,12 +426,12 @@
 // TODO: move to character.h ?
 // TODO: case-insensitive search ?
 as_standard_member
-get_standard_member(const std::string& name)
+get_standard_member(string_table::key name)
 {
-       typedef std::map< std::string, as_standard_member, 
StringNoCaseLessThen>  maptype; 
+       typedef std::map<string_table::key, as_standard_member>  maptype; 
 
        static bool s_inited = false;
-       static std::map< std::string, as_standard_member, StringNoCaseLessThen> 
membersMap;
+       static maptype membersMap;
 
        if (!s_inited)
        {
@@ -440,35 +440,47 @@
                // worth reserving ?
                //membersMap.resize(int(AS_STANDARD_MEMBER_COUNT));
 
-               membersMap["_x"] = M_X;
-               membersMap["_y"] = M_Y;
-               membersMap["_xscale"] = M_XSCALE;
-               membersMap["_yscale"] = M_YSCALE;
-               membersMap["_currentframe"] = M_CURRENTFRAME;
-               membersMap["_totalframes"] = M_TOTALFRAMES;
-               membersMap["_alpha"] = M_ALPHA;
-               membersMap["_visible"] = M_VISIBLE;
-               membersMap["_width"] = M_WIDTH;
-               membersMap["_height"] = M_HEIGHT;
-               membersMap["_rotation"] = M_ROTATION;
-               membersMap["_target"] = M_TARGET;
-               membersMap["_framesloaded"] = M_FRAMESLOADED;
-               membersMap["_name"] = M_NAME;
-               membersMap["_droptarget"] = M_DROPTARGET;
-               membersMap["_url"] = M_URL;
-               membersMap["_highquality"] = M_HIGHQUALITY;
-               membersMap["_focusrect"] = M_FOCUSRECT;
-               membersMap["_soundbuftime"] = M_SOUNDBUFTIME;
-               membersMap["_xmouse"] = M_XMOUSE;
-               membersMap["_ymouse"] = M_YMOUSE;
-               membersMap["_parent"] = M_PARENT;
-               membersMap["text"] = M_TEXT;
-               membersMap["htmlText"] = M_HTMLTEXT;
-               membersMap["textWidth"] = M_TEXTWIDTH;
-               membersMap["textColor"] = M_TEXTCOLOR;
-               membersMap["onLoad"] = M_ONLOAD;
-               membersMap["onRollOver"] = M_ONROLLOVER;
-               membersMap["onRollOut"] = M_ONROLLOUT;
+               membersMap[string_table::find("_x")] = M_X;
+               membersMap[string_table::find("_y")] = M_Y;
+               membersMap[string_table::find("_xscale")] = M_XSCALE;
+               membersMap[string_table::find("_yscale")] = M_YSCALE;
+               membersMap[string_table::find("_currentframe")] = 
M_CURRENTFRAME;
+               membersMap[string_table::find("_totalframes")] = M_TOTALFRAMES;
+               membersMap[string_table::find("_alpha")] = M_ALPHA;
+               membersMap[string_table::find("_visible")] = M_VISIBLE;
+               membersMap[string_table::find("_width")] = M_WIDTH;
+               membersMap[string_table::find("_height")] = M_HEIGHT;
+               membersMap[string_table::find("_rotation")] = M_ROTATION;
+               membersMap[string_table::find("_target")] = M_TARGET;
+               membersMap[string_table::find("_framesloaded")] = 
M_FRAMESLOADED;
+               membersMap[string_table::find("_name")] = M_NAME;
+               membersMap[string_table::find("_droptarget")] = M_DROPTARGET;
+               membersMap[string_table::find("_url")] = M_URL;
+               membersMap[string_table::find("_highquality")] = M_HIGHQUALITY;
+               membersMap[string_table::find("_focusrect")] = M_FOCUSRECT;
+               membersMap[string_table::find("_soundbuftime")] = 
M_SOUNDBUFTIME;
+               membersMap[string_table::find("_xmouse")] = M_XMOUSE;
+               membersMap[string_table::find("_ymouse")] = M_YMOUSE;
+               membersMap[string_table::find("_parent")] = M_PARENT;
+               membersMap[string_table::find("text")] = M_TEXT;
+               if (VM::get().getSWFVersion() >= 7)
+               {
+                       membersMap[string_table::find("htmlText")] = M_HTMLTEXT;
+                       membersMap[string_table::find("textWidth")] = 
M_TEXTWIDTH;
+                       membersMap[string_table::find("textColor")] = 
M_TEXTCOLOR;
+                       membersMap[string_table::find("onLoad")] = M_ONLOAD;
+                       membersMap[string_table::find("onRollOver")] = 
M_ONROLLOVER;
+                       membersMap[string_table::find("onRollOut")] = 
M_ONROLLOUT;
+               }
+               else
+               {
+                       membersMap[string_table::find("htmltext")] = M_HTMLTEXT;
+                       membersMap[string_table::find("textwidth")] = 
M_TEXTWIDTH;
+                       membersMap[string_table::find("textcolor")] = 
M_TEXTCOLOR;
+                       membersMap[string_table::find("onload")] = M_ONLOAD;
+                       membersMap[string_table::find("onrollover")] = 
M_ONROLLOVER;
+                       membersMap[string_table::find("onrollout")] = 
M_ONROLLOUT;
+               }
        }
 
        as_standard_member result;

Index: server/vm/action.h
===================================================================
RCS file: /sources/gnash/gnash/server/vm/action.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- server/vm/action.h  5 Sep 2007 16:47:55 -0000       1.10
+++ server/vm/action.h  16 Sep 2007 16:48:15 -0000      1.11
@@ -145,7 +145,7 @@
 
        /// Return the standard enum, if the arg names a standard member.
        /// Returns M_INVALID_MEMBER if there's no match.
-       as_standard_member      get_standard_member(const std::string& name);
+       as_standard_member      get_standard_member(string_table::key name);
 
        // deprecated, use sprite_instance::loadMovie
        //void attach_extern_movie(const char* c_url, const sprite_instance* 
target, const sprite_instance* root_movie);

Index: testsuite/misc-ming.all/KeyTest-Runner.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/misc-ming.all/KeyTest-Runner.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- testsuite/misc-ming.all/KeyTest-Runner.cpp  1 Jul 2007 10:54:46 -0000       
1.4
+++ testsuite/misc-ming.all/KeyTest-Runner.cpp  16 Sep 2007 16:48:15 -0000      
1.5
@@ -58,33 +58,33 @@
 
        as_value tmp;
 
-       check(mc1->get_member("_x", &tmp));
+       check(mc1->get_member(string_table::find("_x"), &tmp));
        check_equals(tmp.to_number(), 0);
 
        tester.advance();
        check_equals(root->get_current_frame(), 2);
 
-       check(mc1->get_member("_x", &tmp));
+       check(mc1->get_member(string_table::find("_x"), &tmp));
        check_equals(tmp.to_number(), 200);
 
        tester.pressKey(key::J);
 
-       check(mc1->get_member("_x", &tmp));
+       check(mc1->get_member(string_table::find("_x"), &tmp));
        check_equals(tmp.to_number(), 250);
 
        tester.pressKey(key::K);
 
-       check(mc1->get_member("_x", &tmp));
+       check(mc1->get_member(string_table::find("_x"), &tmp));
        check_equals(tmp.to_number(), 300);
 
        tester.releaseKey(key::A);
 
-       check(mc1->get_member("_x", &tmp));
+       check(mc1->get_member(string_table::find("_x"), &tmp));
        check_equals(tmp.to_number(), 250);
 
        tester.releaseKey(key::B);
 
-       check(mc1->get_member("_x", &tmp));
+       check(mc1->get_member(string_table::find("_x"), &tmp));
        check_equals(tmp.to_number(), 200);
 
        // TODO: test pressing and releases keys

Index: testsuite/misc-ming.all/attachMovieTestRunner.cpp
===================================================================
RCS file: 
/sources/gnash/gnash/testsuite/misc-ming.all/attachMovieTestRunner.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- testsuite/misc-ming.all/attachMovieTestRunner.cpp   1 Jul 2007 10:54:50 
-0000       1.12
+++ testsuite/misc-ming.all/attachMovieTestRunner.cpp   16 Sep 2007 16:48:15 
-0000      1.13
@@ -79,23 +79,23 @@
        // check that the pixel under the mouse is white
        check_pixel(100, 30, 2, rgba(255,255,255,255), 2);
 
-       root->get_member("mousedown", &tmp);
+       root->get_member(string_table::find("mousedown"), &tmp);
        check(tmp.is_undefined());
-       root->get_member("mouseup", &tmp);
+       root->get_member(string_table::find("mouseup"), &tmp);
        check(tmp.is_undefined());
 
        // Note that we are *not* on an active entity !
        tester.pressMouseButton();
 
-       root->get_member("mousedown", &tmp);
+       root->get_member(string_table::find("mousedown"), &tmp);
        check_equals(tmp.to_number(), 1);
-       check ( ! root->get_member("mouseup", &tmp) );
+       check ( ! root->get_member(string_table::find("mouseup"), &tmp) );
 
        tester.depressMouseButton();
 
-       root->get_member("mousedown", &tmp);
+       root->get_member(string_table::find("mousedown"), &tmp);
        check_equals(tmp.to_number(), 1);
-       root->get_member("mouseup", &tmp);
+       root->get_member(string_table::find("mouseup"), &tmp);
        check_equals(tmp.to_number(), 1);
 
        tester.advance();
@@ -152,7 +152,7 @@
        // Note that we are *not* on an active entity !
        tester.pressMouseButton();
 
-       root->get_member("mousedown", &tmp);
+       root->get_member(string_table::find("mousedown"), &tmp);
        check_equals(tmp.to_number(), 5);
 
 }

Index: testsuite/misc-ming.all/intervalTestRunner.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/misc-ming.all/intervalTestRunner.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- testsuite/misc-ming.all/intervalTestRunner.cpp      1 Jul 2007 10:54:54 
-0000       1.6
+++ testsuite/misc-ming.all/intervalTestRunner.cpp      16 Sep 2007 16:48:15 
-0000      1.7
@@ -60,65 +60,65 @@
 
        // Now timers are set and counters initialized
 
-       root->get_member("this_counter", &tmp);
+       root->get_member(string_table::find("this_counter"), &tmp);
        check_equals(tmp.to_number(), 0);
-       root->get_member("that_counter", &tmp);
+       root->get_member(string_table::find("that_counter"), &tmp);
        check_equals(tmp.to_number(), 0);
 
        usleep(500000); tester.advance(); // run expired timers
 
-       root->get_member("this_counter", &tmp);
+       root->get_member(string_table::find("this_counter"), &tmp);
        check_equals(tmp.to_number(), 1);
-       root->get_member("that_counter", &tmp);
+       root->get_member(string_table::find("that_counter"), &tmp);
        check_equals(tmp.to_number(), 0);
 
        usleep(500000); tester.advance(); // run expired timers
 
-       root->get_member("this_counter", &tmp);
+       root->get_member(string_table::find("this_counter"), &tmp);
        check_equals(tmp.to_number(), 2);
-       root->get_member("that_counter", &tmp);
+       root->get_member(string_table::find("that_counter"), &tmp);
        check_equals(tmp.to_number(), 1);
 
        usleep(500000); tester.advance(); // run expired timers
 
-       root->get_member("this_counter", &tmp);
+       root->get_member(string_table::find("this_counter"), &tmp);
        check_equals(tmp.to_number(), 3);
-       root->get_member("that_counter", &tmp);
+       root->get_member(string_table::find("that_counter"), &tmp);
        check_equals(tmp.to_number(), 1);
 
        usleep(500000); tester.advance(); // run expired timers
 
-       root->get_member("this_counter", &tmp);
+       root->get_member(string_table::find("this_counter"), &tmp);
        check_equals(tmp.to_number(), 4);
-       root->get_member("that_counter", &tmp);
+       root->get_member(string_table::find("that_counter"), &tmp);
        check_equals(tmp.to_number(), 2);
 
        usleep(1000000); tester.advance(); // run expired timers
 
-       root->get_member("this_counter", &tmp);
+       root->get_member(string_table::find("this_counter"), &tmp);
        check_equals(tmp.to_number(), 4);
-       root->get_member("that_counter", &tmp);
+       root->get_member(string_table::find("that_counter"), &tmp);
        check_equals(tmp.to_number(), 3);
 
        usleep(1000000); tester.advance(); // run expired timers
 
-       root->get_member("this_counter", &tmp);
+       root->get_member(string_table::find("this_counter"), &tmp);
        check_equals(tmp.to_number(), 4);
-       root->get_member("that_counter", &tmp);
+       root->get_member(string_table::find("that_counter"), &tmp);
        check_equals(tmp.to_number(), 4);
 
        usleep(500000); tester.advance(); // run expired timers
 
-       root->get_member("this_counter", &tmp);
+       root->get_member(string_table::find("this_counter"), &tmp);
        check_equals(tmp.to_number(), 5);
-       root->get_member("that_counter", &tmp);
+       root->get_member(string_table::find("that_counter"), &tmp);
        check_equals(tmp.to_number(), 4);
 
-       root->get_member("pushed_args", &tmp);
+       root->get_member(string_table::find("pushed_args"), &tmp);
        as_environment env; // needed for proper to_string()
        check_equals(tmp.to_string(&env), std::string("8,9,10"));
 
-       root->get_member("test_completed", &tmp);
+       root->get_member(string_table::find("test_completed"), &tmp);
        check_equals(tmp.to_number(), 1);
 
 

Index: testsuite/misc-ming.all/key_event_test2runner.cpp
===================================================================
RCS file: 
/sources/gnash/gnash/testsuite/misc-ming.all/key_event_test2runner.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- testsuite/misc-ming.all/key_event_test2runner.cpp   1 Jul 2007 10:54:54 
-0000       1.5
+++ testsuite/misc-ming.all/key_event_test2runner.cpp   16 Sep 2007 16:48:15 
-0000      1.6
@@ -58,7 +58,7 @@
   check(mc);
 
   as_value tmp;
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 0);
   
   // press key 'A' and checks
@@ -66,7 +66,7 @@
   tester.releaseKey(key::A);
 
   // check that KeyDown have been triggered
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 1);
 
   
@@ -75,7 +75,7 @@
    tester.pressKey(key::A);
    tester.releaseKey(key::A);
   // check that no KeyDown was triggered(no key event handler at frame1);
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 0);
 
   tester.advance(); // advance to frame2
@@ -87,7 +87,7 @@
   tester.releaseKey(key::A);
 
   // check that KeyDown have been triggered
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 1); 
 
   tester.advance(); // loop back to frame1 again
@@ -95,7 +95,7 @@
   tester.pressKey(key::A);
   tester.releaseKey(key::A);
   // check that no KeyDown was triggered(no key event handler at frame1);
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 0);
 
   tester.advance(); // advance to frame2
@@ -107,7 +107,7 @@
   tester.releaseKey(key::A);
 
   // check that KeyDown have been triggered
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 1);
   
   return 0; 

Index: testsuite/misc-ming.all/key_event_test3runner.cpp
===================================================================
RCS file: 
/sources/gnash/gnash/testsuite/misc-ming.all/key_event_test3runner.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- testsuite/misc-ming.all/key_event_test3runner.cpp   1 Jul 2007 10:54:55 
-0000       1.3
+++ testsuite/misc-ming.all/key_event_test3runner.cpp   16 Sep 2007 16:48:15 
-0000      1.4
@@ -55,7 +55,7 @@
   check(mc);
 
   as_value tmp;
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 0);
   
   // press key 'A' and checks
@@ -63,7 +63,7 @@
   tester.releaseKey(key::A);
 
   // check that KeyDown have been triggered
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 1);
 
   
@@ -72,7 +72,7 @@
    tester.pressKey(key::A);
    tester.releaseKey(key::A);
   // check that no KeyDown was triggered(no key event handler at frame1);
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 0); 
 
   tester.advance(); // advance to frame2
@@ -83,7 +83,7 @@
   tester.releaseKey(key::A);
 
   // check that KeyDown have been triggered
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 1); 
 
   tester.advance(); // loop back to frame1 again
@@ -91,7 +91,7 @@
   tester.pressKey(key::A);
   tester.releaseKey(key::A);
   // check that no KeyDown was triggered(no key event handler at frame1);
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 0);
 
   tester.advance(); // advance to frame2
@@ -102,7 +102,7 @@
   tester.releaseKey(key::A);
 
   // check that KeyDown have been triggered
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 1);
   
   return 0; 

Index: testsuite/misc-ming.all/key_event_test5runner.cpp
===================================================================
RCS file: 
/sources/gnash/gnash/testsuite/misc-ming.all/key_event_test5runner.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- testsuite/misc-ming.all/key_event_test5runner.cpp   11 Jul 2007 06:43:08 
-0000      1.2
+++ testsuite/misc-ming.all/key_event_test5runner.cpp   16 Sep 2007 16:48:15 
-0000      1.3
@@ -52,7 +52,7 @@
   as_value tmp;
   // Gnash fails because it forget to do the case conversion.
   // A big old bug!
-  xcheck(root->get_member("hasKeyPressed", &tmp));
+  xcheck(root->get_member(string_table::find("hasKeyPressed"), &tmp));
   check_equals(tmp.to_number(), 0.0);
   
   // Provide a key event and that's all.
@@ -69,7 +69,7 @@
   
   // Gnash fails because it forget to do the case conversion.
   // A big old bug!
-  xcheck(root->get_member("hasKeyPressed", &tmp));
+  xcheck(root->get_member(string_table::find("hasKeyPressed"), &tmp));
   xcheck_equals(tmp.to_number(), 1.0);
   
   // Provide a key event. 

Index: testsuite/misc-ming.all/key_event_testrunner.cpp
===================================================================
RCS file: 
/sources/gnash/gnash/testsuite/misc-ming.all/key_event_testrunner.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- testsuite/misc-ming.all/key_event_testrunner.cpp    1 Jul 2007 10:54:55 
-0000       1.6
+++ testsuite/misc-ming.all/key_event_testrunner.cpp    16 Sep 2007 16:48:15 
-0000      1.7
@@ -57,7 +57,7 @@
 
   as_value tmp;
 
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_number(), 0);
   
   // press key 'A' and checks
@@ -65,15 +65,15 @@
   tester.releaseKey(key::A);
 
   // check that onClipKeyUp/KeyDown have been triggered
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_string(), "A");
-  check(root->get_member("x2", &tmp));
+  check(root->get_member(string_table::find("x2"), &tmp));
   check_equals(tmp.to_number(), key::A);
 
   // check that user defined onKeyUp/KeyDown were not triggered
-  check(root->get_member("x4", &tmp));
+  check(root->get_member(string_table::find("x4"), &tmp));
   check_equals(tmp.to_number(), 0);
-  check(root->get_member("x5", &tmp));
+  check(root->get_member(string_table::find("x5"), &tmp));
   check_equals(tmp.to_number(), 0);
 
   for(int i=1; i<30; i++)
@@ -89,24 +89,24 @@
   tester.releaseKey(key::C);
 
   // check that onClipKeyUp/KeyDown have been triggered
-  check(root->get_member("x1", &tmp));
+  check(root->get_member(string_table::find("x1"), &tmp));
   check_equals(tmp.to_string(), "C");
-  check(root->get_member("x2", &tmp));
+  check(root->get_member(string_table::find("x2"), &tmp));
   check_equals(tmp.to_number(), key::C);
   
   // check that user defined onKeyUp/KeyDown have been triggered
-  check(root->get_member("x4", &tmp));
+  check(root->get_member(string_table::find("x4"), &tmp));
   check_equals(tmp.to_string(), "C");
-  check(root->get_member("x5", &tmp));
+  check(root->get_member(string_table::find("x5"), &tmp));
   check_equals(tmp.to_number(), key::C);
        
   // check that user onClipKeyPress and user defined onKeyPress were not 
triggered
   // onClipKeyPress was not triggered because the event handler binds a 
invalid key code
-  check(root->get_member("x3", &tmp));
+  check(root->get_member(string_table::find("x3"), &tmp));
   check_equals(tmp.to_number(), 0);
   // onKeyPress was not triggered because I think there is no user defined
   // KeyPress event handler at all( the defined onKeyPress is just a normal 
function).
-  check(root->get_member("x6", &tmp));
+  check(root->get_member(string_table::find("x6"), &tmp));
   check_equals(tmp.to_number(), 0);
   
 }

Index: testsuite/movies.all/gravity_embedded-TestRunner.cpp
===================================================================
RCS file: 
/sources/gnash/gnash/testsuite/movies.all/gravity_embedded-TestRunner.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- testsuite/movies.all/gravity_embedded-TestRunner.cpp        1 Jul 2007 
10:55:09 -0000       1.7
+++ testsuite/movies.all/gravity_embedded-TestRunner.cpp        16 Sep 2007 
16:48:15 -0000      1.8
@@ -65,9 +65,11 @@
        check(loaded);
        check_equals(loaded->get_parent(), root);
 
+       string_table::key xscale = string_table::find("_xscale");
+       string_table::key yscale = string_table::find("_yscale");
        // we need a const_cast as get_member *might* eventually
        // change the character (fetching _x shouldn't change it though)
-       check(const_cast<character*>(loaded)->get_member("_xscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(xscale, &tmp));
        check_equals(tmp, as_value(50));
 
        check_equals(loaded->get_height(), 2056);
@@ -86,25 +88,25 @@
        check_equals(string(text->get_text_value()), "50");
        tester.depressMouseButton();
        check_equals(string(text->get_text_value()), "48");
-       check(const_cast<character*>(loaded)->get_member("_xscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(xscale, &tmp));
        check_equals(round(tmp.to_number()), 48);
-       check(const_cast<character*>(loaded)->get_member("_yscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(yscale, &tmp));
        check_equals(round(tmp.to_number()), 48);
        tester.pressMouseButton();
        check_equals(string(text->get_text_value()), "48");
        tester.depressMouseButton();
        check_equals(string(text->get_text_value()), "46");
-       check(const_cast<character*>(loaded)->get_member("_xscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(xscale, &tmp));
        check_equals(round(tmp.to_number()), 46);
-       check(const_cast<character*>(loaded)->get_member("_yscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(yscale, &tmp));
        check_equals(round(tmp.to_number()), 46);
        tester.pressMouseButton();
        check_equals(string(text->get_text_value()), "46");
        tester.depressMouseButton();
        check_equals(string(text->get_text_value()), "44");
-       check(const_cast<character*>(loaded)->get_member("_xscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(xscale, &tmp));
        check_equals(round(tmp.to_number()), 44);
-       check(const_cast<character*>(loaded)->get_member("_yscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(yscale, &tmp));
        check_equals(round(tmp.to_number()), 44);
 
        // click some on the "larger" button
@@ -114,33 +116,33 @@
        check_equals(string(text->get_text_value()), "44");
        tester.depressMouseButton();
        check_equals(string(text->get_text_value()), "46");
-       check(const_cast<character*>(loaded)->get_member("_xscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(xscale, &tmp));
        check_equals(round(tmp.to_number()), 46);
-       check(const_cast<character*>(loaded)->get_member("_yscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(yscale, &tmp));
        check_equals(round(tmp.to_number()), 46);
        tester.pressMouseButton();
        check_equals(string(text->get_text_value()), "46");
        tester.depressMouseButton();
        check_equals(string(text->get_text_value()), "48");
-       check(const_cast<character*>(loaded)->get_member("_xscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(xscale, &tmp));
        check_equals(round(tmp.to_number()), 48);
-       check(const_cast<character*>(loaded)->get_member("_yscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(yscale, &tmp));
        check_equals(round(tmp.to_number()), 48);
        tester.pressMouseButton();
        check_equals(string(text->get_text_value()), "48");
        tester.depressMouseButton();
        check_equals(string(text->get_text_value()), "50");
-       check(const_cast<character*>(loaded)->get_member("_xscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(xscale, &tmp));
        check_equals(round(tmp.to_number()), 50);
-       check(const_cast<character*>(loaded)->get_member("_yscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(yscale, &tmp));
        check_equals(round(tmp.to_number()), 50);
        tester.pressMouseButton();
        check_equals(string(text->get_text_value()), "50");
        tester.depressMouseButton();
        check_equals(string(text->get_text_value()), "52");
-       check(const_cast<character*>(loaded)->get_member("_xscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(xscale, &tmp));
        check_equals(round(tmp.to_number()), 52);
-       check(const_cast<character*>(loaded)->get_member("_yscale", &tmp));
+       check(const_cast<character*>(loaded)->get_member(yscale, &tmp));
        check_equals(round(tmp.to_number()), 52);
 
 

Index: testsuite/server/GetterSetterTest.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/server/GetterSetterTest.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- testsuite/server/GetterSetterTest.cpp       7 Sep 2007 00:11:27 -0000       
1.15
+++ testsuite/server/GetterSetterTest.cpp       16 Sep 2007 16:48:15 -0000      
1.16
@@ -53,7 +53,7 @@
        boost::intrusive_ptr<as_object> o = fn.this_ptr;
        assert(fn.nargs == 1);
        as_value& val = fn.arg(0);
-       o->set_member(val.to_string(&fn.env()), val);
+       o->set_member(string_table::find(val.to_string(&fn.env())), val);
        return as_value();
 }
 
@@ -70,7 +70,7 @@
 
        std::string get_text_value() const { return textval; }
 
-       void set_member(const std::string& , const as_value& val )
+       void set_member(string_table::key, const as_value& val )
        {
                textval = val.to_string();
        }

Index: testsuite/server/PropertyListTest.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/server/PropertyListTest.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- testsuite/server/PropertyListTest.cpp       7 Sep 2007 00:11:27 -0000       
1.17
+++ testsuite/server/PropertyListTest.cpp       16 Sep 2007 16:48:16 -0000      
1.18
@@ -65,48 +65,48 @@
        as_value ret;
 
        check_equals(props.size(), 0);
-       check ( props.setValue("Var0", val, obj) );
+       check ( props.setValue(string_table::find("Var0"), val, obj) );
        check_equals(props.size(), 1);
 
-       check ( props.getValue("Var0", ret, obj) );
+       check ( props.getValue(string_table::find("Var0"), ret, obj) );
        check_equals ( ret, val );
 
        // search should be case-sensitive
-       check ( ! props.getValue("var0", ret, obj) );
+       check ( ! props.getValue(string_table::find("var0"), ret, obj) );
 
        // new value overrides existing value
-       check ( props.setValue("Var0", val2, obj) );
+       check ( props.setValue(string_table::find("Var0"), val2, obj) );
        check_equals(props.size(), 1);
-       check ( props.getValue("Var0", ret, obj) );
+       check ( props.getValue(string_table::find("Var0"), ret, obj) );
        check_equals ( ret, val2 );
 
        // case-sensitive setting value doesn't overrides existing value
-       check ( props.setValue("var0", val3, obj) );
+       check ( props.setValue(string_table::find("var0"), val3, obj) );
        check_equals(props.size(), 2);
-       check ( ! props.getValue("vAr0", ret, obj) );
+       check ( ! props.getValue(string_table::find("vAr0"), ret, obj) );
 
        // Now add some new labels
-       check ( props.setValue("var1", val, obj) );
+       check ( props.setValue(string_table::find("var1"), val, obj) );
        check_equals(props.size(), 3);
-       check ( props.setValue("var2", val, obj) );
+       check ( props.setValue(string_table::find("var2"), val, obj) );
        check_equals(props.size(), 4);
-       check ( props.setValue("var3", val, obj) );
+       check ( props.setValue(string_table::find("var3"), val, obj) );
        check_equals(props.size(), 5);
 
        // Test deletion of properties
 
        // this succeeds
-       check(props.delProperty("var3").second);
+       check(props.delProperty(string_table::find("var3")).second);
        check_equals(props.size(), 4);
 
        // this fails (non existent property)
-       check(!props.delProperty("non-existent").first);
+       check(!props.delProperty(string_table::find("non-existent")).first);
        check_equals(props.size(), 4);
 
        // Set property var2 as protected from deletion!
-       check(props.setFlags("var2", as_prop_flags::dontDelete, 0));
+       check(props.setFlags(string_table::find("var2"), 
as_prop_flags::dontDelete, 0));
        // this fails (protected from deletion)
-       std::pair<bool, bool> delpair = props.delProperty("var2");
+       std::pair<bool, bool> delpair = 
props.delProperty(string_table::find("var2"));
        check_equals(delpair.first, true); // property was found
        check_equals(delpair.second, false); // property was NOT deleted
        check_equals(props.size(), 4);

Index: libbase/string_table.cpp
===================================================================
RCS file: libbase/string_table.cpp
diff -N libbase/string_table.cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ libbase/string_table.cpp    16 Sep 2007 16:48:12 -0000      1.1
@@ -0,0 +1,68 @@
+// string_table.cpp -- A shared string table for Gnash.
+// 
+//   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
+// 
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+// 
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+#include "string_table.h"
+
+using namespace gnash;
+
+string_table::table string_table::mTable;
+// By starting at 0, this can be the 'unknown' value.
+string_table::key string_table::mHighestKey = 0;
+boost::mutex string_table::mLock;
+std::string string_table::mEmpty = "";
+
+string_table::key
+string_table::find(const std::string& to_find, bool insert_unfound)
+{
+       table::nth_index<0>::type::iterator i = mTable.get<0>().find(to_find);
+
+       if (i == mTable.end() && insert_unfound)
+       {
+               if (insert_unfound)
+               {
+                       // First we lock.
+                       //boost::mutex::scoped_lock aLock(mLock);
+                       // Then we see if someone else managed to sneak past us.
+                       i = mTable.get<0>().find(to_find);
+                       // If they did, use that value.
+                       if (i != mTable.end())
+                               return i->mId;
+                       // Otherwise, insert it.
+                       return mTable.insert(svt(to_find, 
++mHighestKey)).first->mId;
+               }
+               else
+                       return 0;
+       }
+
+       return i->mId;
+}
+
+string_table::key
+string_table::insert(const std::string& to_insert)
+{
+       boost::mutex::scoped_lock aLock(mLock);
+
+       return mTable.insert(svt(to_insert, ++mHighestKey)).first->mId;
+}
+
+string_table::key
+string_table::already_locked_insert(const std::string& to_insert, 
boost::mutex&)
+{
+       return mTable.insert(svt(to_insert, ++mHighestKey)).first->mId;
+}
+

Index: libbase/string_table.h
===================================================================
RCS file: libbase/string_table.h
diff -N libbase/string_table.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ libbase/string_table.h      16 Sep 2007 16:48:12 -0000      1.1
@@ -0,0 +1,88 @@
+// string_table.h -- A shared string table for Gnash.
+// 
+//   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
+// 
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3 of the License, or
+// (at your option) any later version.
+// 
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+#ifndef GNASH_STRING_TABLE_H
+#define GNASH_STRING_TABLE_H
+
+// Thread Status: SAFE
+
+#include <boost/multi_index_container.hpp>
+#include <boost/multi_index/hashed_index.hpp>
+#include <boost/multi_index/ordered_index.hpp>
+#include <boost/multi_index/identity.hpp>
+#include <boost/multi_index/member.hpp>
+#include <boost/thread.hpp>
+#include <string>
+
+namespace gnash
+{
+
+class string_table;
+
+// So many strings are duplicated (such as standard property names)
+// that a string table could give significant memory savings.
+class string_table
+{
+private:
+       // A little helper for indexing.
+       struct svt
+       {
+               std::string mValue;
+               std::size_t mId;
+               svt(const std::string& a, std::size_t b) : mValue(a), mId(b) 
{/**/}
+        };
+
+public:
+       typedef boost::multi_index_container<svt,
+               boost::multi_index::indexed_by<
+                       boost::multi_index::hashed_non_unique<
+                               boost::multi_index::member<svt, std::string, 
&svt::mValue> >,
+                       boost::multi_index::hashed_non_unique<
+                               boost::multi_index::member<svt, uint32_t, 
&svt::mId> > 
+       > > table;
+
+       typedef std::size_t key;
+
+       // Find a string. If insert_unfound is true, the string will
+       // be inserted if the value is not found in the table already.
+       static key find(const std::string& to_find, bool insert_unfound = true);
+
+       // Find a string by its key.
+       static const std::string& value(key to_find)
+       { table::nth_index<1>::type::iterator r = mTable.get<1>().find(to_find);
+               return (r == mTable.get<1>().end()) ? mEmpty : r->mValue; }
+
+       // Insert a string known to not be in the table. Return the new
+       // index.
+       static key insert(const std::string& to_insert);
+
+       // Insert a string when you will handle the locking yourself.
+       // Use 'lock_mutex' to obtain the correct mutex to use for this.
+       static key already_locked_insert(const std::string& to_insert, 
boost::mutex& lock);
+
+       static boost::mutex& lock_mutex() { return mLock; }
+
+private:
+       static table mTable;
+       static std::string mEmpty;
+       static boost::mutex mLock;
+       static key mHighestKey;
+};
+
+}; /* namespace gnash */
+#endif /* GNASH_STRING_TABLE_H */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]