[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/ActionExec.cpp server/Fu...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/ActionExec.cpp server/Fu... |
Date: |
Wed, 05 Jul 2006 23:56:08 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 06/07/05 23:56:08
Modified files:
. : ChangeLog
server : ActionExec.cpp Function.cpp Global.cpp
as_environment.cpp as_environment.h
server/swf : ASHandlers.cpp
Log message:
* server/ActionExec.cpp, server/Function.cpp, server/Global.cpp
server/as_environment.cpp, server/as_environment.h,
server/swf/ASHandlers.cpp: environment's global and local
registers
made private; provided accessor methods checking for out of
bound
conditions; added dumpers for them. Updated all users.
WARNING: 1-based register must be checked, but ming is unable
to output Function2 code...
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.467&r2=1.468
http://cvs.savannah.gnu.org/viewcvs/gnash/server/ActionExec.cpp?cvsroot=gnash&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/gnash/server/Function.cpp?cvsroot=gnash&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/gnash/server/Global.cpp?cvsroot=gnash&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_environment.cpp?cvsroot=gnash&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_environment.h?cvsroot=gnash&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/ASHandlers.cpp?cvsroot=gnash&r1=1.29&r2=1.30
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.467
retrieving revision 1.468
diff -u -b -r1.467 -r1.468
--- ChangeLog 5 Jul 2006 17:56:51 -0000 1.467
+++ ChangeLog 5 Jul 2006 23:56:08 -0000 1.468
@@ -1,3 +1,14 @@
+2006-07-06 Sandro Santilli <address@hidden>
+
+ * server/ActionExec.cpp, server/Function.cpp, server/Global.cpp
+ server/as_environment.cpp, server/as_environment.h,
+ server/swf/ASHandlers.cpp: environment's global and local registers
+ made private; provided accessor methods checking for out of bound
+ conditions; added dumpers for them. Updated all users.
+ WARNING: 1-based register must be checked, but ming is unable
+ to output Function2 code...
+
+
2006-07-05 Sandro Santilli <address@hidden>
* testsuite/actionscript.all/Function.as:
Index: server/ActionExec.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/ActionExec.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- server/ActionExec.cpp 5 Jul 2006 17:10:39 -0000 1.11
+++ server/ActionExec.cpp 5 Jul 2006 23:56:08 -0000 1.12
@@ -133,6 +133,8 @@
log_action("at ActionExec operator() start, pc=%d, stop_pc=%d,
code.size=%d.", pc, stop_pc, code.size());
stringstream ss;
env.dump_stack(ss);
+ env.dump_global_registers(ss);
+ env.dump_local_registers(ss);
log_action("%s", ss.str().c_str());
#endif
@@ -179,6 +181,8 @@
log_action( " PC is now %d.", pc);
stringstream ss;
env.dump_stack(ss);
+ env.dump_global_registers(ss);
+ env.dump_local_registers(ss);
log_action("%s", ss.str().c_str());
#endif
Index: server/Function.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/Function.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- server/Function.cpp 5 Jul 2006 17:10:39 -0000 1.24
+++ server/Function.cpp 5 Jul 2006 23:56:08 -0000 1.25
@@ -242,16 +242,16 @@
{
// Pass argument into a register.
int reg = m_args[i].m_register;
- *(our_env->local_register_ptr(reg)) = fn.arg(i);
+ our_env->local_register(reg) = fn.arg(i);
}
}
// Handle the implicit args.
- int current_reg = 1;
+ int current_reg = 0;
if (m_function2_flags & 0x01)
{
// preload 'this' into a register.
-
(*(our_env->local_register_ptr(current_reg))).set_as_object(our_env->get_target());
+
our_env->local_register(current_reg).set_as_object(our_env->get_target());
current_reg++;
}
@@ -282,7 +282,7 @@
if (m_function2_flags & 0x04)
{
// preload 'arguments' into a register.
-
(*(our_env->local_register_ptr(current_reg))).set_as_object(arg_array.get_ptr());
+
our_env->local_register(current_reg).set_as_object(arg_array.get_ptr());
current_reg++;
}
@@ -317,7 +317,7 @@
if (m_function2_flags & 0x40)
{
// Put '_root' in a register.
-
(*(our_env->local_register_ptr(current_reg))).set_as_object(
+ our_env->local_register(current_reg).set_as_object(
our_env->get_target()->get_root_movie());
current_reg++;
}
@@ -326,14 +326,14 @@
{
// Put '_parent' in a register.
as_value parent = our_env->get_variable("_parent");
- (*(our_env->local_register_ptr(current_reg))) = parent;
+ our_env->local_register(current_reg) = parent;
current_reg++;
}
if (m_function2_flags & 0x100)
{
// Put '_global' in a register.
-
(*(our_env->local_register_ptr(current_reg))).set_as_object(s_global.get_ptr());
+
our_env->local_register(current_reg).set_as_object(s_global.get_ptr());
current_reg++;
}
}
Index: server/Global.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/Global.cpp,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- server/Global.cpp 5 Jul 2006 17:10:39 -0000 1.16
+++ server/Global.cpp 5 Jul 2006 23:56:08 -0000 1.17
@@ -368,6 +368,8 @@
{
int version = fn.env->get_version();
+ log_msg("ASSetPropFlags called with %d args", fn.nargs);
+
// Check the arguments
assert(fn.nargs == 3 || fn.nargs == 4);
assert((version == 5) ? (fn.nargs == 3) : true);
@@ -378,7 +380,7 @@
as_object* obj = fn.arg(0).to_object();
if ( ! obj )
{
- log_warning("Invalid call to ASSSetPropFlags: "
+ log_warning("Invalid call to ASSetPropFlags: "
"object argument is not an object: %s",
fn.arg(0).to_string());
return;
Index: server/as_environment.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_environment.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- server/as_environment.cpp 1 Jul 2006 20:44:10 -0000 1.9
+++ server/as_environment.cpp 5 Jul 2006 23:56:08 -0000 1.10
@@ -274,6 +274,7 @@
m_variables[varname] = val;
}
+#if 0
as_value*
as_environment::local_register_ptr(unsigned int reg)
{
@@ -292,6 +293,7 @@
return &m_local_register[m_local_register.size() - reg];
}
+#endif
// Search the active frame for the named var; return its index
// in the m_local_frames stack if found.
@@ -477,7 +479,6 @@
return md->get_version();
}
-
};
Index: server/as_environment.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_environment.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- server/as_environment.h 1 Jul 2006 20:44:10 -0000 1.11
+++ server/as_environment.h 5 Jul 2006 23:56:08 -0000 1.12
@@ -51,7 +51,7 @@
#include "container.h" // for composition (stringi_hash, tu_string)
#include "as_value.h" // for composition (vector + frame_slot)
-#include "log.h" // for inlines (dump_stack)
+#include "log.h" // for inlines (dump_*)
#include <vector>
@@ -68,11 +68,6 @@
/// Stack of as_values in this environment
std::vector<as_value> m_stack;
- as_value m_global_register[4];
-
- /// function2 uses this
- std::vector<as_value> m_local_register;
-
/// Variables available in this environment
stringi_hash<as_value> m_variables;
@@ -82,8 +77,16 @@
tu_string m_name;
as_value m_value;
- frame_slot() {}
- frame_slot(const tu_string& name, const as_value& val) :
m_name(name), m_value(val) {}
+ frame_slot()
+ {
+ }
+
+ frame_slot(const tu_string& name, const as_value& val)
+ :
+ m_name(name),
+ m_value(val)
+ {
+ }
};
std::vector<frame_slot> m_local_frames;
@@ -214,7 +217,21 @@
/// we log an error, but still return a valid pointer (to
/// global reg[0]). So the behavior is a bit undefined, but
/// not dangerous.
- as_value* local_register_ptr(unsigned int reg);
+ //as_value* local_register_ptr(unsigned int reg);
+
+ /// Return a reference to the Nth local register.
+ as_value& local_register(uint8_t n)
+ {
+ assert( n < m_local_register.size() );
+ return m_local_register[n];
+ }
+
+ /// Return a reference to the Nth global register.
+ as_value& global_register(unsigned int n)
+ {
+ assert(n<4);
+ return m_global_register[n];
+ }
/// Find the sprite/movie referenced by the given path.
sprite_instance* find_target(const tu_string& path) const;
@@ -226,22 +243,42 @@
/// string giving a relative path name to the object.
sprite_instance* find_target(const as_value& val) const;
- /// Dump content of the stack using the log_msg function
+ /// Dump content of the stack to a std::ostream
void dump_stack(std::ostream& out=std::cerr)
{
out << "Stack: ";
- for (int i=0, n=m_stack.size(); i<n; i++)
+ for (unsigned int i=0, n=m_stack.size(); i<n; i++)
{
-#if 0 // use horizontal layout, easier to read
- out << "Stack[" << i << "]: "
- << m_stack[i].to_string() << std::endl;
-#endif
if (i) out << " | ";
out << '"' << m_stack[i].to_string() << '"';
}
out << std::endl;
}
+ /// Dump the local registers to a std::ostream
+ void dump_local_registers(std::ostream& out=std::cerr)
+ {
+ out << "Local registers: ";
+ for (unsigned int i=0, n=m_local_register.size(); i<n; i++)
+ {
+ if (i) out << " | ";
+ out << '"' << m_local_register[i].to_string() << '"';
+ }
+ out << std::endl;
+ }
+
+ /// Dump the global registers to a std::ostream
+ void dump_global_registers(std::ostream& out=std::cerr)
+ {
+ out << "Global registers: ";
+ for (unsigned int i=0; i<4; ++i)
+ {
+ if (i) out << " | ";
+ out << '"' << m_global_register[i].to_string() << '"';
+ }
+ out << std::endl;
+ }
+
/// Return the SWF version we're running for.
//
/// TODO: check what to return when playing multiple
@@ -253,6 +290,11 @@
private:
+ as_value m_global_register[4];
+
+ /// function2 uses this (could move to swf_function2 class)
+ std::vector<as_value> m_local_register;
+
/// Movie target.
sprite_instance* m_target;
Index: server/swf/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/ASHandlers.cpp,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- server/swf/ASHandlers.cpp 5 Jul 2006 17:10:40 -0000 1.29
+++ server/swf/ASHandlers.cpp 5 Jul 2006 23:56:08 -0000 1.30
@@ -1314,10 +1314,10 @@
log_action("-------------- pushed UNDEFINED");
} else if (type == 4) {
// contents of register
- int reg = code[3 + i];
- i++;
+ uint8_t reg = code[3 + i];
+ ++i;
if ( thread.isFunction2() ) {
- env.push(*(env.local_register_ptr(reg)));
+ env.push(env.local_register(reg));
log_action("-------------- pushed local register[%d] =
'%s'\n",
reg,
env.top(0).to_string());
@@ -1325,7 +1325,7 @@
env.push(as_value());
log_error("push register[%d] -- register out of
bounds!\n", reg);
} else {
- env.push(env.m_global_register[reg]);
+ env.push(env.global_register(reg));
log_action("-------------- pushed global register[%d] =
'%s'\n",
reg,
env.top(0).to_string());
@@ -2193,7 +2193,7 @@
log_action(" method object: %p\n", (void*)obj);
// Get number of arguments
- int nargs = (int) env.top(2).to_number();
+ int nargs = static_cast<int>(env.top(2).to_number());
log_action(" method nargs: %d\n", nargs);
ensure_stack(env, 3+nargs); // actual args
@@ -2444,6 +2444,8 @@
// @@ security: watch out for possible missing terminator here!
const char* arg = code.read_string(i);
+ log_msg("Setting register %d/%d to %s", arg_register, nargs,
arg);
+
func->add_arg(arg_register, arg);
i += strlen(arg)+1;
}
@@ -2596,12 +2598,12 @@
const action_buffer& code = thread.code;
- int reg = code[thread.pc + 3];
+ uint8_t reg = code[thread.pc + 3];
// Save top of stack in specified register.
if ( thread.isFunction2() )
{
- *(env.local_register_ptr(reg)) = env.top(0);
+ env.local_register(reg) = env.top(0);
log_action("-------------- local register[%d] = '%s'\n",
reg, env.top(0).to_string());
@@ -2609,7 +2611,7 @@
}
else if (reg >= 0 && reg < 4)
{
- env.m_global_register[reg] = env.top(0);
+ env.global_register(reg) = env.top(0);
log_action("-------------- global register[%d] = '%s'\n",
reg, env.top(0).to_string() );