gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ./ChangeLog server/Object.cpp server/Obje...


From: strk
Subject: [Gnash-commit] gnash ./ChangeLog server/Object.cpp server/Obje...
Date: Tue, 14 Feb 2006 12:29:48 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Branch:         
Changes by:     strk <address@hidden>   06/02/14 12:29:48

Modified files:
        .              : ChangeLog 
        server         : Object.cpp Object.h action.cpp 
        testsuite/actionscript.all: Inheritance.as 

Log message:
        * server/Object.{h,cpp}: new instanceOf(function_as_object*) method.
        * server/action.cpp: SWF::ACTION_INSTANCEOF implemented.
        * testsuite/actionscript.all/Inheritance.as: instanceOf tests.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/ChangeLog.diff?tr1=1.134&tr2=1.135&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/server/Object.cpp.diff?tr1=1.5&tr2=1.6&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/server/Object.h.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/server/action.cpp.diff?tr1=1.46&tr2=1.47&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/testsuite/actionscript.all/Inheritance.as.diff?tr1=1.1&tr2=1.2&r1=text&r2=text

Patches:
Index: gnash/ChangeLog
diff -u gnash/ChangeLog:1.134 gnash/ChangeLog:1.135
--- gnash/ChangeLog:1.134       Tue Feb 14 08:17:51 2006
+++ gnash/ChangeLog     Tue Feb 14 12:29:48 2006
@@ -1,3 +1,10 @@
+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
+
 2006-02-14 Michael Carlson <address@hidden>
 
        * server/array.cpp: Make tostring() and join() not output any 
@@ -16,15 +23,15 @@
 
        * testsuite/actionscript.all/xtrace.as: trace window enlarged.
        * testsuite/actionscript.all/Inheritance.as: inheritance test
-       * server/Object.h: new header file for definitions from as_object up to
-         as_value (will split again at sometime). gnash::as_object_interface 
class
-         definition merged with gnash::as_object, now directly derived from
-         gnash::resource.
+       * server/Object.h: new header file for definitions from as_object
+       up to as_value (will split again at sometime).
+       gnash::as_object_interface class definition merged with
+       gnash::as_object, now directly derived from gnash::resource.
        * server/action.cpp: doActionEquals and doActionStrictEquals private
-         action_buffer methods. Made as_value::to_object valid for AS_FUNCTION
-         value types
+       action_buffer methods. Made as_value::to_object valid for AS_FUNCTION
+       value types
        * server/Function.{cpp,h}: Made 'Function' an AS_FUNCTION to allow for
-         'prototype' based inheritance. Implemented Function.call
+       'prototype' based inheritance. Implemented Function.call
        
 
 2006-02-12 Michael Carlson <address@hidden>
Index: gnash/server/Object.cpp
diff -u gnash/server/Object.cpp:1.5 gnash/server/Object.cpp:1.6
--- gnash/server/Object.cpp:1.5 Mon Feb 13 10:44:12 2006
+++ gnash/server/Object.cpp     Tue Feb 14 12:29:48 2006
@@ -24,6 +24,7 @@
 
 //#include "Object.h"
 #include "action.h" // when we've finished, Object.h will stay, action.h away
+#include "Function.h"
 
 namespace gnash {
 
@@ -117,6 +118,7 @@
 
        return false;
 }
+
 void
 as_object::clear()
 {
@@ -128,5 +130,17 @@
        }
 }
 
+bool
+as_object::instanceOf(function_as_object* ctor)
+{
+       as_object* proto=m_prototype;
+       do {
+               if ( proto == ctor->m_properties ) return true;
+               proto = ctor->m_properties;
+       } while (proto);
+
+       return false;
+}
+
 } // end of gnash namespace
 
Index: gnash/server/Object.h
diff -u gnash/server/Object.h:1.1 gnash/server/Object.h:1.2
--- gnash/server/Object.h:1.1   Mon Feb 13 10:44:12 2006
+++ gnash/server/Object.h       Tue Feb 14 12:29:48 2006
@@ -483,6 +483,14 @@
        virtual movie*  to_movie() { return NULL; }
 
        void    clear();
