Skip to content

Commit ddf635e

Browse files
authored
Convert internal field CData._memHolder to property CData.MemHolder (#1409)
1 parent 0a0db6b commit ddf635e

15 files changed

Lines changed: 111 additions & 109 deletions

Src/IronPython.Modules/ModuleOps.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ public static object CreateNativeWrapper(PythonType type, object holder) {
5555
Debug.Assert(holder is MemoryHolder);
5656

5757
CTypes.CData data = (CTypes.CData)type.CreateInstance(type.Context.SharedContext);
58-
data._memHolder = (MemoryHolder)holder;
58+
data.MemHolder = (MemoryHolder)holder;
5959
return data;
6060
}
6161

6262
public static object CreateCData(IntPtr dataAddress, PythonType type) {
6363
CTypes.INativeType nativeType = (CTypes.INativeType)type;
6464
CTypes.CData data = (CTypes.CData)type.CreateInstance(type.Context.SharedContext);
65-
data._memHolder = new MemoryHolder(nativeType.Size);
66-
data._memHolder.CopyFrom(dataAddress, new IntPtr(nativeType.Size));
65+
data.MemHolder = new MemoryHolder(nativeType.Size);
66+
data.MemHolder.CopyFrom(dataAddress, new IntPtr(nativeType.Size));
6767
return data;
6868
}
6969

@@ -325,7 +325,7 @@ public static IntPtr GetPointer(object value) {
325325
simpType._type == CTypes.SimpleTypeKind.CharPointer) {
326326
return sd.UnsafeAddress;
327327
} else if (simpType._type == CTypes.SimpleTypeKind.Pointer) {
328-
return sd._memHolder.ReadIntPtr(0);
328+
return sd.MemHolder.ReadIntPtr(0);
329329
}
330330
}
331331

