gnash-commit
[Top][All Lists]
Advanced

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

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


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog TODO server/swf/ASHandlers.cpp
Date: Fri, 07 Jul 2006 14:52:39 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  06/07/07 14:52:39

Modified files:
        .              : ChangeLog TODO 
        server/swf     : ASHandlers.cpp 

Log message:
                * TODO: updated
                * server/swf/ASHandlers.cpp: implemented ActionEnum2
                (enumerate object), fixed ActionEnumerate to always set
                enumeration end.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.478&r2=1.479
http://cvs.savannah.gnu.org/viewcvs/gnash/TODO?cvsroot=gnash&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/ASHandlers.cpp?cvsroot=gnash&r1=1.33&r2=1.34

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.478
retrieving revision 1.479
diff -u -b -r1.478 -r1.479
--- ChangeLog   7 Jul 2006 13:49:40 -0000       1.478
+++ ChangeLog   7 Jul 2006 14:52:39 -0000       1.479
@@ -1,5 +1,9 @@
 2006-07-07 Sandro Santilli <address@hidden>
 
+       * TODO: updated
+       * server/swf/ASHandlers.cpp: implemented ActionEnum2
+       (enumerate object), fixed ActionEnumerate to always set
+       enumeration end.
        * server/ActionExec.cpp, server/Function.cpp, server/Function.h,
        server/Global.cpp, server/Makefile.am, server/MovieClipLoader.cpp,
        server/System.cpp, server/System.h, server/action.cpp,

Index: TODO
===================================================================
RCS file: /sources/gnash/gnash/TODO,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- TODO        11 May 2006 16:56:45 -0000      1.4
+++ TODO        7 Jul 2006 14:52:39 -0000       1.5
@@ -13,24 +13,24 @@
   8. Add support for external loading of media.
   9. SVG support ?
   10. Keep improving the plugin.
+  11. Play movies while reading (stream)
 
-unimplemented opcodes:
+Unimplemented opcodes:
 ----------------------
 
+case 0x08:     // toggle quality
 case 0x2A:      // throw
-case 0x2B:      // cast_object
+case 0x2B:      // cast_object (actually implemented, but untested)
 case 0x2C:      // implements
 case 0x31:      // mb length
 case 0x35:      // mb substring
 case 0x37:      // mb chr
-case 0x3A:      // delete
-case 0x3B:      // delete2
 case 0x43:      // declare object
 case 0x45:      // get target
 case 0x53:      // new method
-case 0x54:      // instance of
-case 0x55:      // enumerate object
 case 0x69:      // extends
+case 0x8A:     // wait for frame  (unneeded until we stream)
+case 0x8D:     // wait for frame expression (unneeded until we stream)
 case 0x8F:      // try
 
 Partially implemented classes are:
@@ -62,19 +62,9 @@
 CustomActions
 Video
 
-Unimplemented Opcodes are:
---------------------------
-Throw
-Implements
-Extends
-EnumObject
-Try
-NewMethod
-MDLength
-MDSubstring
-MDChr
-Delete
-GetTarget.
+
+Others
+------
 
 There is currently no FLV video, only minimal AMF data support,
 and no loading of external jpegs.

Index: server/swf/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/ASHandlers.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- server/swf/ASHandlers.cpp   7 Jul 2006 13:49:40 -0000       1.33
+++ server/swf/ASHandlers.cpp   7 Jul 2006 14:52:39 -0000       1.34
@@ -1136,8 +1136,6 @@
     dbglogfile << __PRETTY_FUNCTION__ << ": unimplemented!" << endl;
 }
 
-// TODO: continue adding ensure_stack() calls (above done)
-
 void
 SWFHandlers::ActionCastOp(ActionExec& thread)
 {
@@ -1181,6 +1179,8 @@
 {
 //     GNASH_REPORT_FUNCTION;
 
+       // assert(thread.code[thread.pc] == SWF::ACTION_IMPLEMENTSOP);
+
        //as_environment& env = thread.env;
        dbglogfile << __PRETTY_FUNCTION__ << ": unimplemented!" << endl;
 }
@@ -1962,63 +1962,93 @@
     dbglogfile << __PRETTY_FUNCTION__ << ": unimplemented!" << endl;
 }
 