+
+       /// Check whether this object is an instance of the given
+       /// function_as_object constructor
+       //
+       /// NOTE: built-in classes should NOT be C_FUNCTIONS for this to
+       /// work
+       ///
+       bool instanceOf(function_as_object* ctor);
 };
 
 } // namespace gnash
Index: gnash/server/action.cpp
diff -u gnash/server/action.cpp:1.46 gnash/server/action.cpp:1.47
--- gnash/server/action.cpp:1.46        Mon Feb 13 12:09:16 2006
+++ gnash/server/action.cpp     Tue Feb 14 12:29:48 2006
@@ -1813,52 +1813,29 @@
        action_buffer::doActionInstanceOf(as_environment* env)
        {
                // Get the "super" function
-               as_value& super = env->top(0);
+               function_as_object* super = env->top(0).to_as_function();
 
                // Get the "instance" 
-               as_value& instance = env->top(1);
-
+               as_object* instance = env->top(1).to_object();
 
+               // Invalid args!
+               if ( ! super || ! instance )
+               {
                //IF_VERBOSE_ACTION(
-                       log_msg("-- %s intance_of %s\n",
-                               instance.to_string(),
-                               super.to_string());
+                       log_msg("-- %s instance_of %s (invalid args?)\n",
+                               env->top(1).to_string(),
+                               env->top(0).to_string());
                //);
 
-               as_value result;
-
-               // If any of the two is undefined, result is false
-               if ( instance.get_type() == as_value::UNDEFINED || \
-                               super.get_type() == as_value::UNDEFINED ) 
-               {
-                       result.set_bool(false);
-               }
-               else
-               {
-
-                       // @@ TODO
-
-                       // Check if 'instance' implements all
-                       // methods of 'super'
-
-                       // @@ TODO
-
-                       result.set_undefined();
-
-
-       #if 0
-                       if ( instance->implements(super) ) {
-                               env->push(true);
-                       } else {
-                               env->push(false);
-                       }
-       #endif
+                       env->drop(2);
+                       env->top(0) = as_value(false); 
+                       return;
                }
-               // @@ TODO
-               log_error("tocheck opcode: ACTION_INSTANCEOF (%02X)\n", 
SWF::ACTION_INSTANCEOF);
 
                env->drop(1);
-               env->top(0) = result;
+               env->top(0) = as_value(instance->instanceOf(super));
+
+               //log_msg("tocheck: opcode %x\n", SWF::ACTION_INSTANCEOF);
        }
 
        /*private*/
@@ -2863,7 +2840,7 @@
                                        break;
                                case SWF::ACTION_INSTANCEOF:    // instance of
                                        // @@ TODO
-                                       log_error("todo opcode: %02X\n", 
action_id);
+                                       doActionInstanceOf(env);
                                        break;
                                case SWF::ACTION_ENUM2: // enumerate object
                                        // @@ TODO
Index: gnash/testsuite/actionscript.all/Inheritance.as
diff -u gnash/testsuite/actionscript.all/Inheritance.as:1.1 
gnash/testsuite/actionscript.all/Inheritance.as:1.2
--- gnash/testsuite/actionscript.all/Inheritance.as:1.1 Mon Feb 13 10:44:12 2006
+++ gnash/testsuite/actionscript.all/Inheritance.as     Tue Feb 14 12:29:48 2006
@@ -101,3 +101,8 @@
 check(subInstance.sayHello() == "hello from Sub" );
 subInstance.sayHello = function() { return "hello from subInstance"; };
 check(subInstance.sayHello() == "hello from subInstance" );
+
+// Test the instanceOf operator
+check(subInstance instanceOf Sub);
+check(subInstance instanceOf Super);
+check(subInstance instanceOf Object);




reply via email to

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