Src/IronPython.Modules/_ctypes/Array.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ public abstract class _Array : CData {
2828
public void __init__(params object[] args) {
2929
INativeType nativeType = NativeType;
3030

31-
_memHolder = new MemoryHolder(nativeType.Size);
31+
MemHolder = new MemoryHolder(nativeType.Size);
3232

3333
if (args.Length > ((ArrayType)nativeType).Length) {
3434
throw PythonOps.IndexError("too many arguments");
3535
}
3636

3737
INativeType elementType = ElementType;
3838
for (var i = 0; i < args.Length; i++) {
39-
elementType.SetValue(_memHolder, checked(i * elementType.Size), args[i]);
39+
elementType.SetValue(MemHolder, checked(i * elementType.Size), args[i]);
4040
}
4141
}
4242

@@ -45,7 +45,7 @@ public object this[int index] {
4545
index = PythonOps.FixIndex(index, ((ArrayType)NativeType).Length);
4646
INativeType elementType = ElementType;
4747
return elementType.GetValue(
48-
_memHolder,
48+
MemHolder,
4949
this,
5050
checked(index * elementType.Size),
5151
false
@@ -56,13 +56,13 @@ public object this[int index] {
5656
INativeType elementType = ElementType;
5757

5858
object keepAlive = elementType.SetValue(
59-
_memHolder,
59+
MemHolder,
6060
checked(index * elementType.Size),
6161
value
6262
);
6363

6464
if (keepAlive != null) {
65-
_memHolder.AddObject(index.ToString(), keepAlive);
65+
MemHolder.AddObject(index.ToString(), keepAlive);
6666
}
6767
}
6868
}
@@ -86,23 +86,23 @@ public object this[[NotNull] Slice slice] {
8686
if (elemType._type == SimpleTypeKind.Char) {
8787
Debug.Assert(((INativeType)elemType).Size == 1);
8888
if (step == 1) {
89-
return _memHolder.ReadBytes(start, count);
89+
return MemHolder.ReadBytes(start, count);
9090
} else {
9191
var buffer = new byte[count];
9292
for (int i = 0, index = start; i < count; i++, index += step) {
93-
buffer[i] = _memHolder.ReadByte(index);
93+
buffer[i] = MemHolder.ReadByte(index);
9494
}
9595
return Bytes.Make(buffer);
9696
}
9797
}
9898
if (elemType._type == SimpleTypeKind.WChar) {
9999
int elmSize = ((INativeType)elemType).Size;
100100
if (step == 1) {
101-
return _memHolder.ReadUnicodeString(checked(start * elmSize), count);
101+
return MemHolder.ReadUnicodeString(checked(start * elmSize), count);
102102
} else {
103103
var res = new StringBuilder(count);
104104
for (int i = 0, index = start; i < count; i++, index += step) {
105-
res.Append((char)_memHolder.ReadInt16(checked(index * elmSize)));
105+
res.Append((char)MemHolder.ReadInt16(checked(index * elmSize)));
106106
}
107107
return res.ToString();
108108
}

Src/IronPython.Modules/_ctypes/ArrayType.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,17 @@ public _Array from_buffer(CodeContext/*!*/ context, ArrayModule.array array, [De
104104

105105
_Array res = (_Array)CreateInstance(context);
106106
IntPtr addr = array.GetArrayAddress();
107-
res._memHolder = new MemoryHolder(addr.Add(offset), ((INativeType)this).Size);
108-
res._memHolder.AddObject("ffffffff", array);
107+
res.MemHolder = new MemoryHolder(addr.Add(offset), ((INativeType)this).Size);
108+
res.MemHolder.AddObject("ffffffff", array);
109109
return res;
110110
}
111111

112112
public _Array from_buffer_copy(CodeContext/*!*/ context, ArrayModule.array array, [DefaultParameterValue(0)] int offset) {
113113
ValidateArraySizes(array, offset, ((INativeType)this).Size);
114114

115115
_Array res = (_Array)CreateInstance(context);
116-
res._memHolder = new MemoryHolder(((INativeType)this).Size);
117-
res._memHolder.CopyFrom(array.GetArrayAddress().Add(offset), new IntPtr(((INativeType)this).Size));
116+
res.MemHolder = new MemoryHolder(((INativeType)this).Size);
117+
res.MemHolder.CopyFrom(array.GetArrayAddress().Add(offset), new IntPtr(((INativeType)this).Size));
118118
GC.KeepAlive(array);
119119
return res;
120120
}
@@ -123,9 +123,9 @@ public _Array from_buffer_copy(CodeContext/*!*/ context, Bytes array, [DefaultPa
123123
ValidateArraySizes(array, offset, ((INativeType)this).Size);
124124

125125
_Array res = (_Array)CreateInstance(context);
126-
res._memHolder = new MemoryHolder(((INativeType)this).Size);
126+
res.MemHolder = new MemoryHolder(((INativeType)this).Size);
127127
for (int i = 0; i < ((INativeType)this).Size; i++) {
128-
res._memHolder.WriteByte(i, ((IList<byte>)array)[i]);
128+
res.MemHolder.WriteByte(i, ((IList<byte>)array)[i]);
129129
}
130130
return res;
131131
}
@@ -134,9 +134,9 @@ public _Array from_buffer_copy(CodeContext/*!*/ context, string data, int offset
134134
ValidateArraySizes(data, offset, ((INativeType)this).Size);
135135

136136
_Array res = (_Array)CreateInstance(context);
137-
res._memHolder = new MemoryHolder(((INativeType)this).Size);
137+
res.MemHolder = new MemoryHolder(((INativeType)this).Size);
138138
for (int i = 0; i < ((INativeType)this).Size; i++) {
139-
res._memHolder.WriteByte(i, (byte)data[i]);
139+
res.MemHolder.WriteByte(i, (byte)data[i]);
140140
}
141141
return res;
142142
}
@@ -208,7 +208,7 @@ object INativeType.GetValue(MemoryHolder owner, object readingFrom, int offset,
208208
}
209209

210210
_Array arr = (_Array)CreateInstance(Context.SharedContext);
211-
arr._memHolder = new MemoryHolder(owner.UnsafeAddress.Add(offset), ((INativeType)this).Size, owner);
211+
arr.MemHolder = new MemoryHolder(owner.UnsafeAddress.Add(offset), ((INativeType)this).Size, owner);
212212
return arr;
213213
}
214214

@@ -276,8 +276,8 @@ object INativeType.SetValue(MemoryHolder address, int offset, object value) {
276276
}
277277
} else {
278278
if (value is _Array arr && arr.NativeType == this) {
279-
arr._memHolder.CopyTo(address, offset, ((INativeType)this).Size);
280-
return arr._memHolder.EnsureObjects();
279+
arr.MemHolder.CopyTo(address, offset, ((INativeType)this).Size);
280+
return arr.MemHolder.EnsureObjects();
281281
}
282282

283283
throw PythonOps.TypeError("unexpected {0} instance, got {1}", Name, PythonOps.GetPythonTypeName(value));

Src/IronPython.Modules/_ctypes/CData.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,30 @@ public static partial class CTypes {
3636
/// </summary>
3737
[PythonType("_CData"), PythonHidden]
3838
public abstract class CData : IBufferProtocol, IPythonBuffer {
39-
internal MemoryHolder _memHolder;
39+
internal MemoryHolder MemHolder {
40+
get => _memHolder ?? throw new InvalidOperationException($"{nameof(CData)} object not fully initialized.");
41+
set => _memHolder = value;
42+
}
43+
private MemoryHolder? _memHolder;
4044

4145
// members: __setstate__, __reduce__ _b_needsfree_ __ctypes_from_outparam__ __hash__ _objects _b_base_ __doc__
42-
protected CData() {
43-
_memHolder = null!;
44-
}
46+
protected CData() { }
4547

4648
// TODO: What if a user directly subclasses CData?
4749
[PythonHidden]
4850
public int Size => NativeType.Size;
4951

5052
// TODO: Accesses via Ops class
5153
[PythonHidden]
52-
public IntPtr UnsafeAddress => _memHolder.UnsafeAddress;
54+
public IntPtr UnsafeAddress => MemHolder.UnsafeAddress;
5355

5456
internal INativeType NativeType => (INativeType)DynamicHelpers.GetPythonType(this);
5557

56-
public virtual object _objects => _memHolder.Objects;
58+
public virtual object _objects => MemHolder.Objects;
5759

5860
internal void SetAddress(IntPtr address) {
5961
Debug.Assert(_memHolder == null);
60-
_memHolder = new MemoryHolder(address, NativeType.Size);
62+
MemHolder = new MemoryHolder(address, NativeType.Size);
6163
}
6264

6365
internal virtual PythonTuple GetBufferInfo()
@@ -73,10 +75,10 @@ void IDisposable.Dispose() { }
7375
object IPythonBuffer.Object => this;
7476

7577
unsafe ReadOnlySpan<byte> IPythonBuffer.AsReadOnlySpan()
76-
=> new Span<byte>(_memHolder.UnsafeAddress.ToPointer(), _memHolder.Size);
78+
=> new Span<byte>(MemHolder.UnsafeAddress.ToPointer(), MemHolder.Size);
7779

7880
unsafe Span<byte> IPythonBuffer.AsSpan()
79-
=> new Span<byte>(_memHolder.UnsafeAddress.ToPointer(), _memHolder.Size);
81+
=> new Span<byte>(MemHolder.UnsafeAddress.ToPointer(), MemHolder.Size);
8082

8183
int IPythonBuffer.Offset => 0;
8284

Src/IronPython.Modules/_ctypes/CFuncPtr.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,18 @@ public _CFuncPtr(PythonTuple args) {
8585
}
8686
}
8787

88-
_memHolder = new MemoryHolder(IntPtr.Size);
88+
MemHolder = new MemoryHolder(IntPtr.Size);
8989
addr = tmpAddr;
9090
_id = Interlocked.Increment(ref _curId);
9191
}
9292

9393
public _CFuncPtr() {
9494
_id = Interlocked.Increment(ref _curId);
95-
_memHolder = new MemoryHolder(IntPtr.Size);
95+
MemHolder = new MemoryHolder(IntPtr.Size);
9696
}
9797

9898
public _CFuncPtr(CodeContext context, object function) {
99-
_memHolder = new MemoryHolder(IntPtr.Size);
99+
MemHolder = new MemoryHolder(IntPtr.Size);
100100
if (function != null) {
101101
if (!PythonOps.IsCallable(context, function)) {
102102
throw PythonOps.TypeError("argument must be called or address of function");
@@ -120,7 +120,7 @@ public _CFuncPtr(CodeContext context, object function) {
120120
/// Creates a new CFuncPtr which calls a COM method.
121121
/// </summary>
122122
public _CFuncPtr(int index, string name) {
123-
_memHolder = new MemoryHolder(IntPtr.Size);
123+
MemHolder = new MemoryHolder(IntPtr.Size);
124124
_comInterfaceIndex = index;
125125
_id = Interlocked.Increment(ref _curId);
126126
}
@@ -130,7 +130,7 @@ public _CFuncPtr(int index, string name) {
130130
/// Creates a new CFuncPtr with the specfied address.
131131
/// </summary>
132132
public _CFuncPtr(int handle) {
133-
_memHolder = new MemoryHolder(IntPtr.Size);
133+
MemHolder = new MemoryHolder(IntPtr.Size);
134134
addr = new IntPtr(handle);
135135
_id = Interlocked.Increment(ref _curId);
136136
}
@@ -139,13 +139,13 @@ public _CFuncPtr(int handle) {
139139
/// Creates a new CFuncPtr with the specfied address.
140140
/// </summary>
141141
public _CFuncPtr([NotNull] BigInteger handle) {
142-
_memHolder = new MemoryHolder(IntPtr.Size);
142+
MemHolder = new MemoryHolder(IntPtr.Size);
143143
addr = new IntPtr((long)handle);
144144
_id = Interlocked.Increment(ref _curId);
145145
}
146146

147147
public _CFuncPtr(IntPtr handle) {
148-
_memHolder = new MemoryHolder(IntPtr.Size);
148+
MemHolder = new MemoryHolder(IntPtr.Size);
149149
addr = handle;
150150
_id = Interlocked.Increment(ref _curId);
151151
}
@@ -251,11 +251,11 @@ internal int Flags {
251251
public IntPtr addr {
252252
[PythonHidden]
253253
get {
254-
return _memHolder.ReadIntPtr(0);
254+
return MemHolder.ReadIntPtr(0);
255255
}
256256
[PythonHidden]
257257
set {
258-
_memHolder.WriteIntPtr(0, value);
258+
MemHolder.WriteIntPtr(0, value);
259259
}
260260
}
261261

Src/IronPython.Modules/_ctypes/Field.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public int size {
6868
internal override bool TryGetValue(CodeContext context, object instance, PythonType owner, out object value) {
6969
if (instance != null) {
7070
CData inst = (CData)instance;
71-
value = _fieldType.GetValue(inst._memHolder, inst, _offset, false);
71+
value = _fieldType.GetValue(inst.MemHolder, inst, _offset, false);
7272
if (_bits == -1) {
7373
return true;
7474
}
@@ -90,7 +90,7 @@ internal override bool GetAlwaysSucceeds {
9090

9191
internal override bool TrySetValue(CodeContext context, object instance, PythonType owner, object value) {
9292
if (instance != null) {
93-
SetValue(((CData)instance)._memHolder, 0, value);
93+
SetValue(((CData)instance).MemHolder, 0, value);
9494
return true;
9595

9696
}

Src/IronPython.Modules/_ctypes/Pointer.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ public abstract class Pointer : CData {
2525
#pragma warning restore 414
2626

2727
public Pointer() {
28-
_memHolder = new MemoryHolder(IntPtr.Size);
28+
MemHolder = new MemoryHolder(IntPtr.Size);
2929
}
3030

3131
public Pointer(CData value) {
3232
_object = value; // Keep alive the object, more to do here.
33-
_memHolder = new MemoryHolder(IntPtr.Size);
34-
_memHolder.WriteIntPtr(0, value._memHolder);
35-
_memHolder.AddObject("1", value);
33+
MemHolder = new MemoryHolder(IntPtr.Size);
34+
MemHolder.WriteIntPtr(0, value.MemHolder);
35+
MemHolder.AddObject("1", value);
3636
if (value._objects != null) {
37-
_memHolder.AddObject("0", value._objects);
37+
MemHolder.AddObject("0", value._objects);
3838
}
3939
}
4040

@@ -43,8 +43,8 @@ public object contents {
4343
PythonType elementType = (PythonType)((PointerType)NativeType)._type;
4444

4545
CData res = (CData)elementType.CreateInstance(elementType.Context.SharedContext);
46-
res._memHolder = _memHolder.ReadMemoryHolder(0);
47-
if(res._memHolder.UnsafeAddress == IntPtr.Zero) {
46+
res.MemHolder = MemHolder.ReadMemoryHolder(0);
47+
if(res.MemHolder.UnsafeAddress == IntPtr.Zero) {
4848
throw PythonOps.ValueError("NULL value access");
4949
}
5050
return res;
@@ -56,23 +56,23 @@ public object contents {
5656
public object this[int index] {
5757
get {
5858
INativeType type = ((PointerType)NativeType)._type;
59-
MemoryHolder address = _memHolder.ReadMemoryHolder(0);
59+
MemoryHolder address = MemHolder.ReadMemoryHolder(0);
6060

6161
return type.GetValue(address, this, checked(type.Size * index), false);
6262
}
6363
set {
64-
MemoryHolder address = _memHolder.ReadMemoryHolder(0);
64+
MemoryHolder address = MemHolder.ReadMemoryHolder(0);
6565

6666
INativeType type = ((PointerType)NativeType)._type;
6767
object keepAlive = type.SetValue(address, checked(type.Size * index), value);
6868
if (keepAlive != null) {
69-
_memHolder.AddObject(index.ToString(), keepAlive);
69+
MemHolder.AddObject(index.ToString(), keepAlive);
7070
}
7171
}
7272
}
7373

7474
public bool __bool__() {
75-
return _memHolder.ReadIntPtr(0) != IntPtr.Zero;
75+
return MemHolder.ReadIntPtr(0) != IntPtr.Zero;
7676
}
7777

7878
public object this[Slice index] {
@@ -103,7 +103,7 @@ public object this[Slice index] {
103103
return new PythonList();
104104
}
105105

106-
MemoryHolder address = _memHolder.ReadMemoryHolder(0);
106+
MemoryHolder address = MemHolder.ReadMemoryHolder(0);
107107
if (elemType != null) {
108108
if (elemType._type == SimpleTypeKind.Char) {
109109
Debug.Assert(((INativeType)elemType).Size == 1);

0 commit comments

Comments
 (0)