|
15 | 15 | using IronPython.Runtime.Operations; |
16 | 16 | using IronPython.Runtime.Types; |
17 | 17 |
|
| 18 | +using Microsoft.Scripting.Runtime; |
18 | 19 | using Microsoft.Scripting.Utils; |
19 | 20 |
|
20 | 21 | namespace IronPython.Modules { |
@@ -109,35 +110,16 @@ public _Array from_buffer(CodeContext/*!*/ context, ArrayModule.array array, [De |
109 | 110 | return res; |
110 | 111 | } |
111 | 112 |
|
112 | | - public _Array from_buffer_copy(CodeContext/*!*/ context, ArrayModule.array array, [DefaultParameterValue(0)] int offset) { |
113 | | - ValidateArraySizes(array, offset, ((INativeType)this).Size); |
114 | | - |
115 | | - _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)); |
118 | | - GC.KeepAlive(array); |
119 | | - return res; |
120 | | - } |
121 | | - |
122 | | - public _Array from_buffer_copy(CodeContext/*!*/ context, Bytes array, [DefaultParameterValue(0)] int offset) { |
123 | | - ValidateArraySizes(array, offset, ((INativeType)this).Size); |
| 113 | + public _Array from_buffer_copy(CodeContext/*!*/ context, [NotNull] IBufferProtocol data, int offset = 0) { |
| 114 | + using var buffer = data.GetBuffer(); |
| 115 | + var span = buffer.AsReadOnlySpan(); |
| 116 | + var size = ((INativeType)this).Size; |
| 117 | + ValidateArraySizes(span.Length, offset, size); |
| 118 | + span = span.Slice(offset, size); |
124 | 119 |
|
125 | 120 | _Array res = (_Array)CreateInstance(context); |
126 | | - res.MemHolder = new MemoryHolder(((INativeType)this).Size); |
127 | | - for (int i = 0; i < ((INativeType)this).Size; i++) { |
128 | | - res.MemHolder.WriteByte(i, ((IList<byte>)array)[i]); |
129 | | - } |
130 | | - return res; |
131 | | - } |
132 | | - |
133 | | - public _Array from_buffer_copy(CodeContext/*!*/ context, string data, int offset = 0) { |
134 | | - ValidateArraySizes(data, offset, ((INativeType)this).Size); |
135 | | - |
136 | | - _Array res = (_Array)CreateInstance(context); |
137 | | - res.MemHolder = new MemoryHolder(((INativeType)this).Size); |
138 | | - for (int i = 0; i < ((INativeType)this).Size; i++) { |
139 | | - res.MemHolder.WriteByte(i, (byte)data[i]); |
140 | | - } |
| 121 | + res.MemHolder = new MemoryHolder(size); |
| 122 | + res.MemHolder.WriteSpan(0, span); |
141 | 123 | return res; |
142 | 124 | } |
143 | 125 |
|
|
0 commit comments