about summary refs log blame commit diff stats
path: root/src/js/propertyenumlist.nim
blob: 98ad2a4f3392d8a6c4a396537371e46401aebe04 (plain) (tree)









































                                                                               
import bindings/quickjs

type
  JSPropertyEnumArray* = ptr UncheckedArray[JSPropertyEnum]

  JSPropertyEnumList* = object
    buffer*: JSPropertyEnumArray
    size: uint32
    len*: uint32
    ctx: JSContext

  JSPropertyEnumWrapper* = object
    is_enumerable: bool
    name: string

func newJSPropertyEnumList*(ctx: JSContext, size: uint32): JSPropertyEnumList =
  let p = js_malloc(ctx, csize_t(sizeof(JSPropertyEnum)) * csize_t(size))
  let buffer = cast[JSPropertyEnumArray](p)
  return JSPropertyEnumList(
    ctx: ctx,
    buffer: buffer,
    size: size
  )

proc grow(this: var JSPropertyEnumList) =
  this.size *= 2
  let p = js_realloc(this.ctx, this.buffer, csize_t(this.size))
  this.buffer = cast[JSPropertyEnumArray](p)

proc add*(this: var JSPropertyEnumList, val: uint32) =
  let i = this.len
  inc this.len
  if this.size < this.len:
    this.grow()
  this.buffer[i].atom = JS_NewAtomUInt32(this.ctx, val)

proc add*(this: var JSPropertyEnumList, val: string) =
  let i = this.len
  inc this.len
  if this.size < this.len:
    this.grow()
  this.buffer[i].atom = JS_NewAtomLen(this.ctx, cstring(val), csize_t(val.len))