[Top][All Lists]
[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;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash ChangeLog TODO server/swf/ASHandlers.cpp,
Sandro Santilli <=