2013/8/22 Nicholas Nethercote <[email protected]>:
> Hi,
>
> |jsid| is a struct in debug builds and an integral type in opt builds.
>  From jspubtd.h:
>
> /*
>  * In release builds, jsid is defined to be an integral type. This
>  * prevents many bugs from being caught at compile time. E.g.:
>  *
>  *  jsid id = ...
>  *  if (id)             // error
>  *    ...
>  *
>  *  size_t n = id;      // error
>  *
>  * To catch more errors, jsid is given a struct type in C++ debug builds.
>  * Struct assignment and (in C++) operator== allow correct code to be mostly
>  * oblivious to the change. This feature can be explicitly disabled in debug
>  * builds by defining JS_NO_JSVAL_JSID_STRUCT_TYPES.
>  */
> # if defined(DEBUG) && !defined(JS_NO_JSVAL_JSID_STRUCT_TYPES)
> #  define JS_USE_JSID_STRUCT_TYPES
> # endif
>
> # ifdef JS_USE_JSID_STRUCT_TYPES
> struct jsid
> {
>     size_t asBits;
>     bool operator==(jsid rhs) const { return asBits == rhs.asBits; }
>     bool operator!=(jsid rhs) const { return asBits != rhs.asBits; }
> };
> #  define JSID_BITS(id) (id.asBits)
> # else  /* defined(JS_USE_JSID_STRUCT_TYPES) */
> typedef ptrdiff_t jsid;
> #  define JSID_BITS(id) (id)
> # endif  /* defined(JS_USE_JSID_STRUCT_TYPES) */
>
>
> I'm wondering if this whole game is even necessary.  Could we use the
> struct version in opt builds as well?  The only reason I can think not
> to is if some compilers do not optimize a struct containing a single
> integer as well as they would a naked integer.

Perhaps in the old days it enabled C typechecking to find more errors?

At any rate, we're definitely already screwed on compilers than don't
properly optimized those kinds of structs. (See Value!)


-- 
Regards,
Benjamin
_______________________________________________
dev-tech-js-engine-internals mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals

Reply via email to