(owner, value, index)
| 80 | } |
| 81 | |
| 82 | function getStringConversionPointer(owner, value, index) { |
| 83 | const size = value.length * 3 + 1; |
| 84 | let buffers = owner[kStringConversionBuffer]; |
| 85 | if (buffers === undefined) { |
| 86 | buffers = []; |
| 87 | ObjectDefineProperty(owner, kStringConversionBuffer, { |
| 88 | __proto__: null, |
| 89 | configurable: false, |
| 90 | enumerable: false, |
| 91 | writable: false, |
| 92 | value: buffers, |
| 93 | }); |
| 94 | } |
| 95 | let entry = buffers[index]; |
| 96 | if (entry !== undefined && entry.string === value) { |
| 97 | return entry.pointer; |
| 98 | } |
| 99 | if (StringPrototypeIncludes(value, '\0')) { |
| 100 | throwFFIArgError(`Argument ${index} must not contain null bytes`); |
| 101 | } |
| 102 | if (entry === undefined || entry.buffer.length < size) { |
| 103 | const buffer = Buffer.allocUnsafe(size); |
| 104 | entry = { |
| 105 | __proto__: null, |
| 106 | buffer, |
| 107 | pointer: getRawPointer(buffer), |
| 108 | string: undefined, |
| 109 | }; |
| 110 | buffers[index] = entry; |
| 111 | } |
| 112 | |
| 113 | const buffer = entry.buffer; |
| 114 | const written = buffer.write(value, 0, size - 1, 'utf8'); |
| 115 | buffer[written] = 0; |
| 116 | entry.string = value; |
| 117 | return entry.pointer; |
| 118 | } |
| 119 | |
| 120 | function convertPointerArg(type, value, owner, index) { |
| 121 | if (needsNullPointerConversion(type) && |
no test coverage detected
searching dependent graphs…