gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/as_value.cpp server/as_v...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/as_value.cpp server/as_v...
Date: Thu, 22 Mar 2007 08:45:52 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/03/22 08:45:52

Modified files:
        .              : ChangeLog 
        server         : as_value.cpp as_value.h 
        server/asobj   : Global.cpp xml.cpp 
        server/vm      : ASHandlers.cpp 

Log message:
                * server/as_value.{h,cpp}: drop all methods transparently
                  calling to_number w/out passing an as_environment.
                * server/asobj/Global.cpp, server/asobj/xml.cpp,
                  server/vm/ASHandlers.cpp: properly update to explicitly
                  invoke as_value::to_number() when needed.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2669&r2=1.2670
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.31&r2=1.32
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.h?cvsroot=gnash&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Global.cpp?cvsroot=gnash&r1=1.53&r2=1.54
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/xml.cpp?cvsroot=gnash&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.73&r2=1.74

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2669
retrieving revision 1.2670
diff -u -b -r1.2669 -r1.2670
--- ChangeLog   22 Mar 2007 08:10:50 -0000      1.2669
+++ ChangeLog   22 Mar 2007 08:45:51 -0000      1.2670
@@ -1,3 +1,11 @@
+2007-03-22 Sandro Santilli <address@hidden>
+
+       * server/as_value.{h,cpp}: drop all methods transparently
+         calling to_number w/out passing an as_environment.
+       * server/asobj/Global.cpp, server/asobj/xml.cpp,
+         server/vm/ASHandlers.cpp: properly update to explicitly
+         invoke as_value::to_number() when needed.
+
 2007-03-22 Zou Lunkai <address@hidden>
 
        * testsuite/misc-ming.all: action_execution_order_test6.c, Makefile.am.

Index: server/as_value.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.cpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -b -r1.31 -r1.32
--- server/as_value.cpp 20 Mar 2007 15:26:04 -0000      1.31
+++ server/as_value.cpp 22 Mar 2007 08:45:51 -0000      1.32
@@ -550,9 +550,9 @@
 
 // Force type to number.
 void
-as_value::convert_to_number()
+as_value::convert_to_number(as_environment* env)
 {
-    set_double(to_number());
+    set_double(to_number(env));
 }
 
 // Force type to string.

Index: server/as_value.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.h,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- server/as_value.h   22 Mar 2007 00:30:45 -0000      1.37
+++ server/as_value.h   22 Mar 2007 08:45:51 -0000      1.38
@@ -14,7 +14,7 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-/* $Id: as_value.h,v 1.37 2007/03/22 00:30:45 strk Exp $ */
+/* $Id: as_value.h,v 1.38 2007/03/22 08:45:51 strk Exp $ */
 
 #ifndef GNASH_AS_VALUE_H
 #define GNASH_AS_VALUE_H
@@ -438,7 +438,12 @@
        as_function*    to_as_function() const;
 
        /// Force type to number.
-       void    convert_to_number();
+       //
+       /// @param env
+       ///     The environment to use for running the valueOf() method
+       ///     for object values. If NULL, valueOf() won't be run.
+       ///
+       void    convert_to_number(as_environment* env);
 
        /// Force type to string.
        void    convert_to_string();
@@ -542,20 +547,23 @@
        bool    operator==(const as_value& v) const;
 
        bool    operator!=(const as_value& v) const;
+
+       /// @deprecated, use v.set_double(v.to_number(env) / v.to_number(env)) 
instead !
        //bool  operator<(const as_value& v) const { return to_number() < 
v.to_number(); }
 
        /// @deprecated, use v.set_double(v.to_number(env) + v.to_number(env)) 
instead !
-       void    operator+=(const as_value& v) { set_double(to_number() + 
v.to_number()); }
+       //void  operator+=(const as_value& v) { set_double(to_number() + 
v.to_number()); }
 
