CVSROOT: /sources/gnash Module name: gnash Changes by: Sandro Santilli <strk> 07/11/30 19:12:50
Modified files: server : as_value.cpp testsuite/actionscript.all: Number.as Log message: Handle malformed hex strings in number conversion CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.100&r2=1.101 http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/Number.as?cvsroot=gnash&r1=1.35&r2=1.36 Patches: Index: server/as_value.cpp =================================================================== RCS file: /sources/gnash/gnash/server/as_value.cpp,v retrieving revision 1.100 retrieving revision 1.101 diff -u -b -r1.100 -r1.101 --- server/as_value.cpp 30 Nov 2007 19:01:03 -0000 1.100 +++ server/as_value.cpp 30 Nov 2007 19:12:49 -0000 1.101 @@ -56,6 +56,7 @@ namespace { +struct invalidHexDigit {}; uint8_t parseHex(char c) { switch (c) @@ -76,6 +77,7 @@ case 'd': case 'D': return 13; case 'e': case 'E': return 14; case 'f': case 'F': return 15; + default: throw invalidHexDigit(); } } @@ -155,7 +157,7 @@ case OBJECT: case AS_FUNCTION: { - as_object* obj = m_type == OBJECT ? getObj().get() : getFun().get(); + //as_object* obj = m_type == OBJECT ? getObj().get() : getFun().get(); try { as_value ret = to_primitive(STRING); @@ -378,10 +380,13 @@ { if ( s.length() == 8 && s[0] == '0' && ( s[1] == 'x' || s[1] == 'X' ) ) { + try { uint8_t r = (parseHex(s[2])<<4) + parseHex(s[3]); uint8_t g = (parseHex(s[4])<<4) + parseHex(s[5]); uint8_t b = (parseHex(s[6])<<4) + parseHex(s[7]); return (double)((r<<16)|(g<<8)|b); + } catch (invalidHexDigit) { } + } } @@ -434,7 +439,7 @@ // // Arrays and Movieclips should return NaN. - as_object* obj = m_type == OBJECT ? getObj().get() : getFun().get(); + //as_object* obj = m_type == OBJECT ? getObj().get() : getFun().get(); try { as_value ret = to_primitive(NUMBER); @@ -762,7 +767,7 @@ } bool -as_value::conforms_to(string_table::key name) +as_value::conforms_to(string_table::key /*name*/) { // TODO: Implement return false; @@ -1472,7 +1477,7 @@ // as the SpriteProxy target (instead of // the full string, to be parsed everytime) - string::size_type size = tgtstr.size(); + //string::size_type size = tgtstr.size(); string::size_type from = 0; while ( string::size_type to=tgtstr.find_first_of('.', from) ) { Index: testsuite/actionscript.all/Number.as =================================================================== RCS file: /sources/gnash/gnash/testsuite/actionscript.all/Number.as,v retrieving revision 1.35 retrieving revision 1.36 diff -u -b -r1.35 -r1.36 --- testsuite/actionscript.all/Number.as 30 Nov 2007 19:01:03 -0000 1.35 +++ testsuite/actionscript.all/Number.as 30 Nov 2007 19:12:50 -0000 1.36 @@ -27,7 +27,7 @@ // TODO: test with SWF target != 6 (the only one tested so far) // -rcsid="$Id: Number.as,v 1.35 2007/11/30 19:01:03 strk Exp $"; +rcsid="$Id: Number.as,v 1.36 2007/11/30 19:12:50 strk Exp $"; #include "check.as" @@ -267,6 +267,8 @@ check("0XFF0000" != 0xFF0000); #endif +check(isNaN("0xff000z")); + check_equals(typeof(Number.prototype.valueOf), 'function'); check_equals(typeof(Number.prototype.toString), 'function'); #if OUTPUT_VERSION > 5 @@ -452,11 +454,11 @@ // END OF TEST #if OUTPUT_VERSION < 6 - check_totals(146); + check_totals(147); #else #if OUTPUT_VERSION < 7 - check_totals(158); + check_totals(159); #else - check_totals(156); + check_totals(157); #endif #endif _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit