gnash-commit
[Top][All Lists]
Advanced

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

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


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/vm/ASHandlers.cpp
Date: Mon, 16 Apr 2007 07:10:45 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  07/04/16 07:10:45

Modified files:
        .              : ChangeLog 
        server/vm      : ASHandlers.cpp 

Log message:
                * server/vm/ASHandlers.cpp: always pass an as_environment 
pointer
                  when converting as_value to a string, use to_string rather
                  then to_std_string() when a reference is enough; 
(ActionDuplicateClip):
                  properly cleanup the stack on error; 
(ActionGotoFrameExpression):
                  properly handle unknown target.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2880&r2=1.2881
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.91&r2=1.92

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2880
retrieving revision 1.2881
diff -u -b -r1.2880 -r1.2881
--- ChangeLog   16 Apr 2007 06:23:21 -0000      1.2880
+++ ChangeLog   16 Apr 2007 07:10:44 -0000      1.2881
@@ -1,5 +1,10 @@
 2007-04-16 Sandro Santilli <address@hidden>
 
+       * server/vm/ASHandlers.cpp: always pass an as_environment pointer
+         when converting as_value to a string, use to_string rather 
+         then to_std_string() when a reference is enough; 
(ActionDuplicateClip): 
+         properly cleanup the stack on error; (ActionGotoFrameExpression):
+         properly handle unknown target.
        * testsuite/misc-ming.all/Makefile.am:
          Activated get_frame_number and frame_label_test.
 

