[Top][All Lists]
[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 */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash ChangeLog libbase/Makefile.am server/Prop...,
Chad Musick <=