| /** |
| * @license |
| * Copyright 2010 The Emscripten Authors |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| //"use strict"; |
| |
| var Compiletime = { |
| isPointerType: isPointerType, |
| isStructType: isStructType, |
| |
| isNumberType: function(type) { |
| return type in Compiletime.INT_TYPES || type in Compiletime.FLOAT_TYPES; |
| }, |
| |
| INT_TYPES: set('i1', 'i8', 'i16', 'i32', 'i64'), |
| FLOAT_TYPES: set('float', 'double'), |
| }; |
| |
| // code used both at compile time and runtime is defined here, then put on |
| // the Runtime object for compile time and support.js for the generated code |
| |
| function getNativeTypeSize(type) { |
| switch (type) { |
| case 'i1': case 'i8': return 1; |
| case 'i16': return 2; |
| case 'i32': return 4; |
| case 'i64': return 8; |
| case 'float': return 4; |
| case 'double': return 8; |
| default: { |
| if (type[type.length-1] === '*') { |
| return 4; // A pointer |
| } else if (type[0] === 'i') { |
| var bits = Number(type.substr(1)); |
| assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); |
| return bits / 8; |
| } else { |
| return 0; |
| } |
| } |
| } |
| } |
| |
| function alignMemory(size, factor) { |
| if (!factor) factor = STACK_ALIGN; // stack alignment (16-byte) by default |
| return Math.ceil(size / factor) * factor; |
| } |
| |
| var Runtime = { |
| getNativeTypeSize: getNativeTypeSize, |
| |
| //! Returns the size of a structure field, as C/C++ would have it (in 32-bit, |
| //! for now). |
| //! @param type The type, by name. |
| getNativeFieldSize: function(type) { |
| return Math.max(getNativeTypeSize(type), Runtime.QUANTUM_SIZE); |
| }, |
| |
| POINTER_SIZE: 4, |
| QUANTUM_SIZE: 4, |
| }; |
| |
| // Additional runtime elements, that need preprocessing |
| |
| // "Process info" for syscalls is static and cannot change, so define it using |
| // some fixed values |
| var PROCINFO = { |
| ppid: 1, |
| pid: 42, |
| sid: 42, |
| pgid: 42 |
| }; |