[Scummvm-git-logs] scummvm master -> cdc8d16fd55d7cdb84ce228048487daaf91837ed
scemino
noreply at scummvm.org
Tue Mar 19 20:02:16 UTC 2024
This automated email contains information about 21 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
1f47c542d0 TWP: Fix not all members of a class are initialized in clipper. PVS-Studio V730
4c4a938b90 TWP: Remove unused code in clipper
f3130c4921 TWP: Fix calling the 'Clear' virtual function in the destructor of ClipperBase. PVS-Studio V1053
5bbe512189 TWP: Fix recurring check in clipper. PVS-Studio V571
9c5e5f2c83 TWP: Fix the 'succeeded' variable was assigned the same value in clipper. PVS-Studio V1048
b765b43881 TWP: Fix the 'j->OutPt1' variable was assigned the same value in clipper. PVS-Studio V1048
f487c0216f TWP: Fix An unconditional 'return' within a loop in squirrel. PVS-Studio V612
15df97fce9 TWP: Fix calling the 'Finalize' virtual function in the destructor in SQClass. PVS-Studio V1053
14301e272e TWP: Fix pointer to local variable 'funcstate' is stored outside the scope of this variable in squirrel. PVS-Studio V506
c613a94ddc TWP: Fix A part of conditional expression is always true or false in squirrel. PVS-Studio V560
4c3e77e568 TWP: Fix a variable is assigned to itself in squirrel. PVS-Studio V560
6d84bf32a7 TWP: Fix unreachable code detected in squirrel. PVS-Studio V779
f461e4bdca TWP: Fix the 'ci' pointer was utilized before it was verified against nullptr in squirrel. PVS-Studio V595
3f80e4a24b TWP: Fix calling the 'Finalize' virtual function in the destructor in SQVM. PVS-Studio V1053
2e823bc6f6 TWP: Fix excessive checks can be simplified in squirrel. PVS-Studio V728
df0d1cb8d4 TWP: Fix not all members of a class are initialized in squirrel. PVS-Studio V730
d4b3907d84 TWP: Fix variables were assigned the same value. in squirrel. PVS-Studio V1048
aeee6ccc17 TWP: Fix array underrun is possible. The value of 'fpos' index could reach -1 in squirrel. PVS-Studio V557
827b7ae5a8 TWP: Fix 'sqvector' lacks the copy assignment operator in squirrel. PVS-Studio V690
2cc5615042 TWP: Fix 'sqvector' constructor contains potentially uninitialized members in squirrel. PVS-Studio V1077
cdc8d16fd5 TWP: Fix '_sharedstate' overwrites field in base class in squirrel. PVS-Studio V703
Commit: 1f47c542d0e617e20bfbf75534f5fdeef8be5cfc
https://github.com/scummvm/scummvm/commit/1f47c542d0e617e20bfbf75534f5fdeef8be5cfc
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix not all members of a class are initialized in clipper. PVS-Studio V730
Changed paths:
engines/twp/clipper/clipper.cpp
diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index 1c52b148750..9490f8c1502 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -169,7 +169,7 @@ int PolyTree::Total() const {
// PolyNode methods ...
//------------------------------------------------------------------------------
-PolyNode::PolyNode() : Parent(0), Index(0), m_IsOpen(false) {
+PolyNode::PolyNode() : Parent(0), Index(0), m_IsOpen(false), m_jointype(jtSquare), m_endtype(etClosedPolygon) {
}
//------------------------------------------------------------------------------
@@ -829,7 +829,7 @@ bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) {
// ClipperBase class methods ...
//------------------------------------------------------------------------------
-ClipperBase::ClipperBase() // constructor
+ClipperBase::ClipperBase(): m_PreserveCollinear(false), m_HasOpenPaths(false), m_ActiveEdges(nullptr) // constructor
{
m_CurrentLM = m_MinimaList.begin(); // begin() == end() here
m_UseFullRange = false;
@@ -1416,7 +1416,13 @@ bool ClipperBase::LocalMinimaPending() {
// TClipper methods ...
//------------------------------------------------------------------------------
-Clipper::Clipper(int initOptions) : ClipperBase() // constructor
+Clipper::Clipper(int initOptions) :
+ClipperBase(),
+m_ClipType(ctIntersection),
+m_SortedEdges(nullptr),
+m_ClipFillType(pftEvenOdd),
+m_SubjFillType(pftEvenOdd),
+m_UsingPolyTree(false)
{
m_ExecuteLocked = false;
m_UseFullRange = false;
Commit: 4c4a938b906a8c19d6ebae1bd6cad056f3f7e111
https://github.com/scummvm/scummvm/commit/4c4a938b906a8c19d6ebae1bd6cad056f3f7e111
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Remove unused code in clipper
Changed paths:
engines/twp/clipper/clipper.cpp
engines/twp/clipper/clipper.hpp
diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index 9490f8c1502..62de522c35d 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -43,10 +43,6 @@
namespace ClipperLib {
-static double const pi = 3.141592653589793238;
-static double const two_pi = pi * 2;
-static double const def_arc_tolerance = 0.25;
-
enum Direction { dRightToLeft,
dLeftToRight };
@@ -137,34 +133,6 @@ inline cInt Abs(cInt val) {
return val < 0 ? -val : val;
}
-//------------------------------------------------------------------------------
-// PolyTree methods ...
-//------------------------------------------------------------------------------
-
-void PolyTree::Clear() {
- for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i)
- delete AllNodes[i];
- AllNodes.resize(0);
- Childs.resize(0);
-}
-//------------------------------------------------------------------------------
-
-PolyNode *PolyTree::GetFirst() const {
- if (!Childs.empty())
- return Childs[0];
- else
- return 0;
-}
-//------------------------------------------------------------------------------
-
-int PolyTree::Total() const {
- int result = (int)AllNodes.size();
- // with negative offsets, ignore the hidden outer polygon ...
- if (result > 0 && Childs[0] != AllNodes[0])
- result--;
- return result;
-}
-
//------------------------------------------------------------------------------
// PolyNode methods ...
//------------------------------------------------------------------------------
@@ -1436,23 +1404,11 @@ m_UsingPolyTree(false)
}
//------------------------------------------------------------------------------
-#ifdef use_xyz
-void Clipper::ZFillFunction(ZFillCallback zFillFunc) {
- m_ZFill = zFillFunc;
-}
-//------------------------------------------------------------------------------
-#endif
-
bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType fillType) {
return Execute(clipType, solution, fillType, fillType);
}
//------------------------------------------------------------------------------
-bool Clipper::Execute(ClipType clipType, PolyTree &polytree, PolyFillType fillType) {
- return Execute(clipType, polytree, fillType, fillType);
-}
-//------------------------------------------------------------------------------
-
bool Clipper::Execute(ClipType clipType, Paths &solution,
PolyFillType subjFillType, PolyFillType clipFillType) {
if (m_ExecuteLocked)
@@ -1474,24 +1430,6 @@ bool Clipper::Execute(ClipType clipType, Paths &solution,
}
//------------------------------------------------------------------------------
-bool Clipper::Execute(ClipType clipType, PolyTree &polytree,
- PolyFillType subjFillType, PolyFillType clipFillType) {
- if (m_ExecuteLocked)
- return false;
- m_ExecuteLocked = true;
- m_SubjFillType = subjFillType;
- m_ClipFillType = clipFillType;
- m_ClipType = clipType;
- m_UsingPolyTree = true;
- bool succeeded = ExecuteInternal();
- if (succeeded)
- BuildResult2(polytree);
- DisposeAllOutRecs();
- m_ExecuteLocked = false;
- return succeeded;
-}
-//------------------------------------------------------------------------------
-
void Clipper::FixHoleLinkage(OutRec &outrec) {
// skip OutRecs that (a) contain outermost polygons or
//(b) already have the correct owner/child linkage ...
@@ -3035,45 +2973,45 @@ void Clipper::BuildResult(Paths &polys) {
}
//------------------------------------------------------------------------------
-void Clipper::BuildResult2(PolyTree &polytree) {
- polytree.Clear();
- polytree.AllNodes.reserve(m_PolyOuts.size());
- // add each output polygon/contour to polytree ...
- for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {
- OutRec *outRec = m_PolyOuts[i];
- int cnt = PointCount(outRec->Pts);
- if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3))
- continue;
- FixHoleLinkage(*outRec);
- PolyNode *pn = new PolyNode();
- // nb: polytree takes ownership of all the PolyNodes
- polytree.AllNodes.push_back(pn);
- outRec->PolyNd = pn;
- pn->Parent = 0;
- pn->Index = 0;
- pn->Contour.reserve(cnt);
- OutPt *op = outRec->Pts->Prev;
- for (int j = 0; j < cnt; j++) {
- pn->Contour.push_back(op->Pt);
- op = op->Prev;
- }
- }
-
- // fixup PolyNode links etc ...
- polytree.Childs.reserve(m_PolyOuts.size());
- for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {
- OutRec *outRec = m_PolyOuts[i];
- if (!outRec->PolyNd)
- continue;
- if (outRec->IsOpen) {
- outRec->PolyNd->m_IsOpen = true;
- polytree.AddChild(*outRec->PolyNd);
- } else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd)
- outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd);
- else
- polytree.AddChild(*outRec->PolyNd);
- }
-}
+// void Clipper::BuildResult2(PolyTree &polytree) {
+// polytree.Clear();
+// polytree.AllNodes.reserve(m_PolyOuts.size());
+// // add each output polygon/contour to polytree ...
+// for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {
+// OutRec *outRec = m_PolyOuts[i];
+// int cnt = PointCount(outRec->Pts);
+// if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3))
+// continue;
+// FixHoleLinkage(*outRec);
+// PolyNode *pn = new PolyNode();
+// // nb: polytree takes ownership of all the PolyNodes
+// polytree.AllNodes.push_back(pn);
+// outRec->PolyNd = pn;
+// pn->Parent = 0;
+// pn->Index = 0;
+// pn->Contour.reserve(cnt);
+// OutPt *op = outRec->Pts->Prev;
+// for (int j = 0; j < cnt; j++) {
+// pn->Contour.push_back(op->Pt);
+// op = op->Prev;
+// }
+// }
+
+// // fixup PolyNode links etc ...
+// polytree.Childs.reserve(m_PolyOuts.size());
+// for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) {
+// OutRec *outRec = m_PolyOuts[i];
+// if (!outRec->PolyNd)
+// continue;
+// if (outRec->IsOpen) {
+// outRec->PolyNd->m_IsOpen = true;
+// polytree.AddChild(*outRec->PolyNd);
+// } else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd)
+// outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd);
+// else
+// polytree.AddChild(*outRec->PolyNd);
+// }
+// }
//------------------------------------------------------------------------------
void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) {
@@ -3554,428 +3492,6 @@ void Clipper::JoinCommonEdges() {
}
}
-//------------------------------------------------------------------------------
-// ClipperOffset support functions ...
-//------------------------------------------------------------------------------
-
-DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) {
- if (pt2.X == pt1.X && pt2.Y == pt1.Y)
- return DoublePoint(0, 0);
-
- double Dx = (double)(pt2.X - pt1.X);
- double dy = (double)(pt2.Y - pt1.Y);
- double f = 1 * 1.0 / sqrt(Dx * Dx + dy * dy);
- Dx *= f;
- dy *= f;
- return DoublePoint(dy, -Dx);
-}
-
-//------------------------------------------------------------------------------
-// ClipperOffset class
-//------------------------------------------------------------------------------
-
-ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance) {
- MiterLimit = miterLimit;
- ArcTolerance = arcTolerance;
- m_lowest.X = -1;
-}
-//------------------------------------------------------------------------------
-
-ClipperOffset::~ClipperOffset() {
- Clear();
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::Clear() {
- for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
- delete m_polyNodes.Childs[i];
- m_polyNodes.Childs.clear();
- m_lowest.X = -1;
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::AddPath(const Path &path, JoinType joinType, EndType endType) {
- int highI = (int)path.size() - 1;
- if (highI < 0)
- return;
- PolyNode *newNode = new PolyNode();
- newNode->m_jointype = joinType;
- newNode->m_endtype = endType;
-
- // strip duplicate points from path and also get index to the lowest point ...
- if (endType == etClosedLine || endType == etClosedPolygon)
- while (highI > 0 && path[0] == path[highI])
- highI--;
- newNode->Contour.reserve(highI + 1);
- newNode->Contour.push_back(path[0]);
- int j = 0, k = 0;
- for (int i = 1; i <= highI; i++)
- if (newNode->Contour[j] != path[i]) {
- j++;
- newNode->Contour.push_back(path[i]);
- if (path[i].Y > newNode->Contour[k].Y ||
- (path[i].Y == newNode->Contour[k].Y &&
- path[i].X < newNode->Contour[k].X))
- k = j;
- }
- if (endType == etClosedPolygon && j < 2) {
- delete newNode;
- return;
- }
- m_polyNodes.AddChild(*newNode);
-
- // if this path's lowest pt is lower than all the others then update m_lowest
- if (endType != etClosedPolygon)
- return;
- if (m_lowest.X < 0)
- m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
- else {
- IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y];
- if (newNode->Contour[k].Y > ip.Y ||
- (newNode->Contour[k].Y == ip.Y &&
- newNode->Contour[k].X < ip.X))
- m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
- }
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::AddPaths(const Paths &paths, JoinType joinType, EndType endType) {
- for (Paths::size_type i = 0; i < paths.size(); ++i)
- AddPath(paths[i], joinType, endType);
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::FixOrientations() {
- // fixup orientations of all closed paths if the orientation of the
- // closed path with the lowermost vertex is wrong ...
- if (m_lowest.X >= 0 &&
- !Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour)) {
- for (int i = 0; i < m_polyNodes.ChildCount(); ++i) {
- PolyNode &node = *m_polyNodes.Childs[i];
- if (node.m_endtype == etClosedPolygon ||
- (node.m_endtype == etClosedLine && Orientation(node.Contour)))
- ReversePath(node.Contour);
- }
- } else {
- for (int i = 0; i < m_polyNodes.ChildCount(); ++i) {
- PolyNode &node = *m_polyNodes.Childs[i];
- if (node.m_endtype == etClosedLine && !Orientation(node.Contour))
- ReversePath(node.Contour);
- }
- }
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::Execute(Paths &solution, double delta) {
- solution.clear();
- FixOrientations();
- DoOffset(delta);
-
- // now clean up 'corners' ...
- Clipper clpr;
- clpr.AddPaths(m_destPolys, ptSubject, true);
- if (delta > 0) {
- clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
- } else {
- IntRect r = clpr.GetBounds();
- Path outer(4);
- outer[0] = IntPoint(r.left - 10, r.bottom + 10);
- outer[1] = IntPoint(r.right + 10, r.bottom + 10);
- outer[2] = IntPoint(r.right + 10, r.top - 10);
- outer[3] = IntPoint(r.left - 10, r.top - 10);
-
- clpr.AddPath(outer, ptSubject, true);
- clpr.ReverseSolution(true);
- clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
- if (solution.size() > 0)
- solution.erase(solution.begin());
- }
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::Execute(PolyTree &solution, double delta) {
- solution.Clear();
- FixOrientations();
- DoOffset(delta);
-
- // now clean up 'corners' ...
- Clipper clpr;
- clpr.AddPaths(m_destPolys, ptSubject, true);
- if (delta > 0) {
- clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
- } else {
- IntRect r = clpr.GetBounds();
- Path outer(4);
- outer[0] = IntPoint(r.left - 10, r.bottom + 10);
- outer[1] = IntPoint(r.right + 10, r.bottom + 10);
- outer[2] = IntPoint(r.right + 10, r.top - 10);
- outer[3] = IntPoint(r.left - 10, r.top - 10);
-
- clpr.AddPath(outer, ptSubject, true);
- clpr.ReverseSolution(true);
- clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
- // remove the outer PolyNode rectangle ...
- if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0) {
- PolyNode *outerNode = solution.Childs[0];
- solution.Childs.reserve(outerNode->ChildCount());
- solution.Childs[0] = outerNode->Childs[0];
- solution.Childs[0]->Parent = outerNode->Parent;
- for (int i = 1; i < outerNode->ChildCount(); ++i)
- solution.AddChild(*outerNode->Childs[i]);
- } else
- solution.Clear();
- }
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::DoOffset(double delta) {
- m_destPolys.clear();
- m_delta = delta;
-
- // if Zero offset, just copy any CLOSED polygons to m_p and return ...
- if (NEAR_ZERO(delta)) {
- m_destPolys.reserve(m_polyNodes.ChildCount());
- for (int i = 0; i < m_polyNodes.ChildCount(); i++) {
- PolyNode &node = *m_polyNodes.Childs[i];
- if (node.m_endtype == etClosedPolygon)
- m_destPolys.push_back(node.Contour);
- }
- return;
- }
-
- // see offset_triginometry3.svg in the documentation folder ...
- if (MiterLimit > 2)
- m_miterLim = 2 / (MiterLimit * MiterLimit);
- else
- m_miterLim = 0.5;
-
- double y;
- if (ArcTolerance <= 0.0)
- y = def_arc_tolerance;
- else if (ArcTolerance > fabs(delta) * def_arc_tolerance)
- y = fabs(delta) * def_arc_tolerance;
- else
- y = ArcTolerance;
- // see offset_triginometry2.svg in the documentation folder ...
- double steps = pi / acos(1 - y / fabs(delta));
- if (steps > fabs(delta) * pi)
- steps = fabs(delta) * pi; // ie excessive precision check
- m_sin = sin(two_pi / steps);
- m_cos = cos(two_pi / steps);
- m_StepsPerRad = steps / two_pi;
- if (delta < 0.0)
- m_sin = -m_sin;
-
- m_destPolys.reserve(m_polyNodes.ChildCount() * 2);
- for (int i = 0; i < m_polyNodes.ChildCount(); i++) {
- PolyNode &node = *m_polyNodes.Childs[i];
- m_srcPoly = node.Contour;
-
- int len = (int)m_srcPoly.size();
- if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon)))
- continue;
-
- m_destPoly.clear();
- if (len == 1) {
- if (node.m_jointype == jtRound) {
- double X = 1.0, Y = 0.0;
- for (cInt j = 1; j <= steps; j++) {
- m_destPoly.push_back(IntPoint(
- Round(m_srcPoly[0].X + X * delta),
- Round(m_srcPoly[0].Y + Y * delta)));
- double X2 = X;
- X = X * m_cos - m_sin * Y;
- Y = X2 * m_sin + Y * m_cos;
- }
- } else {
- double X = -1.0, Y = -1.0;
- for (int j = 0; j < 4; ++j) {
- m_destPoly.push_back(IntPoint(
- Round(m_srcPoly[0].X + X * delta),
- Round(m_srcPoly[0].Y + Y * delta)));
- if (X < 0)
- X = 1;
- else if (Y < 0)
- Y = 1;
- else
- X = -1;
- }
- }
- m_destPolys.push_back(m_destPoly);
- continue;
- }
- // build m_normals ...
- m_normals.clear();
- m_normals.reserve(len);
- for (int j = 0; j < len - 1; ++j)
- m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1]));
- if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon)
- m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0]));
- else
- m_normals.push_back(DoublePoint(m_normals[len - 2]));
-
- if (node.m_endtype == etClosedPolygon) {
- int k = len - 1;
- for (int j = 0; j < len; ++j)
- OffsetPoint(j, k, node.m_jointype);
- m_destPolys.push_back(m_destPoly);
- } else if (node.m_endtype == etClosedLine) {
- int k = len - 1;
- for (int j = 0; j < len; ++j)
- OffsetPoint(j, k, node.m_jointype);
- m_destPolys.push_back(m_destPoly);
- m_destPoly.clear();
- // re-build m_normals ...
- DoublePoint n = m_normals[len - 1];
- for (int j = len - 1; j > 0; j--)
- m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
- m_normals[0] = DoublePoint(-n.X, -n.Y);
- k = 0;
- for (int j = len - 1; j >= 0; j--)
- OffsetPoint(j, k, node.m_jointype);
- m_destPolys.push_back(m_destPoly);
- } else {
- int k = 0;
- for (int j = 1; j < len - 1; ++j)
- OffsetPoint(j, k, node.m_jointype);
-
- IntPoint pt1;
- if (node.m_endtype == etOpenButt) {
- int j = len - 1;
- pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X *
- delta),
- (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta));
- m_destPoly.push_back(pt1);
- pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X *
- delta),
- (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta));
- m_destPoly.push_back(pt1);
- } else {
- int j = len - 1;
- k = len - 2;
- m_sinA = 0;
- m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y);
- if (node.m_endtype == etOpenSquare)
- DoSquare(j, k);
- else
- DoRound(j, k);
- }
-
- // re-build m_normals ...
- for (int j = len - 1; j > 0; j--)
- m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
- m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y);
-
- k = len - 1;
- for (int j = k - 1; j > 0; --j)
- OffsetPoint(j, k, node.m_jointype);
-
- if (node.m_endtype == etOpenButt) {
- pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta),
- (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta));
- m_destPoly.push_back(pt1);
- pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta),
- (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta));
- m_destPoly.push_back(pt1);
- } else {
- k = 1;
- m_sinA = 0;
- if (node.m_endtype == etOpenSquare)
- DoSquare(0, 1);
- else
- DoRound(0, 1);
- }
- m_destPolys.push_back(m_destPoly);
- }
- }
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::OffsetPoint(int j, int &k, JoinType jointype) {
- // cross product ...
- m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y);
- if (fabs(m_sinA * m_delta) < 1.0) {
- // dot product ...
- double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y);
- if (cosA > 0) // angle => 0 degrees
- {
- m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
- Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
- return;
- }
- // else angle => 180 degrees
- } else if (m_sinA > 1.0)
- m_sinA = 1.0;
- else if (m_sinA < -1.0)
- m_sinA = -1.0;
-
- if (m_sinA * m_delta < 0) {
- m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
- Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
- m_destPoly.push_back(m_srcPoly[j]);
- m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta),
- Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)));
- } else
- switch (jointype) {
- case jtMiter: {
- double r = 1 + (m_normals[j].X * m_normals[k].X +
- m_normals[j].Y * m_normals[k].Y);
- if (r >= m_miterLim)
- DoMiter(j, k, r);
- else
- DoSquare(j, k);
- break;
- }
- case jtSquare:
- DoSquare(j, k);
- break;
- case jtRound:
- DoRound(j, k);
- break;
- }
- k = j;
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::DoSquare(int j, int k) {
- double dx = tan(atan2(m_sinA,
- m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) /
- 4);
- m_destPoly.push_back(IntPoint(
- Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)),
- Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx))));
- m_destPoly.push_back(IntPoint(
- Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)),
- Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx))));
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::DoMiter(int j, int k, double r) {
- double q = m_delta / r;
- m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q),
- Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q)));
-}
-//------------------------------------------------------------------------------
-
-void ClipperOffset::DoRound(int j, int k) {
- double a = atan2(m_sinA,
- m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y);
- int steps = MAX((int)Round(m_StepsPerRad * fabs(a)), 1);
-
- double X = m_normals[k].X, Y = m_normals[k].Y, X2;
- for (int i = 0; i < steps; ++i) {
- m_destPoly.push_back(IntPoint(
- Round(m_srcPoly[j].X + X * m_delta),
- Round(m_srcPoly[j].Y + Y * m_delta)));
- X2 = X;
- X = X * m_cos - m_sin * Y;
- Y = X2 * m_sin + Y * m_cos;
- }
- m_destPoly.push_back(IntPoint(
- Round(m_srcPoly[j].X + m_normals[j].X * m_delta),
- Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)));
-}
-
//------------------------------------------------------------------------------
// Miscellaneous public functions
//------------------------------------------------------------------------------
@@ -4050,25 +3566,25 @@ void ReversePaths(Paths &p) {
}
//------------------------------------------------------------------------------
-void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) {
- Clipper c;
- c.StrictlySimple(true);
- c.AddPath(in_poly, ptSubject, true);
- c.Execute(ctUnion, out_polys, fillType, fillType);
-}
-//------------------------------------------------------------------------------
+// void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) {
+// Clipper c;
+// c.StrictlySimple(true);
+// c.AddPath(in_poly, ptSubject, true);
+// c.Execute(ctUnion, out_polys, fillType, fillType);
+// }
+// //------------------------------------------------------------------------------
-void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) {
- Clipper c;
- c.StrictlySimple(true);
- c.AddPaths(in_polys, ptSubject, true);
- c.Execute(ctUnion, out_polys, fillType, fillType);
-}
-//------------------------------------------------------------------------------
+// void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) {
+// Clipper c;
+// c.StrictlySimple(true);
+// c.AddPaths(in_polys, ptSubject, true);
+// c.Execute(ctUnion, out_polys, fillType, fillType);
+// }
+// //------------------------------------------------------------------------------
-void SimplifyPolygons(Paths &polys, PolyFillType fillType) {
- SimplifyPolygons(polys, polys, fillType);
-}
+// void SimplifyPolygons(Paths &polys, PolyFillType fillType) {
+// SimplifyPolygons(polys, polys, fillType);
+// }
//------------------------------------------------------------------------------
inline double DistanceSqrd(const IntPoint &pt1, const IntPoint &pt2) {
@@ -4133,72 +3649,6 @@ OutPt *ExcludeOp(OutPt *op) {
}
//------------------------------------------------------------------------------
-void CleanPolygon(const Path &in_poly, Path &out_poly, double distance) {
- // distance = proximity in units/pixels below which vertices
- // will be stripped. Default ~= sqrt(2).
-
- size_t size = in_poly.size();
-
- if (size == 0) {
- out_poly.clear();
- return;
- }
-
- OutPt *outPts = new OutPt[size];
- for (size_t i = 0; i < size; ++i) {
- outPts[i].Pt = in_poly[i];
- outPts[i].Next = &outPts[(i + 1) % size];
- outPts[i].Next->Prev = &outPts[i];
- outPts[i].Idx = 0;
- }
-
- double distSqrd = distance * distance;
- OutPt *op = &outPts[0];
- while (op->Idx == 0 && op->Next != op->Prev) {
- if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd)) {
- op = ExcludeOp(op);
- size--;
- } else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd)) {
- ExcludeOp(op->Next);
- op = ExcludeOp(op);
- size -= 2;
- } else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd)) {
- op = ExcludeOp(op);
- size--;
- } else {
- op->Idx = 1;
- op = op->Next;
- }
- }
-
- if (size < 3)
- size = 0;
- out_poly.resize(size);
- for (size_t i = 0; i < size; ++i) {
- out_poly[i] = op->Pt;
- op = op->Next;
- }
- delete[] outPts;
-}
-//------------------------------------------------------------------------------
-
-void CleanPolygon(Path &poly, double distance) {
- CleanPolygon(poly, poly, distance);
-}
-//------------------------------------------------------------------------------
-
-void CleanPolygons(const Paths &in_polys, Paths &out_polys, double distance) {
- out_polys.resize(in_polys.size());
- for (Paths::size_type i = 0; i < in_polys.size(); ++i)
- CleanPolygon(in_polys[i], out_polys[i], distance);
-}
-//------------------------------------------------------------------------------
-
-void CleanPolygons(Paths &polys, double distance) {
- CleanPolygons(polys, polys, distance);
-}
-//------------------------------------------------------------------------------
-
void Minkowski(const Path &poly, const Path &path,
Paths &solution, bool isSum, bool isClosed) {
int delta = (isClosed ? 1 : 0);
@@ -4240,12 +3690,12 @@ void Minkowski(const Path &poly, const Path &path,
}
//------------------------------------------------------------------------------
-void MinkowskiSum(const Path &pattern, const Path &path, Paths &solution, bool pathIsClosed) {
- Minkowski(pattern, path, solution, true, pathIsClosed);
- Clipper c;
- c.AddPaths(solution, ptSubject, true);
- c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
-}
+// void MinkowskiSum(const Path &pattern, const Path &path, Paths &solution, bool pathIsClosed) {
+// Minkowski(pattern, path, solution, true, pathIsClosed);
+// Clipper c;
+// c.AddPaths(solution, ptSubject, true);
+// c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
+// }
//------------------------------------------------------------------------------
void TranslatePath(const Path &input, Path &output, const IntPoint delta) {
@@ -4256,30 +3706,6 @@ void TranslatePath(const Path &input, Path &output, const IntPoint delta) {
}
//------------------------------------------------------------------------------
-void MinkowskiSum(const Path &pattern, const Paths &paths, Paths &solution, bool pathIsClosed) {
- Clipper c;
- for (size_t i = 0; i < paths.size(); ++i) {
- Paths tmp;
- Minkowski(pattern, paths[i], tmp, true, pathIsClosed);
- c.AddPaths(tmp, ptSubject, true);
- if (pathIsClosed) {
- Path tmp2;
- TranslatePath(paths[i], tmp2, pattern[0]);
- c.AddPath(tmp2, ptClip, true);
- }
- }
- c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
-}
-//------------------------------------------------------------------------------
-
-void MinkowskiDiff(const Path &poly1, const Path &poly2, Paths &solution) {
- Minkowski(poly1, poly2, solution, false, true);
- Clipper c;
- c.AddPaths(solution, ptSubject, true);
- c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
-}
-//------------------------------------------------------------------------------
-
enum NodeType { ntAny,
ntOpen,
ntClosed };
@@ -4298,28 +3724,28 @@ void AddPolyNodeToPaths(const PolyNode &polynode, NodeType nodetype, Paths &path
}
//------------------------------------------------------------------------------
-void PolyTreeToPaths(const PolyTree &polytree, Paths &paths) {
- paths.resize(0);
- paths.reserve(polytree.Total());
- AddPolyNodeToPaths(polytree, ntAny, paths);
-}
-//------------------------------------------------------------------------------
-
-void ClosedPathsFromPolyTree(const PolyTree &polytree, Paths &paths) {
- paths.resize(0);
- paths.reserve(polytree.Total());
- AddPolyNodeToPaths(polytree, ntClosed, paths);
-}
-//------------------------------------------------------------------------------
-
-void OpenPathsFromPolyTree(PolyTree &polytree, Paths &paths) {
- paths.resize(0);
- paths.reserve(polytree.Total());
- // Open paths are top level only, so ...
- for (int i = 0; i < polytree.ChildCount(); ++i)
- if (polytree.Childs[i]->IsOpen())
- paths.push_back(polytree.Childs[i]->Contour);
-}
+// void PolyTreeToPaths(const PolyTree &polytree, Paths &paths) {
+// paths.resize(0);
+// paths.reserve(polytree.Total());
+// AddPolyNodeToPaths(polytree, ntAny, paths);
+// }
+// //------------------------------------------------------------------------------
+
+// void ClosedPathsFromPolyTree(const PolyTree &polytree, Paths &paths) {
+// paths.resize(0);
+// paths.reserve(polytree.Total());
+// AddPolyNodeToPaths(polytree, ntClosed, paths);
+// }
+// //------------------------------------------------------------------------------
+
+// void OpenPathsFromPolyTree(PolyTree &polytree, Paths &paths) {
+// paths.resize(0);
+// paths.reserve(polytree.Total());
+// // Open paths are top level only, so ...
+// for (int i = 0; i < polytree.ChildCount(); ++i)
+// if (polytree.Childs[i]->IsOpen())
+// paths.push_back(polytree.Childs[i]->Contour);
+// }
//------------------------------------------------------------------------------
} // namespace ClipperLib
diff --git a/engines/twp/clipper/clipper.hpp b/engines/twp/clipper/clipper.hpp
index 8598a9eccc4..7d8223dc2eb 100644
--- a/engines/twp/clipper/clipper.hpp
+++ b/engines/twp/clipper/clipper.hpp
@@ -179,10 +179,6 @@ struct DoublePoint {
};
//------------------------------------------------------------------------------
-#ifdef use_xyz
-typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt);
-#endif
-
enum InitOptions { ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4 };
enum JoinType { jtSquare, jtRound, jtMiter };
enum EndType { etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound };
@@ -213,39 +209,10 @@ private:
friend class ClipperOffset;
};
-class PolyTree : public PolyNode {
-public:
- ~PolyTree() { Clear(); };
- PolyNode *GetFirst() const;
- void Clear();
- int Total() const;
-private:
- //PolyTree& operator =(PolyTree& other);
- PolyNodes AllNodes;
- friend class Clipper; //to access AllNodes
-};
-
bool Orientation(const Path &poly);
double Area(const Path &poly);
int PointInPolygon(const IntPoint &pt, const Path &path);
-void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
-void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
-void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd);
-
-void CleanPolygon(const Path &in_poly, Path &out_poly, double distance = 1.415);
-void CleanPolygon(Path &poly, double distance = 1.415);
-void CleanPolygons(const Paths &in_polys, Paths &out_polys, double distance = 1.415);
-void CleanPolygons(Paths &polys, double distance = 1.415);
-
-void MinkowskiSum(const Path &pattern, const Path &path, Paths &solution, bool pathIsClosed);
-void MinkowskiSum(const Path &pattern, const Paths &paths, Paths &solution, bool pathIsClosed);
-void MinkowskiDiff(const Path &poly1, const Path &poly2, Paths &solution);
-
-void PolyTreeToPaths(const PolyTree &polytree, Paths &paths);
-void ClosedPathsFromPolyTree(const PolyTree &polytree, Paths &paths);
-void OpenPathsFromPolyTree(PolyTree &polytree, Paths &paths);
-
void ReversePath(Path &p);
void ReversePaths(Paths &p);
@@ -284,7 +251,6 @@ public:
void PreserveCollinear(bool value) { m_PreserveCollinear = value; };
protected:
void DisposeLocalMinimaList();
- TEdge *AddBoundsToLML(TEdge *e, bool IsClosed);
virtual void Reset();
TEdge *ProcessBound(TEdge *E, bool IsClockwise);
void InsertScanbeam(const cInt Y);
@@ -324,21 +290,11 @@ public:
Paths &solution,
PolyFillType subjFillType,
PolyFillType clipFillType);
- bool Execute(ClipType clipType,
- PolyTree &polytree,
- PolyFillType fillType = pftEvenOdd);
- bool Execute(ClipType clipType,
- PolyTree &polytree,
- PolyFillType subjFillType,
- PolyFillType clipFillType);
+
bool ReverseSolution() { return m_ReverseOutput; };
void ReverseSolution(bool value) { m_ReverseOutput = value; };
bool StrictlySimple() { return m_StrictSimple; };
void StrictlySimple(bool value) { m_StrictSimple = value; };
- //set the callback function for z value filling on intersections (otherwise Z is 0)
-#ifdef use_xyz
- void ZFillFunction(ZFillCallback zFillFunc);
-#endif
protected:
virtual bool ExecuteInternal();
private:
@@ -355,9 +311,6 @@ private:
bool m_ReverseOutput;
bool m_UsingPolyTree;
bool m_StrictSimple;
-#ifdef use_xyz
- ZFillCallback m_ZFill; //custom callback
-#endif
void SetWindingCount(TEdge &edge);
bool IsEvenOddFillType(const TEdge &edge) const;
bool IsEvenOddAltFillType(const TEdge &edge) const;
@@ -369,7 +322,6 @@ private:
void DeleteFromSEL(TEdge *e);
void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2);
bool IsContributing(const TEdge &edge) const;
- bool IsTopHorz(const cInt XPos);
void DoMaxima(TEdge *e);
void ProcessHorizontals();
void ProcessHorizontal(TEdge *horzEdge);
@@ -385,14 +337,11 @@ private:
void ProcessIntersectList();
void ProcessEdgesAtTopOfScanbeam(const cInt topY);
void BuildResult(Paths &polys);
- void BuildResult2(PolyTree &polytree);
void SetHoleState(TEdge *e, OutRec *outrec);
void DisposeIntersectNodes();
bool FixupIntersectionOrder();
void FixupOutPolygon(OutRec &outrec);
void FixupOutPolyline(OutRec &outrec);
- bool IsHole(TEdge *e);
- bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl);
void FixHoleLinkage(OutRec &outrec);
void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt);
void ClearJoins();
@@ -410,36 +359,6 @@ private:
};
//------------------------------------------------------------------------------
-class ClipperOffset {
-public:
- ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25);
- ~ClipperOffset();
- void AddPath(const Path &path, JoinType joinType, EndType endType);
- void AddPaths(const Paths &paths, JoinType joinType, EndType endType);
- void Execute(Paths &solution, double delta);
- void Execute(PolyTree &solution, double delta);
- void Clear();
- double MiterLimit;
- double ArcTolerance;
-private:
- Paths m_destPolys;
- Path m_srcPoly;
- Path m_destPoly;
- Common::Array<DoublePoint> m_normals;
- double m_delta, m_sinA, m_sin, m_cos;
- double m_miterLim, m_StepsPerRad;
- IntPoint m_lowest;
- PolyNode m_polyNodes;
-
- void FixOrientations();
- void DoOffset(double delta);
- void OffsetPoint(int j, int &k, JoinType jointype);
- void DoSquare(int j, int k);
- void DoMiter(int j, int k, double r);
- void DoRound(int j, int k);
-};
-//------------------------------------------------------------------------------
-
} //ClipperLib namespace
#endif //clipper_hpp
Commit: f3130c49218017a3fc38c12a8b9ddd47d5f552df
https://github.com/scummvm/scummvm/commit/f3130c49218017a3fc38c12a8b9ddd47d5f552df
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix calling the 'Clear' virtual function in the destructor of ClipperBase. PVS-Studio V1053
Changed paths:
engines/twp/clipper/clipper.hpp
diff --git a/engines/twp/clipper/clipper.hpp b/engines/twp/clipper/clipper.hpp
index 7d8223dc2eb..1a7173e4236 100644
--- a/engines/twp/clipper/clipper.hpp
+++ b/engines/twp/clipper/clipper.hpp
@@ -245,7 +245,7 @@ public:
virtual ~ClipperBase();
virtual bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed);
bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed);
- virtual void Clear();
+ void Clear();
IntRect GetBounds();
bool PreserveCollinear() { return m_PreserveCollinear; };
void PreserveCollinear(bool value) { m_PreserveCollinear = value; };
Commit: 5bbe5121890446c66d7cc2b86752f9d4926a37c9
https://github.com/scummvm/scummvm/commit/5bbe5121890446c66d7cc2b86752f9d4926a37c9
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix recurring check in clipper. PVS-Studio V571
Changed paths:
engines/twp/clipper/clipper.cpp
diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index 62de522c35d..bdb0e9ddd73 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -2760,8 +2760,7 @@ void Clipper::DoMaxima(TEdge *e) {
DeleteFromAEL(e);
DeleteFromAEL(eMaxPair);
} else if (e->OutIdx >= 0 && eMaxPair->OutIdx >= 0) {
- if (e->OutIdx >= 0)
- AddLocalMaxPoly(e, eMaxPair, e->Top);
+ AddLocalMaxPoly(e, eMaxPair, e->Top);
DeleteFromAEL(e);
DeleteFromAEL(eMaxPair);
}
Commit: 9c5e5f2c83021b4fce036697141b56143fb5a33e
https://github.com/scummvm/scummvm/commit/9c5e5f2c83021b4fce036697141b56143fb5a33e
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix the 'succeeded' variable was assigned the same value in clipper. PVS-Studio V1048
Changed paths:
engines/twp/clipper/clipper.cpp
diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index bdb0e9ddd73..46afe5f68d5 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -1452,7 +1452,6 @@ bool Clipper::ExecuteInternal() {
m_Maxima = MaximaList();
m_SortedEdges = 0;
- succeeded = true;
cInt botY, topY;
if (!PopScanbeam(botY))
return false;
Commit: b765b43881c1d7fec5e56568b5c2c99630c19b76
https://github.com/scummvm/scummvm/commit/b765b43881c1d7fec5e56568b5c2c99630c19b76
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix the 'j->OutPt1' variable was assigned the same value in clipper. PVS-Studio V1048
Changed paths:
engines/twp/clipper/clipper.cpp
diff --git a/engines/twp/clipper/clipper.cpp b/engines/twp/clipper/clipper.cpp
index 46afe5f68d5..4ba0b0a2e29 100644
--- a/engines/twp/clipper/clipper.cpp
+++ b/engines/twp/clipper/clipper.cpp
@@ -3225,7 +3225,6 @@ bool Clipper::JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2) {
op2->Next = op1;
op1b->Next = op2b;
op2b->Prev = op1b;
- j->OutPt1 = op1;
j->OutPt2 = op1b;
return true;
} else {
@@ -3235,7 +3234,6 @@ bool Clipper::JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2) {
op2->Prev = op1;
op1b->Prev = op2b;
op2b->Next = op1b;
- j->OutPt1 = op1;
j->OutPt2 = op1b;
return true;
}
@@ -3329,7 +3327,6 @@ bool Clipper::JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2) {
op2->Next = op1;
op1b->Next = op2b;
op2b->Prev = op1b;
- j->OutPt1 = op1;
j->OutPt2 = op1b;
return true;
} else {
@@ -3339,7 +3336,6 @@ bool Clipper::JoinPoints(Join *j, OutRec *outRec1, OutRec *outRec2) {
op2->Prev = op1;
op1b->Prev = op2b;
op2b->Next = op1b;
- j->OutPt1 = op1;
j->OutPt2 = op1b;
return true;
}
Commit: f487c0216f0a44d68fd7fa626a27699b1e885410
https://github.com/scummvm/scummvm/commit/f487c0216f0a44d68fd7fa626a27699b1e885410
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix An unconditional 'return' within a loop in squirrel. PVS-Studio V612
Changed paths:
engines/twp/squirrel/sqarray.h
engines/twp/squirrel/sqobject.cpp
diff --git a/engines/twp/squirrel/sqarray.h b/engines/twp/squirrel/sqarray.h
index 7c6c204945d..8664b6373f7 100755
--- a/engines/twp/squirrel/sqarray.h
+++ b/engines/twp/squirrel/sqarray.h
@@ -43,7 +43,7 @@ public:
SQInteger Next(const SQObjectPtr &refpos,SQObjectPtr &outkey,SQObjectPtr &outval)
{
SQUnsignedInteger idx=TranslateIndex(refpos);
- while(idx<_values.size()){
+ if(idx<_values.size()){
//first found
outkey=(SQInteger)idx;
SQObjectPtr &o = _values[idx];
diff --git a/engines/twp/squirrel/sqobject.cpp b/engines/twp/squirrel/sqobject.cpp
index be376131252..736666251fa 100755
--- a/engines/twp/squirrel/sqobject.cpp
+++ b/engines/twp/squirrel/sqobject.cpp
@@ -60,7 +60,7 @@ void SQString::Release()
SQInteger SQString::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)
{
SQInteger idx = (SQInteger)TranslateIndex(refpos);
- while(idx < _len){
+ if(idx < _len){
outkey = (SQInteger)idx;
outval = (SQInteger)((SQUnsignedInteger)_val[idx]);
//return idx for the next iteration
Commit: 15df97fce9abf0b34badd7f3fd0ccf25e0a813c7
https://github.com/scummvm/scummvm/commit/15df97fce9abf0b34badd7f3fd0ccf25e0a813c7
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix calling the 'Finalize' virtual function in the destructor in SQClass. PVS-Studio V1053
Changed paths:
engines/twp/squirrel/sqclass.cpp
engines/twp/squirrel/sqclass.h
diff --git a/engines/twp/squirrel/sqclass.cpp b/engines/twp/squirrel/sqclass.cpp
index fc619616c05..31ea068346b 100755
--- a/engines/twp/squirrel/sqclass.cpp
+++ b/engines/twp/squirrel/sqclass.cpp
@@ -34,7 +34,11 @@ SQClass::SQClass(SQSharedState *ss,SQClass *base)
}
void SQClass::Finalize() {
- _attributes.Null();
+ FinalizeCore();
+}
+
+void SQClass::FinalizeCore() {
+ _attributes.Null();
_NULL_SQOBJECT_VECTOR(_defaultvalues,_defaultvalues.size());
_methods.resize(0);
_NULL_SQOBJECT_VECTOR(_metamethods,MT_LAST);
diff --git a/engines/twp/squirrel/sqclass.h b/engines/twp/squirrel/sqclass.h
index 7d4021721bf..b1eef338513 100755
--- a/engines/twp/squirrel/sqclass.h
+++ b/engines/twp/squirrel/sqclass.h
@@ -65,6 +65,7 @@ public:
sq_delete(this, SQClass);
}
void Finalize();
+ void FinalizeCore();
#ifndef NO_GARBAGE_COLLECTOR
void Mark(SQCollectable ** );
SQObjectType GetType() {return OT_CLASS;}
Commit: 14301e272ec6129a15ef62134fdf68c90cca1867
https://github.com/scummvm/scummvm/commit/14301e272ec6129a15ef62134fdf68c90cca1867
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix pointer to local variable 'funcstate' is stored outside the scope of this variable in squirrel. PVS-Studio V506
Changed paths:
engines/twp/squirrel/sqcompiler.cpp
diff --git a/engines/twp/squirrel/sqcompiler.cpp b/engines/twp/squirrel/sqcompiler.cpp
index 9f357952ca7..60fa8a026bb 100755
--- a/engines/twp/squirrel/sqcompiler.cpp
+++ b/engines/twp/squirrel/sqcompiler.cpp
@@ -149,7 +149,7 @@ public:
bool IsEndOfStatement() { return ((_lex._prevtoken == _SC('\n')) || (_token == SQUIRREL_EOB) || (_token == _SC('}')) || (_token == _SC(';'))); }
void OptionalSemicolon()
{
- if(_token == _SC(';')) { Lex(); return; }
+ if(_token == _SC(';')) { Lex(); return; }
}
void MoveIfCurrentTargetIsLocal() {
SQInteger trg = _fs->TopTarget();
@@ -192,8 +192,10 @@ public:
_lex._currentline, _lex._currentcolumn);
}
_vm->_lasterror = SQString::Create(_ss(_vm), _compilererror, -1);
+ _fs = nullptr;
return false;
}
+ _fs = nullptr;
return true;
}
void Statements()
@@ -1176,7 +1178,7 @@ public:
}
_fs->AddInstruction(_OP_JMP, 0, jmppos - _fs->GetCurrentPos() - 1, 0);
if(jzpos> 0) _fs->SetInstructionParam(jzpos, 1, _fs->GetCurrentPos() - jzpos);
-
+
END_BREAKBLE_BLOCK(continuetrg);
END_SCOPE();
Commit: c613a94ddc5fff7bdaba9a474d6116160a18446d
https://github.com/scummvm/scummvm/commit/c613a94ddc5fff7bdaba9a474d6116160a18446d
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix A part of conditional expression is always true or false in squirrel. PVS-Studio V560
Changed paths:
engines/twp/squirrel/sqcompiler.cpp
engines/twp/squirrel/sqstdrex.cpp
diff --git a/engines/twp/squirrel/sqcompiler.cpp b/engines/twp/squirrel/sqcompiler.cpp
index 60fa8a026bb..24a8e253737 100755
--- a/engines/twp/squirrel/sqcompiler.cpp
+++ b/engines/twp/squirrel/sqcompiler.cpp
@@ -391,7 +391,7 @@ public:
switch(op){
case TK_NEWSLOT:
- if(ds == OBJECT || ds == BASE)
+ if(ds == OBJECT)
EmitDerefOp(_OP_NEWSLOT);
else //if _derefstate != DEREF_NO_DEREF && DEREF_FIELD so is the index of a local
Error(_SC("can't 'create' a local slot"));
diff --git a/engines/twp/squirrel/sqstdrex.cpp b/engines/twp/squirrel/sqstdrex.cpp
index 2112afec55b..8dcdcc5b9b0 100755
--- a/engines/twp/squirrel/sqstdrex.cpp
+++ b/engines/twp/squirrel/sqstdrex.cpp
@@ -413,7 +413,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
//checks that 0 matches satisfy the expression(if so skips)
//if not would always stop(for instance if is a '?')
if(greedystop->type != OP_GREEDY ||
- (greedystop->type == OP_GREEDY && ((greedystop->right >> 16)&0x0000FFFF) != 0))
+ (((greedystop->right >> 16)&0x0000FFFF) != 0))
{
SQRexNode *gnext = NULL;
if(greedystop->next != -1) {
Commit: 4c3e77e568cdd517c49b8f0414debcfc08e33440
https://github.com/scummvm/scummvm/commit/4c3e77e568cdd517c49b8f0414debcfc08e33440
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix a variable is assigned to itself in squirrel. PVS-Studio V560
Changed paths:
engines/twp/squirrel/sqfuncstate.cpp
diff --git a/engines/twp/squirrel/sqfuncstate.cpp b/engines/twp/squirrel/sqfuncstate.cpp
index 9d613545c25..779b40df420 100755
--- a/engines/twp/squirrel/sqfuncstate.cpp
+++ b/engines/twp/squirrel/sqfuncstate.cpp
@@ -481,7 +481,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
break;
case _OP_GET:
if( pi.op == _OP_LOAD && pi._arg0 == i._arg2 && (!IsLocal(pi._arg0))){
- pi._arg1 = pi._arg1;
pi._arg2 = (unsigned char)i._arg1;
pi.op = _OP_GETK;
pi._arg0 = i._arg0;
@@ -493,7 +492,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
if( pi.op == _OP_LOAD && pi._arg0 == i._arg1 && (!IsLocal(pi._arg0))){
pi.op = _OP_PREPCALLK;
pi._arg0 = i._arg0;
- pi._arg1 = pi._arg1;
pi._arg2 = i._arg2;
pi._arg3 = i._arg3;
return;
@@ -511,7 +509,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
if(aat != -1 && pi._arg0 == i._arg1 && (!IsLocal(pi._arg0))){
pi.op = _OP_APPENDARRAY;
pi._arg0 = i._arg0;
- pi._arg1 = pi._arg1;
pi._arg2 = (unsigned char)aat;
pi._arg3 = MAX_FUNC_STACKSIZE;
return;
@@ -553,7 +550,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
{
pi.op = i.op;
pi._arg0 = i._arg0;
- pi._arg1 = pi._arg1;
pi._arg2 = i._arg2;
pi._arg3 = MAX_FUNC_STACKSIZE;
return;
Commit: 6d84bf32a72a89670c37f9e9928c3ea475362633
https://github.com/scummvm/scummvm/commit/6d84bf32a72a89670c37f9e9928c3ea475362633
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix unreachable code detected in squirrel. PVS-Studio V779
Changed paths:
engines/twp/squirrel/sqlexer.cpp
engines/twp/squirrel/sqvm.cpp
diff --git a/engines/twp/squirrel/sqlexer.cpp b/engines/twp/squirrel/sqlexer.cpp
index 460e9efedcd..8a2bbf0a579 100755
--- a/engines/twp/squirrel/sqlexer.cpp
+++ b/engines/twp/squirrel/sqlexer.cpp
@@ -277,7 +277,6 @@ SQInteger SQLexer::Lex()
NEXT();
RETURN_TOKEN(c);
}
- RETURN_TOKEN(0);
}
}
}
diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index 4e77a554e00..21d8c5ab652 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -241,10 +241,6 @@ bool SQVM::ObjCmp(const SQObjectPtr &o1,const SQObjectPtr &o2,SQInteger &result)
default:
_RET_SUCCEED( _userpointer(o1) < _userpointer(o2)?-1:1 );
}
- assert(0);
- //if(type(res)!=OT_INTEGER) { Raise_CompareError(o1,o2); return false; }
- // _RET_SUCCEED(_integer(res));
-
}
else{
if(sq_isnumeric(o1) && sq_isnumeric(o2)){
@@ -1103,7 +1099,6 @@ exception_trap:
_lasterror = currerror;
return false;
}
- assert(0);
}
bool SQVM::CreateClassInstance(SQClass *theclass, SQObjectPtr &inst, SQObjectPtr &constructor)
Commit: f461e4bdcaf0412b28dcc782557f49d12f91dae4
https://github.com/scummvm/scummvm/commit/f461e4bdcaf0412b28dcc782557f49d12f91dae4
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix the 'ci' pointer was utilized before it was verified against nullptr in squirrel. PVS-Studio V595
Changed paths:
engines/twp/squirrel/sqvm.cpp
diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index 21d8c5ab652..1f73dfef0a6 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -1047,13 +1047,14 @@ exception_restore:
_GUARD(NewSlotA(STK(arg1),STK(arg2),STK(arg3),(arg0&NEW_SLOT_ATTRIBUTES_FLAG) ? STK(arg2-1) : SQObjectPtr(),(arg0&NEW_SLOT_STATIC_FLAG)?true:false,false));
continue;
case _OP_GETBASE:{
- SQClosure *clo = _closure(ci->_closure);
- if(clo->_base) {
- TARGET = clo->_base;
- }
- else {
- TARGET.Null();
+ if (ci) {
+ SQClosure *clo = _closure(ci->_closure);
+ if (clo && clo->_base) {
+ TARGET = clo->_base;
+ continue;
+ }
}
+ TARGET.Null();
continue;
}
case _OP_CLOSE:
@@ -1091,7 +1092,7 @@ exception_trap:
}
}
if(ci->_generator) ci->_generator->Kill();
- bool mustbreak = ci && ci->_root;
+ bool mustbreak = ci->_root;
LeaveFrame();
if(mustbreak) break;
}
Commit: 3f80e4a24becdccfe8006b673fd56ab0165ad8c3
https://github.com/scummvm/scummvm/commit/3f80e4a24becdccfe8006b673fd56ab0165ad8c3
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix calling the 'Finalize' virtual function in the destructor in SQVM. PVS-Studio V1053
Changed paths:
engines/twp/squirrel/sqvm.cpp
engines/twp/squirrel/sqvm.h
diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index 1f73dfef0a6..f64bc675086 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -131,6 +131,11 @@ SQVM::SQVM(SQSharedState *ss)
}
void SQVM::Finalize()
+{
+ FinalizeCore();
+}
+
+void SQVM::FinalizeCore()
{
if(_releasehook) { _releasehook(_foreignptr,0); _releasehook = NULL; }
if(_openouters) CloseOuters(&_stack._vals[0]);
diff --git a/engines/twp/squirrel/sqvm.h b/engines/twp/squirrel/sqvm.h
index 41d556a3832..e86a4f82476 100755
--- a/engines/twp/squirrel/sqvm.h
+++ b/engines/twp/squirrel/sqvm.h
@@ -118,6 +118,7 @@ public:
SQObjectType GetType() {return OT_THREAD;}
#endif
void Finalize();
+ void FinalizeCore();
void GrowCallStack() {
SQInteger newsize = _alloccallsstacksize*2;
_callstackdata.resize(newsize);
Commit: 2e823bc6f63320b5c15822b8dd1b9e530920b35f
https://github.com/scummvm/scummvm/commit/2e823bc6f63320b5c15822b8dd1b9e530920b35f
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix excessive checks can be simplified in squirrel. PVS-Studio V728
Changed paths:
engines/twp/squirrel/sqcompiler.cpp
diff --git a/engines/twp/squirrel/sqcompiler.cpp b/engines/twp/squirrel/sqcompiler.cpp
index 24a8e253737..e3e673df2a0 100755
--- a/engines/twp/squirrel/sqcompiler.cpp
+++ b/engines/twp/squirrel/sqcompiler.cpp
@@ -916,7 +916,7 @@ public:
}
break;
}
- return (!_es.donot_get || ( _es.donot_get && (_token == _SC('.') || _token == _SC('['))));
+ return (!_es.donot_get || ((_token == _SC('.') || _token == _SC('['))));
}
void FunctionCallArgs(bool rawcall = false)
{
@@ -991,7 +991,7 @@ public:
SQInteger key = _fs->PopTarget();
SQInteger attrs = hasattrs ? _fs->PopTarget():-1;
((void)attrs);
- assert((hasattrs && (attrs == key-1)) || !hasattrs);
+ assert(!hasattrs || (attrs == key-1));
unsigned char flags = (hasattrs?NEW_SLOT_ATTRIBUTES_FLAG:0)|(isstatic?NEW_SLOT_STATIC_FLAG:0);
SQInteger table = _fs->TopTarget(); //<<BECAUSE OF THIS NO COMMON EMIT FUNC IS POSSIBLE
if(separator == _SC(',')) { //hack recognizes a table from the separator
Commit: df0d1cb8d4dae88610a569751735ae1456686438
https://github.com/scummvm/scummvm/commit/df0d1cb8d4dae88610a569751735ae1456686438
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix not all members of a class are initialized in squirrel. PVS-Studio V730
Changed paths:
engines/twp/squirrel/sqfuncproto.h
engines/twp/squirrel/sqopcodes.h
engines/twp/squirrel/sqstate.cpp
engines/twp/squirrel/sqstring.h
engines/twp/squirrel/sqvm.h
diff --git a/engines/twp/squirrel/sqfuncproto.h b/engines/twp/squirrel/sqfuncproto.h
index d5883454469..052a365c95c 100755
--- a/engines/twp/squirrel/sqfuncproto.h
+++ b/engines/twp/squirrel/sqfuncproto.h
@@ -12,7 +12,7 @@ enum SQOuterType {
struct SQOuterVar
{
- SQOuterVar(){}
+ SQOuterVar() : _type(otLOCAL) {}
SQOuterVar(const SQObjectPtr &name,const SQObjectPtr &src,SQOuterType t)
{
_name = name;
diff --git a/engines/twp/squirrel/sqopcodes.h b/engines/twp/squirrel/sqopcodes.h
index 15d80e4bb05..30b5708ed67 100755
--- a/engines/twp/squirrel/sqopcodes.h
+++ b/engines/twp/squirrel/sqopcodes.h
@@ -108,7 +108,7 @@ struct SQInstructionDesc {
struct SQInstruction
{
- SQInstruction(){};
+ SQInstruction() : _arg1(0), op(0), _arg0(0), _arg2(0), _arg3(0){}
SQInstruction(SQOpcode _op,SQInteger a0=0,SQInteger a1=0,SQInteger a2=0,SQInteger a3=0)
{ op = (unsigned char)_op;
_arg0 = (unsigned char)a0;_arg1 = (SQInt32)a1;
diff --git a/engines/twp/squirrel/sqstate.cpp b/engines/twp/squirrel/sqstate.cpp
index c89bdc4a254..4162e0d6a1c 100755
--- a/engines/twp/squirrel/sqstate.cpp
+++ b/engines/twp/squirrel/sqstate.cpp
@@ -14,6 +14,13 @@
SQSharedState::SQSharedState()
{
+ _metamethods = NULL;
+ _systemstrings = NULL;
+ _types = NULL;
+ _stringtable = NULL;
+ _gc_chain = NULL;
+ _scratchpad = NULL;
+ _scratchpadsize = 0;
_compilererrorhandler = NULL;
_printfunc = NULL;
_errorfunc = NULL;
diff --git a/engines/twp/squirrel/sqstring.h b/engines/twp/squirrel/sqstring.h
index 82f1cdf46e3..c3a1a818332 100755
--- a/engines/twp/squirrel/sqstring.h
+++ b/engines/twp/squirrel/sqstring.h
@@ -13,7 +13,10 @@ inline SQHash _hashstr (const SQChar *s, size_t l)
struct SQString : public SQRefCounted
{
- SQString(){}
+ SQString() : _sharedstate(nullptr), _next(nullptr), _len(0), _hash(0)
+ {
+ _val[0] = 0;
+ }
~SQString(){}
public:
static SQString *Create(SQSharedState *ss, const SQChar *, SQInteger len = -1 );
diff --git a/engines/twp/squirrel/sqvm.h b/engines/twp/squirrel/sqvm.h
index e86a4f82476..f4f0e5500cc 100755
--- a/engines/twp/squirrel/sqvm.h
+++ b/engines/twp/squirrel/sqvm.h
@@ -18,7 +18,7 @@
void sq_base_register(HSQUIRRELVM v);
struct SQExceptionTrap{
- SQExceptionTrap() {}
+ SQExceptionTrap() : _stackbase(0), _stacksize(0), _ip(nullptr), _extarget(0) {}
SQExceptionTrap(SQInteger ss, SQInteger stackbase,SQInstruction *ip, SQInteger ex_target){ _stacksize = ss; _stackbase = stackbase; _ip = ip; _extarget = ex_target;}
SQInteger _stackbase;
SQInteger _stacksize;
Commit: d4b3907d84e5dbcd412a409ae6c276ee442adb6e
https://github.com/scummvm/scummvm/commit/d4b3907d84e5dbcd412a409ae6c276ee442adb6e
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix variables were assigned the same value. in squirrel. PVS-Studio V1048
Changed paths:
engines/twp/squirrel/sqfuncstate.cpp
engines/twp/squirrel/sqvm.cpp
diff --git a/engines/twp/squirrel/sqfuncstate.cpp b/engines/twp/squirrel/sqfuncstate.cpp
index 779b40df420..797f2f77350 100755
--- a/engines/twp/squirrel/sqfuncstate.cpp
+++ b/engines/twp/squirrel/sqfuncstate.cpp
@@ -559,7 +559,6 @@ void SQFuncState::AddInstruction(SQInstruction &i)
if((pi.op == _OP_LOADNULLS && pi._arg0+pi._arg1 == i._arg0)) {
pi._arg1 = pi._arg1 + 1;
- pi.op = _OP_LOADNULLS;
return;
}
break;
diff --git a/engines/twp/squirrel/sqvm.cpp b/engines/twp/squirrel/sqvm.cpp
index f64bc675086..2cb14212847 100755
--- a/engines/twp/squirrel/sqvm.cpp
+++ b/engines/twp/squirrel/sqvm.cpp
@@ -1490,9 +1490,6 @@ bool SQVM::NewSlot(const SQObjectPtr &self,const SQObjectPtr &key,const SQObject
}
rawcall = false;
}
- else {
- rawcall = true;
- }
}
}
if(rawcall) _table(self)->NewSlot(key,val); //cannot fail
Commit: aeee6ccc179dc4e036cc03d776fb6cdceea28eb1
https://github.com/scummvm/scummvm/commit/aeee6ccc179dc4e036cc03d776fb6cdceea28eb1
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix array underrun is possible. The value of 'fpos' index could reach -1 in squirrel. PVS-Studio V557
Changed paths:
engines/twp/squirrel/sqstdstring.cpp
diff --git a/engines/twp/squirrel/sqstdstring.cpp b/engines/twp/squirrel/sqstdstring.cpp
index ab1a801127c..7b7bd4c0d45 100755
--- a/engines/twp/squirrel/sqstdstring.cpp
+++ b/engines/twp/squirrel/sqstdstring.cpp
@@ -112,6 +112,7 @@ SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen
{
size_t flen = scstrlen(fmt);
SQInteger fpos = flen - 1;
+ assert(fpos >= 0);
SQChar f = fmt[fpos];
const SQChar *prec = (const SQChar *)_PRINT_INT_PREC;
while(*prec != _SC('\0')) {
Commit: 827b7ae5a87d5d15e4dc39928c95c3c72be3c008
https://github.com/scummvm/scummvm/commit/827b7ae5a87d5d15e4dc39928c95c3c72be3c008
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix 'sqvector' lacks the copy assignment operator in squirrel. PVS-Studio V690
Changed paths:
engines/twp/squirrel/squtils.h
diff --git a/engines/twp/squirrel/squtils.h b/engines/twp/squirrel/squtils.h
index f3e819a58ef..7141b237cfa 100755
--- a/engines/twp/squirrel/squtils.h
+++ b/engines/twp/squirrel/squtils.h
@@ -28,6 +28,11 @@ public:
{
copy(v);
}
+ inline sqvector<T>& operator=(const sqvector<T>& v)
+ {
+ copy(v);
+ return *this;
+ }
void copy(const sqvector<T>& v)
{
if(_size) {
Commit: 2cc56150420e51a476f24ef32b21e4e2ebc37340
https://github.com/scummvm/scummvm/commit/2cc56150420e51a476f24ef32b21e4e2ebc37340
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix 'sqvector' constructor contains potentially uninitialized members in squirrel. PVS-Studio V1077
Changed paths:
engines/twp/squirrel/squtils.h
diff --git a/engines/twp/squirrel/squtils.h b/engines/twp/squirrel/squtils.h
index 7141b237cfa..4cb2d4ed7b0 100755
--- a/engines/twp/squirrel/squtils.h
+++ b/engines/twp/squirrel/squtils.h
@@ -26,6 +26,9 @@ public:
}
sqvector(const sqvector<T>& v)
{
+ _vals = NULL;
+ _size = 0;
+ _allocated = 0;
copy(v);
}
inline sqvector<T>& operator=(const sqvector<T>& v)
Commit: cdc8d16fd55d7cdb84ce228048487daaf91837ed
https://github.com/scummvm/scummvm/commit/cdc8d16fd55d7cdb84ce228048487daaf91837ed
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-19T21:01:14+01:00
Commit Message:
TWP: Fix '_sharedstate' overwrites field in base class in squirrel. PVS-Studio V703
Changed paths:
engines/twp/squirrel/sqvm.h
diff --git a/engines/twp/squirrel/sqvm.h b/engines/twp/squirrel/sqvm.h
index f4f0e5500cc..7bf80ab9ea3 100755
--- a/engines/twp/squirrel/sqvm.h
+++ b/engines/twp/squirrel/sqvm.h
@@ -169,7 +169,6 @@ public:
CallInfo *ci;
SQUserPointer _foreignptr;
//VMs sharing the same state
- SQSharedState *_sharedstate;
SQInteger _nnativecalls;
SQInteger _nmetamethodscall;
SQRELEASEHOOK _releasehook;
More information about the Scummvm-git-logs
mailing list