gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/asobj/flash/geom/Point_a...
Date: Mon, 19 May 2008 11:05:27 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  08/05/19 11:05:27

Modified files:
        .              : ChangeLog 
        server/asobj/flash/geom: Point_as.cpp 
        testsuite/actionscript.all: Point.as 

Log message:
        Chill-out monday hacking:
        
        * server/asobj/flash/geom/Point_as.cpp: implement Point.add(),
          Point.equals() and Point.clone()
        * testsuite/actionscript.all/Point.as: test Point.add(),
          Point.equals() and Point.clone().

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.6642&r2=1.6643
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/flash/geom/Point_as.cpp?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/Point.as?cvsroot=gnash&r1=1.1&r2=1.2

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.6642
retrieving revision 1.6643
diff -u -b -r1.6642 -r1.6643
--- ChangeLog   19 May 2008 08:35:06 -0000      1.6642
+++ ChangeLog   19 May 2008 11:05:26 -0000      1.6643
@@ -1,5 +1,12 @@
 2008-05-19 Sandro Santilli <address@hidden>
 
+       * server/asobj/flash/geom/Point_as.cpp: implement Point.add(),
+         Point.equals() and Point.clone()
+       * testsuite/actionscript.all/Point.as: test Point.add(),
+         Point.equals() and Point.clone().
+
+2008-05-19 Sandro Santilli <address@hidden>
+
        * configure.ac: add --with-plugins-install=user|system|prefix,
          default to user.
        * doc/C/refmanual/custompath_configuration.xml: document

