[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/asobj/string.cpp
From: |
Benjamin Wolsey |
Subject: |
[Gnash-commit] gnash ChangeLog server/asobj/string.cpp |
Date: |
Mon, 17 Mar 2008 12:05:16 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Benjamin Wolsey <bwy> 08/03/17 12:05:16
Modified files:
. : ChangeLog
server/asobj : string.cpp
Log message:
* server/asobj/string.cpp: fix fromCharCode for SWF6+, sort
of fix it for SWF5. This would get more passes in the swfdec
testsuite if swfdec_gnash_tester could catch newlines in
trace output.
Handling of SWF5's encoding is becoming a bit of a mess, and log output
isn't
utf-8, which is bad. It needs more attention.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5944&r2=1.5945
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/string.cpp?cvsroot=gnash&r1=1.59&r2=1.60
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5944
retrieving revision 1.5945
diff -u -b -r1.5944 -r1.5945
--- ChangeLog 17 Mar 2008 11:36:45 -0000 1.5944
+++ ChangeLog 17 Mar 2008 12:04:45 -0000 1.5945
@@ -1,3 +1,10 @@
+2008-03-17 Benjamin Wolsey <address@hidden>
+
+ * server/asobj/string.cpp: fix fromCharCode for SWF6+, sort
+ of fix it for SWF5. This would get more passes in the swfdec
+ testsuite if swfdec_gnash_tester could catch newlines in
+ trace output.
+
2008-03-17 Sandro Santilli <address@hidden>
* testsuite/actionscript.all/Inheritance.as: fixed bug in testcase
Index: server/asobj/string.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/string.cpp,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -b -r1.59 -r1.60
--- server/asobj/string.cpp 17 Mar 2008 08:06:47 -0000 1.59
+++ server/asobj/string.cpp 17 Mar 2008 12:05:16 -0000 1.60
@@ -488,14 +488,14 @@
ENSURE_FN_ARGS(1, 2, -1);
- as_value& tfarg = fn.arg(0); // to find arg
+ const as_value& tfarg = fn.arg(0); // to find arg
const std::wstring& toFind =
utf8::decodeCanonicalString(tfarg.to_string(), version);
size_t start = 0;
if (fn.nargs >= 2)
{
- as_value& saval = fn.arg(1); // start arg val
+ const as_value& saval = fn.arg(1); // start arg val
int start_arg = saval.to_int();
if ( start_arg > 0 ) start = (size_t) start_arg;
else
@@ -520,21 +520,48 @@
return as_value(pos);
}
+// String.fromCharCode(code1[, code2[, code3[, code4[, ...]]]])
+// Makes a string out of any number of char codes.
+// The string is always UTF8, so SWF5 mangles it.
static as_value
string_from_char_code(const fn_call& fn)
{
- std::wstring result;
- // isn't this function supposed to take one argument?
+ int version = VM::get().getSWFVersion();
+
+ if (version == 5)
+ {
+ std::string str;
+ for (unsigned int i = 0; i < fn.nargs; i++)
+ {
+ // Maximum 65535, as with all character codes.
+ boost::uint16_t c =
static_cast<boost::uint16_t>(fn.arg(i).to_int());
- for (unsigned int i = 0; i < fn.nargs; i++) {
- boost::uint32_t c = fn.arg(i).to_number<boost::uint32_t>();
- result += c;
+ // If more than 255, push 'overflow' byte.
+ if (c > 255)
+ {
+ str.push_back(static_cast<unsigned char>(c >> 8));
}
- int version = VM::get().getSWFVersion();
+ // 0 terminates the string, but mustn't be pushed or it
+ // will break concatenation.
+ if (static_cast<unsigned char>(c) == 0) break;
+ str.push_back(static_cast<unsigned char>(c));
+ }
+ return as_value(str);
+ }
+
+ std::wstring wstr;
+
+ for (unsigned int i = 0; i < fn.nargs; i++)
+ {
+ boost::uint16_t c = static_cast<boost::uint16_t>(fn.arg(i).to_int());
+ if (c == 0) break;
+ wstr.push_back(c);
+ }
+
+ return as_value(utf8::encodeCanonicalString(wstr, version));
- return as_value(utf8::encodeCanonicalString(result, version));
}
static as_value