From e4eec5185203c3ecdb91dc7451428cc4ae1404a2 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Sun, 18 Oct 2015 19:27:12 -0700 Subject: [PATCH] chakrashim: Implemented 2 new nan.h APIs Added below 2 new nan.h APIs of version 2.12 - SetCallHandler - SetCallAsFunctionHandler Reviewed-By: @munyirik --- deps/chakrashim/include/v8.h | 4 ++++ deps/chakrashim/src/v8functiontemplate.cc | 19 ++++++++++++++++++ deps/chakrashim/src/v8objecttemplate.cc | 24 +++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/deps/chakrashim/include/v8.h b/deps/chakrashim/include/v8.h index 5464e4b4808..d7615f458d1 100644 --- a/deps/chakrashim/include/v8.h +++ b/deps/chakrashim/include/v8.h @@ -1794,6 +1794,8 @@ class V8_EXPORT FunctionTemplate : public Template { Local PrototypeTemplate(); void SetClassName(Handle name); void SetHiddenPrototype(bool value); + void SetCallHandler(FunctionCallback callback, + Handle data = Handle()); bool HasInstance(Handle object); void Inherit(Handle parent); }; @@ -1908,6 +1910,8 @@ class V8_EXPORT ObjectTemplate : public Template { bool turned_on_by_default = true); void SetInternalFieldCount(int value); + void SetCallAsFunctionHandler(FunctionCallback callback, + Handle data = Handle()); private: friend struct FunctionCallbackData; diff --git a/deps/chakrashim/src/v8functiontemplate.cc b/deps/chakrashim/src/v8functiontemplate.cc index 3e53b5277c7..086e2bd1b66 100644 --- a/deps/chakrashim/src/v8functiontemplate.cc +++ b/deps/chakrashim/src/v8functiontemplate.cc @@ -327,6 +327,25 @@ void FunctionTemplate::SetHiddenPrototype(bool value) { // CHAKRA-TODO } +void FunctionTemplate::SetCallHandler(FunctionCallback callback, + Handle data) { + void* externalData; + if (JsGetExternalData(this, &externalData) != JsNoError) { + return; + } + + FunctionCallbackData* callbackData = + new FunctionCallbackData(callback, data, Handle()); + FunctionTemplateData *functionTemplateData = + reinterpret_cast(externalData); + + // delete old callbackData explictly + if (functionTemplateData->callbackData != nullptr) { + delete functionTemplateData->callbackData; + } + functionTemplateData->callbackData = callbackData; +} + bool FunctionTemplate::HasInstance(Handle object) { return jsrt::InstanceOf(*object, *GetFunction()); } diff --git a/deps/chakrashim/src/v8objecttemplate.cc b/deps/chakrashim/src/v8objecttemplate.cc index 7f0a1e371fc..dd0063ef543 100644 --- a/deps/chakrashim/src/v8objecttemplate.cc +++ b/deps/chakrashim/src/v8objecttemplate.cc @@ -39,6 +39,8 @@ struct ObjectTemplateData : public TemplateData { IndexedPropertyDeleterCallback indexedPropertyDeleter; IndexedPropertyEnumeratorCallback indexedPropertyEnumerator; Persistent indexedPropertyInterceptorData; + FunctionCallback functionCallDelegate; + Persistent functionCallDelegateInterceptorData; int internalFieldCount; ObjectTemplateData() @@ -52,6 +54,8 @@ struct ObjectTemplateData : public TemplateData { indexedPropertyQuery(nullptr), indexedPropertyDeleter(nullptr), indexedPropertyEnumerator(nullptr), + functionCallDelegate(nullptr), + functionCallDelegateInterceptorData(nullptr), internalFieldCount(0) { HandleScope scope(nullptr); properties = Object::New(); @@ -68,6 +72,10 @@ struct ObjectTemplateData : public TemplateData { indexedPropertyGetter != nullptr || indexedPropertyQuery != nullptr || indexedPropertySetter != nullptr; + /* + CHAKRA: functionCallDelegate is intentionaly not added as interceptors because it can be invoked + through Object::CallAsFunction or Object::CallAsConstructor + */ } static void CALLBACK FinalizeCallback(void *data) { @@ -1043,6 +1051,22 @@ void ObjectTemplate::SetAccessCheckCallbacks( // CHAKRA-TODO } +void ObjectTemplate::SetCallAsFunctionHandler( + FunctionCallback callback, + Handle data) { + void* externalData; + if (JsGetExternalData(this, &externalData) != JsNoError) + { + return; + } + + ObjectTemplateData *objectTemplateData = + reinterpret_cast(externalData); + + objectTemplateData->functionCallDelegate = callback; + objectTemplateData->functionCallDelegateInterceptorData = data; +} + void ObjectTemplate::SetInternalFieldCount(int value) { void* externalData; if (JsGetExternalData(this, &externalData) != JsNoError) {