Index: server/vm/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -b -r1.91 -r1.92
--- server/vm/ASHandlers.cpp    16 Apr 2007 01:02:17 -0000      1.91
+++ server/vm/ASHandlers.cpp    16 Apr 2007 07:10:45 -0000      1.92
@@ -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.91 2007/04/16 01:02:17 zoulunkai Exp $ */
+/* $Id: ASHandlers.cpp,v 1.92 2007/04/16 07:10:45 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -824,7 +824,7 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(2);
-    env.top(1).set_bool(env.top(1).to_string() == env.top(0).to_string());
+    env.top(1).set_bool(env.top(1).to_string(&env) == 
env.top(0).to_string(&env));
     env.drop(1);    
 }
 
@@ -956,15 +956,13 @@
        thread.ensureStack(1); // variable name
 
        as_value& top_value = env.top(0);
-       const char* ptr = top_value.to_string().c_str();
-       if ( ! ptr )
+       string var_string = top_value.to_string(&env);
+       if ( var_string.empty() )
        {
                top_value.set_undefined();
                return;
        }
 
-       string var_string(ptr);
-
        top_value = thread.getVariable(var_string);
 
        IF_VERBOSE_ACTION
@@ -977,7 +975,7 @@
                } else {
                        log_action("-- get var: %s=%s at %p",
                                var_string.c_str(),
-                               top_value.to_string().c_str(),
+                               top_value.to_string(&env).c_str(),
                                (void*)obj.get());
                }
        );
@@ -996,8 +994,8 @@
        // stack must be contain at least two items
        thread.ensureStack(2); 
 
-       assert(env.top(1).to_string().c_str());
-        string name = env.top(1).to_std_string();
+       assert(env.top(1).to_string(&env).c_str());
+        string name = env.top(1).to_string(&env);
        thread.setVariable(name, env.top(0));
 
         IF_VERBOSE_ACTION (
@@ -1024,9 +1022,9 @@
 
        //Vitaly: env.drop(1) remove object on which refers const char * 
target_name
        //strk: shouldn't we use env.pop() instead ? No (see above comment)
-       //const char * target_name = env.top(0).to_string();
-       assert(env.top(0).to_string().c_str());
-       string target_name = env.top(0).to_string();
+       //const char * target_name = env.top(0).to_string(&env);
+       assert(env.top(0).to_string(&env).c_str());
+       string target_name = env.top(0).to_string(&env);
        env.drop(1); // pop the target name off the stack
 
        CommonSetTarget(env, target_name);
@@ -1145,8 +1143,8 @@
        thread.ensureStack(3); 
 
        int depth = 
int(env.top(0).to_number(&env))+character::staticDepthOffset;
-       std::string newname = env.top(1).to_std_string(&env);
-       std::string path = env.top(2).to_std_string(&env);
+       const std::string& newname = env.top(1).to_string(&env);
+       const std::string& path = env.top(2).to_string(&env);
 
        character* ch = env.find_target(path);
        if ( ! ch )
@@ -1155,6 +1153,7 @@
                log_aserror("Path given to duplicateMovieClip(%s) doesn't point 
to a character",
                        path.c_str());
                );
+               env.drop(3);
                return;
        }
 
@@ -1165,6 +1164,7 @@
                log_aserror("Path given to duplicateMovieClip(%s) is not a 
sprite",
                        path.c_str());
                );
+               env.drop(3);
                return;
        }
 
@@ -1180,7 +1180,7 @@
 
        thread.ensureStack(1); 
 
-       std::string path = env.pop().to_std_string();
+       std::string path = env.pop().to_string(&env);
 
        character* ch = env.find_target(path);
        if ( ! ch )
@@ -1303,7 +1303,7 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(2); 
-    env.top(1).set_bool(env.top(1).to_string() < env.top(0).to_string());
+    env.top(1).set_bool(env.top(1).to_string(&env) < 
env.top(0).to_string(&env));
 }
 
 void
@@ -1394,7 +1394,15 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(1);  
-    env.top(0).set_int(env.top(0).to_string()[0]);
+    string str = env.top(0).to_string(&env);
+    if ( str.empty() )
+    {
+       env.top(0).set_undefined();
+    }
+    else
+    {
+       env.top(0).set_int(str.c_str()[0]);
+    }
 }
 
 void
@@ -1767,10 +1775,10 @@
                sendVarsMethod=0;
        }
 
-       const char* target_string = NULL;
+       string target_string;
        if ( ! target.is_undefined() && ! target.is_null() )
        {
-               target_string = target.to_string(&env).c_str();
+               target_string = target.to_string(&env);
        }
 
        // If the url starts with "FSCommand:", then this is
@@ -1780,7 +1788,7 @@
                if (s_fscommand_handler)
                {
                        // Call into the app.
-                       
(*s_fscommand_handler)(env.get_target()->get_root_movie(), url_c + 10, 
target_string);
+                       
(*s_fscommand_handler)(env.get_target()->get_root_movie(), url_c + 10, 
target_string.c_str());
                }
 
                return;
@@ -1815,7 +1823,7 @@
        const URL& baseurl = get_base_url();
        URL url(url_s, baseurl);
 
-       log_msg("get url: target=%s, url=%s (%s)", target_string,
+       log_msg("get url: target=%s, url=%s (%s)", target_string.c_str(),
                url.str().c_str(), url_c);
 
        if ( loadTargetFlag )
@@ -1824,7 +1832,7 @@
                if ( ! target_ch )
                {
                        log_error("get url: target %s not found",
-                               target_string);
+                               target_string.c_str());
                        return;
                }
 
@@ -1832,7 +1840,7 @@
                if ( ! target_movie ) 
                {
                        log_error("get url: target %s is not a sprite",
-                               target_string);
+                               target_string.c_str());
                        return;
                }
 
@@ -1840,7 +1848,7 @@
                {
                        log_msg("getURL2 loadVariable");
 
-                       //log_warning("Unhandled GetUrl2 loadVariable flag. 
loadTargetFlag=%d, target=%s (%s)", loadTargetFlag, target.typeOf(), 
target.to_string());
+                       //log_warning("Unhandled GetUrl2 loadVariable flag. 
loadTargetFlag=%d, target=%s (%s)", loadTargetFlag, target.typeOf(), 
target.to_string(&env).c_str());
                        target_movie->loadVariables(url, sendVarsMethod);
                }
                else
@@ -1877,9 +1885,9 @@
                string command = "firefox -remote \"openurl(";
                command += url.str();
 #if 0 // target testing
-               if ( target_string )
+               if ( ! target_string.empty() )
                {
-                       command += ", " + string(target_string);
+                       command += ", " + target_string;
                }
 #endif
                command += ")\"";
@@ -1940,8 +1948,8 @@
        }
        else
        {
-               const char* url = url_val.to_string().c_str();
-               CommonGetUrl(env, env.top(0), url, method);
+               const string& url = url_val.to_string(&env);
+               CommonGetUrl(env, env.top(0), url.c_str(), method);
        }
                  
        env.drop(2);
@@ -1987,7 +1995,7 @@
 
        thread.ensureStack(1); // frame spec
 
-       string target_frame = env.top(0).to_std_string();
+       string target_frame = env.top(0).to_string(&env);
        string target_path;
        string frame_var;
        
@@ -2046,11 +2054,11 @@
        unsigned char play_flag = code[pc + 3];
        sprite_instance::play_state state = play_flag ? sprite_instance::PLAY : 
sprite_instance::STOP;
                  
-       string target_frame = env.pop().to_std_string();
+       string target_frame = env.pop().to_string(&env);
        string target_path;
        string frame_var;
        
-       character * target;
+       character * target = NULL;
        if( env.parse_path(target_frame, target_path, frame_var) )
        {
                target = env.find_target(target_path);
@@ -2061,7 +2069,7 @@
                frame_var = target_frame;
        }
        
-       sprite_instance *target_sprite = target->to_movie();
+       sprite_instance *target_sprite = target ? target->to_movie() : NULL;
        if(target_sprite)
        {
                size_t frame_number;
@@ -2111,7 +2119,7 @@
 
        as_value var = env.pop();
 
-       bool ret = thread.delVariable(var.to_std_string());
+       bool ret = thread.delVariable(var.to_string(&env));
        env.push(as_value(ret));
 
        return;
@@ -2129,7 +2137,7 @@
        thread.ensureStack(1); // var
 
        // See bug #18482, this works fine now (assuming the bug report is 
correct)
-       env.top(0) = thread.delVariable(env.top(0).to_std_string());
+       env.top(0) = thread.delVariable(env.top(0).to_string(&env));
 }
 
 void
@@ -2141,10 +2149,10 @@
 
     as_value value = env.pop();
     as_value varname = env.pop();
-    thread.setLocalVariable(varname.to_std_string(), value);
+    thread.setLocalVariable(varname.to_string(&env), value);
 
     IF_VERBOSE_ACTION (
-    log_action("-- set local var: %s = %s", varname.to_string().c_str(), 
value.to_debug_string().c_str());
+    log_action("-- set local var: %s = %s", varname.to_string(&env).c_str(), 
value.to_debug_string().c_str());
     );
 }
 
@@ -2164,7 +2172,7 @@
        as_value function = thread.getVariable(env.top(0).to_std_string(&env));
        if ( ! function.is_object() ) 
        {
-               log_aserror("ActionCallFunction: %s is not an object", 
env.top(0).to_string().c_str());
+               log_aserror("ActionCallFunction: %s is not an object", 
env.top(0).to_string(&env).c_str());
        }
        else if ( ! function.is_function() ) 
        {
@@ -2198,7 +2206,7 @@
        as_value result = call_method(function, &env, thread.getThisPointer(),
                                  nargs, env.get_top_index() - 2);
 
-       //log_msg("Function's result: %s", result.to_string());
+       //log_msg("Function's result: %s", result.to_string(&env));
     
        env.drop(nargs + 1);
        env.top(0) = result;
@@ -2228,7 +2236,7 @@
        env.drop(1);
 
 #ifdef USE_DEBUGGER
-//        cerr << "Returning from function: " << env.top(0).to_string() << 
endl;
+//        cerr << "Returning from function: " << env.top(0).to_string(&env) << 
endl;
         debugger.callStackPop();
 #endif
 
@@ -2269,7 +2277,7 @@
        thread.ensureStack(2); // classname, nargs
 
        as_value val = env.pop();
-       string classname = val.to_std_string();;
+       string classname = val.to_string(&env);;
 
        IF_VERBOSE_ACTION (
                log_action("---new object: %s",
@@ -2317,7 +2325,7 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(1); // var name
-    string varname = env.top(0).to_std_string();
+    const string& varname = env.top(0).to_string(&env);
     if ( thread.isFunction() )
     {
        env.declare_local(varname);
@@ -2357,9 +2365,10 @@
     as_value   index_number;
     for (int i = 0; i < array_size; i++) {
         // @@ TODO a set_member that takes an int or as_value?
+       // @@ TODO: don'e use as_value for converting a number to a string !!
         index_number.set_int(i);
-        //ao->set_member(index_number.to_string(), env.pop());
-        thread.setObjectMember(*ao, index_number.to_std_string(), env.pop());
+        //ao->set_member(index_number.to_string(&env), env.pop());
+        thread.setObjectMember(*ao, index_number.to_string(&env), env.pop());
     }
     
     env.push(result);
@@ -2395,7 +2404,7 @@
     // Set provided members
     for (int i=0; i<nmembers; ++i) {
         as_value member_value = env.pop();
-       string member_name = env.pop().to_std_string();
+       string member_name = env.pop().to_string(&env);
         //new_obj_ptr->set_member(member_name, member_value);
        thread.setObjectMember(*new_obj_ptr, member_name, member_value);
     }
@@ -2500,7 +2509,7 @@
     as_value& v1 = env.top(0);
     as_value& v2 = env.top(1);
 
-    //log_msg("ActionNewAdd(%s[%s],%s[%s]) called", v1.typeOf(), 
v1.to_string(), v2.typeOf(), v2.to_string());
+    //log_msg("ActionNewAdd(%s, %s) called", v1.to_debug_string().c_str(), 
v2.to_debug_string().c_str());
 
 
     if (v1.is_string() || v2.is_string() )
@@ -2537,7 +2546,7 @@
 
        if ( operand1.is_string() && operand2.is_string() )
        {
-               env.top(1).set_bool(operand1.to_std_string() < 
operand2.to_std_string());
+               env.top(1).set_bool(operand1.to_string(&env) < 
operand2.to_string(&env));
        }
        else 
        {
@@ -2628,7 +2637,7 @@
     if (!obj) {
 //         IF_VERBOSE_DEBUG(log_msg("getMember called against "
 //                                  "a value that does not cast "
-//                                  "to an as_object: %s", 
target.to_string()));
+//                                  "to an as_object: %s", 
target.to_string(&env).c_str()));
         env.top(1).set_undefined();
         env.drop(1);
         return;
@@ -2645,7 +2654,7 @@
         int len = target.to_string_versioned(version).size();
         env.top(1).set_int(len); 
     } else {
-        if ( ! thread.getObjectMember(*obj, member_name.to_std_string(), 
env.top(1)) )
+        if ( ! thread.getObjectMember(*obj, member_name.to_string(&env), 
env.top(1)) )
        {
             env.top(1).set_undefined();
         }
@@ -2670,7 +2679,7 @@
        thread.ensureStack(3); // value, member, object
 
        boost::intrusive_ptr<as_object> obj = env.top(2).to_object();
-       string member_name = env.top(1).to_std_string();
+       const string& member_name = env.top(1).to_string(&env);
        const as_value& member_value = env.top(0);
 
        if (obj)
@@ -2757,7 +2766,7 @@
        log_action(" method nargs: %d", nargs);
        );
 
-       string method_string = method_name.to_std_string();
+       string method_string = method_name.to_string(&env);
        as_value method_val;
        boost::intrusive_ptr<as_object> obj = obj_value.to_object(); 
        if ( method_name.is_undefined() || method_string.empty() )
@@ -2842,8 +2851,8 @@
 //     // IT IS NOT GUARANTEE WE DO HAVE A METHOD NAME HERE !
        if ( ! method_name.is_undefined() )
        {
-               debugger.callStackPush(method_name.to_std_string());
-               debugger.matchBreakPoint(method_name.to_std_string(), true);
+               debugger.callStackPush(method_name.to_string(&env));
+               debugger.matchBreakPoint(method_name.to_string(&env), true);
        }
        else
        {
@@ -2905,7 +2914,7 @@
                return;
        }
 
-       string method_string = method_name.to_std_string();
+       string method_string = method_name.to_string(&env);
        as_value method_val;
        if ( method_name.is_undefined() || method_string.empty() )
        {
@@ -2943,8 +2952,8 @@
        boost::intrusive_ptr<as_object> new_obj = construct_object(method.get(),
                        env, nargs, env.get_top_index());
 
-       //log_msg("%s( [%d args] ) returned %s", method_val.to_string(),
-       //      nargs, new_obj.to_string());
+       //log_msg("%s( [%d args] ) returned %s", method_val.to_string(&env),
+       //      nargs, new_obj.to_string(&env));
 
 
        env.drop(nargs);
@@ -3134,7 +3143,7 @@
 
        if ( operand1.is_string() && operand2.is_string() )
        {
-               env.top(1).set_bool(operand1.to_std_string() > 
operand2.to_std_string());
+               env.top(1).set_bool(operand1.to_string(&env) > 
operand2.to_string(&env));
        }
        else 
        {
@@ -3159,7 +3168,7 @@
 //    GNASH_REPORT_FUNCTION;
     as_environment& env = thread.env;
     thread.ensureStack(2); 
-    env.top(1).set_bool(env.top(1).to_string() > env.top(0).to_string());
+    env.top(1).set_bool(env.top(1).to_string(&env) > 
env.top(0).to_string(&env));
     env.drop(1);
 }
 




reply via email to

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