-       void    operator-=(const as_value& v) { set_double(to_number() - 
v.to_number()); }
-       void    operator*=(const as_value& v) { set_double(to_number() * 
v.to_number()); }
-       void    operator/=(const as_value& v) { set_double(to_number() / 
v.to_number()); }  // @@ check for div/0
-       void    operator&=(const as_value& v) { set_int(int(to_number()) & 
int(v.to_number())); }
-       void    operator|=(const as_value& v) { set_int(int(to_number()) | 
int(v.to_number())); }
-       void    operator^=(const as_value& v) { set_int(int(to_number()) ^ 
int(v.to_number())); }
-       void    shl(const as_value& v) { set_int(int(to_number()) << 
int(v.to_number())); }
-       void    asr(const as_value& v) { set_int(int(to_number()) >> 
int(v.to_number())); }
-       void    lsr(const as_value& v) { set_int((uint32_t(to_number()) >> 
int(v.to_number()))); }
+       /// TODO: deprecate all these !
+//     void    operator-=(const as_value& v) { set_double(to_number() - 
v.to_number()); }
+//     void    operator*=(const as_value& v) { set_double(to_number() * 
v.to_number()); }
+//     void    operator/=(const as_value& v) { set_double(to_number() / 
v.to_number()); }  // @@ check for div/0
+//     void    operator&=(const as_value& v) { set_int(int(to_number()) & 
int(v.to_number())); }
+//     void    operator|=(const as_value& v) { set_int(int(to_number()) | 
int(v.to_number())); }
+//     void    operator^=(const as_value& v) { set_int(int(to_number()) ^ 
int(v.to_number())); }
+//     void    shl(const as_value& v) { set_int(int(to_number()) << 
int(v.to_number())); }
+//     void    asr(const as_value& v) { set_int(int(to_number()) >> 
int(v.to_number())); }
+//     void    lsr(const as_value& v) { set_int((uint32_t(to_number()) >> 
int(v.to_number()))); }
 
        /// Sets this value to this string plus the given string.
        void    string_concat(const tu_string& str);

Index: server/asobj/Global.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Global.cpp,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -b -r1.53 -r1.54
--- server/asobj/Global.cpp     20 Mar 2007 15:01:20 -0000      1.53
+++ server/asobj/Global.cpp     22 Mar 2007 08:45:52 -0000      1.54
@@ -18,7 +18,7 @@
 
 // Implementation of the Global ActionScript Object
 
