Source: types/StringType.js

import { MemoryManager } from '../MemoryManager'
import { StringBuffer } from '../StringBuffer'

import { ReferenceType } from './ReferenceType'

/**
 * A class representing a string type
 * @extends {ReferenceType<string>}
 */
export class StringType extends ReferenceType {
  /**
   * Free an allocated string
   * @param {MemoryManager} memoryManager The memory manager
   * @param {number} address The address of the string in memory
   * @param {number} unmarshalledIndex The index of the unmarshalled value or -1
   * @param {Array<*>} unmarshalledArgs The unmarshalled arguments
   * @returns {void}
   */
  free (memoryManager, address, unmarshalledIndex, unmarshalledArgs) {
    memoryManager.free(address)
  }

  /**
   * Marshall a string into memory
   * @param {MemoryManager} memoryManager The memory manager
   * @param {number} unmarshalledIndex The index of the value to marshall
   * @param {Array<*>} unmarshalledArgs The unmarshalled arguments
   * @returns {number} The address of the string in memory
   */
  marshall (memoryManager, unmarshalledIndex, unmarshalledArgs) {
    const unmarshalledValue = unmarshalledArgs[unmarshalledIndex]
    const stringBuffer = StringBuffer.fromString(memoryManager, unmarshalledValue, false)
    return stringBuffer.byteOffset
  }

  /**
   * Unmarshall a string
   * @param {MemoryManager} memoryManager The memory manager
   * @param {number} address The address of the string in memory
   * @param {number} unmarshalledIndex The index to the unmarshalled value or -1
   * @param {Array<*>} unmarshalledArgs The unmarshalled arguments
   * @returns {string} The unmarshalled string
   */
  unmarshall (memoryManager, address, unmarshalledIndex, unmarshalledArgs) {
    try {
      const stringBuffer = StringBuffer.fromAddress(memoryManager, address, false)
      return stringBuffer.toString()
    } finally {
      // Free the memory
      memoryManager.free(address)
    }
  }

  static MANGLED_NAME = 's8'

  get mangledName() {
    return StringType.MANGLED_NAME
  }
}