gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] /srv/bzr/gnash/trunk r9988: Reduce code duplication, cl


From: Benjamin Wolsey
Subject: [Gnash-commit] /srv/bzr/gnash/trunk r9988: Reduce code duplication, clean up String charAt methods.
Date: Mon, 13 Oct 2008 10:56:32 +0200
User-agent: Bazaar (1.5)

------------------------------------------------------------
revno: 9988
committer: Benjamin Wolsey <address@hidden>
branch nick: trunk
timestamp: Mon 2008-10-13 10:56:32 +0200
message:
  Reduce code duplication, clean up String charAt methods.
modified:
  libcore/asobj/LoadVars_as.cpp
  libcore/asobj/LoadableObject.cpp
  libcore/asobj/LoadableObject.h
  libcore/asobj/String_as.cpp
  libcore/asobj/XML_as.cpp
  testsuite/actionscript.all/LoadVars.as
    ------------------------------------------------------------
    revno: 9902.1.5
    committer: Benjamin Wolsey <address@hidden>
    branch nick: postrelease
    timestamp: Thu 2008-10-02 18:39:25 +0200
    message:
      Optimize charAt, prevent UB in float->int conversion.
    modified:
      libcore/asobj/String_as.cpp
    ------------------------------------------------------------
    revno: 9902.1.6
    committer: Benjamin Wolsey <address@hidden>
    branch nick: postrelease
    timestamp: Thu 2008-10-02 18:40:05 +0200
    message:
      Move common and interchangeable methods of LoadVars and XML to 
LoadableObject.
    modified:
      libcore/asobj/LoadVars_as.cpp
      libcore/asobj/LoadableObject.cpp
      libcore/asobj/LoadableObject.h
      libcore/asobj/XML_as.cpp
=== modified file 'libcore/asobj/LoadVars_as.cpp'
--- a/libcore/asobj/LoadVars_as.cpp     2008-09-29 08:40:24 +0000
+++ b/libcore/asobj/LoadVars_as.cpp     2008-10-02 16:40:05 +0000
@@ -40,10 +40,7 @@
 
 namespace gnash {
 
-static as_value loadvars_addRequestHeader(const fn_call& fn);
-static as_value loadvars_load(const fn_call& fn);
 static as_value loadvars_send(const fn_call& fn);
-static as_value loadvars_sendAndLoad(const fn_call& fn);
 static as_value loadvars_tostring(const fn_call& fn);
 static as_value loadvars_ctor(const fn_call& fn);
 
@@ -142,13 +139,18 @@
 void
 LoadVars_as::attachLoadVarsInterface(as_object& o)
 {
-       o.init_member("addRequestHeader", new 
builtin_function(loadvars_addRequestHeader));
+       o.init_member("addRequestHeader", new builtin_function(
+                   LoadableObject::loadableobject_addRequestHeader));
        o.init_member("decode", new 
builtin_function(LoadVars_as::decode_method));
-       o.init_member("getBytesLoaded", new 
builtin_function(LoadVars_as::getBytesLoaded_method));
-       o.init_member("getBytesTotal", new 
builtin_function(LoadVars_as::getBytesTotal_method));
-       o.init_member("load", new builtin_function(loadvars_load));
+       o.init_member("getBytesLoaded", new builtin_function(
+                   LoadVars_as::getBytesLoaded_method));
+       o.init_member("getBytesTotal", new builtin_function(
+                   LoadVars_as::getBytesTotal_method));
+       o.init_member("load", new builtin_function(
+                   LoadableObject::loadableobject_load));
        o.init_member("send", new builtin_function(loadvars_send));
-       o.init_member("sendAndLoad", new 
builtin_function(loadvars_sendAndLoad));
+       o.init_member("sendAndLoad", new builtin_function(
+                   LoadableObject::loadableobject_sendAndLoad));
        o.init_member("toString", new builtin_function(loadvars_tostring));
        o.init_member("onData", new 
builtin_function(LoadVars_as::onData_method));
        o.init_member("onLoad", new 
builtin_function(LoadVars_as::onLoad_method));
@@ -168,113 +170,6 @@
 
 
 as_value
-loadvars_addRequestHeader(const fn_call& fn)
-{
-    
-       boost::intrusive_ptr<LoadVars_as> ptr = 
ensureType<LoadVars_as>(fn.this_ptr);   
-
-    as_value customHeaders;
-    as_object* array;
-
-    if (ptr->get_member(NSV::PROP_uCUSTOM_HEADERS, &customHeaders))
-    {
-        array = customHeaders.to_object().get();
-        if (!array)
-        {
-            IF_VERBOSE_ASCODING_ERRORS(
-                log_aserror(_("LoadVars.addRequestHeader: "
-                         "LoadVars._customHeaders is not an object"));
-            );
-            return as_value();
-        }
-    }
-    else
-    {
-        array = new Array_as;
-        // This property is always initialized on the first call to
-        // addRequestHeaders.
-        ptr->set_member(NSV::PROP_uCUSTOM_HEADERS, array);
-    }
-
-    if (fn.nargs == 0)
-    {
-        // Return after having initialized the _customHeaders array.
-        IF_VERBOSE_ASCODING_ERRORS(
-            log_aserror(_("LoadVars.addRequestHeader requires at least "
-                          "one argument"));
-        );
-        return as_value();
-    }
-    
-    if (fn.nargs == 1)
-    {
-        // This must be an array. Keys / values are pushed in valid
-        // pairs to the _customHeaders array.    
-        boost::intrusive_ptr<as_object> obj = fn.arg(0).to_object();
-        Array_as* headerArray = dynamic_cast<Array_as*>(obj.get());
-
-        if (!headerArray)
-        {
-            IF_VERBOSE_ASCODING_ERRORS(
-                log_aserror(_("LoadVars.addRequestHeader: single argument "
-                                "is not an array"));
-            );
-            return as_value();
-        }
-
-        Array_as::const_iterator e = headerArray->end();
-        --e;
-
-        for (Array_as::const_iterator i = headerArray->begin(); i != e; ++i)
-        {
-            // Only even indices can be a key, and they must be a string.
-            if (i.index() % 2) continue;
-            if (!(*i).is_string()) continue;
-            
-            // Only the immediately following odd number can be 
-            // a value, and it must also be a string.
-            const as_value& val = headerArray->at(i.index() + 1);
-            if (val.is_string())
-            {
-                array->callMethod(NSV::PROP_PUSH, *i, val);
-            }
-        }
-        return as_value();
-    }
-        
-    if (fn.nargs > 2)
-    {
-        IF_VERBOSE_ASCODING_ERRORS(
-            std::ostringstream ss;
-            fn.dump_args(ss);
-            log_aserror(_("LoadVars.addRequestHeader(%s): arguments after the"
-                            "second will be discarded"), ss.str());
-        );
-    }
-    
-    // Push both to the _customHeaders array.
-    const as_value& name = fn.arg(0);
-    const as_value& val = fn.arg(1);
-    
-    // Both arguments must be strings.
-    if (!name.is_string() || !val.is_string())
-    {
-        IF_VERBOSE_ASCODING_ERRORS(
-            std::ostringstream ss;
-            fn.dump_args(ss);
-            log_aserror(_("LoadVars.addRequestHeader(%s): both arguments "
-                        "must be a string"), ss.str());
-        );
-        return as_value(); 
-    }
-
-    array->callMethod(NSV::PROP_PUSH, name, val);
-    
-    return as_value();
-}
-
-
-as_value
 LoadVars_as::decode_method(const fn_call& fn)
 {
        boost::intrusive_ptr<LoadVars_as> ptr = 
ensureType<LoadVars_as>(fn.this_ptr);
@@ -352,32 +247,6 @@
        return as_value();
 }
 
-static as_value
-loadvars_load(const fn_call& fn)
-{
-       boost::intrusive_ptr<LoadVars_as> obj = 
ensureType<LoadVars_as>(fn.this_ptr);
-
-       if ( fn.nargs < 1 )
-       {
-               IF_VERBOSE_ASCODING_ERRORS(
-               log_aserror(_("LoadVars.load() requires at least one 
argument"));
-               );
-               return as_value(false);
-       }
-
-       const std::string& urlstr = fn.arg(0).to_string();
-       if ( urlstr.empty() )
-       {
-               IF_VERBOSE_ASCODING_ERRORS(
-               log_aserror(_("LoadVars.load(): invalid empty url"));
-               );
-               return as_value(false);
-       }
-
-       obj->load(urlstr);
-       return as_value(true);
-       
-}
 
 static as_value
 loadvars_send(const fn_call& fn)
@@ -387,46 +256,6 @@
        return as_value(); 
 }
 
-static as_value
-loadvars_sendAndLoad(const fn_call& fn)
-{
-       boost::intrusive_ptr<LoadVars_as> ptr = 
ensureType<LoadVars_as>(fn.this_ptr);
-
-       if ( fn.nargs < 2 )
-       {
-               IF_VERBOSE_ASCODING_ERRORS(
-               log_aserror(_("LoadVars.sendAndLoad() requires at least two 
arguments"));
-               );
-               return as_value(false);
-       }
-
-       const std::string& urlstr = fn.arg(0).to_string();
-       if ( urlstr.empty() )
-       {
-               IF_VERBOSE_ASCODING_ERRORS(
-               log_aserror(_("LoadVars.sendAndLoad(): invalid empty url"));
-               );
-               return as_value(false);
-       }
-
-       if (!fn.arg(1).is_object())
-       {
-               IF_VERBOSE_ASCODING_ERRORS(
-                   log_aserror(_("LoadVars.sendAndLoad(): invalid target (must 
be an object)"));
-               );
-               return as_value(false);
-       }
-
-
-       boost::intrusive_ptr<as_object> target = fn.arg(1).to_object();
-
-       // Post by default, override by ActionScript third argument
-       bool post = true;
-       if ( fn.nargs > 2 && fn.arg(2).to_string() == "GET" ) post = false;
-
-       ptr->sendAndLoad(urlstr, *target, post);
-       return as_value(true);
-}
 
 static as_value
 loadvars_tostring(const fn_call& fn)

=== modified file 'libcore/asobj/LoadableObject.cpp'
--- a/libcore/asobj/LoadableObject.cpp  2008-09-29 08:40:24 +0000
+++ b/libcore/asobj/LoadableObject.cpp  2008-10-02 16:40:05 +0000
@@ -206,8 +206,7 @@
     // Doing so also avoids processing queued load
     // request immediately
     // 
-    _loadThreads.push_front(lt.get());
-    lt.release();
+    _loadThreads.push_front(lt.release());
 
     if ( startTimer )
     {
@@ -228,7 +227,8 @@
 as_value
 LoadableObject::checkLoads_wrapper(const fn_call& fn)
 {
-       boost::intrusive_ptr<LoadableObject> ptr = 
ensureType<LoadableObject>(fn.this_ptr);
+       boost::intrusive_ptr<LoadableObject> ptr =
+        ensureType<LoadableObject>(fn.this_ptr);
        ptr->checkLoads();
        return as_value();
 }
@@ -247,13 +247,15 @@
 
         if ( lt->completed() )
         {
-            size_t xmlsize = _bytesTotal = _bytesLoaded = lt->getBytesTotal();
-            boost::scoped_array<char> buf(new char[xmlsize+1]);
-            size_t actuallyRead = lt->read(buf.get(), xmlsize);
-            if ( actuallyRead != xmlsize )
+            size_t dataSize = _bytesTotal = _bytesLoaded = lt->getBytesTotal();
+
+            boost::scoped_array<char> buf(new char[dataSize + 1]);
+            size_t actuallyRead = lt->read(buf.get(), dataSize);
+            if ( actuallyRead != dataSize )
                        {
                                // This would be either a bug of LoadThread or 
an expected
-                               // possibility which lacks documentation (thus 
a bug in documentation)
+                               // possibility which lacks documentation (thus 
a bug in
+                // documentation)
                                //
                        }
             buf[actuallyRead] = '\0';
@@ -262,10 +264,11 @@
             // See http://savannah.gnu.org/bugs/?19915
             utf8::TextEncoding encoding;
             // NOTE: the call below will possibly change 'xmlsize' parameter
-            char* bufptr = utf8::stripBOM(buf.get(), xmlsize, encoding);
+            char* bufptr = utf8::stripBOM(buf.get(), dataSize, encoding);
             if ( encoding != utf8::encUTF8 && encoding != utf8::encUNSPECIFIED 
)
             {
-                log_unimpl("%s to utf8 conversion in LoadVars input parsing", 
utf8::textEncodingName(encoding));
+                log_unimpl("%s to utf8 conversion in LoadVars input parsing", 
+                        utf8::textEncodingName(encoding));
             }
             as_value dataVal(bufptr); // memory copy here (optimize?)
 
@@ -291,5 +294,189 @@
 }
 
 
+/// Can take either a two strings as arguments or an array of strings,
+/// alternately header and value.
+as_value
+LoadableObject::loadableobject_addRequestHeader(const fn_call& fn)
+{
+    
+    boost::intrusive_ptr<LoadableObject> ptr = 
ensureType<LoadableObject>(fn.this_ptr);   
+
+    as_value customHeaders;
+    as_object* array;
+
+    if (ptr->get_member(NSV::PROP_uCUSTOM_HEADERS, &customHeaders))
+    {
+        array = customHeaders.to_object().get();
+        if (!array)
+        {
+            IF_VERBOSE_ASCODING_ERRORS(
+                log_aserror(_("XML.addRequestHeader: XML._customHeaders "
+                              "is not an object"));
+            );
+            return as_value();
+        }
+    }
+    else
+    {
+        array = new Array_as;
+        // This property is always initialized on the first call to
+        // addRequestHeaders.
+        ptr->set_member(NSV::PROP_uCUSTOM_HEADERS, array);
+    }
+
+    if (fn.nargs == 0)
+    {
+        // Return after having initialized the _customHeaders array.
+        IF_VERBOSE_ASCODING_ERRORS(
+            log_aserror(_("XML.addRequestHeader requires at least "
+                          "one argument"));
+        );
+        return as_value();
+    }
+    
+    if (fn.nargs == 1)
+    {
+        // This must be an array. Keys / values are pushed in valid
+        // pairs to the _customHeaders array.    
+        boost::intrusive_ptr<as_object> obj = fn.arg(0).to_object();
+        Array_as* headerArray = dynamic_cast<Array_as*>(obj.get());
+
+        if (!headerArray)
+        {
+            IF_VERBOSE_ASCODING_ERRORS(
+                log_aserror(_("XML.addRequestHeader: single argument "
+                                "is not an array"));
+            );
+            return as_value();
+        }
+
+        Array_as::const_iterator e = headerArray->end();
+        --e;
+
+        for (Array_as::const_iterator i = headerArray->begin(); i != e; ++i)
+        {
+            // Only even indices can be a key, and they must be a string.
+            if (i.index() % 2) continue;
+            if (!(*i).is_string()) continue;
+            
+            // Only the immediately following odd number can be 
+            // a value, and it must also be a string.
+            const as_value& val = headerArray->at(i.index() + 1);
+            if (val.is_string())
+            {
+                array->callMethod(NSV::PROP_PUSH, *i, val);
+            }
+        }
+        return as_value();
+    }
+        
+    if (fn.nargs > 2)
+    {
+        IF_VERBOSE_ASCODING_ERRORS(
+            std::ostringstream ss;
+            fn.dump_args(ss);
+            log_aserror(_("XML.addRequestHeader(%s): arguments after the"
+                            "second will be discarded"), ss.str());
+        );
+    }
+    
+    // Push both to the _customHeaders array.
+    const as_value& name = fn.arg(0);
+    const as_value& val = fn.arg(1);
+    
+    // Both arguments must be strings.
+    if (!name.is_string() || !val.is_string())
+    {
+        IF_VERBOSE_ASCODING_ERRORS(
+            std::ostringstream ss;
+            fn.dump_args(ss);
+            log_aserror(_("XML.addRequestHeader(%s): both arguments "
+                        "must be a string"), ss.str());
+        );
+        return as_value(); 
+    }
+
+    array->callMethod(NSV::PROP_PUSH, name, val);
+    
+    return as_value();
+}
+
+
+/// Returns true if the arguments are valid, otherwise false. The
+/// success of the connection is irrelevant.
+/// The second argument must be a loadable object (XML or LoadVars).
+/// An optional third argument specifies the method ("GET", or by default
+/// "POST"). The values are partly URL encoded if using GET.
+as_value
+LoadableObject::loadableobject_sendAndLoad(const fn_call& fn)
+{
+       boost::intrusive_ptr<LoadableObject> ptr =
+                       ensureType<LoadableObject>(fn.this_ptr);
+
+       if ( fn.nargs < 2 )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               log_aserror(_("sendAndLoad() requires at least two arguments"));
+               );
+               return as_value(false);
+       }
+
+       const std::string& urlstr = fn.arg(0).to_string();
+       if ( urlstr.empty() )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               log_aserror(_("sendAndLoad(): invalid empty url"));
+               );
+               return as_value(false);
+       }
+
+       if (!fn.arg(1).is_object())
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+                   log_aserror(_("sendAndLoad(): invalid target (must be an "
+                                   "XML or LoadVars object)"));
+               );
+               return as_value(false);
+       }
+
+
+       boost::intrusive_ptr<as_object> target = fn.arg(1).to_object();
+
+       // Post by default, override by ActionScript third argument
+       bool post = true;
+       if ( fn.nargs > 2 && fn.arg(2).to_string() == "GET" ) post = false;
+
+       ptr->sendAndLoad(urlstr, *target, post);
+       return as_value(true);
+}
+
+
+as_value
+LoadableObject::loadableobject_load(const fn_call& fn)
+{
+       boost::intrusive_ptr<LoadableObject> obj = 
ensureType<LoadableObject>(fn.this_ptr);
+
+       if ( fn.nargs < 1 )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               log_aserror(_("load() requires at least one argument"));
+               );
+               return as_value(false);
+       }
+
+       const std::string& urlstr = fn.arg(0).to_string();
+       if ( urlstr.empty() )
+       {
+               IF_VERBOSE_ASCODING_ERRORS(
+               log_aserror(_("load(): invalid empty url"));
+               );
+               return as_value(false);
+       }
+
+       obj->load(urlstr);
+       return as_value(true);
+
+}
 
 }

=== modified file 'libcore/asobj/LoadableObject.h'
--- a/libcore/asobj/LoadableObject.h    2008-09-29 08:40:24 +0000
+++ b/libcore/asobj/LoadableObject.h    2008-10-02 16:40:05 +0000
@@ -79,6 +79,13 @@
     ///                 we're finished with it.
     void queueLoad(std::auto_ptr<IOChannel> str);
 
+    /// Shared AS methods for XML and LoadVars, which can be used
+    /// interchangeably with each object in ActionScript.
+    static as_value loadableobject_addRequestHeader(const fn_call& fn);
+    static as_value loadableobject_sendAndLoad(const fn_call& fn);
+    static as_value loadableobject_load(const fn_call& fn);
+    static as_value loadableobject_send(const fn_call& fn);
+
 protected:
 
     /// Convert the Loadable Object to a string.

=== modified file 'libcore/asobj/String_as.cpp'
--- a/libcore/asobj/String_as.cpp       2008-09-25 11:13:14 +0000
+++ b/libcore/asobj/String_as.cpp       2008-10-02 16:39:25 +0000
@@ -655,21 +655,30 @@
 
     const int version = obj->getVM().getSWFVersion();
 
-    const std::wstring& wstr = utf8::decodeCanonicalString(str, version);
-
     ENSURE_FN_ARGS(1, 1, "");
 
-    size_t index = static_cast<size_t>(fn.arg(0).to_number());
-
-    if (index >= wstr.length()) {
-        return as_value("");
+    // to_int() makes this safe from overflows.
+    const size_t index = static_cast<size_t>(fn.arg(0).to_int());
+
+    size_t currentIndex = 0;
+
+    std::string::const_iterator it = str.begin(), e = str.end();
+
+    while (boost::uint32_t code = utf8::decodeNextUnicodeCharacter(it, e))
+    {
+        if (currentIndex == index)
+        {
+            if (version == 5)
+            {
+                return as_value(utf8::encodeLatin1Character(code));
+            }
+            return as_value(utf8::encodeUnicodeCharacter(code));
+        }
+        ++currentIndex;
     }
 
-    std::string rv;
-
-    rv.append(utf8::encodeCanonicalString(wstr.substr(index, 1), version));
-
-    return as_value(rv);
+    // We've reached the end without finding the index
+    return as_value("");
 }
 
 static as_value

=== modified file 'libcore/asobj/XML_as.cpp'
--- a/libcore/asobj/XML_as.cpp  2008-09-29 08:40:24 +0000
+++ b/libcore/asobj/XML_as.cpp  2008-10-02 16:40:05 +0000
@@ -60,15 +60,12 @@
 static void attachXMLProperties(as_object& o);
 
 static as_value xml_new(const fn_call& fn);
-static as_value xml_load(const fn_call& fn);
-static as_value xml_addRequestHeader(const fn_call& fn);
 static as_value xml_createelement(const fn_call& fn);
 static as_value xml_createtextnode(const fn_call& fn);
 static as_value xml_getbytesloaded(const fn_call& fn);
 static as_value xml_getbytestotal(const fn_call& fn);
 static as_value xml_parsexml(const fn_call& fn);
 static as_value xml_send(const fn_call& fn);
-static as_value xml_sendAndLoad(const fn_call& fn);
 static as_value xml_ondata(const fn_call& fn);
 
 
@@ -333,25 +330,6 @@
 }
 
 
-as_value
-xml_load(const fn_call& fn)
-{
-    boost::intrusive_ptr<XML_as> obj = ensureType<XML_as>(fn.this_ptr);
-  
-    if ( ! fn.nargs )
-    {
-        IF_VERBOSE_ASCODING_ERRORS(
-        log_aserror(_("XML.load(): missing argument"));
-        );
-        return as_value(false);
-    }
-
-    const std::string& filespec = fn.arg(0).to_string();
-
-    obj->load(filespec);
-    
-    return as_value(true);
-}
 
 static void
 attachXMLProperties(as_object& /*o*/)
@@ -367,15 +345,18 @@
     const int flags = 0;
 
     // No flags:
-    o.init_member("addRequestHeader", new 
builtin_function(xml_addRequestHeader), flags);
+    o.init_member("addRequestHeader", new builtin_function(
+                LoadableObject::loadableobject_addRequestHeader), flags);
     o.init_member("createElement", new builtin_function(xml_createelement), 
flags);
     o.init_member("createTextNode", new builtin_function(xml_createtextnode), 
flags);
     o.init_member("getBytesLoaded", new builtin_function(xml_getbytesloaded), 
flags);
     o.init_member("getBytesTotal", new builtin_function(xml_getbytestotal), 
flags);
-    o.init_member("load", new builtin_function(xml_load), flags);
+    o.init_member("load", new builtin_function(
+                LoadableObject::loadableobject_load), flags);
     o.init_member("parseXML", new builtin_function(xml_parsexml), flags);
     o.init_member("send", new builtin_function(xml_send), flags);
-    o.init_member("sendAndLoad", new builtin_function(xml_sendAndLoad), flags);
+    o.init_member("sendAndLoad", new builtin_function(
+                LoadableObject::loadableobject_sendAndLoad), flags);
     o.init_member("onData", new builtin_function(xml_ondata), flags);
 
 }
@@ -432,114 +413,6 @@
     return as_value(xml_obj.get());
 }
 
-/// Can take either a two strings as arguments or an array of strings,
-/// alternately header and value.
-as_value
-xml_addRequestHeader(const fn_call& fn)
-{
-    
-    boost::intrusive_ptr<XML_as> ptr = ensureType<XML_as>(fn.this_ptr);   
-
-    as_value customHeaders;
-    as_object* array;
-
-    if (ptr->get_member(NSV::PROP_uCUSTOM_HEADERS, &customHeaders))
-    {
-        array = customHeaders.to_object().get();
-        if (!array)
-        {
-            IF_VERBOSE_ASCODING_ERRORS(
-                log_aserror(_("XML.addRequestHeader: XML._customHeaders "
-                              "is not an object"));
-            );
-            return as_value();
-        }
-    }
-    else
-    {
-        array = new Array_as;
-        // This property is always initialized on the first call to
-        // addRequestHeaders.
-        ptr->set_member(NSV::PROP_uCUSTOM_HEADERS, array);
-    }
-
-    if (fn.nargs == 0)
-    {
-        // Return after having initialized the _customHeaders array.
-        IF_VERBOSE_ASCODING_ERRORS(
-            log_aserror(_("XML.addRequestHeader requires at least "
-                          "one argument"));
-        );
-        return as_value();
-    }
-    
-    if (fn.nargs == 1)
-    {
-        // This must be an array. Keys / values are pushed in valid
-        // pairs to the _customHeaders array.    
-        boost::intrusive_ptr<as_object> obj = fn.arg(0).to_object();
-        Array_as* headerArray = dynamic_cast<Array_as*>(obj.get());
-
-        if (!headerArray)
-        {
-            IF_VERBOSE_ASCODING_ERRORS(
-                log_aserror(_("XML.addRequestHeader: single argument "
-                                "is not an array"));
-            );
-            return as_value();
-        }
-
-        Array_as::const_iterator e = headerArray->end();
-        --e;
-
-        for (Array_as::const_iterator i = headerArray->begin(); i != e; ++i)
-        {
-            // Only even indices can be a key, and they must be a string.
-            if (i.index() % 2) continue;
-            if (!(*i).is_string()) continue;
-            
-            // Only the immediately following odd number can be 
-            // a value, and it must also be a string.
-            const as_value& val = headerArray->at(i.index() + 1);
-            if (val.is_string())
-            {
-                array->callMethod(NSV::PROP_PUSH, *i, val);
-            }
-        }
-        return as_value();
-    }
-        
-    if (fn.nargs > 2)
-    {
-        IF_VERBOSE_ASCODING_ERRORS(
-            std::ostringstream ss;
-            fn.dump_args(ss);
-            log_aserror(_("XML.addRequestHeader(%s): arguments after the"
-                            "second will be discarded"), ss.str());
-        );
-    }
-    
-    // Push both to the _customHeaders array.
-    const as_value& name = fn.arg(0);
-    const as_value& val = fn.arg(1);
-    
-    // Both arguments must be strings.
-    if (!name.is_string() || !val.is_string())
-    {
-        IF_VERBOSE_ASCODING_ERRORS(
-            std::ostringstream ss;
-            fn.dump_args(ss);
-            log_aserror(_("XML.addRequestHeader(%s): both arguments "
-                        "must be a string"), ss.str());
-        );
-        return as_value(); 
-    }
-
-    array->callMethod(NSV::PROP_PUSH, name, val);
-    
-    return as_value();
-}
-
 
 /// \brief create a new XML element
 ///
@@ -644,56 +517,6 @@
     return as_value();
 }
 
-/// Returns true if the arguments are valid, otherwise false. The
-/// success of the connection is irrelevant.
-/// The second argument must be an object, but does not have to 
-/// be an XML object.
-/// An optional third argument specifies the method ("GET", or by default
-/// "POST"). The XML node values are partly URL encoded if using GET.
-static as_value
-xml_sendAndLoad(const fn_call& fn)
-{
-
-    boost::intrusive_ptr<XML_as> ptr = ensureType<XML_as>(fn.this_ptr);
-    
-    if ( fn.nargs < 2 )
-    {
-        IF_VERBOSE_ASCODING_ERRORS(
-        std::stringstream ss;
-        fn.dump_args(ss);
-        log_aserror(_("XML.sendAndLoad(%s): missing arguments"),
-        ss.str());
-        );
-        return as_value(false);
-    }
-
-    const std::string& filespec = fn.arg(0).to_string();
-
-    if (!fn.arg(1).is_object())
-    {
-        IF_VERBOSE_ASCODING_ERRORS(
-        std::ostringstream ss;
-        fn.dump_args(ss);
-        log_aserror(_("XML.sendAndLoad(%s): second argument is not "
-                "an object"), ss.str());
-        );
-
-        return as_value(false);
-    }
-
-    boost::intrusive_ptr<as_object> targetObj = fn.arg(1).to_object();
-    assert(targetObj);
-
-       // Post by default, override by ActionScript third argument. This isn't
-       // documented, but it is possible to send XML objects by the GET method,
-       // exactly like LoadVars.
-       bool post = true;
-       if ( fn.nargs > 2 && fn.arg(2).to_string() == "GET" ) post = false;
-
-    ptr->sendAndLoad(filespec, *targetObj, post);
-
-    return as_value(true);
-}
 
 static as_value
 xml_ondata(const fn_call& fn)

=== modified file 'testsuite/actionscript.all/LoadVars.as'
--- a/testsuite/actionscript.all/LoadVars.as    2008-10-02 10:31:34 +0000
+++ b/testsuite/actionscript.all/LoadVars.as    2008-10-13 08:56:32 +0000
@@ -174,15 +174,15 @@
 
 // For checking that the data were loaded with XML.prototype.load.
 x.onLoad = function(success) {
-    xcheck_equals(x['var2'], 'val2');
+    check_equals(x['var2'], 'val2');
     play();
 };
 
 // The two objects are also interchangeable for these functions.
 x.sendAndLoad = XML.prototype.sendAndLoad;
-xcheck_equals(x.sendAndLoad("some server name", r), true);
+check_equals(x.sendAndLoad("some server name", r), true);
 x.load = XML.prototype.load;
-xcheck_equals(x.load( MEDIA(vars.txt) ), true);
+check_equals(x.load( MEDIA(vars.txt) ), true);
 stop();
 
 //--------------------------------------------------------------------------


reply via email to

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