mirror of
https://github.com/gpujs/gpu.js.git
synced 2026-01-18 16:04:10 +00:00
fix: Slight memory leak, and loss of first kernel when switching kernels fix: Feed `value.constructor` to `this.onUpdateValueMismatch()` where it was missing
85 lines
2.4 KiB
JavaScript
85 lines
2.4 KiB
JavaScript
const { utils } = require('./utils');
|
|
|
|
/**
|
|
* Makes kernels easier for mortals (including me)
|
|
* @param kernel
|
|
* @returns {function()}
|
|
*/
|
|
function kernelRunShortcut(kernel) {
|
|
let run = function() {
|
|
kernel.build.apply(kernel, arguments);
|
|
run = function() {
|
|
let result = kernel.run.apply(kernel, arguments);
|
|
if (kernel.switchingKernels) {
|
|
const reasons = kernel.resetSwitchingKernels();
|
|
const newKernel = kernel.onRequestSwitchKernel(reasons, arguments, kernel);
|
|
shortcut.kernel = kernel = newKernel;
|
|
result = newKernel.run.apply(newKernel, arguments);
|
|
}
|
|
if (kernel.renderKernels) {
|
|
return kernel.renderKernels();
|
|
} else if (kernel.renderOutput) {
|
|
return kernel.renderOutput();
|
|
} else {
|
|
return result;
|
|
}
|
|
};
|
|
return run.apply(kernel, arguments);
|
|
};
|
|
const shortcut = function() {
|
|
return run.apply(kernel, arguments);
|
|
};
|
|
/**
|
|
* Run kernel in async mode
|
|
* @returns {Promise<KernelOutput>}
|
|
*/
|
|
shortcut.exec = function() {
|
|
return new Promise((accept, reject) => {
|
|
try {
|
|
accept(run.apply(this, arguments));
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
});
|
|
};
|
|
shortcut.replaceKernel = function(replacementKernel) {
|
|
kernel = replacementKernel;
|
|
bindKernelToShortcut(kernel, shortcut);
|
|
};
|
|
|
|
bindKernelToShortcut(kernel, shortcut);
|
|
return shortcut;
|
|
}
|
|
|
|
function bindKernelToShortcut(kernel, shortcut) {
|
|
if (shortcut.kernel) {
|
|
shortcut.kernel = kernel;
|
|
return;
|
|
}
|
|
const properties = utils.allPropertiesOf(kernel);
|
|
for (let i = 0; i < properties.length; i++) {
|
|
const property = properties[i];
|
|
if (property[0] === '_' && property[1] === '_') continue;
|
|
if (typeof kernel[property] === 'function') {
|
|
if (property.substring(0, 3) === 'add' || property.substring(0, 3) === 'set') {
|
|
shortcut[property] = function() {
|
|
shortcut.kernel[property].apply(shortcut.kernel, arguments);
|
|
return shortcut;
|
|
};
|
|
} else {
|
|
shortcut[property] = function() {
|
|
return shortcut.kernel[property].apply(shortcut.kernel, arguments);
|
|
};
|
|
}
|
|
} else {
|
|
shortcut.__defineGetter__(property, () => shortcut.kernel[property]);
|
|
shortcut.__defineSetter__(property, (value) => {
|
|
shortcut.kernel[property] = value;
|
|
});
|
|
}
|
|
}
|
|
shortcut.kernel = kernel;
|
|
}
|
|
module.exports = {
|
|
kernelRunShortcut
|
|
}; |