gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/vm/ActionExec.cpp server...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/vm/ActionExec.cpp server...
Date: Tue, 24 Apr 2007 20:38:27 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/04/24 20:38:26

Modified files:
        .              : ChangeLog 
        server/vm      : ActionExec.cpp ActionExec.h ASHandlers.cpp 
        testsuite/actionscript.all: delete.as 

Log message:
                * server/vm/ActionExec.{cpp,h}: add delObjectMember() method.
                * server/vm/ASHandlers.cpp (ActionDelete): hopefully fixed -
                  at least as far as we can tell...
                * testsuite/actionscript.all/delete.as: more tests for 
ActionDelete.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2985&r2=1.2986
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ActionExec.cpp?cvsroot=gnash&r1=1.28&r2=1.29
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ActionExec.h?cvsroot=gnash&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.99&r2=1.100
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/delete.as?cvsroot=gnash&r1=1.9&r2=1.10

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2985
retrieving revision 1.2986
diff -u -b -r1.2985 -r1.2986
--- ChangeLog   24 Apr 2007 17:52:47 -0000      1.2985
+++ ChangeLog   24 Apr 2007 20:38:26 -0000      1.2986
@@ -1,3 +1,10 @@
+2007-04-24 Sandro Santilli <address@hidden>
+
+       * server/vm/ActionExec.{cpp,h}: add delObjectMember() method.
+       * server/vm/ASHandlers.cpp (ActionDelete): hopefully fixed -
+         at least as far as we can tell...
+       * testsuite/actionscript.all/delete.as: more tests for ActionDelete.
+
 2007-04-24  Rob Savoye  <address@hidden>
 
        * configure.ac: Remove --enable-extension. Add --with-extensions=

Index: server/vm/ActionExec.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ActionExec.cpp,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -b -r1.28 -r1.29
--- server/vm/ActionExec.cpp    20 Apr 2007 12:13:34 -0000      1.28
+++ server/vm/ActionExec.cpp    24 Apr 2007 20:38:26 -0000      1.29
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: ActionExec.cpp,v 1.28 2007/04/20 12:13:34 strk Exp $ */
+/* $Id: ActionExec.cpp,v 1.29 2007/04/24 20:38:26 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -342,6 +342,21 @@
        return env.del_variable_raw(namei, with_stack);
 }
 
+bool
+ActionExec::delObjectMember(as_object& obj, const std::string& name)
+{
+       VM& vm = VM::get();
+
+       std::string namei = name;
+
+       if ( vm.getSWFVersion() < 7 ) {
+           boost::to_lower(namei, vm.getLocale());
+       } 
+
+       std::pair<bool,bool> ret = obj.delProperty(namei);
+       return ret.second;
+}
+
 void
 ActionExec::setVariable(const std::string& name, const as_value& val)
 {

Index: server/vm/ActionExec.h
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ActionExec.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- server/vm/ActionExec.h      28 Mar 2007 16:24:39 -0000      1.14
+++ server/vm/ActionExec.h      24 Apr 2007 20:38:26 -0000      1.15
@@ -228,6 +228,19 @@
        ///
        bool delVariable(const std::string& name);
 
+       /// Delete a named object member.
+       //
+       /// @param obj
+       ///     The object to remove the member/property from.
+       ///
+       /// @param name
+       ///     Name of the member. 
+       ///     Name is converted to lowercase if SWF version is < 7.
+       ///
+       /// @return true if the member was successfully removed, false 
otherwise.
+       ///
+       bool delObjectMember(as_object& obj, const std::string& name);
+
        /// Set a named variable, seeking for it in the with stack if any.
        //
        /// @param name

Index: server/vm/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v
retrieving revision 1.99
retrieving revision 1.100
diff -u -b -r1.99 -r1.100
--- server/vm/ASHandlers.cpp    19 Apr 2007 14:25:41 -0000      1.99
+++ server/vm/ASHandlers.cpp    24 Apr 2007 20:38:26 -0000      1.100
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: ASHandlers.cpp,v 1.99 2007/04/19 14:25:41 martinwguy Exp $ */
+/* $Id: ASHandlers.cpp,v 1.100 2007/04/24 20:38:26 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -2112,32 +2112,39 @@
 void
 SWFHandlers::ActionDelete(ActionExec& thread)
 {
-//     GNASH_REPORT_FUNCTION;
+       //GNASH_REPORT_FUNCTION;
        as_environment& env = thread.env;
 
        assert(thread.code[thread.pc] == SWF::ACTION_DELETE); // 0x3A
 
-       size_t stacksize = env.stack_size();
+       thread.ensureStack(2); // obj, member
 
-       if ( stacksize < 1 )
+       // TODO: some parameter checking ?
+       const std::string& propname = env.top(0).to_string(&env);
+       boost::intrusive_ptr<as_object> obj = env.top(1).to_object();
+
+       if ( ! obj )
        {
-               IF_VERBOSE_MALFORMED_SWF(
-                       log_swferror(_("No elements on the stack "
-                               "at ActionDelete (0x3A). "
-                               "Returning FALSE."));
+               IF_VERBOSE_ASCODING_ERRORS(
+               log_aserror("delete %s.%s : first element is not an object",
+                       env.top(1).to_debug_string().c_str(),
+                       env.top(0).to_debug_string().c_str());
                );
-               env.push(as_value(false));
+               env.top(1).set_bool(false);
+               env.drop(1);
                return;
        }
 
-       // What's the difference between this and ActionDelete2 ??
-       env.top(0) = thread.delVariable(env.top(0).to_string(&env));
+       env.top(1).set_bool(thread.delObjectMember(*obj, propname));
+
+       env.drop(1);
+
 }
 
 void
 SWFHandlers::ActionDelete2(ActionExec& thread)
 {
-//     GNASH_REPORT_FUNCTION;
+       //GNASH_REPORT_FUNCTION;
 
        as_environment& env = thread.env;
 

Index: testsuite/actionscript.all/delete.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/delete.as,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- testsuite/actionscript.all/delete.as        15 Mar 2007 22:39:54 -0000      
1.9
+++ testsuite/actionscript.all/delete.as        24 Apr 2007 20:38:26 -0000      
1.10
@@ -1,4 +1,4 @@
-rcsid="$Id: delete.as,v 1.9 2007/03/15 22:39:54 strk Exp $";
+rcsid="$Id: delete.as,v 1.10 2007/04/24 20:38:26 strk Exp $";
 
 #include "check.as"
 
@@ -57,3 +57,17 @@
 check(!delete func.prototype);
 check_equals(typeof(func.prototype), 'object');
 check_equals(func.prototype.appended_value, 4);
+
+//
+// Deleting an object's member
+//
+
+obj = new Object;
+obj.a = 1;
+check_equals(obj.a, 1);
+check(delete obj.a);
+check_equals(typeof(obj.a), 'undefined');
+check(!delete obj.a);
+check(!delete unexistent.a);
+
+// TODO: try other malformed ActionDelete calls




reply via email to

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