#include "gdb-tests.h"
#include "jsatom.h"

// When JSGC_ANALYSIS is #defined, Rooted<JSFlatString*> needs the definition
// of JSFlatString in order to figure out its ThingRootKind
#include "vm/String.h"

FRAGMENT(JSString, simple) {
  JS::Rooted<JSString *> empty(cx, JS_NewStringCopyN(cx, NULL, 0));
  JS::Rooted<JSString *> x(cx, JS_NewStringCopyN(cx, "x", 1));
  JS::Rooted<JSString *> z(cx, JS_NewStringCopyZ(cx, "z"));

  // I expect this will be a non-inlined string.
  JS::Rooted<JSString *> stars(cx, JS_NewStringCopyZ(cx,
                                                     "*************************"
                                                     "*************************"
                                                     "*************************"
                                                     "*************************"));

  // This may well be an inlined string.
  JS::Rooted<JSString *> xz(cx, JS_ConcatStrings(cx, x, z));

  // This will probably be a rope.
  JS::Rooted<JSString *> doubleStars(cx, JS_ConcatStrings(cx, stars, stars));

  // Ensure we're not confused by typedefs for pointer types.
  JSString *xRaw = x;

  breakpoint();

  (void) empty;
  (void) x;
  (void) z;
  (void) stars;
  (void) xz;
  (void) doubleStars;
  (void) xRaw;
}

FRAGMENT(JSString, null) {
  JS::Rooted<JSString *> null(cx, NULL);
  JSString *nullRaw = null;

  breakpoint();

  (void) null;
  (void) nullRaw;
}

FRAGMENT(JSString, subclasses) {
  JS::Rooted<JSFlatString *> flat(cx, JS_FlattenString(cx, JS_NewStringCopyZ(cx, "Hi!")));

  breakpoint();

  (void) flat;
}

FRAGMENT(JSString, atom) {
  JSAtom *molybdenum = js::Atomize(cx, "molybdenum", 10);
  breakpoint();

  (void) molybdenum;
}
