gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ./ChangeLog server/action.cpp server/acti...


From: strk
Subject: [Gnash-commit] gnash ./ChangeLog server/action.cpp server/acti...
Date: Tue, 14 Feb 2006 13:55:59 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Branch:         
Changes by:     strk <address@hidden>   06/02/14 13:55:59

Modified files:
        .              : ChangeLog 
        server         : action.cpp action.h 

Log message:
        Implemented ACTION_CASTOP, not tested as Ming does not produce those 
blocks

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/ChangeLog.diff?tr1=1.135&tr2=1.136&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/server/action.cpp.diff?tr1=1.47&tr2=1.48&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/server/action.h.diff?tr1=1.18&tr2=1.19&r1=text&r2=text

Patches:
Index: gnash/ChangeLog
diff -u gnash/ChangeLog:1.135 gnash/ChangeLog:1.136
--- gnash/ChangeLog:1.135       Tue Feb 14 12:29:48 2006
+++ gnash/ChangeLog     Tue Feb 14 13:55:59 2006
@@ -1,9 +1,8 @@
 2006-02-14 Sandro Santilli <address@hidden>
 
-       * server/Object.{h,cpp}: new instanceOf(function_as_object*)
-       method.
-       * server/action.cpp: SWF::ACTION_INSTANCEOF implemented
-       * testsuite/actionscript.all/Inheritance.as: instanceOf tests
+       * server/Object.{h,cpp}: new instanceOf(function_as_object*) method.
+       * server/action.cpp: ACTION_INSTANCEOF and ACTION_CASTOP implemented.
+       * testsuite/actionscript.all/Inheritance.as: instanceOf tests.
 
 2006-02-14 Michael Carlson <address@hidden>
 
Index: gnash/server/action.cpp
diff -u gnash/server/action.cpp:1.47 gnash/server/action.cpp:1.48
--- gnash/server/action.cpp:1.47        Tue Feb 14 12:29:48 2006
+++ gnash/server/action.cpp     Tue Feb 14 13:55:59 2006
@@ -1827,7 +1827,7 @@
                                env->top(0).to_string());
                //);
 
-                       env->drop(2);
+                       env->drop(1);
                        env->top(0) = as_value(false); 
                        return;
                }
@@ -1838,6 +1838,40 @@
                //log_msg("tocheck: opcode %x\n", SWF::ACTION_INSTANCEOF);
        }
 
+       void
+       action_buffer::doActionCast(as_environment* env)
+       {
+               // Get the "super" function
+               function_as_object* super = env->top(0).to_as_function();
+
+               // Get the "instance" 
+               as_object* instance = env->top(1).to_object();
+
+               // Invalid args!
+               if ( ! super || ! instance )
+               {
+               //IF_VERBOSE_ACTION(
+                       log_msg("-- %s instance_of %s (invalid args?)\n",
+                               env->top(1).to_string(),
+                               env->top(0).to_string());
+               //);
+
+                       env->drop(1);
+                       env->top(0) = as_value(); 
+                       return;
+               }
+
+               env->drop(1);
+               if ( instance->instanceOf(super) ) {
+                       env->top(0) = as_value(instance);
+               } else {
+                       env->top(0) = as_value();
+               }
+
+               //log_msg("tocheck: opcode %x\n", SWF::ACTION_CASTOP);
+       }
+
+
        /*private*/
        void
        action_buffer::doActionCallMethod(as_environment* env)
@@ -2450,19 +2484,8 @@
                                }
 
                                case SWF::ACTION_CASTOP: // 0x2B
-                               {
-                                       // TODO
-                                       //
-                                       // Pop o1, pop s2
-                                       // Make sure o1 is an instance of s2.
-                                       // If the cast succeeds, push o1, else 
push NULL.
-                                       //
-                                       // The cast doesn't appear to coerce at 
all, it's more
-                                       // like a dynamic_cast<> in C++ I think.
-                                       log_error("todo opcode: %02X\n", 
action_id);
+                                       doActionCast(env);
                                        break;
-                               }
-
                                case SWF::ACTION_IMPLEMENTSOP: // 0x2C
                                {
                                        // Declare that a class s1 implements 
one or more
Index: gnash/server/action.h
diff -u gnash/server/action.h:1.18 gnash/server/action.h:1.19
--- gnash/server/action.h:1.18  Mon Feb 13 10:44:12 2006
+++ gnash/server/action.h       Tue Feb 14 13:55:59 2006
@@ -210,6 +210,8 @@
 
                void doActionInstanceOf(as_environment* env);
 
+               void doActionCast(as_environment* env);
+
                void doActionCallMethod(as_environment* env);
 
                void doActionCallFunction(as_environment* env,




reply via email to

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