From 7e5af9a0b9f54401845d1f56733622a0efad8dfa Mon Sep 17 00:00:00 2001 From: King Koopa Date: Sun, 12 Apr 2015 18:08:28 +0300 Subject: [PATCH] Update for V8 v4.3 --- nan.h | 457 ++++++++++++++++++++++++++++++++++++ nan_implementation_12_inl.h | 72 ++++++ 2 files changed, 529 insertions(+) diff --git a/nan.h b/nan.h index ee9f8bce..a19bac4f 100644 --- a/nan.h +++ b/nan.h @@ -283,9 +283,16 @@ NAN_INLINE v8::Local _NanEnsureLocal(T val) { v8::Isolate::GetCurrent()->SetAddHistogramSampleFunction(cb); } +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + NAN_INLINE bool NanIdleNotification(int idle_time_in_ms) { + return v8::Isolate::GetCurrent()->IdleNotificationDeadline(idle_time_in_ms * 0.001); + } +# else NAN_INLINE bool NanIdleNotification(int idle_time_in_ms) { return v8::Isolate::GetCurrent()->IdleNotification(idle_time_in_ms); } +#endif NAN_INLINE void NanLowMemoryNotification() { v8::Isolate::GetCurrent()->LowMemoryNotification(); @@ -326,6 +333,15 @@ NAN_INLINE v8::Local _NanEnsureLocal(T val) { #if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION) // Node 0.11+ (0.11.12 and below won't compile with these) +typedef void (*NanGetter) ( + v8::Local property + , const v8::PropertyCallbackInfo& info); + +typedef void (*NanSetter) ( + v8::Local property + , v8::Local value + , const v8::PropertyCallbackInfo& info); + # define _NAN_METHOD_ARGS_TYPE const v8::FunctionCallbackInfo& # define _NAN_METHOD_ARGS _NAN_METHOD_ARGS_TYPE args # define _NAN_METHOD_RETURN_TYPE void @@ -700,6 +716,35 @@ NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( ); } +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + NAN_INLINE v8::Local NanCompileScript( + v8::Local s + , const v8::ScriptOrigin& origin + ) { + v8::ScriptCompiler::Source source(s, origin); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source).ToLocalChecked(); + } + + NAN_INLINE v8::Local NanCompileScript( + v8::Local s + ) { + v8::ScriptCompiler::Source source(s); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source).ToLocalChecked(); + } + + NAN_INLINE v8::Local NanRunScript( + v8::Handle script + ) { + return script->BindToCurrentContext()->Run().ToLocalChecked(); + } + + NAN_INLINE v8::Local NanRunScript( + v8::Handle script + ) { + return script->Run().ToLocalChecked(); + } +#else NAN_INLINE v8::Local NanCompileScript( v8::Local s , const v8::ScriptOrigin& origin @@ -726,6 +771,7 @@ NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( ) { return script->Run(); } +#endif NAN_INLINE v8::Local NanMakeCallback( v8::Handle target @@ -872,6 +918,15 @@ NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( #else // Node 0.8 and 0.10 +typedef v8::Handle (*NanGetter) ( + v8::Local property + , const v8::AccessorInfo& info); + +typedef void (*NanSetter) ( + v8::Local property + , v8::Local value + , const v8::AccessorInfo& info); + # define _NAN_METHOD_ARGS_TYPE const v8::Arguments& # define _NAN_METHOD_ARGS _NAN_METHOD_ARGS_TYPE args # define _NAN_METHOD_RETURN_TYPE v8::Handle @@ -1799,6 +1854,408 @@ NAN_INLINE void NanAsyncQueueWorker (NanAsyncWorker* worker) { ); } +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) + +NAN_INLINE v8::Local NanToBoolean(v8::Local val) { + return val->ToBoolean(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanToNumber(v8::Local val) { + return val->ToNumber(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanToString(v8::Local val) { + return val->ToString(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanToDetailString(v8::Local val) { + return val->ToDetailString(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanToObject(v8::Local val) { + return val->ToObject(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanToInteger(v8::Local val) { + return val->ToInteger(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanToUint32(v8::Local val) { + return val->ToUint32(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanToInt32(v8::Local val) { + return val->ToInt32(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE bool NanBooleanValue(v8::Local val) { + return val->BooleanValue(NanGetCurrentContext().FromJust()); +} + +NAN_INLINE double NanNumberValue(v8::Local val) { + return val->NumberValue(NanGetCurrentContext()).FromJust(); +} + +NAN_INLINE int64_t NanIntegerValue(v8::Local val) { + return val->IntegerValue(NanGetCurrentContext()).FromJust(); +} + +NAN_INLINE uint32_t NanUint32Value(v8::Local val) { + return val->Uint32Value(NanGetCurrentContext()).FromJust(); +} + +NAN_INLINE int32_t NanInt32Value(v8::Local val) { + return val->Int32Value(NanGetCurrentContext()).FromJust(); +} + +NAN_INLINE bool NanEquals(v8::Handle a, v8::Handle(b)) { + return a->Equals(NanGetCurrentContext(), b).FromJust(); +} + +template +NAN_INLINE v8::Local NanNewInstance(v8::Handle h) { + return h->NewInstance(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanGetFunction(v8::Handle t) { + return t->GetFunction(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE bool NanSet(v8::Handle obj, v8::Handle key, v8::Handle value) { + return obj->Set(NanGetCurrentContext(), key, value).FromJust(); +} + +NAN_INLINE bool NanSet(v8::Handle obj, uint32_t index, v8::Handle value) { + return obj->Set(NanGetCurrentContext(), index, value).FromJust(); +} + +NAN_INLINE bool NanForceSet(v8::Handle obj, v8::Handle key, v8::Handle value, v8::PropertyAttribute attribs = v8::None) { + return obj->ForceSet(NanGetCurrentContext(), key, value, attribs).FromJust(); +} + +NAN_INLINE v8::Local NanGet(v8::Handle obj, v8::Handle key) { + return obj->Get(NanGetCurrentContext(), key).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanGet(v8::Handle obj, uint32_t index) { + return obj->Get(NanGetCurrentContext(), index).ToLocalChecked(); +} + +NAN_INLINE v8::PropertyAttribute NanGetPropertyAttributes(v8::Handle obj, v8::Handle key) { + return obj->GetPropertyAttributes(NanGetCurrentContext(), key).FromJust(); +} + +NAN_INLINE bool NanHas(v8::Handle obj, v8::Handle key) { + return obj->Has(NanGetCurrentContext(), key).FromJust(); +} + +NAN_INLINE bool NanHas(v8::Handle obj, uint32_t index) { + return obj->Has(NanGetCurrentContext(), index).FromJust(); +} + +NAN_INLINE bool NanDelete(v8::Handle obj, v8::Handle key) { + return obj->Delete(NanGetCurrentContext(), key).FromJust(); +} + +NAN_INLINE bool NanDelete(v8::Handle obj, uint32_t index) { + return obj->Delete(NanGetCurrentContext(), index).FromJust(); +} + +NAN_INLINE bool NanSetAccessor( + v8::Handle obj + , v8::Handle name + , NanGetter getter + , NanSetter setter = 0 + , v8::Handle data = v8::Handle() + , v8::AccessControl settings = v8::DEFAULT + , v8::PropertyAttribute attribute = v8::None) { + return obj->SetAccessor( + NanGetCurrentContext() + , name + , getter + , setter + , data + , settings + , attribute).FromJust(); +} + +NAN_INLINE v8::Local NanGetPropertyNames(v8::Handle obj) { + return obj->GetPropertyNames(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanGetOwnPropertyNames(v8::Handle obj) { + return obj->GetOwnPropertyNames(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE bool NanSetPrototype(v8::Handle obj, v8::Handle prototype) { + return obj->SetPrototype(NanGetCurrentContext(), prototype).FromJust(); +} + +NAN_INLINE v8::Local NanObjectProtoToString(v8::Handle obj) { + return obj->ObjectProtoToString(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE bool NanHasOwnProperty(v8::Handle obj, v8::Handle key) { + return obj->HasOwnProperty(NanGetCurrentContext(), key).FromJust(); +} + +NAN_INLINE bool NanHasRealNamedProperty(v8::Handle obj, v8::Handle key) { + return obj->HasRealNamedProperty(NanGetCurrentContext(), key).FromJust(); +} + +NAN_INLINE bool NanHasRealIndexedProperty(v8::Handle obj, uint32_t index) { + return obj->HasRealIndexedProperty(NanGetCurrentContext(), index).FromJust(); +} + +NAN_INLINE bool NanHasRealNamedCallbackProperty(v8::Handle obj, v8::Handle key) { + return obj->HasRealNamedCallbackProperty(NanGetCurrentContext(), key).FromJust(); +} + +NAN_INLINE v8::Local NanGetRealNamedPropertyInPrototypeChain(v8::Handle obj, v8::Handle key) { + return obj->GetRealNamedPropertyInPrototypeChain(NanGetCurrentContext(), key).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanGetRealNamedProperty(v8::Handle obj, v8::Handle key) { + return obj->GetRealNamedProperty(NanGetCurrentContext(), key).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanCallAsFunction(v8::Handle obj, + v8::Handle recv, + int argc, + v8::Handle argv[]) { + return obj->CallAsFunction(NanGetCurrentContext(), recv, argc, argv).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanCallAsConstructor(v8::Handle obj, int argc, v8::Handle argv[]) { + return obj->CallAsConstructor(NanGetCurrentContext(), argc, argv).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanGetSourceLine(v8::Handle msg) { + return msg->GetSourceLine(NanGetCurrentContext()).ToLocalChecked(); +} + +NAN_INLINE int NanGetLineNumber(v8::Handle msg) { + return msg->GetLineNumber(NanGetCurrentContext()).FromJust(); +} + +NAN_INLINE int NanGetStartColumn(v8::Handle msg) { + return msg->GetStartColumn(NanGetCurrentContext()).FromJust(); +} + +NAN_INLINE int NanGetEndColumn(v8::Handle msg) { + return msg->GetEndColumn(NanGetCurrentContext()).FromJust(); +} + +NAN_INLINE v8::Local NanCloneElementAt(v8::Handle array, uint32_t index) { + return array->CloneElementAt(NanGetCurrentContext(), index).ToLocalChecked(); +} + +NAN_INLINE v8::Local NanStackTrace(v8::TryCatch trycatch) { + return trycatch.StackTrace(NanGetCurrentContext()).ToLocalChecked(); +} + +#else + +NAN_INLINE v8::Local NanToBoolean(v8::Local val) { + return val->ToBoolean(); +} + +NAN_INLINE v8::Local NanToNumber(v8::Local val) { + return val->ToNumber(); +} + +NAN_INLINE v8::Local NanToString(v8::Local val) { + return val->ToString(); +} + +NAN_INLINE v8::Local NanToDetailString(v8::Local val) { + return val->ToDetailString(); +} + +NAN_INLINE v8::Local NanToObject(v8::Local val) { + return val->ToObject(); +} + +NAN_INLINE v8::Local NanToInteger(v8::Local val) { + return val->ToInteger(); +} + +NAN_INLINE v8::Local NanToUint32(v8::Local val) { + return val->ToUint32(); +} + +NAN_INLINE v8::Local NanToInt32(v8::Local val) { + return val->ToInt32(); +} + +NAN_INLINE bool NanBooleanValue(v8::Local val) { + return val->BooleanValue(); +} + +NAN_INLINE double NanNumberValue(v8::Local val) { + return val->NumberValue(); +} + +NAN_INLINE int64_t NanIntegerValue(v8::Local val) { + return val->IntegerValue(); +} + +NAN_INLINE uint32_t NanUint32Value(v8::Local val) { + return val->Uint32Value(); +} + +NAN_INLINE int32_t NanInt32Value(v8::Local val) { + return val->Int32Value(); +} + +NAN_INLINE bool NanEquals(v8::Handle a, v8::Handle(b)) { + return a->Equals(b); +} + +template +NAN_INLINE v8::Local NanNewInstance(v8::Handle h) { + return h->NewInstance(); +} + +NAN_INLINE v8::Local NanGetFunction(v8::Handle t) { + return t->GetFunction(); +} + +NAN_INLINE bool NanSet(v8::Handle obj, v8::Handle key, v8::Handle value) { + return obj->Set(key, value); +} + +NAN_INLINE bool NanSet(v8::Handle obj, uint32_t index, v8::Handle value) { + return obj->Set(index, value); +} + +NAN_INLINE bool NanForceSet(v8::Handle obj, v8::Handle key, v8::Handle value, v8::PropertyAttribute attribs = v8::None) { + return obj->ForceSet(key, value, attribs); +} + +NAN_INLINE v8::Local NanGet(v8::Handle obj, v8::Handle key) { + return obj->Get(key); +} + +NAN_INLINE v8::Local NanGet(v8::Handle obj, uint32_t index) { + return obj->Get(index); +} + +NAN_INLINE v8::PropertyAttribute NanGetPropertyAttributes(v8::Handle obj, v8::Handle key) { + return obj->GetPropertyAttributes(key); +} + +NAN_INLINE bool NanHas(v8::Handle obj, v8::Handle key) { + return obj->Has(key); +} + +NAN_INLINE bool NanHas(v8::Handle obj, uint32_t index) { + return obj->Has(index); +} + +NAN_INLINE bool NanDelete(v8::Handle obj, v8::Handle key) { + return obj->Delete(key); +} + +NAN_INLINE bool NanDelete(v8::Handle obj, uint32_t index) { + return obj->Delete(index); +} + +NAN_INLINE bool NanSetAccessor( + v8::Handle obj + , v8::Handle name + , NanGetter getter + , NanSetter setter = 0 + , v8::Handle data = v8::Handle() + , v8::AccessControl settings = v8::DEFAULT + , v8::PropertyAttribute attribute = v8::None) { + return obj->SetAccessor( + name + , getter + , setter + , data + , settings + , attribute); +} + +NAN_INLINE v8::Local NanGetPropertyNames(v8::Handle obj) { + return obj->GetPropertyNames(); +} + +NAN_INLINE v8::Local NanGetOwnPropertyNames(v8::Handle obj) { + return obj->GetOwnPropertyNames(); +} + +NAN_INLINE bool NanSetPrototype(v8::Handle obj, v8::Handle prototype) { + return obj->SetPrototype(prototype); +} + +NAN_INLINE v8::Local NanObjectProtoToString(v8::Handle obj) { + return obj->ObjectProtoToString(); +} + +NAN_INLINE bool NanHasOwnProperty(v8::Handle obj, v8::Handle key) { + return obj->HasOwnProperty(key); +} + +NAN_INLINE bool NanHasRealNamedProperty(v8::Handle obj, v8::Handle key) { + return obj->HasRealNamedProperty(key); +} + +NAN_INLINE bool NanHasRealIndexedProperty(v8::Handle obj, uint32_t index) { + return obj->HasRealIndexedProperty(index); +} + +NAN_INLINE bool NanHasRealNamedCallbackProperty(v8::Handle obj, v8::Handle key) { + return obj->HasRealNamedCallbackProperty(key); +} + +NAN_INLINE v8::Local NanGetRealNamedPropertyInPrototypeChain(v8::Handle obj, v8::Handle key) { + return obj->GetRealNamedPropertyInPrototypeChain(key); +} + +NAN_INLINE v8::Local NanGetRealNamedProperty(v8::Handle obj, v8::Handle key) { + return obj->GetRealNamedProperty(key); +} + +NAN_INLINE v8::Local NanCallAsFunction(v8::Handle obj, + v8::Handle recv, + int argc, + v8::Handle argv[]) { + return obj->CallAsFunction(recv, argc, argv); +} + +NAN_INLINE v8::Local NanCallAsConstructor(v8::Handle obj, int argc, v8::Handle argv[]) { + return obj->CallAsConstructor(argc, argv); +} + +NAN_INLINE v8::Local NanGetSourceLine(v8::Handle msg) { + return msg->GetSourceLine(); +} + +NAN_INLINE int NanGetLineNumber(v8::Handle msg) { + return msg->GetLineNumber(); +} + +NAN_INLINE int NanGetStartColumn(v8::Handle msg) { + return msg->GetStartColumn(); +} + +NAN_INLINE int NanGetEndColumn(v8::Handle msg) { + return msg->GetEndColumn(); +} + +NAN_INLINE v8::Local NanCloneElementAt(v8::Handle array, uint32_t index) { + return array->CloneElementAt(index); +} + +NAN_INLINE v8::Local NanStackTrace(v8::TryCatch trycatch) { + return trycatch.StackTrace(); +} + +#endif + //// Base 64 //// #define _nan_base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4) diff --git a/nan_implementation_12_inl.h b/nan_implementation_12_inl.h index 004e92b5..87ca781a 100644 --- a/nan_implementation_12_inl.h +++ b/nan_implementation_12_inl.h @@ -59,10 +59,18 @@ Factory::New( v8::ExtensionConfiguration* extensions //=== Date ===================================================================== +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New(double value) { + return v8::Date::New(NanGetCurrentContext(), value).ToLocalChecked().As(); +} +#else Factory::return_t Factory::New(double value) { return v8::Date::New(v8::Isolate::GetCurrent(), value).As(); } +#endif //=== External ================================================================= @@ -150,15 +158,40 @@ Factory::New() { //=== RegExp =================================================================== +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New( + v8::Handle pattern + , v8::RegExp::Flags flags) { + return v8::RegExp::New(NanGetCurrentContext(), pattern, flags).ToLocalChecked(); +} +#else Factory::return_t Factory::New( v8::Handle pattern , v8::RegExp::Flags flags) { return v8::RegExp::New(pattern, flags); } +#endif //=== Script =================================================================== +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New( v8::Local source) { + v8::ScriptCompiler::Source src(source); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src).ToLocalChecked(); +} + +Factory::return_t +Factory::New( v8::Local source + , v8::ScriptOrigin const& origin) { + v8::ScriptCompiler::Source src(source, origin); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src).ToLocalChecked(); +} +#else Factory::return_t Factory::New( v8::Local source) { v8::ScriptCompiler::Source src(source); @@ -171,6 +204,7 @@ Factory::New( v8::Local source v8::ScriptCompiler::Source src(source, origin); return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src); } +#endif //=== Signature ================================================================ @@ -186,6 +220,43 @@ Factory::New() { return v8::String::Empty(v8::Isolate::GetCurrent()); } +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 || \ + (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3)) +Factory::return_t +Factory::New(const char * value, int length) { + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value, + v8::String::kNormalString, length).ToLocalChecked(); +} + +Factory::return_t +Factory::New(std::string const& value) { + assert(value.size() <= INT_MAX && "string too long"); + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), + value.data(), v8::String::kNormalString, static_cast(value.size())).ToLocalChecked(); +} + +Factory::return_t +Factory::New(const uint8_t * value, int length) { + return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value, + v8::String::kNormalString, length).ToLocalChecked(); +} + +Factory::return_t +Factory::New(const uint16_t * value, int length) { + return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value, + v8::String::kNormalString, length).ToLocalChecked(); +} + +Factory::return_t +Factory::New(v8::String::ExternalStringResource * value) { + return v8::String::NewExternal(v8::Isolate::GetCurrent(), value).ToLocalChecked(); +} + +Factory::return_t +Factory::New(NanExternalOneByteStringResource * value) { + return v8::String::NewExternal(v8::Isolate::GetCurrent(), value).ToLocalChecked(); +} +#else Factory::return_t Factory::New(const char * value, int length) { return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value, @@ -220,6 +291,7 @@ Factory::return_t Factory::New(NanExternalOneByteStringResource * value) { return v8::String::NewExternal(v8::Isolate::GetCurrent(), value); } +#endif //=== String Object ============================================================