struct-compile
Version:
Create a JavaScript class from a C structure
77 lines (67 loc) • 2.21 kB
JavaScript
import { maybeNumber, forSize, createMask } from '#src/number';
export function proxyFromParams({ getter, setter, buffer, d: _d, length, floating, BufferImpl }) {
const k = _d[0];
const d = _d.slice(1);
const chunkSize = length / k / 8;
return new Proxy(buffer, {
get(target, _prop, receiver) {
if (typeof _prop == 'symbol') {
return target[_prop];
}
const prop = maybeNumber(_prop);
if (typeof prop == 'number') {
if (prop < 0 || prop >= k) {
throw new Error(`Out of bounds value, expected index to be 0 <= index < ${k}`);
}
if (d.length == 0) {
return target[getter](prop * chunkSize);
}
else {
return proxyFromParams({
getter,
setter,
buffer: buffer.subarray(prop * chunkSize, (prop + 1) * chunkSize),
d,
length: chunkSize * 8,
floating,
BufferImpl
});
}
}
else if (typeof target[prop] == 'function') {
return target[prop].bind(target);
}
//Reflect throws strange errors
//return Reflect.get(...arguments);
return target[prop];
},
set(target, _prop, val) {
if (typeof _prop == 'symbol') {
target[prop] = val;
return true;
}
const prop = maybeNumber(_prop);
if (typeof prop == 'number') {
if (prop < 0 || prop >= k) {
throw new Error(`Out of bounds value, expected index to be 0 <= index < ${k}`);
}
if (d.length == 0) {
target[setter](val instanceof BufferImpl ? val[getter]() : forSize(chunkSize * 8, val, floating), prop * chunkSize);
}
else {
if (val instanceof BufferImpl) {
val.copy(target.subarray(prop * chunkSize, (prop + 1) * chunkSize), 0, 0, Math.min(val.length, chunkSize));
}
else {
target.subarray(prop * chunkSize, (propd + 1) * chunkSize).write(val.toString());
}
}
return true;
}
//Reflect throws strange errors
//return Reflect.set(...arguments);
target[prop] = val;
return true;
},
});
}