Skip to content

Commit d125c1f

Browse files
committed
Implement memory loading in GeometryContainer.
Implement GetMemoryConverter for BGBox and BGSegment. Add new method DrawableFromMemory to DrawableLoader.
1 parent 64c8569 commit d125c1f

File tree

3 files changed

+217
-54
lines changed

3 files changed

+217
-54
lines changed

Visual_Studio_2017/GraphicalDebugging/ExpressionLoader.cs

Lines changed: 210 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,12 @@ virtual public MemoryReader.Converter<double> GetMemoryConverter(MemoryReader mr
587587
{
588588
return null;
589589
}
590+
591+
virtual public ExpressionDrawer.IDrawable DrawableFromMemory(MemoryReader.Converter<double> converter,
592+
double[] values, int offset)
593+
{
594+
return null;
595+
}
590596
}
591597

592598
/// <summary>
@@ -622,13 +628,60 @@ virtual public ExpressionDrawer.Point LoadPoint(MemoryReader mreader, Debugger d
622628
}
623629
abstract protected ExpressionDrawer.Point LoadPointParsed(Debugger debugger, string name, string type);
624630
abstract protected ExpressionDrawer.Point LoadPointMemory(MemoryReader mreader, Debugger debugger, string name, string type);
631+
632+
public override ExpressionDrawer.IDrawable DrawableFromMemory(MemoryReader.Converter<double> converter,
633+
double[] values, int offset)
634+
{
635+
int valCount = converter.ValueCount();
636+
return valCount >= 2 ? new ExpressionDrawer.Point(values[offset], values[offset + 1])
637+
: valCount == 1 ? new ExpressionDrawer.Point(values[offset], 0)
638+
: null;
639+
}
625640
}
626641

627642
abstract class BoxLoader : GeometryLoader<ExpressionDrawer.Box>
628-
{ }
643+
{
644+
public override ExpressionDrawer.IDrawable DrawableFromMemory(MemoryReader.Converter<double> converter,
645+
double[] values, int offset)
646+
{
647+
int valCount = converter.ValueCount();
648+
if (valCount == 4)
649+
{
650+
var mi = new ExpressionDrawer.Point(values[offset], values[offset + 1]);
651+
var ma = new ExpressionDrawer.Point(values[offset + 2], values[offset + 3]);
652+
return new ExpressionDrawer.Box(mi, ma);
653+
}
654+
else if (valCount == 2)
655+
{
656+
var mi = new ExpressionDrawer.Point(values[offset], 0);
657+
var ma = new ExpressionDrawer.Point(values[offset + 1], 0);
658+
return new ExpressionDrawer.Box(mi, ma);
659+
}
660+
return null;
661+
}
662+
}
629663

630664
abstract class SegmentLoader : GeometryLoader<ExpressionDrawer.Segment>
631-
{ }
665+
{
666+
public override ExpressionDrawer.IDrawable DrawableFromMemory(MemoryReader.Converter<double> converter,
667+
double[] values, int offset)
668+
{
669+
int valCount = converter.ValueCount();
670+
if (valCount == 4)
671+
{
672+
var p0 = new ExpressionDrawer.Point(values[offset], values[offset + 1]);
673+
var p1 = new ExpressionDrawer.Point(values[offset + 2], values[offset + 3]);
674+
return new ExpressionDrawer.Segment(p0, p1);
675+
}
676+
else if (valCount == 2)
677+
{
678+
var p0 = new ExpressionDrawer.Point(values[offset], 0);
679+
var p1 = new ExpressionDrawer.Point(values[offset + 1], 0);
680+
return new ExpressionDrawer.Segment(p0, p1);
681+
}
682+
return null;
683+
}
684+
}
632685

633686
abstract class NSphereLoader : GeometryLoader<ExpressionDrawer.NSphere>
634687
{ }
@@ -663,9 +716,9 @@ protected override ExpressionDrawer.Point LoadPointParsed(Debugger debugger, str
663716
bool okx = true, oky = true;
664717
double x = 0, y = 0;
665718
string ptrName = name + memberArraySuffix;
666-
if (count > 0)
719+
if (count >= 1)
667720
okx = ExpressionParser.TryLoadDouble(debugger, ptrName + "[0]", out x);
668-
if (count > 1)
721+
if (count >= 2)
669722
oky = ExpressionParser.TryLoadDouble(debugger, ptrName + "[1]", out y);
670723
return Util.IsOk(okx, oky)
671724
? new ExpressionDrawer.Point(x, y)
@@ -683,12 +736,12 @@ protected override ExpressionDrawer.Point LoadPointMemory(MemoryReader mreader,
683736
double[] values = new double[count];
684737
if (mreader.ReadNumericArray(info.Address, info.Type, info.Size, values))
685738
{
686-
if (count > 1)
739+
if (count >= 2)
687740
return new ExpressionDrawer.Point(values[0], values[1]);
688-
else if (count > 0)
741+
else if (count == 1)
689742
return new ExpressionDrawer.Point(values[0], 0);
690743
else
691-
return new ExpressionDrawer.Point(0, 0);
744+
return null;
692745
}
693746

694747
return null;
@@ -704,6 +757,8 @@ public override MemoryReader.Converter<double> GetMemoryConverter(MemoryReader m
704757
int elemSize = ExpressionParser.GetTypeSizeof(debugger, coordType);
705758
MemoryReader.Converter<double> arrayConverter
706759
= mreader.GetNumericArrayConverter(coordType, elemSize, count);
760+
if (arrayConverter == null)
761+
return null;
707762
int byteSize = (new ExpressionParser(debugger)).GetValueSizeof(name);
708763
if (byteSize == 0)
709764
return null;
@@ -884,6 +939,8 @@ public override MemoryReader.Converter<double> GetMemoryConverter(MemoryReader m
884939
string m_max_corner = name + ".m_max_corner";
885940

886941
MemoryReader.Converter<double> pointConverter = pointLoader.GetMemoryConverter(mreader, debugger, m_min_corner, pointType);
942+
if (pointConverter == null)
943+
return null;
887944

888945
return new MemoryReader.StructConverter<double>(sizeOf,
889946
new MemoryReader.Member<double>(pointConverter, (int)minDiff),
@@ -913,21 +970,35 @@ public Loader Create(Loaders loaders, Debugger debugger, string name, string typ
913970
return null;
914971

915972
string first = name + ".first";
973+
string second = name + ".second";
974+
916975
string pointType = tparams[0];
917976
PointLoader pointLoader = loaders.FindByType(ExpressionLoader.Kind.Point,
918977
first,
919978
pointType) as PointLoader;
920979
if (pointLoader == null)
921980
return null;
922981

923-
return new BGSegment(pointLoader, pointType);
982+
int sizeOf = ExpressionParser.GetTypeSizeof(debugger, type);
983+
if (ExpressionParser.IsInvalidSize(sizeOf))
984+
return null;
985+
986+
long firstDiff = ExpressionParser.GetAddressDifference(debugger, name, first);
987+
long secondDiff = ExpressionParser.GetAddressDifference(debugger, name, second);
988+
if (ExpressionParser.IsInvalidOffset(sizeOf, firstDiff, secondDiff))
989+
return null;
990+
991+
return new BGSegment(pointLoader, pointType, sizeOf, firstDiff, secondDiff);
924992
}
925993
}
926994

927-
protected BGSegment(PointLoader pointLoader, string pointType)
995+
protected BGSegment(PointLoader pointLoader, string pointType, int sizeOf, long firstDiff, long secondDiff)
928996
{
929997
this.pointLoader = pointLoader;
930998
this.pointType = pointType;
999+
this.sizeOf = sizeOf;
1000+
this.firstDiff = firstDiff;
1001+
this.secondDiff = secondDiff;
9311002
}
9321003

9331004
public override Geometry.Traits GetTraits(MemoryReader mreader, Debugger debugger,
@@ -951,10 +1022,32 @@ public override ExpressionDrawer.IDrawable Load(MemoryReader mreader, Debugger d
9511022
: null;
9521023
}
9531024

954-
// TODO: GetMemoryConverter
1025+
public override MemoryReader.Converter<double> GetMemoryConverter(MemoryReader mreader,
1026+
Debugger debugger, // TODO - remove
1027+
string name, string type)
1028+
{
1029+
// NOTE: Because it can be created by derived class
1030+
// and these members can be set to invalid values
1031+
// e.g. BGReferringSegment
1032+
if (ExpressionParser.IsInvalidSize(sizeOf)
1033+
|| ExpressionParser.IsInvalidOffset(sizeOf, firstDiff, secondDiff))
1034+
return null;
1035+
1036+
string first = name + ".first";
1037+
MemoryReader.Converter<double> pointConverter = pointLoader.GetMemoryConverter(mreader, debugger, first, pointType);
1038+
if (pointConverter == null)
1039+
return null;
1040+
1041+
return new MemoryReader.StructConverter<double>(sizeOf,
1042+
new MemoryReader.Member<double>(pointConverter, (int)firstDiff),
1043+
new MemoryReader.Member<double>(pointConverter, (int)secondDiff));
1044+
}
9551045

9561046
PointLoader pointLoader;
9571047
string pointType;
1048+
long firstDiff;
1049+
long secondDiff;
1050+
int sizeOf;
9581051
}
9591052

9601053
class BGReferringSegment : BGSegment
@@ -977,15 +1070,13 @@ public Loader Create(Loaders loaders, Debugger debugger, string name, string typ
9771070
PointLoader pointLoader = loaders.FindByType(ExpressionLoader.Kind.Point,
9781071
first,
9791072
pointType) as PointLoader;
980-
if (pointLoader == null)
981-
return null;
9821073

9831074
return new BGReferringSegment(pointLoader, pointType);
9841075
}
9851076
}
9861077

9871078
private BGReferringSegment(PointLoader pointLoader, string pointType)
988-
: base(pointLoader, pointType)
1079+
: base(pointLoader, pointType, 0, -1, -1)
9891080
{ }
9901081
}
9911082

@@ -1087,15 +1178,15 @@ protected ResultType LoadMemory(MemoryReader mreader,
10871178
ContainerLoader containerLoader,
10881179
LoadCallback callback)
10891180
{
1090-
ResultType result = null;
1181+
MemoryReader.Converter<double> pointConverter = pointLoader.GetMemoryConverter(
1182+
mreader, debugger, pointName, pointType);
1183+
if (pointConverter == null)
1184+
return null;
10911185

1092-
MemoryReader.Converter<double> pointConverter = pointLoader.GetMemoryConverter(mreader, debugger,
1093-
pointName, pointType);
1094-
if (pointConverter != null)
1095-
{
1096-
int dimension = pointConverter.ValueCount();
1097-
result = new ResultType();
1098-
bool ok = containerLoader.ForEachMemoryBlock(mreader, debugger, name, type, 0, pointConverter,
1186+
int dimension = pointConverter.ValueCount();
1187+
ResultType result = new ResultType();
1188+
if (containerLoader.ForEachMemoryBlock(mreader, debugger,
1189+
name, type, 0, pointConverter,
10991190
delegate (double[] values)
11001191
{
11011192
if (dimension == 0 || values.Length % dimension != 0)
@@ -1112,12 +1203,12 @@ protected ResultType LoadMemory(MemoryReader mreader,
11121203
}
11131204

11141205
return callback();
1115-
});
1116-
if (!ok)
1117-
result = null;
1206+
}))
1207+
{
1208+
return result;
11181209
}
11191210

1120-
return result;
1211+
return null;
11211212
}
11221213
}
11231214

@@ -2565,23 +2656,23 @@ protected override ExpressionDrawer.Point LoadPointParsed(Debugger debugger, str
25652656
protected override ExpressionDrawer.Point LoadPointMemory(MemoryReader mreader, Debugger debugger,
25662657
string name, string type)
25672658
{
2568-
// TODO: Memory converter could be calculated once
25692659
MemoryReader.Converter<double> converter = GetMemoryConverter(mreader, debugger, name, type);
2570-
if (converter != null)
2571-
{
2572-
if (converter.ValueCount() != 2)
2573-
throw new ArgumentOutOfRangeException("converter.ValueCount()");
2660+
if (converter == null)
2661+
return null;
25742662

2575-
ulong address = ExpressionParser.GetValueAddress(debugger, name);
2576-
if (address == 0)
2577-
return null;
2663+
if (converter.ValueCount() != 2)
2664+
throw new ArgumentOutOfRangeException("converter.ValueCount()");
25782665

2579-
double[] values = new double[2];
2580-
if (mreader.Read(address, values, converter))
2581-
{
2582-
return new ExpressionDrawer.Point(values[0], values[1]);
2583-
}
2666+
ulong address = ExpressionParser.GetValueAddress(debugger, name);
2667+
if (address == 0)
2668+
return null;
2669+
2670+
double[] values = new double[2];
2671+
if (mreader.Read(address, values, converter))
2672+
{
2673+
return new ExpressionDrawer.Point(values[0], values[1]);
25842674
}
2675+
25852676
return null;
25862677
}
25872678

@@ -2871,20 +2962,90 @@ public override Geometry.Traits GetTraits(MemoryReader mreader, Debugger debugge
28712962
public override ExpressionDrawer.IDrawable Load(MemoryReader mreader, Debugger debugger,
28722963
string name, string type,
28732964
LoadCallback callback)
2965+
{
2966+
ExpressionDrawer.DrawablesContainer result = null;
2967+
2968+
if (mreader != null)
2969+
{
2970+
string geometryName, dummyType;
2971+
containerLoader.ElementInfo(name, type, out geometryName, out dummyType);
2972+
2973+
result = LoadMemory(mreader, debugger,
2974+
name, type,
2975+
geometryName,
2976+
callback);
2977+
}
2978+
2979+
if (result == null)
2980+
{
2981+
result = LoadParsed(mreader, debugger, name, type, callback);
2982+
}
2983+
2984+
return result;
2985+
}
2986+
2987+
private ExpressionDrawer.DrawablesContainer LoadMemory(MemoryReader mreader, Debugger debugger,
2988+
string name, string type,
2989+
string geometryName,
2990+
LoadCallback callback)
2991+
{
2992+
MemoryReader.Converter<double> geometryConverter = geometryLoader.GetMemoryConverter(
2993+
mreader, debugger, geometryName, geometryType);
2994+
2995+
if (geometryConverter == null)
2996+
return null;
2997+
2998+
ExpressionDrawer.DrawablesContainer result = new ExpressionDrawer.DrawablesContainer();
2999+
if (containerLoader.ForEachMemoryBlock(mreader, debugger,
3000+
name, type, 0, geometryConverter,
3001+
delegate (double[] values)
3002+
{
3003+
int valCount = geometryConverter.ValueCount();
3004+
if (valCount == 0 || values.Length % valCount != 0)
3005+
return false;
3006+
int geometriesCount = values.Length / valCount;
3007+
3008+
for (int i = 0; i < geometriesCount; ++i)
3009+
{
3010+
ExpressionDrawer.IDrawable d = geometryLoader.DrawableFromMemory(
3011+
geometryConverter, values, i * valCount);
3012+
3013+
if (d == null)
3014+
return false;
3015+
3016+
result.Add(d);
3017+
}
3018+
3019+
return callback();
3020+
}))
3021+
{
3022+
return result;
3023+
}
3024+
3025+
return null;
3026+
}
3027+
3028+
private ExpressionDrawer.DrawablesContainer LoadParsed(MemoryReader mreader, Debugger debugger,
3029+
string name, string type,
3030+
LoadCallback callback)
28743031
{
28753032
ExpressionDrawer.DrawablesContainer drawables = new ExpressionDrawer.DrawablesContainer();
2876-
bool ok = containerLoader.ForEachElement(debugger, name, delegate (string elName)
3033+
if (containerLoader.ForEachElement(debugger, name,
3034+
delegate (string elName)
3035+
{
3036+
ExpressionDrawer.IDrawable drawable = geometryLoader.Load(
3037+
mreader, debugger, elName, geometryType,callback);
3038+
if (drawable == null)
3039+
return false;
3040+
drawables.Add(drawable);
3041+
//return callback();
3042+
return true;
3043+
}))
28773044
{
2878-
ExpressionDrawer.IDrawable drawable = geometryLoader.Load(mreader, debugger,
2879-
elName, geometryType,
2880-
callback);
2881-
if (drawable == null)
2882-
return false;
2883-
drawables.Add(drawable);
2884-
//return callback();
2885-
return true;
2886-
});
2887-
return ok ? drawables : null;
3045+
return drawables;
3046+
}
3047+
3048+
return null;
28883049
}
28893050

28903051
ContainerLoader containerLoader;

0 commit comments

Comments
 (0)