[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/array.cpp server/array.h...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/array.cpp server/array.h... |
Date: |
Tue, 18 Mar 2008 11:26:55 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 08/03/18 11:26:54
Modified files:
. : ChangeLog
server : array.cpp array.h character.cpp
testsuite/actionscript.all: array.as
Log message:
* server/array.{cpp,h}: add concept of 'holes' in arrays, don't
enumerate holes.
* testsuite/actionscript.all/array.as: update expected results.
* server/character.cpp (width_getset, height_getset): don't
abort
if the character being worked on has collapsed dimensions.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5957&r2=1.5958
http://cvs.savannah.gnu.org/viewcvs/gnash/server/array.cpp?cvsroot=gnash&r1=1.95&r2=1.96
http://cvs.savannah.gnu.org/viewcvs/gnash/server/array.h?cvsroot=gnash&r1=1.43&r2=1.44
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.cpp?cvsroot=gnash&r1=1.82&r2=1.83
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/array.as?cvsroot=gnash&r1=1.48&r2=1.49
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5957
retrieving revision 1.5958
diff -u -b -r1.5957 -r1.5958
--- ChangeLog 18 Mar 2008 08:11:32 -0000 1.5957
+++ ChangeLog 18 Mar 2008 11:26:53 -0000 1.5958
@@ -1,5 +1,13 @@
2008-03-18 Sandro Santilli <address@hidden>
+ * server/array.{cpp,h}: add concept of 'holes' in arrays, don't
+ enumerate holes.
+ * testsuite/actionscript.all/array.as: update expected results.
+ * server/character.cpp (width_getset, height_getset): don't abort
+ if the character being worked on has collapsed dimensions.
+
+2008-03-18 Sandro Santilli <address@hidden>
+
* testsuite/actionscript.all/array.as: test sorting an array with
holes.
Index: server/array.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/array.cpp,v
retrieving revision 1.95
retrieving revision 1.96
diff -u -b -r1.95 -r1.96
--- server/array.cpp 17 Mar 2008 20:34:33 -0000 1.95
+++ server/array.cpp 18 Mar 2008 11:26:54 -0000 1.96
@@ -502,28 +502,34 @@
// Convenience function to process and extract flags from an as_value array
// of flags (as passed to sortOn when sorting on multiple properties)
std::deque<boost::uint8_t>
-get_multi_flags(std::deque<as_value>::const_iterator itBegin,
- std::deque<as_value>::const_iterator itEnd, bool* uniq, bool* index)
+get_multi_flags(as_array_object::const_iterator itBegin,
+ as_array_object::const_iterator itEnd, bool* uniq, bool* index)
{
- std::deque<as_value>::const_iterator it = itBegin;
+ as_array_object::const_iterator it = itBegin;
std::deque<boost::uint8_t> flgs;
// extract fUniqueSort and fReturnIndexedArray from first flag
if (it != itEnd)
{
- boost::uint8_t flag =
static_cast<boost::uint8_t>((*it).to_number());
+ as_array_object::ValOrNone v = *it++;
+ if ( v.which() == as_array_object::itemValue )
+ {
+ boost::uint8_t flag =
static_cast<boost::uint8_t>(boost::get<as_value>(v).to_number());
flag = flag_preprocess(flag, uniq, index);
flgs.push_back(flag);
- ++it;
+ }
}
while (it != itEnd)
{
- boost::uint8_t flag =
static_cast<boost::uint8_t>((*it).to_number());
+ as_array_object::ValOrNone v = *it++;
+ if ( v.which() == as_array_object::itemValue )
+ {
+ boost::uint8_t flag =
static_cast<boost::uint8_t>(boost::get<as_value>(v).to_number());
flag &= ~(as_array_object::fReturnIndexedArray);
flag &= ~(as_array_object::fUniqueSort);
flgs.push_back(flag);
- ++it;
+ }
}
return flgs;
}
@@ -559,21 +565,24 @@
std::deque<indexed_as_value> indexed_elements;
int i = 0;
- for (std::deque<as_value>::const_iterator it = elements.begin();
+ for (const_iterator it = elements.begin();
it != elements.end(); ++it)
{
- indexed_elements.push_back(indexed_as_value(*it, i++));
+ if ( it->which() == itemValue )
+ {
+
indexed_elements.push_back(indexed_as_value(boost::get<as_value>(*it), i++));
+ }
}
return indexed_elements;
}
-std::deque<as_value>::const_iterator
+as_array_object::const_iterator
as_array_object::begin()
{
return elements.begin();
}
-std::deque<as_value>::const_iterator
+as_array_object::const_iterator
as_array_object::end()
{
return elements.end();
@@ -618,7 +627,10 @@
return as_value(); // undefined
}
- as_value ret = elements.back();
+ ValOrNone last = elements.back();
+ as_value ret;
+ if ( last.which() == itemValue ) ret = boost::get<as_value>(last);
+ else log_error("Last element of Array (on pop) is not a value");
elements.pop_back();
return ret;
@@ -636,7 +648,9 @@
return as_value(); // undefined
}
- as_value ret = elements.front();
+ ValOrNone first = elements.front();
+ as_value ret;
+ if ( first.which() == itemValue ) ret = boost::get<as_value>(first);
elements.pop_front();
return ret;
@@ -666,17 +680,19 @@
if ( ! elements.empty() )
{
- std::deque<as_value>::const_iterator
- it=elements.begin(),
- itEnd=elements.end();
+ bool printed=false;
- // print first element w/out separator prefix
- temp += (*it++).to_string_versioned(swfversion);
+ const_iterator it=elements.begin(), itEnd=elements.end();
- // print subsequent elements with separator prefix
while ( it != itEnd )
{
- temp += separator +
(*it++).to_string_versioned(swfversion);
+ ValOrNone v = *it++;
+ if ( printed ) temp += separator;
+ if ( v.which() == itemValue )
+ temp +=
boost::get<as_value>(v).to_string_versioned(swfversion);
+ else
+ temp +=
as_value().to_string_versioned(swfversion);
+ printed=true;
}
}
@@ -714,7 +730,9 @@
}
else
{
- return elements[index];
+ ValOrNone v = elements[index];
+ if ( v.which() != itemValue ) return as_value();
+ return boost::get<as_value>(v);
}
}
@@ -791,7 +809,10 @@
{
for (iterator it = elements.begin(); it != elements.end(); ++it)
{
- if ( v.equals(*it) )
+ ValOrNone x = *it;
+ if ( x.which() != itemValue ) continue;
+
+ if ( v.equals(boost::get<as_value>(x)) )
{
elements.erase(it);
return true;
@@ -809,9 +830,13 @@
int index = index_requested(name);
if ( index >= 0 && (unsigned int)index < elements.size() )
{
- *val = elements[index];
+ ValOrNone x = elements[index];
+ if ( x.which() == itemValue )
+ {
+ *val = boost::get<as_value>(x);
return true;
}
+ }
return get_member_default(name, val, nsname);
}
@@ -976,7 +1001,9 @@
if ( (flags & as_array_object::fReturnIndexedArray) )
return as_value(array->sort_indexed(avc));
+ //log_debug("Sorting %d-sized array with custom function",
array->size());
array->sort(avc);
+ //log_debug("After sorting, array is %d-sized", array->size());
return as_value(array.get());
// note: custom AS function sorting apparently ignores the
// UniqueSort flag which is why it is also ignored here
@@ -1054,12 +1081,16 @@
std::deque<as_cmp_fn> cmp;
std::deque<as_cmp_fn> eq;
- for (std::deque<as_value>::const_iterator it = props->begin();
+ for (as_array_object::const_iterator it = props->begin();
it != props->end(); ++it)
{
- string_table::key s =
st.find(PROPNAME((*it).to_string_versioned(sv)));
+ as_array_object::ValOrNone v = *it;
+ if ( v.which() == as_array_object::itemValue )
+ {
+ string_table::key s =
st.find(PROPNAME(boost::get<as_value>(v).to_string_versioned(sv)));
prp.push_back(s);
}
+ }
// case: sortOn(["prop1", "prop2"])
if (fn.nargs == 1)
@@ -1075,7 +1106,7 @@
ensureType<as_array_object>(fn.arg(1).to_object());
if (farray->size() == optnum)
{
- std::deque<as_value>::const_iterator
+ as_array_object::const_iterator
fBegin = farray->begin(),
fEnd = farray->end();
@@ -1542,18 +1573,24 @@
// and non-defined elements
for (unsigned int i=0; i<size(); ++i)
{
- // here should be something like, if ( isDefined(i) ) ...
+ if ( elements[i].which() == itemValue )
+ {
env.push(as_value(i));
}
+ }
}
#ifdef GNASH_USE_GC
void
as_array_object::markReachableResources() const
{
- for (container::const_iterator i=elements.begin(), e=elements.end();
i!=e; ++i)
+ for (const_iterator i=elements.begin(), e=elements.end(); i!=e; ++i)
{
- i->setReachable();
+ ValOrNone v = *i;
+ if ( v.which() == itemValue )
+ {
+ boost::get<as_value>(v).setReachable();
+ }
}
markAsObjectReachable();
}
Index: server/array.h
===================================================================
RCS file: /sources/gnash/gnash/server/array.h,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -b -r1.43 -r1.44
--- server/array.h 5 Mar 2008 11:38:40 -0000 1.43
+++ server/array.h 18 Mar 2008 11:26:54 -0000 1.44
@@ -45,13 +45,26 @@
}
};
+template <class T>
+struct ContainerFiller {
+ T& cont;
+ ContainerFiller(T& c): cont(c) {}
+ void visit(as_value& v) { cont.push_back(v); }
+};
+
+struct blank {};
+
/// The Array ActionScript object
class as_array_object : public as_object
{
public:
- typedef std::deque<as_value> container;
+ enum { itemBlank, itemValue };
+
+ typedef boost::variant<blank, as_value> ValOrNone;
+
+ typedef std::deque<ValOrNone> container;
typedef container::const_iterator const_iterator;
typedef container::iterator iterator;
@@ -67,7 +80,7 @@
container copy = elements;
for (iterator i=copy.begin(), ie=copy.end(); i!=ie; ++i)
{
- v.visit(*i);
+ if ( i->which() == itemValue )
v.visit(boost::get<as_value>(*i));
}
}
@@ -235,11 +248,15 @@
// to avoid the comparator changing the original container.
//
- std::list<as_value> nelem(elements.begin(), elements.end());
+ typedef std::list<as_value> ValueList;
+ ValueList nelem;
+ ContainerFiller<ValueList> filler(nelem);
+ visitAll(filler);
+ size_t oldSize = elements.size(); // custom comparator might
change input size
nelem.sort(avc);
-
elements.assign(nelem.begin(), nelem.end());
+ resize(oldSize);
}
/// \brief
@@ -276,7 +293,12 @@
// to avoid the comparator changing the original container.
//
- std::list<as_value> nelem(elements.begin(), elements.end());
+ typedef std::list<as_value> ValueList;
+ ValueList nelem;
+ ContainerFiller<ValueList> filler(nelem);
+ visitAll(filler);
+
+ size_t oldSize = elements.size(); // custom comparator might
change input size
nelem.sort(avc);
@@ -284,6 +306,7 @@
return as_value(0);
elements.assign(nelem.begin(), nelem.end());
+ resize(oldSize);
return as_value(this);
}
Index: server/character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/character.cpp,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -b -r1.82 -r1.83
--- server/character.cpp 5 Mar 2008 03:55:58 -0000 1.82
+++ server/character.cpp 18 Mar 2008 11:26:54 -0000 1.83
@@ -438,7 +438,11 @@
}
double oldwidth = bounds.width();
- assert(oldwidth>0);
+ if ( oldwidth <= 0 )
+ {
+ log_unimpl(_("FIXME: can't set _height on character
with width %d"), oldwidth);
+ return rv;
+ }
double newwidth = PIXELS_TO_TWIPS(fn.arg(0).to_number());
if ( newwidth <= 0 )
@@ -483,7 +487,11 @@
}
double oldheight = bounds.height();
- assert(oldheight>0);
+ if ( oldheight <= 0 )
+ {
+ log_unimpl(_("FIXME: can't set _height on character
with height %d"), oldheight);
+ return rv;
+ }
double newheight = PIXELS_TO_TWIPS(fn.arg(0).to_number());
if ( newheight <= 0 )
Index: testsuite/actionscript.all/array.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/array.as,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -b -r1.48 -r1.49
--- testsuite/actionscript.all/array.as 18 Mar 2008 10:41:58 -0000 1.48
+++ testsuite/actionscript.all/array.as 18 Mar 2008 11:26:54 -0000 1.49
@@ -19,7 +19,7 @@
// Initial test written by Mike Carlson
-rcsid="$Id: array.as,v 1.48 2008/03/18 10:41:58 strk Exp $";
+rcsid="$Id: array.as,v 1.49 2008/03/18 11:26:54 strk Exp $";
#include "check.as"
check_equals(typeof(Array), 'function');
@@ -211,8 +211,8 @@
gaparray.sort();
check_equals(gaparray.length, 17);
#if OUTPUT_VERSION < 7
- check_equals(gaparray[0], undefined);
- check_equals(gaparray[1], undefined);
+ xcheck_equals(gaparray[0], undefined); // this is 16 with gnash
+ xcheck_equals(gaparray[1], undefined); // this is 4 with gnash
#else
check_equals(gaparray[0], '16');
check_equals(gaparray[1], '4');
@@ -231,8 +231,8 @@
check_equals(gaparray[13], undefined);
check_equals(gaparray[14], undefined);
#if OUTPUT_VERSION < 7
- check_equals(gaparray[15], '16');
- check_equals(gaparray[16], '4');
+ xcheck_equals(gaparray[15], '16'); // this is at [0] with gnash
+ xcheck_equals(gaparray[16], '4'); // this is at [1] with gnash
#else
check_equals(gaparray[15], undefined);
check_equals(gaparray[16], undefined);
@@ -1079,16 +1079,16 @@
// Changing length doesn't trigger enumeration of undefined values
b.length = 100;
out = {len:0}; for (var i in b) { out[i] = 1; out['len']++; }
-xcheck_equals(out['len'], 0);
+check_equals(out['len'], 0);
b[1] = undefined;
out = {len:0}; for (var i in b) { out[i] = 1; out['len']++; }
-xcheck_equals(out['len'], 1);
+check_equals(out['len'], 1);
check_equals(out[1], 1);
b[0] = undefined;
out = {len:0}; for (var i in b) { out[i] = 1; out['len']++; }
-xcheck_equals(out['len'], 2);
+check_equals(out['len'], 2);
check_equals(out[1], 1);
check_equals(out[0], 1);
- [Gnash-commit] gnash ChangeLog server/array.cpp server/array.h...,
Sandro Santilli <=