///|
extern "C" fn native_ptr_sizeof() -> Int = "moonbit_ptr_sizeof"

///|
#borrow(bytes)
extern "C" fn native_ptr_is_null(bytes : Bytes) -> Bool = "moonbit_ptr_is_null"

///|
#borrow(bytes)
extern "C" fn native_ptr_clear(bytes : Bytes) -> Unit = "moonbit_ptr_clear"

///|
#borrow(bytes)
extern "C" fn native_error_delete_ptr(bytes : Bytes) -> Unit = "moonbit_v8_error_delete_ptr"

///|
#borrow(bytes)
extern "C" fn native_error_message_bytes(bytes : Bytes) -> Bytes = "moonbit_v8_error_message_bytes"

///|
fn make_ptr_buffer() -> Bytes {
  Bytes::make(native_ptr_sizeof(), 0)
}

///|
fn take_native_error(err_ptr : Bytes, fallback : V8Error) -> V8Error {
  if native_ptr_is_null(err_ptr) {
    fallback
  } else {
    let msg = @utf8.decode_lossy(native_error_message_bytes(err_ptr))
    native_error_delete_ptr(err_ptr)
    if msg == "" {
      fallback
    } else {
      V8Error::NativeError(msg)
    }
  }
}