// Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef SRC_NODE_INTERNALS_H_ #define SRC_NODE_INTERNALS_H_ #include #include "v8.h" namespace node { #ifdef _WIN32 // emulate snprintf() on windows, _snprintf() doesn't zero-terminate the buffer // on overflow... #include inline static int snprintf(char* buf, unsigned int len, const char* fmt, ...) { va_list ap; va_start(ap, fmt); int n = _vsprintf_p(buf, len, fmt, ap); if (len) buf[len - 1] = '\0'; va_end(ap); return n; } #endif #ifndef offset_of // g++ in strict mode complains loudly about the system offsetof() macro // because it uses NULL as the base address. # define offset_of(type, member) \ ((intptr_t) ((char *) &(((type *) 8)->member) - 8)) #endif #ifndef container_of # define container_of(ptr, type, member) \ ((type *) ((char *) (ptr) - offset_of(type, member))) #endif #ifndef ARRAY_SIZE # define ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0])) #endif #ifndef ROUND_UP # define ROUND_UP(a, b) ((a) % (b) ? ((a) + (b)) - ((a) % (b)) : (a)) #endif // this would have been a template function were it not for the fact that g++ // sometimes fails to resolve it... #define THROW_ERROR(fun) \ do { \ v8::HandleScope scope; \ return v8::ThrowException(fun(v8::String::New(errmsg))); \ } \ while (0) inline static v8::Handle ThrowError(const char* errmsg) { THROW_ERROR(v8::Exception::Error); } inline static v8::Handle ThrowTypeError(const char* errmsg) { THROW_ERROR(v8::Exception::TypeError); } inline static v8::Handle ThrowRangeError(const char* errmsg) { THROW_ERROR(v8::Exception::RangeError); } #define UNWRAP(type) \ assert(!args.Holder().IsEmpty()); \ assert(args.Holder()->InternalFieldCount() > 0); \ type* wrap = \ static_cast(args.Holder()->GetPointerFromInternalField(0)); \ if (!wrap) { \ fprintf(stderr, #type ": Aborting due to unwrap failure at %s:%d\n", \ __FILE__, __LINE__); \ abort(); \ } } // namespace node #endif // SRC_NODE_INTERNALS_H_