-/* $Id: Global.cpp,v 1.53 2007/03/20 15:01:20 strk Exp $ */
+/* $Id: Global.cpp,v 1.54 2007/03/22 08:45:52 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -186,6 +186,8 @@
 static as_value
 as_global_parseint(const fn_call& fn)
 {
+       as_environment* env = fn.env;
+
     // assert(fn.nargs == 2 || fn.nargs == 1);
     if (fn.nargs < 1) {
        IF_VERBOSE_ASCODING_ERRORS(
@@ -200,7 +202,7 @@
 
     // Make sure our argument is the correct type
     if (fn.nargs > 1)
-       fn.arg(1).convert_to_number();
+       fn.arg(1).convert_to_number(env);
 
     // Set up some variables
     const string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
@@ -230,7 +232,7 @@
     if (fn.nargs > 1)
        {
            // to_number returns a double. atoi() would be better
-           base = (int)(fn.arg(1).to_number());
+           base = (int)(fn.arg(1).to_number(env));
        }
     // if the string starts with "0x" then a hex digit
     else if (strlen(input) > 2 && input[0] == '0' && input[1] == 'X'
@@ -296,6 +298,7 @@
 as_global_assetpropflags(const fn_call& fn)
 {
     int version = fn.env->get_version();
+    as_environment* env = fn.env;
 
     //log_msg("ASSetPropFlags called with %d args", fn.nargs);
 
@@ -336,7 +339,7 @@
     // are used to determine whether the list of child names should be hidden,
     // un-hidden, protected from over-write, un-protected from over-write,
     // protected from deletion and un-protected from deletion
-    int set_true = int(fn.arg(2).to_number()) & 
as_prop_flags::as_prop_flags_mask;
+    int set_true = int(fn.arg(2).to_number(env)) & 
as_prop_flags::as_prop_flags_mask;
 
     // Is another integer bitmask that works like set_true,
     // except it sets the attributes to false. The
@@ -345,7 +348,7 @@
     // ASSetPropFlags was exposed in Flash 5, however the fourth argument 
'set_false'
     // was not required as it always defaulted to the value '~0'. 
     int set_false = (fn.nargs == 3 ? 
-                    (version == 5 ? ~0 : 0) : int(fn.arg(3).to_number()))
+                    (version == 5 ? ~0 : 0) : int(fn.arg(3).to_number(env)))
        & as_prop_flags::as_prop_flags_mask;
 
        obj->setPropFlags(props, set_false, set_true);

Index: server/asobj/xml.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/xml.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- server/asobj/xml.cpp        20 Mar 2007 15:01:20 -0000      1.22
+++ server/asobj/xml.cpp        22 Mar 2007 08:45:52 -0000      1.23
@@ -14,7 +14,7 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-/* $Id: xml.cpp,v 1.22 2007/03/20 15:01:20 strk Exp $ */
+/* $Id: xml.cpp,v 1.23 2007/03/22 08:45:52 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -42,6 +42,7 @@
 #include <string>
 #include <sstream>
 #include <vector>
+#include <boost/lexical_cast.hpp>
 
 using namespace std;
 
@@ -459,7 +460,6 @@
     //const char    *nodevalue;
     //AS_value      nodevalue;
     int           length;
-    as_value      inum;
     XMLNode       *childnode;
     XMLNode *xmlchildnode_obj;
     xmlattr_as_object* attr_obj;
@@ -506,6 +506,7 @@
     // Process the children, if there are any
     if (length) {
         //log_msg("\tProcessing %d children nodes for %s\n", length, nodename);
+       int inum;
         inum = 0;
         for (child=0; child<length; child++) {
             // Create a new AS object for this node's children
@@ -514,15 +515,13 @@
             // to be the first element of the array instead.
             if (mem) {
                 childnode = xml;
-                //obj->set_member(inum.to_string(), obj);
-                //inum += 1;
-                //childnode = xml->_children[child];
             } else {
                 childnode = xml->_children[child];
             }
             setupFrame(xmlchildnode_obj, childnode, false); // setup child node
-            obj->set_member(inum.to_string(), xmlchildnode_obj);
-            inum += 1;
+
+            obj->set_member(boost::lexical_cast<std::string>(inum), 
xmlchildnode_obj);
+            ++inum;
         }
     } else {
         //log_msg("\tNode %s has no children\n", nodename);

Index: server/vm/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -b -r1.73 -r1.74
--- server/vm/ASHandlers.cpp    22 Mar 2007 00:30:45 -0000      1.73
+++ server/vm/ASHandlers.cpp    22 Mar 2007 08:45:52 -0000      1.74
@@ -14,7 +14,7 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-/* $Id: ASHandlers.cpp,v 1.73 2007/03/22 00:30:45 strk Exp $ */
+/* $Id: ASHandlers.cpp,v 1.74 2007/03/22 08:45:52 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -702,9 +702,14 @@
 SWFHandlers::ActionAdd(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
+
+       //env.top(1) += env.top(0); //original version
+
     as_environment& env = thread.env;
     thread.ensureStack(2);
-    env.top(1) += env.top(0);
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+       env.top(1) = operand1 + operand2;
     env.drop(1);
 }
 
@@ -712,9 +717,14 @@
 SWFHandlers::ActionSubtract(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
+
+       // env.top(1) -= env.top(0); //original version
+
     as_environment& env = thread.env;
     thread.ensureStack(2);
-    env.top(1) -= env.top(0);
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+       env.top(1) = operand1 - operand2;
     env.drop(1);
 }
 
@@ -722,9 +732,14 @@
 SWFHandlers::ActionMultiply(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
+
+       // env.top(1) *= env.top(0); //original version
+
     as_environment& env = thread.env;
     thread.ensureStack(2);
-    env.top(1) *= env.top(0);
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+       env.top(1) = operand1 * operand2;
     env.drop(1);
 }
 
@@ -732,9 +747,14 @@
 SWFHandlers::ActionDivide(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
+//
+       // env.top(1) /= env.top(0); //original version
+
     as_environment& env = thread.env;
     thread.ensureStack(2);
-    env.top(1) /= env.top(0);
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+       env.top(1) = operand1 / operand2;
     env.drop(1);
 }
 
@@ -755,7 +775,7 @@
 
     // Flash4 used 1 and 0 as return from this tag
     if ( env.get_version() < 5 ) {
-      env.top(1).to_number();
+      env.top(1).to_number(&env);
     } 
 
     env.drop(1);
@@ -767,7 +787,7 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(2);
-    env.top(1).set_bool(env.top(1).to_number() < env.top(0).to_number());
+    env.top(1).set_bool(env.top(1).to_number(&env) < 
env.top(0).to_number(&env));
     env.drop(1);
 }
 
@@ -841,9 +861,9 @@
        return;
     }
 
-    int size = unsigned(size_val.to_number());
+    int size = unsigned(size_val.to_number(&env));
 
-    int        base = int(base_val.to_number());  
+    int        base = int(base_val.to_number(&env));  
     int version = env.get_version();
     const tu_string& str = string_val.to_tu_string_versioned(version);
 
@@ -926,7 +946,7 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(1);
-    env.top(0).set_int(int(floor(env.top(0).to_number())));
+    env.top(0).set_int(int(floor(env.top(0).to_number(&env))));
 }
 
 void
@@ -1055,7 +1075,7 @@
        {
                target = env.find_target(tgt_val);
        }
-       unsigned int prop_number = (unsigned int)env.top(0).to_number();
+       unsigned int prop_number = (unsigned int)env.top(0).to_number(&env);
        if (target)
        {
                if ( prop_number < get_property_names().size() )
@@ -1097,7 +1117,7 @@
     thread.ensureStack(3); // prop val, prop num, target
 
     character *target = env.find_target(env.top(2));
-    unsigned int prop_number = (unsigned int)env.top(1).to_number();
+    unsigned int prop_number = (unsigned int)env.top(1).to_number(&env);
     as_value prop_val = env.top(0);
     
     if (target) {
@@ -1136,7 +1156,7 @@
                si->clone_display_object(
                        env.top(2).to_std_string(),
                        env.top(1).to_std_string(),
-                       (int) env.top(0).to_number());
+                       (int) env.top(0).to_number(&env));
        }
        env.drop(3);
 }
@@ -1202,10 +1222,10 @@
                // It looks like coordinates of drag bounds are
                // given as PIXELS :
                // http://www.richsalter.btinternet.co.uk/cks1/cks1.swf
-               float y1 = PIXELS_TO_TWIPS(env.top(3).to_number());
-               float x1 = PIXELS_TO_TWIPS(env.top(4).to_number());
-               float y0 = PIXELS_TO_TWIPS(env.top(5).to_number());
-               float x0 = PIXELS_TO_TWIPS(env.top(6).to_number());
+               float y1 = PIXELS_TO_TWIPS(env.top(3).to_number(&env));
+               float x1 = PIXELS_TO_TWIPS(env.top(4).to_number(&env));
+               float y0 = PIXELS_TO_TWIPS(env.top(5).to_number(&env));
+               float x0 = PIXELS_TO_TWIPS(env.top(6).to_number(&env));
 
                // check for swapped values
                if ( y1 < y0 )
@@ -1327,7 +1347,7 @@
 
        thread.ensureStack(1);  // max
 
-       int     max = int(env.top(0).to_number());
+       int     max = int(env.top(0).to_number(&env));
        if (max < 1) max = 1;
        env.top(0).set_int(tu_random::next_random() % max);
 }
@@ -1356,7 +1376,7 @@
     as_environment& env = thread.env;
     thread.ensureStack(1);  
     char       buf[2];
-    buf[0] = int(env.top(0).to_number());
+    buf[0] = int(env.top(0).to_number(&env));
     buf[1] = 0;
     env.top(0).set_string(buf);
 }
@@ -2075,7 +2095,7 @@
        }
 
        // Get number of args, modifying it if not enough values are on the 
stack.
-       unsigned nargs = unsigned(env.top(1).to_number());
+       unsigned nargs = unsigned(env.top(1).to_number(&env));
        unsigned available_args = env.stack_size()-2; // 2 for func name and 
nargs
        if ( available_args < nargs )
        {
@@ -2148,14 +2168,14 @@
     thread.ensureStack(2); // x, ,y
 
     as_value   result;
-    double     y = env.pop().to_number();
-    double     x = env.pop().to_number();
+    double     y = env.pop().to_number(&env);
+    double     x = env.pop().to_number(&env);
 //  Don't need to check for y being 0 here - if it's zero, fmod returns NaN
 //  which is what flash would do too
     result = fmod(x, y);
 //  env.top(1).set_double(fmod(env.top(1).to_bool() && env.top(0).to_bool());
 //  env.drop(1);
-//  log_error("modulo x=%f, y=%f, z=%f",x,y,result.to_number());
+//  log_error("modulo x=%f, y=%f, z=%f",x,y,result.to_number(&env));
     env.push(result);
 }
 
@@ -2175,7 +2195,7 @@
                        classname.c_str());
        );
 
-       unsigned nargs = unsigned(env.pop().to_number());
+       unsigned nargs = unsigned(env.pop().to_number(&env));
 
        thread.ensureStack(nargs); // previous 2 entries popped
 
@@ -2238,7 +2258,7 @@
 
     thread.ensureStack(1); // array size name
 
-    int        array_size = (int) env.pop().to_number();
+    int        array_size = (int) env.pop().to_number(&env);
     assert(array_size >= 0);
 
     thread.ensureStack((unsigned int)array_size); // array elements
@@ -2285,7 +2305,7 @@
     //     [003]   Integer: 1
     //    SWFACTION_INITOBJECT
     
-    int nmembers = (int) env.pop().to_number();
+    int nmembers = (int) env.pop().to_number(&env);
 
     thread.ensureStack(nmembers); // members
     
@@ -2424,8 +2444,8 @@
        }
        else 
        {
-               double op1 = operand1.to_number();
-               double op2 = operand2.to_number();
+               double op1 = operand1.to_number(&env);
+               double op2 = operand2.to_number(&env);
 
                if ( isnan(op1) || isnan(op2) )
                {
@@ -2460,7 +2480,7 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(1); 
-    env.top(0).convert_to_number();
+    env.top(0).convert_to_number(&env);
 }
 
 void
@@ -2590,7 +2610,7 @@
 
     thread.ensureStack(1); 
 
-    env.top(0) += 1;
+    env.top(0).set_double(env.top(0).to_number(&env)+1);
 }
 
 void
@@ -2599,7 +2619,7 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(1); 
-    env.top(0) -= 1;
+    env.top(0).set_double(env.top(0).to_number(&env)-1);
 }
 
 void
@@ -2621,7 +2641,7 @@
        as_value& obj_value = env.top(1);
 
        // Get number of args, modifying it if not enough values are on the 
stack.
-       unsigned nargs = unsigned(env.top(2).to_number());
+       unsigned nargs = unsigned(env.top(2).to_number(&env));
        unsigned available_args = env.stack_size()-3; // 3 for obj, func and 
nargs
        if ( available_args < nargs )
        {
@@ -2762,7 +2782,7 @@
        as_value obj_val = env.pop();
 
        // Get number of args, modifying it if not enough values are on the 
stack.
-       unsigned nargs = unsigned(env.pop().to_number());
+       unsigned nargs = unsigned(env.pop().to_number(&env));
        unsigned available_args = env.stack_size(); // previous 3 entries popped
        if ( available_args < nargs )
        {
@@ -2906,9 +2926,14 @@
 SWFHandlers::ActionBitwiseAnd(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
+
     as_environment& env = thread.env;
     thread.ensureStack(2); 
-    env.top(1) &= env.top(0);
+
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+
+       env.top(1) = int(operand1)&int(operand2); 
     env.drop(1);
 }
 
@@ -2918,7 +2943,11 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(2); 
-    env.top(1) |= env.top(0);
+
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+
+       env.top(1) = int(operand1)|int(operand2); 
     env.drop(1);
 }
 
@@ -2926,9 +2955,14 @@
 SWFHandlers::ActionBitwiseXor(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
+
     as_environment& env = thread.env;
     thread.ensureStack(2); 
-    env.top(1) ^= env.top(0);
+
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+
+       env.top(1) = int(operand1)^int(operand2); 
     env.drop(1);
 }
 
@@ -2936,9 +2970,16 @@
 SWFHandlers::ActionShiftLeft(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
+
+       // env.top(1).asr(env.top(0));
+
     as_environment& env = thread.env;
     thread.ensureStack(2); 
-    env.top(1).asr(env.top(0));
+
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+
+       env.top(1) = int(operand1) >> int(operand2); 
     env.drop(1);
 }
 
@@ -2946,9 +2987,16 @@
 SWFHandlers::ActionShiftRight(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
+//
+       //env.top(1).lsr(env.top(0));
+
     as_environment& env = thread.env;
     thread.ensureStack(2); 
-    env.top(1).lsr(env.top(0));
+
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+
+       env.top(1) = int(operand1) >> int(operand2); 
     env.drop(1);
 }
 
@@ -2956,9 +3004,15 @@
 SWFHandlers::ActionShiftRight2(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
+       // env.top(1).lsr(env.top(0));
+
     as_environment& env = thread.env;
     thread.ensureStack(2); 
-    env.top(1).lsr(env.top(0));
+
+       double operand1 = env.top(1).to_number(&env);
+       double operand2 = env.top(0).to_number(&env);
+
+       env.top(1) = uint32_t(operand1) >> int(operand2); 
     env.drop(1);
 }
 
@@ -2990,8 +3044,8 @@
        }
        else 
        {
-               double op1 = operand1.to_number();
-               double op2 = operand2.to_number();
+               double op1 = operand1.to_number(&env);
+               double op2 = operand2.to_number(&env);
 
                if ( isnan(op1) || isnan(op2) )
                {




reply via email to

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