CVSROOT: /sources/gnash Module name: gnash Changes by: Sandro Santilli <strk> 07/08/25 14:15:51
Modified files: . : ChangeLog server : as_value.cpp as_value.h server/vm : ASHandlers.cpp testsuite/actionscript.all: Number.as ops.as toString_valueOf.as Log message: * server/vm/ASHandlers.cpp (ActionNewAdd): convert operands to primitive value before proceeding. * server/as_value.h: make to_primitive() public * server/as_value.cpp (to_number): if valueOf returned a string value call to_number() again on it; (equals): if one operand is a string and the other is a number, don't compare unless the string converts to a non-infinite number. * testsuite/actionscript.all/Number.as: add test for 'string' convertion to number returning NaN * testsuite/actionscript.all/ops.as: xcheck => check * testsuite/actionscript.all/toString_valueOf.as xcheck => check CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4099&r2=1.4100 http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.66&r2=1.67 http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.h?cvsroot=gnash&r1=1.63&r2=1.64 http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.125&r2=1.126 http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/Number.as?cvsroot=gnash&r1=1.27&r2=1.28 http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/ops.as?cvsroot=gnash&r1=1.17&r2=1.18 http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/toString_valueOf.as?cvsroot=gnash&r1=1.5&r2=1.6 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.4099 retrieving revision 1.4100 diff -u -b -r1.4099 -r1.4100 --- ChangeLog 24 Aug 2007 16:07:26 -0000 1.4099 +++ ChangeLog 25 Aug 2007 14:15:49 -0000 1.4100 @@ -1,3 +1,17 @@ +2007-08-25 Sandro Santilli <[EMAIL PROTECTED]> + + * server/vm/ASHandlers.cpp (ActionNewAdd): convert operands to + primitive value before proceeding. + * server/as_value.h: make to_primitive() public + * server/as_value.cpp (to_number): if valueOf returned a string value + call to_number() again on it; (equals): if one operand is a string + and the other is a number, don't compare unless the string converts + to a non-infinite number. + * testsuite/actionscript.all/Number.as: add test for 'string' + convertion to number returning NaN + * testsuite/actionscript.all/ops.as: xcheck => check + * testsuite/actionscript.all/toString_valueOf.as xcheck => check + 2007-08-24 Sandro Santilli <[EMAIL PROTECTED]> * server/dlist.{h,cpp} (replace_character): call unload() on replaced Index: server/as_value.cpp =================================================================== RCS file: /sources/gnash/gnash/server/as_value.cpp,v retrieving revision 1.66 retrieving revision 1.67 diff -u -b -r1.66 -r1.67 --- server/as_value.cpp 24 Aug 2007 16:07:27 -0000 1.66 +++ server/as_value.cpp 25 Aug 2007 14:15:50 -0000 1.67 @@ -299,6 +299,10 @@ { return ret.m_number_value; } + else if ( ret.is_string() ) + { + return ret.to_number(); + } else { log_msg(_("[object %p].%s() did not return a number: %s"), @@ -687,14 +691,18 @@ // return the result of the comparison x == ToNumber(y). else if (m_type == NUMBER && v.m_type == STRING) { - return equalsSameType(v.to_number(&env)); + double n = v.to_number(&env); // no need for the env actually + if ( ! isfinite(n) ) return false; + return equalsSameType(n); } // 17. If Type(x) is String and Type(y) is Number, // return the result of the comparison ToNumber(x) == y. else if (v.m_type == NUMBER && m_type == STRING) { - return v.equalsSameType(to_number(&env)); + double n = to_number(&env); // no need for the env actually + if ( ! isfinite(n) ) return false; + return v.equalsSameType(n); } // 18. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y. Index: server/as_value.h =================================================================== RCS file: /sources/gnash/gnash/server/as_value.h,v retrieving revision 1.63 retrieving revision 1.64 diff -u -b -r1.63 -r1.64 --- server/as_value.h 13 Aug 2007 02:47:58 -0000 1.63 +++ server/as_value.h 25 Aug 2007 14:15:51 -0000 1.64 @@ -15,7 +15,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -/* $Id: as_value.h,v 1.63 2007/08/13 02:47:58 strk Exp $ */ +/* $Id: as_value.h,v 1.64 2007/08/25 14:15:51 strk Exp $ */ #ifndef GNASH_AS_VALUE_H #define GNASH_AS_VALUE_H @@ -424,6 +424,16 @@ /// or NULL if it is not an ActionScript function. as_function* to_as_function() const; + /// Return value as a primitive type + // + /// Primitive types are: undefined, null, boolean, string, number. + /// See ECMA-2.6.2 (section 4.3.2). + /// + /// @param env + /// The environment to use for calling the valueOf method. + /// + as_value to_primitive(as_environment& env) const; + /// Force type to number. // /// @param env @@ -573,16 +583,6 @@ void set_sprite(const std::string& path); - /// Return value as a primitive type - // - /// Primitive types are: undefined, null, boolean, string, number. - /// See ECMA-2.6.2 (section 4.3.2). - /// - /// @param env - /// The environment to use for calling the valueOf method. - /// - as_value to_primitive(as_environment& env) const; - /// Compare values of the same type // /// NOTE: will abort if values are not of the same type! Index: server/vm/ASHandlers.cpp =================================================================== RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v retrieving revision 1.125 retrieving revision 1.126 diff -u -b -r1.125 -r1.126 --- server/vm/ASHandlers.cpp 23 Aug 2007 16:50:56 -0000 1.125 +++ server/vm/ASHandlers.cpp 25 Aug 2007 14:15:51 -0000 1.126 @@ -17,7 +17,7 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // -/* $Id: ASHandlers.cpp,v 1.125 2007/08/23 16:50:56 strk Exp $ */ +/* $Id: ASHandlers.cpp,v 1.126 2007/08/25 14:15:51 strk Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -2765,18 +2765,21 @@ thread.ensureStack(2); - as_value& v1 = env.top(0); - as_value& v2 = env.top(1); + as_value& v1_in = env.top(0); + as_value& v2_in = env.top(1); - //log_msg(_("ActionNewAdd(%s, %s) called"), v1.to_debug_string().c_str(), v2.to_debug_string().c_str()); + as_value v1 = v1_in.to_primitive(env); + as_value v2 = v2_in.to_primitive(env); + + //log_msg(_("ActionNewAdd(%s, %s) [prim %s, %s] called"), v1_in.to_debug_string().c_str(), v2_in.to_debug_string().c_str(), v1.to_debug_string().c_str(), v2.to_debug_string().c_str()); if (v1.is_string() || v2.is_string() ) { int version = env.get_version(); - // modify env.top(1) v2.convert_to_string_versioned(version, &env); v2.string_concat(v1.to_string_versioned(version, &env)); + v2_in = v2; // modify env.top(1) } else { @@ -2786,7 +2789,9 @@ double v1num = v1.to_number(&env); //log_msg(_("v1 num = %g"), v1num); - v2.set_double(v2num + v1num); // modify env.top(1) + v2.set_double(v2num + v1num); + + v2_in = v2; // modify env.top(1) } env.drop(1); } Index: testsuite/actionscript.all/Number.as =================================================================== RCS file: /sources/gnash/gnash/testsuite/actionscript.all/Number.as,v retrieving revision 1.27 retrieving revision 1.28 diff -u -b -r1.27 -r1.28 --- testsuite/actionscript.all/Number.as 26 Jul 2007 03:41:19 -0000 1.27 +++ testsuite/actionscript.all/Number.as 25 Aug 2007 14:15:51 -0000 1.28 @@ -27,7 +27,7 @@ // TODO: test with SWF target != 6 (the only one tested so far) // -rcsid="$Id: Number.as,v 1.27 2007/07/26 03:41:19 strk Exp $"; +rcsid="$Id: Number.as,v 1.28 2007/08/25 14:15:51 strk Exp $"; #include "check.as" @@ -346,6 +346,9 @@ asm { push 'val','2p' tonumber setvariable }; check(isNaN(val)); +asm { push 'val','string' tonumber setvariable }; +check(isNaN(val)); + asm { push 'val','NaN' tonumber setvariable }; check(isNaN(val)); Index: testsuite/actionscript.all/ops.as =================================================================== RCS file: /sources/gnash/gnash/testsuite/actionscript.all/ops.as,v retrieving revision 1.17 retrieving revision 1.18 diff -u -b -r1.17 -r1.18 --- testsuite/actionscript.all/ops.as 19 Aug 2007 23:34:55 -0000 1.17 +++ testsuite/actionscript.all/ops.as 25 Aug 2007 14:15:51 -0000 1.18 @@ -20,7 +20,7 @@ * Test binary predicates (equal, less_then, greater_then, logical and bitwise ops) */ -rcsid="$Id: ops.as,v 1.17 2007/08/19 23:34:55 strk Exp $"; +rcsid="$Id: ops.as,v 1.18 2007/08/25 14:15:51 strk Exp $"; #include "check.as" @@ -42,8 +42,12 @@ check(! (0 == NaN) ); check(! ('string' == 0) ); check(! (0 == 'string') ); -xcheck(! ('string' == NaN) ); -xcheck(! (NaN == 'string') ); +check(! ('string' == NaN) ); +check(! (NaN == 'string') ); +check(! (Infinite == 'Infinite') ); +check(! ('Infinite' == Infinite) ); +check(! (-Infinite == '-Infinite') ); +check(! ('-Infinite' == -Infinite) ); check(1==true); check(true==1); check(2!=true); @@ -76,7 +80,7 @@ check_equals( str3.toString(), 3.0 ); // str3 (primitive string) is automatically converted to a number check( ! (str1 == 0) ); // str1 (object) is NOT converted to a number (due to NaN?) -xcheck( ! (str1 == NaN) ); // str1 (object) is NOT converted to a number (due to NaN?) +check( ! (str1 == NaN) ); // str1 (object) is NOT converted to a number (due to NaN?) #if OUTPUT_VERSION > 5 check( ! (str1 == str2) ); // they are not the same object @@ -102,7 +106,7 @@ x=String("0.999"); y=String("1.0"); -xcheck(x<y); +check(x<y); x=String("A"); y=String("a"); @@ -114,11 +118,11 @@ x=0.999; y=String("1.000"); -xcheck(x<y); +check(x<y); x=String("0.999"); y=1.0; -xcheck(x<y); +check(x<y); check(! (NaN < NaN) ); check(! (undefined < undefined) ); @@ -307,19 +311,19 @@ x = new String("1"); y = new String("3"); -xcheck_equals(x&y, 1); +check_equals(x&y, 1); x = new String("1.0"); y = new String("3.0"); -xcheck_equals(x&y, 1); +check_equals(x&y, 1); x = new String("1.999"); y = new String("3.999"); -xcheck_equals(x&y, 1); +check_equals(x&y, 1); x = new String("3.999"); y = 7; -xcheck_equals(x&y, 3); +check_equals(x&y, 3); x = Number("7.999"); y = 3; @@ -351,11 +355,11 @@ x = new String("1.999"); y = 8.999; -xcheck_equals(x|y, 9); +check_equals(x|y, 9); x = String("1.999"); y = String("8.999"); -xcheck_equals(x|y, 9); +check_equals(x|y, 9); x = 9; y = String("1.5"); @@ -399,15 +403,15 @@ x = new String("1.999"); y = new String("2.999"); -xcheck_equals(x^y, 3); +check_equals(x^y, 3); x = new String("1.999"); y = 2.999; -xcheck_equals(x^y, 3); +check_equals(x^y, 3); x = 1.999; y = new String("2.999"); -xcheck_equals(x^y, 3); +check_equals(x^y, 3); //------------------------------------------------ @@ -463,11 +467,11 @@ x = String("3"); y = x << 1; -xcheck_equals(y, 6); +check_equals(y, 6); x = new String("3"); y = x << 1; -xcheck_equals(y, 6); +check_equals(y, 6); //------------------------------------------------ // Shift right operator (ACTION_SHIFTRIGHT : 0x64) @@ -503,11 +507,11 @@ x = String("7"); y = x >> 1; -xcheck_equals(y, 3); +check_equals(y, 3); x = new String("7"); y = x >> 1; -xcheck_equals(y, 3); +check_equals(y, 3); //------------------------------------------------- // Shift right2 operator (ACTION_SHIFTRIGHT2 : 0x65) @@ -537,12 +541,12 @@ x = new String("1.9"); y = --x; //xcheck_equals(y, 0.9); -xcheck( (y-0.9) < 0.001 ); +check( (y-0.9) < 0.001 ); x = new String("0.0"); y = --x; //xcheck_equals(y, -1.0); -xcheck( (y+1.0) < 0.001 ); +check( (y+1.0) < 0.001 ); x = new String("a"); y = --x; @@ -564,11 +568,11 @@ x = new String("1.9"); y = ++x; //xcheck_equals(y, 2.9); -xcheck( (y-2.9) < 0.001 ); +check( (y-2.9) < 0.001 ); x = new String("0.0"); y = ++x; -xcheck_equals(y, 1); +check_equals(y, 1); x = new String("a"); y = ++x; Index: testsuite/actionscript.all/toString_valueOf.as =================================================================== RCS file: /sources/gnash/gnash/testsuite/actionscript.all/toString_valueOf.as,v retrieving revision 1.5 retrieving revision 1.6 diff -u -b -r1.5 -r1.6 --- testsuite/actionscript.all/toString_valueOf.as 16 Aug 2007 06:09:14 -0000 1.5 +++ testsuite/actionscript.all/toString_valueOf.as 25 Aug 2007 14:15:51 -0000 1.6 @@ -99,7 +99,7 @@ num2 = new Number(2); num3 = num1 + num2; //valueOf called; -check(num3 == "TO_VALUETO_VALUE"); +check_equals(num3, "TO_VALUETO_VALUE"); x = num1.toString(); y = num1.valueOf(); @@ -138,8 +138,8 @@ str2 = new String("2"); str3 = str1+str2; -xcheck(str3 == "102"); -xcheck(str3 == 102); +check(str3 == "102"); +check(str3 == 102); String.prototype.toString = function () {return "TO_STRING";}; String.prototype.valueOf = function () {return "TO_VALUE";}; @@ -147,9 +147,9 @@ xcheck(parseInt(str1) == 10); xcheck(parseInt(str2) == 2); str3 = str1 + str2; -xcheck(typeof(str3) == "string"); +check(typeof(str3) == "string"); //valueOf called -check(str3 == "TO_VALUETO_VALUE"); +check_equals(str3, "TO_VALUETO_VALUE"); // trace a string Object won't invoke the toString method. // I don't think it's a bug. //trace(str1); //output 10 ! @@ -313,7 +313,7 @@ b2 = new Boolean(true); b3 = b1 + b2; check(typeof(b3) == 'number'); -xcheck(b3 == 1); +check_equals(b3, 1); // _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit