gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog libbase/Makefile.am server/movi...


From: Benjamin Wolsey
Subject: [Gnash-commit] gnash ChangeLog libbase/Makefile.am server/movi...
Date: Mon, 10 Dec 2007 10:54:34 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Benjamin Wolsey <bwy>   07/12/10 10:54:34

Modified files:
        .              : ChangeLog 
        libbase        : Makefile.am 
        server         : movie_root.cpp 
        server/asobj   : Math.cpp 
        server/vm      : ASHandlers.cpp VM.cpp VM.h action.cpp 
Removed files:
        libbase        : tu_random.cpp tu_random.h 

Log message:
        * server/vm/VM.{h,cpp}: add randomNumberGenerator() to return
          pointer to a boost pseudo-RNG.
        * server/vm/ASHandlers.cpp: (ActionRandom) use boost RNG instead of 
tu_random.
        * server/asobj/Math.cpp: use boost RND instead of tu_random.
        * server/action.cpp: remove tu_random include.
        * libbase/tu_random{cpp,h}: removed.
        * libbase/Makefile: remove deleted files
                
        I have used the mersenne-twister based boost generator mt11213b. This 
has some memory
        requirements (about 1.4KB once initialized), but is fast and has a 
massive cycle length
        of 2^11213-1 - so probably good enough for anything but 
security-critical applications:
        no implementing GPG key pair generation in flash yet.
        
        The hellekalek1995 generator is much smaller (1*sizeof(uint32_t)) but 
by far the slowest 
        of all options (see 
        http://www.boost.org/libs/random/random-generators.html#performance).
        
        I'm not particularly fixed on that generator; they are easy to swap in 
and out through
        the VM::RNG typedef in VM.h.
        
        Some platforms have a non-deterministic source of randomness; using 
that would be good,
        but needs a compile-time method of working out whether a random device 
exists.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5116&r2=1.5117
http://cvs.savannah.gnu.org/viewcvs/gnash/libbase/Makefile.am?cvsroot=gnash&r1=1.93&r2=1.94
http://cvs.savannah.gnu.org/viewcvs/gnash/libbase/tu_random.cpp?cvsroot=gnash&r1=1.8&r2=0
http://cvs.savannah.gnu.org/viewcvs/gnash/libbase/tu_random.h?cvsroot=gnash&r1=1.5&r2=0
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.132&r2=1.133
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Math.cpp?cvsroot=gnash&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.167&r2=1.168
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/VM.cpp?cvsroot=gnash&r1=1.26&r2=1.27
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/VM.h?cvsroot=gnash&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/action.cpp?cvsroot=gnash&r1=1.29&r2=1.30

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5116
retrieving revision 1.5117
diff -u -b -r1.5116 -r1.5117
--- ChangeLog   10 Dec 2007 10:25:55 -0000      1.5116
+++ ChangeLog   10 Dec 2007 10:54:32 -0000      1.5117
@@ -1,3 +1,16 @@
+2007-12-10 Benjamin Wolsey <address@hidden>
+
+       * server/vm/VM.{h,cpp}: add randomNumberGenerator() to return
+         pointer to a boost pseudo-RNG.
+       * server/vm/ASHandlers.cpp: use boost RNG instead of tu_random
+         in ActionRandom().
+       * server/asobj/Math.cpp: use boost RNG instead of tu_random in
+         math_random().
+       * server/movie_root.cpp: remove calls to tu_random::next_random.
+       * server/action.cpp: remove tu_random include.
+       * libbase/tu_random{cpp,h}: removed.
+       * libbase/Makefile: remove deleted files
+
 2007-12-10 Sandro Santilli <address@hidden>
 
        * server/parser/movie_def_impl.cpp (readHeader): 0 FPS 

Index: libbase/Makefile.am
===================================================================
RCS file: /sources/gnash/gnash/libbase/Makefile.am,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -b -r1.93 -r1.94
--- libbase/Makefile.am 4 Dec 2007 11:45:23 -0000       1.93
+++ libbase/Makefile.am 10 Dec 2007 10:54:33 -0000      1.94
@@ -92,7 +92,6 @@
        string_table.cpp \
        tu_file.cpp \
        $(SDL_FILE) \
-       tu_random.cpp \
        tu_timer.cpp \
        WallClockTimer.cpp \
        utf8.cpp \
@@ -133,7 +132,6 @@
        tu_file.h \
        tu_math.h \
        tu_opengl_includes.h \
-       tu_random.h \
        tu_timer.h \
        WallClockTimer.h \
        utf8.h \

Index: server/movie_root.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -b -r1.132 -r1.133
--- server/movie_root.cpp       30 Nov 2007 11:26:05 -0000      1.132
+++ server/movie_root.cpp       10 Dec 2007 10:54:33 -0000      1.133
@@ -27,7 +27,6 @@
 #include "movie_instance.h" // for implicit upcast to sprite_instance
 #include "render.h"
 #include "VM.h"
-#include "tu_random.h"
 #include "ExecutableCode.h"
 #include "Stage.h"
 #include "utility.h"
@@ -916,11 +915,6 @@
        // NOTE: can throw ActionLimitException
        executeTimers();
 
-       // random should go continuously that:
-       // 1. after restart of the player the situation has not repeated
-       // 2. by different machines the random gave different numbers
-       tu_random::next_random();
-                       
        // Advance all non-unloaded characters in the LiveChars list
        // in reverse order (last added, first advanced)
        // NOTE: can throw ActionLimitException

Index: server/asobj/Math.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Math.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- server/asobj/Math.cpp       4 Dec 2007 11:45:31 -0000       1.24
+++ server/asobj/Math.cpp       10 Dec 2007 10:54:33 -0000      1.25
@@ -16,7 +16,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: Math.cpp,v 1.24 2007/12/04 11:45:31 strk Exp $ */
+/* $Id: Math.cpp,v 1.25 2007/12/10 10:54:33 bwy Exp $ */
 
 //
 // This file implements methods of the ActionScript Math class.
@@ -34,7 +34,9 @@
 #endif
 #include <cmath>
 #include <string>
-#include "tu_random.h"
+#include <boost/random.hpp>
+
+#include "VM.h" // get random generator
 #include "fn_call.h"
 #include "GMath.h"
 #include "log.h"
@@ -142,13 +144,22 @@
 MATH_WRAP_FUNC2_EXP(pow, (pow(arg0, arg1)))
 
 // A couple of oddballs.
-as_value       math_random(const fn_call& /* fn */)
+as_value
+math_random(const fn_call& /* fn */)
 {
-    // Random number between 0 and 1.
-    return as_value(tu_random::next_random() / 
double(boost::uint32_t(0x0FFFFFFFF)));
+
+       VM::RNG& rnd = VM::get().randomNumberGenerator();
+
+       // Produces double ( 0 <= n < 1)
+       boost::uniform_real<> uni_dist(0, 1);
+       boost::variate_generator<VM::RNG&, boost::uniform_real<> > uni(rnd, 
uni_dist);
+
+       return as_value(uni());
+
 }
 
-as_value       math_round(const fn_call& fn)
+as_value
+math_round(const fn_call& fn)
 {
        // round argument to nearest int. 0.5 goes to 1 and -0.5 goes to 0
        double result;

Index: server/vm/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v
retrieving revision 1.167
retrieving revision 1.168
diff -u -b -r1.167 -r1.168
--- server/vm/ASHandlers.cpp    4 Dec 2007 11:45:33 -0000       1.167
+++ server/vm/ASHandlers.cpp    10 Dec 2007 10:54:33 -0000      1.168
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: ASHandlers.cpp,v 1.167 2007/12/04 11:45:33 strk Exp $ */
+/* $Id: ASHandlers.cpp,v 1.168 2007/12/10 10:54:33 bwy Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -31,7 +31,6 @@
 #include "array.h"
 #include "swf_function.h"
 #include "as_function.h"
-#include "tu_random.h"
 #include "fn_call.h"
 #include "ActionExec.h"
 #include "sprite_instance.h"
@@ -58,6 +57,7 @@
 #include <utility> // for std::pair
 #include <locale.h>
 #include <boost/scoped_array.hpp>
+#include <boost/random.hpp>
 
 using namespace std;
 
@@ -1479,13 +1479,28 @@
 SWFHandlers::ActionRandom(ActionExec& thread)
 {
 //     GNASH_REPORT_FUNCTION;
+
+       // Action random(n) should return an integer from 0 up to (not
+       // including) n.
+       // It was introduced in SWF4 and deprecated in favour of
+       // Math.random() in SWF5.
+       
        as_environment& env = thread.env;
 
        thread.ensureStack(1);  // max
 
        int     max = int(env.top(0).to_number()); // TODO: use to_int ?
+
        if (max < 1) max = 1;
-       env.top(0).set_int(tu_random::next_random() % max);
+
+       // Get pointer to static random generator in VM
+       VM::RNG& rnd = VM::get().randomNumberGenerator();
+
+       // Produces int (0 <= n <= max - 1)
+       boost::uniform_int<> uni_dist(0, max - 1);
+       boost::variate_generator<VM::RNG&, boost::uniform_int<> > uni(rnd, 
uni_dist);
+
+       env.top(0).set_int(uni());
 }
 
 as_encoding_guess_t

Index: server/vm/VM.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/VM.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- server/vm/VM.cpp    7 Dec 2007 15:34:37 -0000       1.26
+++ server/vm/VM.cpp    10 Dec 2007 10:54:34 -0000      1.27
@@ -16,7 +16,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: VM.cpp,v 1.26 2007/12/07 15:34:37 strk Exp $ */
+/* $Id: VM.cpp,v 1.27 2007/12/10 10:54:34 bwy Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -34,6 +34,7 @@
 #include "VirtualClock.h" // for getTime()
 
 #include <memory>
+#include <boost/random.hpp> // for random generator
 
 namespace {
 gnash::RcInitFile& rcfile = gnash::RcInitFile::getDefaultInstance();
@@ -111,6 +112,14 @@
        return _swfversion;
 }
 
+VM::RNG&
+VM::randomNumberGenerator() const
+{
+
+       static RNG rnd(tu_timer::get_ticks());
+       return rnd;
+}
+
 const std::string&
 VM::getPlayerVersion() const
 {

Index: server/vm/VM.h
===================================================================
RCS file: /sources/gnash/gnash/server/vm/VM.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- server/vm/VM.h      7 Dec 2007 15:34:37 -0000       1.21
+++ server/vm/VM.h      10 Dec 2007 10:54:34 -0000      1.22
@@ -31,6 +31,7 @@
 #include <memory> // for auto_ptr
 #include <locale>
 #include <boost/cstdint.hpp> // for boost::?int??_t 
+#include <boost/random.hpp>
 
 // Forward declarations
 namespace gnash {
@@ -208,6 +209,32 @@
        ///
        const std::string& getPlayerVersion() const;
 
+       // The boost Random Number Generator to use.
+       //
+       // http://www.boost.org/libs/random/random-generators.html
+       //
+       // TODO: boost/nondet_random.hpp provides access to a random device,
+       // which can be used in preference to a pseudo-RNG. It is only
+       // presently available on some platforms.
+       // http://www.boost.org/libs/random/nondet_random.html
+       //
+       // Generators have different limits on the size of the seed. Please
+       // check if replacing the generator.
+       //
+       // The mt11213b provides a pseudo-random number cycle
+       // of length 2^11213-1 and requires approx 352*sizeof(uint32_t) memory
+       // once initialized. It is more than adequate for most purposes.
+       typedef boost::mt11213b RNG;    
+
+       // Get a pointer to the random number generator for
+       // use by Math.random() and random().
+       //
+       // The seed is the system time in milliseconds at the first call
+       // to a random function. This allows a potentially variable amount
+       // of time to elapse between starting gnash and initialization of
+       // the generator, so decreasing predictability.
+       RNG& randomNumberGenerator() const;
+
        /// Get a pointer to this VM's Root movie (stage)
        movie_root& getRoot() const;
 

Index: server/vm/action.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/action.cpp,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- server/vm/action.cpp        2 Dec 2007 14:54:33 -0000       1.29
+++ server/vm/action.cpp        10 Dec 2007 10:54:34 -0000      1.30
@@ -24,7 +24,6 @@
 #include "action.h"
 #include "as_object.h"
 #include "log.h"
-#include "tu_random.h"
 #include "movie_definition.h"
 #include "MovieClipLoader.h"
 #include "as_function.h"

Index: libbase/tu_random.cpp
===================================================================
RCS file: libbase/tu_random.cpp
diff -N libbase/tu_random.cpp
--- libbase/tu_random.cpp       4 Dec 2007 11:45:24 -0000       1.8
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,151 +0,0 @@
-// tu_random.cpp       -- Thatcher Ulrich 2003
-
-// This source code has been donated to the Public Domain.  Do
-// whatever you want with it.
-
-// Pseudorandom number generator.
-
-
-#include "tu_random.h"
-
-#ifdef TEST_TU_RANDOM
-       #include <cstdio>
-#endif
-
-namespace tu_random
-{
-       // Global generator.
-       static generator        s_generator;
-
-       boost::uint32_t next_random()
-       {
-               return s_generator.next_random();
-       }
-
-       void    seed_random(boost::uint32_t seed)
-       {
-               s_generator.seed_random(seed);
-       }
-
-       float   get_unit_float()
-       {
-               return s_generator.get_unit_float();
-       }
-
-
-       // PRNG code adapted from the complimentary-multiply-with-carry
-       // code in the article: George Marsaglia, "Seeds for Random Number
-       // Generators", Communications of the ACM, May 2003, Vol 46 No 5,
-       // pp90-93.
-       //
-       // The article says:
-       //
-       // "Any one of the choices for seed table size and multiplier will
-       // provide a RNG that has passed extensive tests of randomness,
-       // particularly those in [3], yet is simple and fast --
-       // approximately 30 million random 32-bit integers per second on a
-       // 850MHz PC.  The period is a*b^n, where a is the multiplier, n
-       // the size of the seed table and b=2^32-1.  (a is chosen so that
-       // b is a primitive root of the prime a*b^n + 1.)"
-       //
-       // [3] Marsaglia, G., Zaman, A., and Tsang, W.  Toward a universal
-       // random number generator.  _Statistics and Probability Letters
-       // 8_ (1990), 35-39.
-
-//     const boost::uint64_t   a = 123471786;  // for SEED_COUNT=1024
-//     const boost::uint64_t   a = 123554632;  // for SEED_COUNT=512
-//     const boost::uint64_t   a = 8001634;    // for SEED_COUNT=255
-//     const boost::uint64_t   a = 8007626;    // for SEED_COUNT=128
-//     const boost::uint64_t   a = 647535442;  // for SEED_COUNT=64
-//     const boost::uint64_t   a = 547416522;  // for SEED_COUNT=32
-//     const boost::uint64_t   a = 487198574;  // for SEED_COUNT=16
-       const boost::uint64_t   a = 716514398;  // for SEED_COUNT=8
-
-
-       generator::generator()
-               :
-               c(362436),
-               i(SEED_COUNT - 1)
-       {
-               seed_random(987654321);
-       }
-
-
-       void    generator::seed_random(boost::uint32_t seed)
-       {
-               // Simple pseudo-random to reseed the seeds.
-               // Suggested by the above article.
-               boost::uint32_t j = seed;
-               for (int i = 0; i < SEED_COUNT; i++)
-               {
-                       j = j ^ (j << 13);
-                       j = j ^ (j >> 17);
-                       j = j ^ (j << 5);
-                       Q[i] = j;
-               }
-       }
-
-
-       boost::uint32_t generator::next_random()
-       // Return the next pseudo-random number in the sequence.
-       {
-               boost::uint64_t t;
-               boost::uint32_t x;
-
-               //static boost::uint32_t        c = 362436;
-               //static boost::uint32_t        i = SEED_COUNT - 1;
-               const boost::uint32_t   r = 0xFFFFFFFE;
-
-               i = (i+1) & (SEED_COUNT - 1);
-               t = a * Q[i] + c;
-               c = (boost::uint32_t) (t >> 32);
-               x = (boost::uint32_t) (t + c);
-               if (x < c)
-               {
-                       x++;
-                       c++;
-               }
-               
-               boost::uint32_t val = r - x;
-               Q[i] = val;
-               return val;
-       }
-
-       
-       float   generator::get_unit_float()
-       {
-               boost::uint32_t r = next_random();
-
-               // 24 bits of precision.
-               return float(r >> 8) / (16777216.0f - 1.0f);
-       }
-
-}      // end namespace tu_random
-
-
-#ifdef TEST_TU_RANDOM
-
-// Compile with e.g.:
-//
-//  gcc -o tu_random_test tu_random.cpp -I.. -g -DTEST_TU_RANDOM -lstdc++
-//
-// Generate a test file of random numbers for DIEHARD.
-int    main()
-{
-       const int       COUNT = 15000000 / 4;   // number of 4-byte words; 
DIEHARD needs ~80M bits
-
-       for (int i = 0; i < COUNT; i++)
-       {
-               boost::uint32_t val = tu_random::next_random();
-               fwrite(&val, sizeof(val), 1, stdout);
-       }
-}
-
-
-#endif // TEST_TU_RANDOM
-
-
-// Local Variables:
-// mode: C++
-// indent-tabs-mode: t
-// End:

Index: libbase/tu_random.h
===================================================================
RCS file: libbase/tu_random.h
diff -N libbase/tu_random.h
--- libbase/tu_random.h 4 Dec 2007 11:45:24 -0000       1.5
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,52 +0,0 @@
-// tu_random.h -- Thatcher Ulrich 2003
-
-// This source code has been donated to the Public Domain.  Do
-// whatever you want with it.
-
-// Pseudorandom number generator.
-
-
-#ifndef TU_RANDOM_H
-#define TU_RANDOM_H
-
-
-#include "tu_config.h" // needed ?
-
-#include <boost/cstdint.hpp> // for boost::uint32_t used in this file
-
-namespace tu_random
-{
-       // Global generator.
-       DSOEXPORT boost::uint32_t       next_random();
-       void    seed_random(boost::uint32_t seed);
-       DSOEXPORT float get_unit_float();
-
-       // In case you need independent generators.  The global
-       // generator is just an instance of this.
-       const int       SEED_COUNT = 8;
-       class generator
-       {
-       public:
-               generator();
-               void    seed_random(boost::uint32_t seed);      // not necessary
-               boost::uint32_t next_random();
-               float   get_unit_float();
-
-       private:
-               boost::uint32_t Q[SEED_COUNT];
-               boost::uint32_t c;
-               boost::uint32_t i;
-       };
-
-}      // end namespace tu_random
-
-
-#endif // TU_RANDOM_H
-
-
-// Local Variables:
-// mode: C++
-// c-basic-offset: 8 
-// tab-width: 8
-// indent-tabs-mode: t
-// End:




reply via email to

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