bool decode(JSContext *cx, unsigned argc, Value *vp) {
  METHOD_HEADER(1)

  // Default to empty string if no input is given.
  if (args[0].isUndefined()) {
    args.rval().set(JS_GetEmptyStringValue(cx));
    return true;
  }

  size_t length;
  uint8_t *data = value_to_buffer(cx, args[0], "TextDecoder#decode: input", &length);
  if (!data) {
    return false;
  }

  RootedString str(cx, JS_NewStringCopyUTF8N(cx, JS::UTF8Chars((char *)data, length)));
  if (!str)
    return false;

  args.rval().setString(str);
  return true;
}
bool decode(JSContext *cx, unsigned argc, Value *vp) {
  METHOD_HEADER(1)

   
  if (args[0].isUndefined()) {
    args.rval().set(JS_GetEmptyStringValue(cx));
    return true;
  }

  size_t length;
  uint8_t *data = value_to_buffer(cx, args[0], "TextDecoder#decode: input", &length);
  if (!data) {
    return false;
  }

  RootedString str(cx, JS_NewStringCopyUTF8N(cx, JS::UTF8Chars((char *)data, length)));
  if (!str)
    return false;

  args.rval().setString(str);
  return true;
}