diff options
Diffstat (limited to '')
-rw-r--r-- | toolkit/modules/subprocess/subprocess_shared.js | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/toolkit/modules/subprocess/subprocess_shared.js b/toolkit/modules/subprocess/subprocess_shared.js new file mode 100644 index 0000000000..e9230d9243 --- /dev/null +++ b/toolkit/modules/subprocess/subprocess_shared.js @@ -0,0 +1,108 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +/* exported ArrayBuffer_transfer, Library, SubprocessConstants */ + +// ctypes is either already available in the chrome worker scope, or defined +// in scope via loadSubScript. +/* global ctypes */ + +/** + * Returns a new ArrayBuffer whose contents have been taken from the `buffer`'s + * data and then is either truncated or zero-extended by `size`. If `size` is + * undefined, the `byteLength` of the `buffer` is used. This operation leaves + * `buffer` in a detached state. + * + * @param {ArrayBuffer} buffer + * @param {integer} [size = buffer.byteLength] + * @returns {ArrayBuffer} + */ +var ArrayBuffer_transfer = function(buffer, size = buffer.byteLength) { + let u8out = new Uint8Array(size); + let u8buffer = new Uint8Array(buffer, 0, Math.min(size, buffer.byteLength)); + u8out.set(u8buffer); + return u8out.buffer; +}; + +var libraries = {}; + +var Library = class Library { + constructor(name, names, definitions) { + if (name in libraries) { + return libraries[name]; + } + + for (let name of names) { + try { + if (!this.library) { + this.library = ctypes.open(name); + } + } catch (e) { + // Ignore errors until we've tried all the options. + } + } + if (!this.library) { + throw new Error("Could not load libc"); + } + + libraries[name] = this; + + for (let symbol of Object.keys(definitions)) { + this.declare(symbol, ...definitions[symbol]); + } + } + + declare(name, ...args) { + Object.defineProperty(this, name, { + configurable: true, + get() { + Object.defineProperty(this, name, { + configurable: true, + value: this.library.declare(name, ...args), + }); + + return this[name]; + }, + }); + } +}; + +/** + * Holds constants which apply to various Subprocess operations. + * + * @namespace + * @lends Subprocess + */ +var SubprocessConstants = { + /** + * @property {integer} ERROR_END_OF_FILE + * The operation failed because the end of the file was reached. + * @constant + */ + ERROR_END_OF_FILE: 0xff7a0001, + /** + * @property {integer} ERROR_INVALID_JSON + * The operation failed because an invalid JSON was encountered. + * @constant + */ + ERROR_INVALID_JSON: 0xff7a0002, + /** + * @property {integer} ERROR_BAD_EXECUTABLE + * The operation failed because the given file did not exist, or + * could not be executed. + * @constant + */ + ERROR_BAD_EXECUTABLE: 0xff7a0003, + /** + * @property {integer} ERROR_INVALID_OPTION + * The operation failed because an invalid option was provided. + * @constant + */ + ERROR_INVALID_OPTION: 0xff7a0004, +}; + +Object.freeze(SubprocessConstants); |