Index: server/asobj/flash/geom/Point_as.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/flash/geom/Point_as.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/asobj/flash/geom/Point_as.cpp        17 May 2008 12:41:40 -0000      
1.8
+++ server/asobj/flash/geom/Point_as.cpp        19 May 2008 11:05:27 -0000      
1.9
@@ -112,27 +112,126 @@
 Point_add(const fn_call& fn)
 {
        boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
-       UNUSED(ptr);
-       LOG_ONCE( log_unimpl (__FUNCTION__) );
-       return as_value();
+
+       as_value x, y;
+       ptr->get_member(NSV::PROP_X, &x);
+       ptr->get_member(NSV::PROP_Y, &y);
+
+       as_value x1, y1;
+
+       if ( ! fn.nargs )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               log_aserror(_("%s: missing arguments"), "Point.add()");
+               );
+       }
+       else
+       {
+               if ( fn.nargs > 1 )
+               {
+                       IF_VERBOSE_ASCODING_ERRORS(
+                       std::stringstream ss; fn.dump_args(ss);
+                       log_aserror("Point.add(%s): %s", ss.str(), _("arguments 
after first discarded"));
+                       );
+               }
+               as_value& arg1 = fn.arg(0);
+               as_object* o = arg1.to_object().get();
+               if ( ! o )
+               {
+                       IF_VERBOSE_ASCODING_ERRORS(
+                       std::stringstream ss; fn.dump_args(ss);
+                       log_aserror("Point.add(%s): %s", ss.str(), _("first 
argument doesn't cast to object"));
+                       );
+               }
+               else
+               {
+                       if ( ! o->get_member(NSV::PROP_X, &x1) )
+                       {
+                               IF_VERBOSE_ASCODING_ERRORS(
+                               std::stringstream ss; fn.dump_args(ss);
+                               log_aserror("Point.add(%s): %s", ss.str(),
+                                       _("first argument casted to object 
doesn't contain an 'x' member"));
+                               );
+                       }
+                       if ( ! o->get_member(NSV::PROP_Y, &y1) )
+                       {
+                               IF_VERBOSE_ASCODING_ERRORS(
+                               std::stringstream ss; fn.dump_args(ss);
+                               log_aserror("Point.add(%s): %s", ss.str(),
+                                       _("first argument casted to object 
doesn't contain an 'y' member"));
+                               );
+                       }
+               }
+       }
+
+       x.newAdd(x1);
+       y.newAdd(y1);
+
+       boost::intrusive_ptr<as_object> ret = new Point_as;
+       ret->set_member(NSV::PROP_X, x);
+       ret->set_member(NSV::PROP_Y, y);
+
+       return as_value(ret.get());
 }
 
 static as_value
 Point_clone(const fn_call& fn)
 {
        boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
-       UNUSED(ptr);
-       LOG_ONCE( log_unimpl (__FUNCTION__) );
-       return as_value();
+
+       as_value x, y;
+       ptr->get_member(NSV::PROP_X, &x);
+       ptr->get_member(NSV::PROP_Y, &y);
+
+       boost::intrusive_ptr<as_object> ret = new Point_as;
+       ret->set_member(NSV::PROP_X, x);
+       ret->set_member(NSV::PROP_Y, y);
+
+       return as_value(ret.get());
 }
 
 static as_value
 Point_equals(const fn_call& fn)
 {
        boost::intrusive_ptr<Point_as> ptr = ensureType<Point_as>(fn.this_ptr);
-       UNUSED(ptr);
-       LOG_ONCE( log_unimpl (__FUNCTION__) );
-       return as_value();
+
+       if ( ! fn.nargs )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               log_aserror(_("%s: missing arguments"), "Point.equals()");
+               );
+               return as_value(false);
+       }
+
+       as_value& arg1 = fn.arg(0);
+       if ( ! arg1.is_object() )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               std::stringstream ss; fn.dump_args(ss);
+               log_aserror("Point.equals(%s): %s", ss.str(), _("First arg must 
be an object"));
+               );
+               return as_value(false);
+       }
+       as_object* o = arg1.to_object().get();
+       assert(o);
+       if ( ! o->instanceOf(getFlashGeomPointConstructor()) )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               std::stringstream ss; fn.dump_args(ss);
+               log_aserror("Point.equals(%s): %s %s", ss.str(), _("First arg 
must be an instance of"), "flash.geom.Point");
+               );
+               return as_value(false);
+       }
+
+       as_value x, y;
+       ptr->get_member(NSV::PROP_X, &x);
+       ptr->get_member(NSV::PROP_Y, &y);
+
+       as_value x1, y1;
+       o->get_member(NSV::PROP_X, &x1);
+       o->get_member(NSV::PROP_Y, &y1);
+
+       return as_value(x.equals(x1) && y.equals(y1));
 }
 
 static as_value

Index: testsuite/actionscript.all/Point.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/Point.as,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- testsuite/actionscript.all/Point.as 7 May 2008 08:03:40 -0000       1.1
+++ testsuite/actionscript.all/Point.as 19 May 2008 11:05:27 -0000      1.2
@@ -20,7 +20,7 @@
 // compile this test case with Ming makeswf, and then
 // execute it like this gnash -1 -r 0 -v out.swf
 
-rcsid="$Id: Point.as,v 1.1 2008/05/07 08:03:40 strk Exp $";
+rcsid="$Id: Point.as,v 1.2 2008/05/19 11:05:27 strk Exp $";
 
 #include "check.as"
 
@@ -93,12 +93,51 @@
 //-------------------------------------------------------------
 
 // TODO
+p0 = new Point('x', 'y');
+ret = p0.add();
+check(ret instanceof Point);
+check_equals(p0.toString(), '(x=x, y=y)');
+check_equals(ret.toString(), '(x=xundefined, y=yundefined)');
+String.prototype.x = 3; // to test it's used
+ret = p0.add('1');
+delete String.prototype.x;
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=x3, y=yundefined)');
+check_equals(p0.toString(), '(x=x, y=y)');
+ret = p0.add(1, '2');
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=xundefined, y=yundefined)');
+check_equals(p0.toString(), '(x=x, y=y)');
+
+p0 = new Point('x', 'y');
+p1 = new Point('x1', 'y1');
+ret = p0.add(p1);
+check(ret instanceof Point);
+check_equals(ret.toString(), '(x=xx1, y=yy1)');
+check_equals(p0.toString(), '(x=x, y=y)');
+check_equals(p1.toString(), '(x=x1, y=y1)');
+
+p0 = new Point(2, 3);
+p1 = { x:1, y:1 };
+ret = p0.add(p1);
+check_equals(ret.toString(), '(x=3, y=4)');
+
+ret = p0.add(p1, 4, 5, 6);
+check_equals(ret.toString(), '(x=3, y=4)');
 
 //-------------------------------------------------------------
 // Test Point.clone
 //-------------------------------------------------------------
 
-// TODO
+p0 = new Point(3, 4);
+p0.z = 5;
+p2 = p0.clone();
+check(p2 instanceof Point);
+check_equals(p2.toString(), "(x=3, y=4)");
+check_equals(typeof(p2.z), 'undefined');
+p2 = p0.clone(1, 2, 3);
+check(p2 instanceof Point);
+check_equals(p2.toString(), "(x=3, y=4)");
 
 //-------------------------------------------------------------
 // Test Point.distance (static)
@@ -110,7 +149,47 @@
 // Test Point.equals
 //-------------------------------------------------------------
 
-// TODO
+o0 = {};
+o0.valueOf = function() { return 4; };
+o1 = {};
+o1.valueOf = function() { return 4; };
+
+p0 = new Point(3, o0);
+check(p0.equals(p0));
+
+p1 = new Point(3, o1);
+check(p1.equals(p1));
+
+check(p0 != p1);
+check_equals(p0.toString(), p1.toString());
+
+check(!p0.equals(p1));
+check(!p1.equals(p0));
+
+ret = p0.equals();
+check_equals(typeof(ret), 'boolean');
+check(!ret);
+
+p2 = new Point(3, o1);
+check(p1.equals(p2));
+// Equals doesn't return true if p2 isn't an point
+p2 = {x:3, y:o1};
+ret = p1.equals(p2);
+check_equals(typeof(ret), 'boolean');
+check(!ret);
+// But we can cheat ...
+p2.__proto__ = Point.prototype;
+check(p1.equals(p2));
+// ... even with double jump to get there ...
+o3 = {}; o3.prototype = {}; o3.prototype.__proto__ = Point.prototype;
+p2.__proto__ = o3.prototype;
+check(p1.equals(p2));
+// ... but not with syntetized objects ?
+String.prototype.x = 3;
+String.prototype.y = o1;
+String.prototype.__proto__ = Point.prototype;
+check(!p1.equals('string'));
+
 
 //-------------------------------------------------------------
 // Test Point.interpolate (static)
@@ -146,6 +225,6 @@
 // END OF TEST
 //-------------------------------------------------------------
 
-check_totals(37);
+check_totals(71);
 
 #endif // OUTPUT_VERSION >= 8




reply via email to

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