[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/asobj/SharedObject.cpp
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/asobj/SharedObject.cpp |
Date: |
Wed, 19 Dec 2007 22:06:36 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 07/12/19 22:06:36
Modified files:
. : ChangeLog
server/asobj : SharedObject.cpp
Log message:
make SharedObject.flush more robust, reduce string_table lookups
in PropsSerializer, cleanup class initialization and SharedObject
constructor.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5223&r2=1.5224
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/SharedObject.cpp?cvsroot=gnash&r1=1.14&r2=1.15
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5223
retrieving revision 1.5224
diff -u -b -r1.5223 -r1.5224
--- ChangeLog 19 Dec 2007 21:04:10 -0000 1.5223
+++ ChangeLog 19 Dec 2007 22:06:35 -0000 1.5224
@@ -1,5 +1,8 @@
2007-12-19 Sandro Santilli <address@hidden>
+ * server/asobj/SharedObject.cpp: make SharedObject.flush more
+ robust, reduce string_table lookups in PropsSerializer, cleanup
+ class initialization and SharedObject constructor.
* libamf/amf.{cpp,h} (createElement): take element names by
const refs.
Index: server/asobj/SharedObject.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/SharedObject.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- server/asobj/SharedObject.cpp 19 Dec 2007 19:40:20 -0000 1.14
+++ server/asobj/SharedObject.cpp 19 Dec 2007 22:06:36 -0000 1.15
@@ -48,28 +48,38 @@
void sharedobject_iter(SOL &sol, string_table::key key, const as_value
&reference);
class PropsSerializer {
- SOL& _sol; public: PropsSerializer(SOL& sol) : _sol(sol) {};
- virtual as_value operator() (string_table::key key, const as_value& val)
+
+ SOL& _sol;
+
+ string_table& _st;
+
+public:
+
+ PropsSerializer(SOL& sol, VM& vm)
+ :
+ _sol(sol),
+ _st(vm.getStringTable())
+ {};
+
+ void operator() (string_table::key key, const as_value& val) const
{
GNASH_REPORT_FUNCTION;
AMF amf;
AMF::amf_element_t el;
- string_table& st = VM::get().getStringTable();
- string str = st.string_table::value(key);
- cerr << "FIXME: yes!!!!! " << str << ": "<< val.to_string() <<
endl;
+
+ const string& name = _st.string_table::value(key);
+
+ cerr << "FIXME: yes!!!!! " << name << ": "<< val.to_debug_string()
<< endl;
if (val.is_string()) {
string str;
- if (val.is_undefined()) {
- str = "";
- } else {
+ if (!val.is_undefined()) {
str = val.to_string();
}
- amf.createElement(&el, str, str);
+ amf.createElement(&el, name, str);
}
if (val.is_bool()) {
- bool b;
- amf.createElement(&el, str, b);
+ amf.createElement(&el, name, val.to_bool());
}
if (val.is_number()) {
double dub;
@@ -78,11 +88,10 @@
} else {
dub = val.to_number();
}
- amf.createElement(&el, str, dub);
+ amf.createElement(&el, name, dub);
}
_sol.addObj(el);
- return as_value(true);
}
};
@@ -98,26 +107,31 @@
attachSharedObjectInterface(as_object& o)
{
GNASH_REPORT_FUNCTION;
- // TODO: clear, flush and getSize not in SWF<6 , it seems
+
+ VM& vm = o.getVM();
+ int swfVersion = vm.getSWFVersion();
+
+ // clear, flush and getSize not in SWF<6 , it seems
+ if ( swfVersion < 6 ) return;
+
o.init_member("clear", new builtin_function(sharedobject_clear));
o.init_member("flush", new builtin_function(sharedobject_flush));
- //o.init_member("getLocal", new builtin_function(sharedobject_getlocal));
o.init_member("getSize", new builtin_function(sharedobject_getsize));
- attachProperties(o);
}
static void
attachSharedObjectStaticInterface(as_object& o)
{
GNASH_REPORT_FUNCTION;
+
o.init_member("getLocal", new builtin_function(sharedobject_getlocal));
- attachProperties(o);
}
static as_object*
getSharedObjectInterface()
{
GNASH_REPORT_FUNCTION;
+
static boost::intrusive_ptr<as_object> o;
if ( ! o ) {
o = new as_object(getObjectInterface());
@@ -134,6 +148,7 @@
:
as_object(getSharedObjectInterface())
{
+ attachProperties(*this);
}
};
@@ -192,15 +207,27 @@
// log_msg("Flushing to file %s", obj->getFilespec().c_str());
- string_table::key dataKey = VM::get().getStringTable().find("data");
+ VM& vm = obj->getVM();
+
+ // TODO: cache the dataKey in SharedObject prototype on first use ?
+ // a SharedObject::getDataKey() might do...
+ string_table::key dataKey = vm.getStringTable().find("data");
+
as_value as = obj->getMember(dataKey);
boost::intrusive_ptr<as_object> ptr = as.to_object();
+ if ( ! ptr )
+ {
+ log_error("'data' member of SharedObject is not an object (%s)",
+ as.to_debug_string().c_str());
+ return as_value();
+ }
- auto_ptr<SOL> sol(new SOL);
- PropsSerializer props(*sol);
+ SOL sol;
+ PropsSerializer props(sol, vm);
ptr->visitPropertyValues(props);
- sol->writeFile(obj->getFilespec(), obj->getObjectName().c_str());
- return as_value(true);
+ sol.writeFile(obj->getFilespec(), obj->getObjectName().c_str());
+
+ return as_value(true); // TODO: check expected return type from
SharedObject.flush
}
as_value
@@ -214,9 +241,12 @@
if (fn.nargs > 0) {
std::string filespec = fn.arg(0).to_string();
+
+ // FIXME: check security !!!
+ // This is scary...
obj->setFilespec(filespec);
obj->setObjectName(filespec);
- log_msg("Opening SharedObject file: %s", filespec.c_str());
+ log_security("Opening SharedObject file: %s", filespec.c_str());
}
return as_value(obj.get()); // will keep alive
@@ -234,8 +264,8 @@
sharedobject_ctor(const fn_call& /* fn */)
{
GNASH_REPORT_FUNCTION;
-// boost::intrusive_ptr<as_object> obj = new SharedObject;
- static boost::intrusive_ptr<as_object> obj = new
as_object(getSharedObjectInterface());
+ boost::intrusive_ptr<as_object> obj = new SharedObject;
+// static boost::intrusive_ptr<as_object> obj = new
as_object(getSharedObjectInterface());
return as_value(obj.get()); // will keep alive
}
@@ -249,8 +279,6 @@
if (cl == NULL) {
cl=new builtin_function(&sharedobject_ctor,
getSharedObjectInterface());
- // replicate all interface to class, to be able to access
- // all methods as static functions
attachSharedObjectStaticInterface(*cl);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash ChangeLog server/asobj/SharedObject.cpp,
Sandro Santilli <=