-void
-SWFHandlers::ActionEnumerate(ActionExec& thread)
+// Push a each object's member value on the stack
+// This is an utility function for use by ActionEnumerate
+// and ActionEnum2. The caller is expected to have
+// already set the top-of-stack to the NULL value (as an optimization)
+static void
+enumerateObject(as_environment& env, const as_object& obj)
 {
-//    GNASH_REPORT_FUNCTION;
-    as_environment& env = thread.env;
 
-    ensure_stack(env, 1);  // var_name
+       assert( env.top(0).get_type() == as_value::NULLTYPE );
 
-    as_value var_name = env.pop();
-    const tu_string& var_string = var_name.to_tu_string();
+       typedef stringi_hash<as_member>::const_iterator members_iterator;
     
-    as_value variable = env.get_variable(var_string);
+       for ( members_iterator
+               it=obj.m_members.begin(), itEnd=obj.m_members.end();
+               it!=itEnd;
+               ++it )
+       {
+               const as_member member = it->second;
     
-       // @@ shouldn't we return *only* after pushing the nullvalue
-       // below ?
-    if (variable.to_object() == NULL) {
-       dbglogfile << __PRETTY_FUNCTION__ << ": CHECKME: are we required to 
always push at least a NULL value ?" << endl;
-        return;
-    }
-    const as_object* object = (as_object*) (variable.to_object());
+               if (! member.get_member_flags().get_dont_enum())
+               {
+                       // shouldn't this be a tu_string instead ?
+                       // we need to support UTF8 too I guess
+                       const char* val = it->first.c_str();
     
-    // The end of the enumeration
-    as_value nullvalue;
-    nullvalue.set_null();
-    env.push(nullvalue);
-    log_action("---enumerate - push: NULL\n");
+                       env.push(as_value(val));
+                       log_action("---enumerate - push: %s\n", val);
+               }
     
-    stringi_hash<as_member>::const_iterator it = object->m_members.begin();
-    while (it != object->m_members.end()) {
-        const as_member member = (it->second);
+       }
         
-        if (! member.get_member_flags().get_dont_enum()) {
-            env.push(as_value(it->first.c_str()));
+       // Enumerate __proto__ ?? are we sure this is required ?
+       // Should we recurse then ?
             
-            log_action("---enumerate - push: %s\n",
-                                      it->first.c_str());
-        }
+       const as_object *prototype = obj.m_prototype;
         
-        ++it;
-    }
+       if (prototype == NULL) return; // no proto, no enums
     
-    const as_object * prototype = (as_object *) object->m_prototype;
-    if (prototype != NULL) {
-        stringi_hash<as_member>::const_iterator it = 
prototype->m_members.begin();
-        while (it != prototype->m_members.end()) {
-            const as_member member = (it->second);
+       const as_object& proto = *prototype; // just type less ;)
+       for ( members_iterator
+               it=proto.m_members.begin(), itEnd=proto.m_members.end();
+               it!=itEnd;
+               ++it )
+       {
+               const as_member member = it->second;
             
-            if (! member.get_member_flags().get_dont_enum()) {
-                env.push(as_value(it->first.c_str()));
+               if (! member.get_member_flags().get_dont_enum())
+               {
+                       // shouldn't this be a tu_string instead ?
+                       // we need to support UTF8 too I guess
+                       const char* val = it->first.c_str();
                 
-                log_action("---enumerate - push: %s\n",
-                           it->first.c_str());
+                       env.push(as_value(val));
+                       log_action("---enumerate - push: %s\n", val);
             }
             
-            ++it;
         };
+
+}
+
+void
+SWFHandlers::ActionEnumerate(ActionExec& thread)
+{
+//    GNASH_REPORT_FUNCTION;
+       as_environment& env = thread.env;
+
+       ensure_stack(env, 1);  // var_name
+
+       // Get the object
+       as_value& var_name = env.top(0);
+       const tu_string& var_string = var_name.to_tu_string();
+       as_value variable = env.get_variable(var_string);
+       const as_object* obj = variable.to_object();
+
+       // The end of the enumeration, don't set top(0) *before*
+       // fetching the as_object* obj above or it will get lost
+       env.top(0).set_null();
+       log_action("---enumerate - push: NULL\n");
+
+       if ( ! obj )
+       {
+               log_warning("Top of stack not an object (%s) at ActionEnum2 "
+                       " execution", variable.to_string());
+               return;
     }
+
+       enumerateObject(env, *obj);
 }
 
 void
@@ -2296,10 +2326,32 @@
 }
 
 void
-SWFHandlers::ActionEnum2(ActionExec& /*thread*/)
+SWFHandlers::ActionEnum2(ActionExec& thread)
 {
 //    GNASH_REPORT_FUNCTION;
-//    as_environment& env = thread.env;
+
+       as_environment& env = thread.env;
+
+       ensure_stack(env, 1); // object
+
+       // Get the object
+       as_value& obj_val = env.top(0);
+       as_object* obj = obj_val.to_object();
+
+       // The end of the enumeration, don't set top(0) *before*
+       // fetching the as_object* obj above or it will get lost
+       env.top(0).set_null(); 
+       log_action("---enumerate - push: NULL\n");
+
+       if ( ! obj )
+       {
+               log_warning("Top of stack not an object (%s) at ActionEnum2 "
+                       " execution", obj_val.to_string());
+               return;
+       }
+
+       enumerateObject(env, *obj);
+
     dbglogfile << __PRETTY_FUNCTION__ << ": unimplemented!" << endl;
 }
 




reply via email to

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