diff options
author | Charles Krinke | 2008-07-16 14:30:22 +0000 |
---|---|---|
committer | Charles Krinke | 2008-07-16 14:30:22 +0000 |
commit | 0106f967161b2fa0dbf131a56e9c5498d1b16270 (patch) | |
tree | 62e0cbad5193521f7a2549bb782207306ca9e92c | |
parent | squashing warnings critters (diff) | |
download | opensim-SC_OLD-0106f967161b2fa0dbf131a56e9c5498d1b16270.zip opensim-SC_OLD-0106f967161b2fa0dbf131a56e9c5498d1b16270.tar.gz opensim-SC_OLD-0106f967161b2fa0dbf131a56e9c5498d1b16270.tar.bz2 opensim-SC_OLD-0106f967161b2fa0dbf131a56e9c5498d1b16270.tar.xz |
Mantis#1755. Thank you kindly, Matth for a patch that solves:
When using math operators +,-,*,/ in an LSL script with an LSLFloat
and an integer literal the wrong result is returned. This patch
adds operators to the LSLFloat type to handle this case.
Diffstat (limited to '')
3 files changed, 109 insertions, 34 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Common/LSL_Types.cs index 3dfa711..c630c27 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_Types.cs | |||
@@ -1276,11 +1276,11 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
1276 | return new LSLInteger(int.Parse(s)); | 1276 | return new LSLInteger(int.Parse(s)); |
1277 | } | 1277 | } |
1278 | 1278 | ||
1279 | static public implicit operator LSLInteger(double d) | 1279 | static public implicit operator LSLInteger(uint u) |
1280 | { | 1280 | { |
1281 | return new LSLInteger(d); | 1281 | return new LSLInteger(u); |
1282 | } | 1282 | } |
1283 | 1283 | ||
1284 | static public bool operator ==(LSLInteger i1, LSLInteger i2) | 1284 | static public bool operator ==(LSLInteger i1, LSLInteger i2) |
1285 | { | 1285 | { |
1286 | bool ret = i1.value == i2.value; | 1286 | bool ret = i1.value == i2.value; |
@@ -1312,6 +1312,31 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
1312 | { | 1312 | { |
1313 | return new LSLInteger(i1.value / i2); | 1313 | return new LSLInteger(i1.value / i2); |
1314 | } | 1314 | } |
1315 | |||
1316 | static public LSLFloat operator +(LSLInteger i1, double f) | ||
1317 | { | ||
1318 | return new LSLFloat((double)i1.value + f); | ||
1319 | } | ||
1320 | |||
1321 | static public LSLFloat operator -(LSLInteger i1, double f) | ||
1322 | { | ||
1323 | return new LSLFloat((double)i1.value - f); | ||
1324 | } | ||
1325 | |||
1326 | static public LSLFloat operator *(LSLInteger i1, double f) | ||
1327 | { | ||
1328 | return new LSLFloat((double)i1.value * f); | ||
1329 | } | ||
1330 | |||
1331 | static public LSLFloat operator /(LSLInteger i1, double f) | ||
1332 | { | ||
1333 | return new LSLFloat((double)i1.value / f); | ||
1334 | } | ||
1335 | |||
1336 | static public LSLInteger operator -(LSLInteger i) | ||
1337 | { | ||
1338 | return new LSLInteger(-i.value); | ||
1339 | } | ||
1315 | 1340 | ||
1316 | public override bool Equals(Object o) | 1341 | public override bool Equals(Object o) |
1317 | { | 1342 | { |
@@ -1392,16 +1417,6 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
1392 | 1417 | ||
1393 | #region Operators | 1418 | #region Operators |
1394 | 1419 | ||
1395 | static public implicit operator int(LSLFloat f) | ||
1396 | { | ||
1397 | return (int)f.value; | ||
1398 | } | ||
1399 | |||
1400 | static public implicit operator uint(LSLFloat f) | ||
1401 | { | ||
1402 | return (uint) Math.Abs(f.value); | ||
1403 | } | ||
1404 | |||
1405 | static public implicit operator Boolean(LSLFloat f) | 1420 | static public implicit operator Boolean(LSLFloat f) |
1406 | { | 1421 | { |
1407 | if (f.value == 0.0) | 1422 | if (f.value == 0.0) |
@@ -1450,17 +1465,37 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
1450 | f.value--; | 1465 | f.value--; |
1451 | return f; | 1466 | return f; |
1452 | } | 1467 | } |
1468 | |||
1469 | static public LSLFloat operator +(LSLFloat f, int i) | ||
1470 | { | ||
1471 | return new LSLFloat(f.value + (double)i); | ||
1472 | } | ||
1473 | |||
1474 | static public LSLFloat operator -(LSLFloat f, int i) | ||
1475 | { | ||
1476 | return new LSLFloat(f.value - (double)i); | ||
1477 | } | ||
1478 | |||
1479 | static public LSLFloat operator *(LSLFloat f, int i) | ||
1480 | { | ||
1481 | return new LSLFloat(f.value * (double)i); | ||
1482 | } | ||
1483 | |||
1484 | static public LSLFloat operator /(LSLFloat f, int i) | ||
1485 | { | ||
1486 | return new LSLFloat(f.value / (double)i); | ||
1487 | } | ||
1488 | |||
1489 | static public LSLFloat operator -(LSLFloat f) | ||
1490 | { | ||
1491 | return new LSLFloat(-f.value); | ||
1492 | } | ||
1453 | 1493 | ||
1454 | static public implicit operator System.Double(LSLFloat f) | 1494 | static public implicit operator System.Double(LSLFloat f) |
1455 | { | 1495 | { |
1456 | return f.value; | 1496 | return f.value; |
1457 | } | 1497 | } |
1458 | 1498 | ||
1459 | //static public implicit operator System.Int32(LSLFloat f) | ||
1460 | //{ | ||
1461 | // return (int)f.value; | ||
1462 | //} | ||
1463 | |||
1464 | #endregion | 1499 | #endregion |
1465 | 1500 | ||
1466 | #region Overriders | 1501 | #region Overriders |
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index 7ababb4..f71d584 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs | |||
@@ -1303,10 +1303,10 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
1303 | { | 1303 | { |
1304 | return new LSLInteger(int.Parse(s)); | 1304 | return new LSLInteger(int.Parse(s)); |
1305 | } | 1305 | } |
1306 | 1306 | ||
1307 | static public implicit operator LSLInteger(double d) | 1307 | static public implicit operator LSLInteger(uint u) |
1308 | { | 1308 | { |
1309 | return new LSLInteger(d); | 1309 | return new LSLInteger(u); |
1310 | } | 1310 | } |
1311 | 1311 | ||
1312 | static public bool operator ==(LSLInteger i1, LSLInteger i2) | 1312 | static public bool operator ==(LSLInteger i1, LSLInteger i2) |
@@ -1341,9 +1341,34 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
1341 | return new LSLInteger(i1.value / i2); | 1341 | return new LSLInteger(i1.value / i2); |
1342 | } | 1342 | } |
1343 | 1343 | ||
1344 | static public LSLFloat operator +(LSLInteger i1, double f) | ||
1345 | { | ||
1346 | return new LSLFloat((double)i1.value + f); | ||
1347 | } | ||
1348 | |||
1349 | static public LSLFloat operator -(LSLInteger i1, double f) | ||
1350 | { | ||
1351 | return new LSLFloat((double)i1.value - f); | ||
1352 | } | ||
1353 | |||
1354 | static public LSLFloat operator *(LSLInteger i1, double f) | ||
1355 | { | ||
1356 | return new LSLFloat((double)i1.value * f); | ||
1357 | } | ||
1358 | |||
1359 | static public LSLFloat operator /(LSLInteger i1, double f) | ||
1360 | { | ||
1361 | return new LSLFloat((double)i1.value / f); | ||
1362 | } | ||
1363 | |||
1364 | static public LSLInteger operator -(LSLInteger i) | ||
1365 | { | ||
1366 | return new LSLInteger(-i.value); | ||
1367 | } | ||
1368 | |||
1344 | static public LSLInteger operator &(LSLInteger i1, LSLInteger i2) | 1369 | static public LSLInteger operator &(LSLInteger i1, LSLInteger i2) |
1345 | { | 1370 | { |
1346 | int ret = i1.value & i2.value; | 1371 | int ret = i1.value & i2.value; |
1347 | return ret; | 1372 | return ret; |
1348 | } | 1373 | } |
1349 | 1374 | ||
@@ -1447,16 +1472,6 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
1447 | 1472 | ||
1448 | #region Operators | 1473 | #region Operators |
1449 | 1474 | ||
1450 | static public implicit operator int(LSLFloat f) | ||
1451 | { | ||
1452 | return (int)f.value; | ||
1453 | } | ||
1454 | |||
1455 | static public implicit operator uint(LSLFloat f) | ||
1456 | { | ||
1457 | return (uint) Math.Abs(f.value); | ||
1458 | } | ||
1459 | |||
1460 | static public implicit operator Boolean(LSLFloat f) | 1475 | static public implicit operator Boolean(LSLFloat f) |
1461 | { | 1476 | { |
1462 | if (f.value == 0.0) | 1477 | if (f.value == 0.0) |
@@ -1518,7 +1533,32 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
1518 | f.value--; | 1533 | f.value--; |
1519 | return f; | 1534 | return f; |
1520 | } | 1535 | } |
1536 | |||
1537 | static public LSLFloat operator +(LSLFloat f, int i) | ||
1538 | { | ||
1539 | return new LSLFloat(f.value + (double)i); | ||
1540 | } | ||
1541 | |||
1542 | static public LSLFloat operator -(LSLFloat f, int i) | ||
1543 | { | ||
1544 | return new LSLFloat(f.value - (double)i); | ||
1545 | } | ||
1546 | |||
1547 | static public LSLFloat operator *(LSLFloat f, int i) | ||
1548 | { | ||
1549 | return new LSLFloat(f.value * (double)i); | ||
1550 | } | ||
1551 | |||
1552 | static public LSLFloat operator /(LSLFloat f, int i) | ||
1553 | { | ||
1554 | return new LSLFloat(f.value / (double)i); | ||
1555 | } | ||
1521 | 1556 | ||
1557 | static public LSLFloat operator -(LSLFloat f) | ||
1558 | { | ||
1559 | return new LSLFloat(-f.value); | ||
1560 | } | ||
1561 | |||
1522 | static public implicit operator System.Double(LSLFloat f) | 1562 | static public implicit operator System.Double(LSLFloat f) |
1523 | { | 1563 | { |
1524 | return f.value; | 1564 | return f.value; |
diff --git a/OpenSim/Tests/OpenSim/Region/ScriptEngine/Common/LSL_TypesTestLSLFloat.cs b/OpenSim/Tests/OpenSim/Region/ScriptEngine/Common/LSL_TypesTestLSLFloat.cs index 29d0e1c..130c0ec 100644 --- a/OpenSim/Tests/OpenSim/Region/ScriptEngine/Common/LSL_TypesTestLSLFloat.cs +++ b/OpenSim/Tests/OpenSim/Region/ScriptEngine/Common/LSL_TypesTestLSLFloat.cs | |||
@@ -133,7 +133,7 @@ namespace OpenSim.Region.ScriptEngine.Common.Tests | |||
133 | 133 | ||
134 | foreach (KeyValuePair<double, int> number in numberSet) | 134 | foreach (KeyValuePair<double, int> number in numberSet) |
135 | { | 135 | { |
136 | testNumber = new LSL_Types.LSLFloat(number.Key); | 136 | testNumber = (int)(new LSL_Types.LSLFloat(number.Key)); |
137 | Assert.AreEqual(number.Value, testNumber, "Converting double " + number.Key + ", expecting int " + number.Value); | 137 | Assert.AreEqual(number.Value, testNumber, "Converting double " + number.Key + ", expecting int " + number.Value); |
138 | } | 138 | } |
139 | } | 139 | } |
@@ -170,7 +170,7 @@ namespace OpenSim.Region.ScriptEngine.Common.Tests | |||
170 | 170 | ||
171 | foreach (KeyValuePair<double, int> number in numberSet) | 171 | foreach (KeyValuePair<double, int> number in numberSet) |
172 | { | 172 | { |
173 | testNumber = new LSL_Types.LSLFloat(number.Key); | 173 | testNumber = (uint)(new LSL_Types.LSLFloat(number.Key)); |
174 | Assert.AreEqual(number.Value, testNumber, "Converting double " + number.Key + ", expecting uint " + number.Value); | 174 | Assert.AreEqual(number.Value, testNumber, "Converting double " + number.Key + ", expecting uint " + number.Value); |
175 | } | 175 | } |
176 | } | 176 | } |