forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			108 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* -*- 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);
 | 
