[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/as_value.cpp server/as_v...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/as_value.cpp server/as_v... |
Date: |
Thu, 22 Mar 2007 08:45:52 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 07/03/22 08:45:52
Modified files:
. : ChangeLog
server : as_value.cpp as_value.h
server/asobj : Global.cpp xml.cpp
server/vm : ASHandlers.cpp
Log message:
* server/as_value.{h,cpp}: drop all methods transparently
calling to_number w/out passing an as_environment.
* server/asobj/Global.cpp, server/asobj/xml.cpp,
server/vm/ASHandlers.cpp: properly update to explicitly
invoke as_value::to_number() when needed.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2669&r2=1.2670
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.cpp?cvsroot=gnash&r1=1.31&r2=1.32
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_value.h?cvsroot=gnash&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Global.cpp?cvsroot=gnash&r1=1.53&r2=1.54
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/xml.cpp?cvsroot=gnash&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.73&r2=1.74
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2669
retrieving revision 1.2670
diff -u -b -r1.2669 -r1.2670
--- ChangeLog 22 Mar 2007 08:10:50 -0000 1.2669
+++ ChangeLog 22 Mar 2007 08:45:51 -0000 1.2670
@@ -1,3 +1,11 @@
+2007-03-22 Sandro Santilli <address@hidden>
+
+ * server/as_value.{h,cpp}: drop all methods transparently
+ calling to_number w/out passing an as_environment.
+ * server/asobj/Global.cpp, server/asobj/xml.cpp,
+ server/vm/ASHandlers.cpp: properly update to explicitly
+ invoke as_value::to_number() when needed.
+
2007-03-22 Zou Lunkai <address@hidden>
* testsuite/misc-ming.all: action_execution_order_test6.c, Makefile.am.
Index: server/as_value.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.cpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -b -r1.31 -r1.32
--- server/as_value.cpp 20 Mar 2007 15:26:04 -0000 1.31
+++ server/as_value.cpp 22 Mar 2007 08:45:51 -0000 1.32
@@ -550,9 +550,9 @@
// Force type to number.
void
-as_value::convert_to_number()
+as_value::convert_to_number(as_environment* env)
{
- set_double(to_number());
+ set_double(to_number(env));
}
// Force type to string.
Index: server/as_value.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_value.h,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- server/as_value.h 22 Mar 2007 00:30:45 -0000 1.37
+++ server/as_value.h 22 Mar 2007 08:45:51 -0000 1.38
@@ -14,7 +14,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: as_value.h,v 1.37 2007/03/22 00:30:45 strk Exp $ */
+/* $Id: as_value.h,v 1.38 2007/03/22 08:45:51 strk Exp $ */
#ifndef GNASH_AS_VALUE_H
#define GNASH_AS_VALUE_H
@@ -438,7 +438,12 @@
as_function* to_as_function() const;
/// Force type to number.
- void convert_to_number();
+ //
+ /// @param env
+ /// The environment to use for running the valueOf() method
+ /// for object values. If NULL, valueOf() won't be run.
+ ///
+ void convert_to_number(as_environment* env);
/// Force type to string.
void convert_to_string();
@@ -542,20 +547,23 @@
bool operator==(const as_value& v) const;
bool operator!=(const as_value& v) const;
+
+ /// @deprecated, use v.set_double(v.to_number(env) / v.to_number(env))
instead !
//bool operator<(const as_value& v) const { return to_number() <
v.to_number(); }
/// @deprecated, use v.set_double(v.to_number(env) + v.to_number(env))
instead !
- void operator+=(const as_value& v) { set_double(to_number() +
v.to_number()); }
+ //void operator+=(const as_value& v) { set_double(to_number() +
v.to_number()); }
- void operator-=(const as_value& v) { set_double(to_number() -
v.to_number()); }
- void operator*=(const as_value& v) { set_double(to_number() *
v.to_number()); }
- void operator/=(const as_value& v) { set_double(to_number() /
v.to_number()); } // @@ check for div/0
- void operator&=(const as_value& v) { set_int(int(to_number()) &
int(v.to_number())); }
- void operator|=(const as_value& v) { set_int(int(to_number()) |
int(v.to_number())); }
- void operator^=(const as_value& v) { set_int(int(to_number()) ^
int(v.to_number())); }
- void shl(const as_value& v) { set_int(int(to_number()) <<
int(v.to_number())); }
- void asr(const as_value& v) { set_int(int(to_number()) >>
int(v.to_number())); }
- void lsr(const as_value& v) { set_int((uint32_t(to_number()) >>
int(v.to_number()))); }
+ /// TODO: deprecate all these !
+// void operator-=(const as_value& v) { set_double(to_number() -
v.to_number()); }
+// void operator*=(const as_value& v) { set_double(to_number() *
v.to_number()); }
+// void operator/=(const as_value& v) { set_double(to_number() /
v.to_number()); } // @@ check for div/0
+// void operator&=(const as_value& v) { set_int(int(to_number()) &
int(v.to_number())); }
+// void operator|=(const as_value& v) { set_int(int(to_number()) |
int(v.to_number())); }
+// void operator^=(const as_value& v) { set_int(int(to_number()) ^
int(v.to_number())); }
+// void shl(const as_value& v) { set_int(int(to_number()) <<
int(v.to_number())); }
+// void asr(const as_value& v) { set_int(int(to_number()) >>
int(v.to_number())); }
+// void lsr(const as_value& v) { set_int((uint32_t(to_number()) >>
int(v.to_number()))); }
/// Sets this value to this string plus the given string.
void string_concat(const tu_string& str);
Index: server/asobj/Global.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Global.cpp,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -b -r1.53 -r1.54
--- server/asobj/Global.cpp 20 Mar 2007 15:01:20 -0000 1.53
+++ server/asobj/Global.cpp 22 Mar 2007 08:45:52 -0000 1.54
@@ -18,7 +18,7 @@
// Implementation of the Global ActionScript Object
-/* $Id: Global.cpp,v 1.53 2007/03/20 15:01:20 strk Exp $ */
+/* $Id: Global.cpp,v 1.54 2007/03/22 08:45:52 strk Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -186,6 +186,8 @@
static as_value
as_global_parseint(const fn_call& fn)
{
+ as_environment* env = fn.env;
+
// assert(fn.nargs == 2 || fn.nargs == 1);
if (fn.nargs < 1) {
IF_VERBOSE_ASCODING_ERRORS(
@@ -200,7 +202,7 @@
// Make sure our argument is the correct type
if (fn.nargs > 1)
- fn.arg(1).convert_to_number();
+ fn.arg(1).convert_to_number(env);
// Set up some variables
const string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
@@ -230,7 +232,7 @@
if (fn.nargs > 1)
{
// to_number returns a double. atoi() would be better
- base = (int)(fn.arg(1).to_number());
+ base = (int)(fn.arg(1).to_number(env));
}
// if the string starts with "0x" then a hex digit
else if (strlen(input) > 2 && input[0] == '0' && input[1] == 'X'
@@ -296,6 +298,7 @@
as_global_assetpropflags(const fn_call& fn)
{
int version = fn.env->get_version();
+ as_environment* env = fn.env;
//log_msg("ASSetPropFlags called with %d args", fn.nargs);
@@ -336,7 +339,7 @@
// are used to determine whether the list of child names should be hidden,
// un-hidden, protected from over-write, un-protected from over-write,
// protected from deletion and un-protected from deletion
- int set_true = int(fn.arg(2).to_number()) &
as_prop_flags::as_prop_flags_mask;
+ int set_true = int(fn.arg(2).to_number(env)) &
as_prop_flags::as_prop_flags_mask;
// Is another integer bitmask that works like set_true,
// except it sets the attributes to false. The
@@ -345,7 +348,7 @@
// ASSetPropFlags was exposed in Flash 5, however the fourth argument
'set_false'
// was not required as it always defaulted to the value '~0'.
int set_false = (fn.nargs == 3 ?
- (version == 5 ? ~0 : 0) : int(fn.arg(3).to_number()))
+ (version == 5 ? ~0 : 0) : int(fn.arg(3).to_number(env)))
& as_prop_flags::as_prop_flags_mask;
obj->setPropFlags(props, set_false, set_true);
Index: server/asobj/xml.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/xml.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- server/asobj/xml.cpp 20 Mar 2007 15:01:20 -0000 1.22
+++ server/asobj/xml.cpp 22 Mar 2007 08:45:52 -0000 1.23
@@ -14,7 +14,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: xml.cpp,v 1.22 2007/03/20 15:01:20 strk Exp $ */
+/* $Id: xml.cpp,v 1.23 2007/03/22 08:45:52 strk Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -42,6 +42,7 @@
#include <string>
#include <sstream>
#include <vector>
+#include <boost/lexical_cast.hpp>
using namespace std;
@@ -459,7 +460,6 @@
//const char *nodevalue;
//AS_value nodevalue;
int length;
- as_value inum;
XMLNode *childnode;
XMLNode *xmlchildnode_obj;
xmlattr_as_object* attr_obj;
@@ -506,6 +506,7 @@
// Process the children, if there are any
if (length) {
//log_msg("\tProcessing %d children nodes for %s\n", length, nodename);
+ int inum;
inum = 0;
for (child=0; child<length; child++) {
// Create a new AS object for this node's children
@@ -514,15 +515,13 @@
// to be the first element of the array instead.
if (mem) {
childnode = xml;
- //obj->set_member(inum.to_string(), obj);
- //inum += 1;
- //childnode = xml->_children[child];
} else {
childnode = xml->_children[child];
}
setupFrame(xmlchildnode_obj, childnode, false); // setup child node
- obj->set_member(inum.to_string(), xmlchildnode_obj);
- inum += 1;
+
+ obj->set_member(boost::lexical_cast<std::string>(inum),
xmlchildnode_obj);
+ ++inum;
}
} else {
//log_msg("\tNode %s has no children\n", nodename);
Index: server/vm/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -b -r1.73 -r1.74
--- server/vm/ASHandlers.cpp 22 Mar 2007 00:30:45 -0000 1.73
+++ server/vm/ASHandlers.cpp 22 Mar 2007 08:45:52 -0000 1.74
@@ -14,7 +14,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: ASHandlers.cpp,v 1.73 2007/03/22 00:30:45 strk Exp $ */
+/* $Id: ASHandlers.cpp,v 1.74 2007/03/22 08:45:52 strk Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -702,9 +702,14 @@
SWFHandlers::ActionAdd(ActionExec& thread)
{
// GNASH_REPORT_FUNCTION;
+
+ //env.top(1) += env.top(0); //original version
+
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1) += env.top(0);
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+ env.top(1) = operand1 + operand2;
env.drop(1);
}
@@ -712,9 +717,14 @@
SWFHandlers::ActionSubtract(ActionExec& thread)
{
// GNASH_REPORT_FUNCTION;
+
+ // env.top(1) -= env.top(0); //original version
+
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1) -= env.top(0);
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+ env.top(1) = operand1 - operand2;
env.drop(1);
}
@@ -722,9 +732,14 @@
SWFHandlers::ActionMultiply(ActionExec& thread)
{
// GNASH_REPORT_FUNCTION;
+
+ // env.top(1) *= env.top(0); //original version
+
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1) *= env.top(0);
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+ env.top(1) = operand1 * operand2;
env.drop(1);
}
@@ -732,9 +747,14 @@
SWFHandlers::ActionDivide(ActionExec& thread)
{
// GNASH_REPORT_FUNCTION;
+//
+ // env.top(1) /= env.top(0); //original version
+
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1) /= env.top(0);
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+ env.top(1) = operand1 / operand2;
env.drop(1);
}
@@ -755,7 +775,7 @@
// Flash4 used 1 and 0 as return from this tag
if ( env.get_version() < 5 ) {
- env.top(1).to_number();
+ env.top(1).to_number(&env);
}
env.drop(1);
@@ -767,7 +787,7 @@
// GNASH_REPORT_FUNCTION;
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1).set_bool(env.top(1).to_number() < env.top(0).to_number());
+ env.top(1).set_bool(env.top(1).to_number(&env) <
env.top(0).to_number(&env));
env.drop(1);
}
@@ -841,9 +861,9 @@
return;
}
- int size = unsigned(size_val.to_number());
+ int size = unsigned(size_val.to_number(&env));
- int base = int(base_val.to_number());
+ int base = int(base_val.to_number(&env));
int version = env.get_version();
const tu_string& str = string_val.to_tu_string_versioned(version);
@@ -926,7 +946,7 @@
// GNASH_REPORT_FUNCTION;
as_environment& env = thread.env;
thread.ensureStack(1);
- env.top(0).set_int(int(floor(env.top(0).to_number())));
+ env.top(0).set_int(int(floor(env.top(0).to_number(&env))));
}
void
@@ -1055,7 +1075,7 @@
{
target = env.find_target(tgt_val);
}
- unsigned int prop_number = (unsigned int)env.top(0).to_number();
+ unsigned int prop_number = (unsigned int)env.top(0).to_number(&env);
if (target)
{
if ( prop_number < get_property_names().size() )
@@ -1097,7 +1117,7 @@
thread.ensureStack(3); // prop val, prop num, target
character *target = env.find_target(env.top(2));
- unsigned int prop_number = (unsigned int)env.top(1).to_number();
+ unsigned int prop_number = (unsigned int)env.top(1).to_number(&env);
as_value prop_val = env.top(0);
if (target) {
@@ -1136,7 +1156,7 @@
si->clone_display_object(
env.top(2).to_std_string(),
env.top(1).to_std_string(),
- (int) env.top(0).to_number());
+ (int) env.top(0).to_number(&env));
}
env.drop(3);
}
@@ -1202,10 +1222,10 @@
// It looks like coordinates of drag bounds are
// given as PIXELS :
// http://www.richsalter.btinternet.co.uk/cks1/cks1.swf
- float y1 = PIXELS_TO_TWIPS(env.top(3).to_number());
- float x1 = PIXELS_TO_TWIPS(env.top(4).to_number());
- float y0 = PIXELS_TO_TWIPS(env.top(5).to_number());
- float x0 = PIXELS_TO_TWIPS(env.top(6).to_number());
+ float y1 = PIXELS_TO_TWIPS(env.top(3).to_number(&env));
+ float x1 = PIXELS_TO_TWIPS(env.top(4).to_number(&env));
+ float y0 = PIXELS_TO_TWIPS(env.top(5).to_number(&env));
+ float x0 = PIXELS_TO_TWIPS(env.top(6).to_number(&env));
// check for swapped values
if ( y1 < y0 )
@@ -1327,7 +1347,7 @@
thread.ensureStack(1); // max
- int max = int(env.top(0).to_number());
+ int max = int(env.top(0).to_number(&env));
if (max < 1) max = 1;
env.top(0).set_int(tu_random::next_random() % max);
}
@@ -1356,7 +1376,7 @@
as_environment& env = thread.env;
thread.ensureStack(1);
char buf[2];
- buf[0] = int(env.top(0).to_number());
+ buf[0] = int(env.top(0).to_number(&env));
buf[1] = 0;
env.top(0).set_string(buf);
}
@@ -2075,7 +2095,7 @@
}
// Get number of args, modifying it if not enough values are on the
stack.
- unsigned nargs = unsigned(env.top(1).to_number());
+ unsigned nargs = unsigned(env.top(1).to_number(&env));
unsigned available_args = env.stack_size()-2; // 2 for func name and
nargs
if ( available_args < nargs )
{
@@ -2148,14 +2168,14 @@
thread.ensureStack(2); // x, ,y
as_value result;
- double y = env.pop().to_number();
- double x = env.pop().to_number();
+ double y = env.pop().to_number(&env);
+ double x = env.pop().to_number(&env);
// Don't need to check for y being 0 here - if it's zero, fmod returns NaN
// which is what flash would do too
result = fmod(x, y);
// env.top(1).set_double(fmod(env.top(1).to_bool() && env.top(0).to_bool());
// env.drop(1);
-// log_error("modulo x=%f, y=%f, z=%f",x,y,result.to_number());
+// log_error("modulo x=%f, y=%f, z=%f",x,y,result.to_number(&env));
env.push(result);
}
@@ -2175,7 +2195,7 @@
classname.c_str());
);
- unsigned nargs = unsigned(env.pop().to_number());
+ unsigned nargs = unsigned(env.pop().to_number(&env));
thread.ensureStack(nargs); // previous 2 entries popped
@@ -2238,7 +2258,7 @@
thread.ensureStack(1); // array size name
- int array_size = (int) env.pop().to_number();
+ int array_size = (int) env.pop().to_number(&env);
assert(array_size >= 0);
thread.ensureStack((unsigned int)array_size); // array elements
@@ -2285,7 +2305,7 @@
// [003] Integer: 1
// SWFACTION_INITOBJECT
- int nmembers = (int) env.pop().to_number();
+ int nmembers = (int) env.pop().to_number(&env);
thread.ensureStack(nmembers); // members
@@ -2424,8 +2444,8 @@
}
else
{
- double op1 = operand1.to_number();
- double op2 = operand2.to_number();
+ double op1 = operand1.to_number(&env);
+ double op2 = operand2.to_number(&env);
if ( isnan(op1) || isnan(op2) )
{
@@ -2460,7 +2480,7 @@
// GNASH_REPORT_FUNCTION;
as_environment& env = thread.env;
thread.ensureStack(1);
- env.top(0).convert_to_number();
+ env.top(0).convert_to_number(&env);
}
void
@@ -2590,7 +2610,7 @@
thread.ensureStack(1);
- env.top(0) += 1;
+ env.top(0).set_double(env.top(0).to_number(&env)+1);
}
void
@@ -2599,7 +2619,7 @@
// GNASH_REPORT_FUNCTION;
as_environment& env = thread.env;
thread.ensureStack(1);
- env.top(0) -= 1;
+ env.top(0).set_double(env.top(0).to_number(&env)-1);
}
void
@@ -2621,7 +2641,7 @@
as_value& obj_value = env.top(1);
// Get number of args, modifying it if not enough values are on the
stack.
- unsigned nargs = unsigned(env.top(2).to_number());
+ unsigned nargs = unsigned(env.top(2).to_number(&env));
unsigned available_args = env.stack_size()-3; // 3 for obj, func and
nargs
if ( available_args < nargs )
{
@@ -2762,7 +2782,7 @@
as_value obj_val = env.pop();
// Get number of args, modifying it if not enough values are on the
stack.
- unsigned nargs = unsigned(env.pop().to_number());
+ unsigned nargs = unsigned(env.pop().to_number(&env));
unsigned available_args = env.stack_size(); // previous 3 entries popped
if ( available_args < nargs )
{
@@ -2906,9 +2926,14 @@
SWFHandlers::ActionBitwiseAnd(ActionExec& thread)
{
// GNASH_REPORT_FUNCTION;
+
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1) &= env.top(0);
+
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+
+ env.top(1) = int(operand1)&int(operand2);
env.drop(1);
}
@@ -2918,7 +2943,11 @@
// GNASH_REPORT_FUNCTION;
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1) |= env.top(0);
+
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+
+ env.top(1) = int(operand1)|int(operand2);
env.drop(1);
}
@@ -2926,9 +2955,14 @@
SWFHandlers::ActionBitwiseXor(ActionExec& thread)
{
// GNASH_REPORT_FUNCTION;
+
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1) ^= env.top(0);
+
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+
+ env.top(1) = int(operand1)^int(operand2);
env.drop(1);
}
@@ -2936,9 +2970,16 @@
SWFHandlers::ActionShiftLeft(ActionExec& thread)
{
// GNASH_REPORT_FUNCTION;
+
+ // env.top(1).asr(env.top(0));
+
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1).asr(env.top(0));
+
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+
+ env.top(1) = int(operand1) >> int(operand2);
env.drop(1);
}
@@ -2946,9 +2987,16 @@
SWFHandlers::ActionShiftRight(ActionExec& thread)
{
// GNASH_REPORT_FUNCTION;
+//
+ //env.top(1).lsr(env.top(0));
+
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1).lsr(env.top(0));
+
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+
+ env.top(1) = int(operand1) >> int(operand2);
env.drop(1);
}
@@ -2956,9 +3004,15 @@
SWFHandlers::ActionShiftRight2(ActionExec& thread)
{
// GNASH_REPORT_FUNCTION;
+ // env.top(1).lsr(env.top(0));
+
as_environment& env = thread.env;
thread.ensureStack(2);
- env.top(1).lsr(env.top(0));
+
+ double operand1 = env.top(1).to_number(&env);
+ double operand2 = env.top(0).to_number(&env);
+
+ env.top(1) = uint32_t(operand1) >> int(operand2);
env.drop(1);
}
@@ -2990,8 +3044,8 @@
}
else
{
- double op1 = operand1.to_number();
- double op2 = operand2.to_number();
+ double op1 = operand1.to_number(&env);
+ double op2 = operand2.to_number(&env);
if ( isnan(op1) || isnan(op2) )
{