//////////////////////////////////////////////////////////////////////////////// /// @brief V8-vocbase bridge /// /// @file /// /// DISCLAIMER /// /// Copyright 2014 ArangoDB GmbH, Cologne, Germany /// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// /// Copyright holder is ArangoDB GmbH, Cologne, Germany /// /// @author Dr. Frank Celler /// @author Copyright 2014, ArangoDB GmbH, Cologne, Germany /// @author Copyright 2011-2014, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// #ifndef ARANGODB_V8_V8__GLOBALS_H #define ARANGODB_V8_V8__GLOBALS_H 1 #include "Basics/Common.h" #include // ----------------------------------------------------------------------------- // --SECTION-- forward declarations // ----------------------------------------------------------------------------- struct TRI_vocbase_s; namespace triagens { namespace arango { class ApplicationV8; class JSLoader; } } // ----------------------------------------------------------------------------- // --SECTION-- public macros // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for creating a v8 symbol for the specified string //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_SYMBOL(name) \ v8::String::NewSymbol(name, (int) strlen(name)) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for creating a v8 string for the specified string //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_STRING(name) \ v8::String::New(name) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for current v8 globals //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_CURRENT_GLOBALS \ v8::Isolate* isolate = v8::Isolate::GetCurrent(); \ TRI_v8_global_t* v8g = static_cast(isolate->GetData()); \ while (0) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for current v8 globals and scope //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_CURRENT_GLOBALS_AND_SCOPE \ v8::Isolate* isolate = v8::Isolate::GetCurrent(); \ TRI_v8_global_t* v8g = static_cast(isolate->GetData()); \ v8::HandleScope scope; \ while (0) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an exception with an error code //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION(scope, code) \ return scope.Close(v8::ThrowException( \ TRI_CreateErrorObject(__FILE__, __LINE__, code))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_MESSAGE(scope, code, message) \ return scope.Close(v8::ThrowException( \ TRI_CreateErrorObject(__FILE__, __LINE__, code, message, true))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_FULL(scope, code, message) \ return scope.Close(v8::ThrowException( \ TRI_CreateErrorObject(__FILE__, __LINE__, code, message, false))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a usage exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_USAGE(scope, usage) \ do { \ std::string msg = "usage: "; \ msg += usage; \ return scope.Close( \ v8::ThrowException( \ TRI_CreateErrorObject(__FILE__, __LINE__, \ TRI_ERROR_BAD_PARAMETER, \ msg.c_str()))); \ } \ while (0) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an internal exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_INTERNAL(scope, message) \ return scope.Close(v8::ThrowException( \ TRI_CreateErrorObject(__FILE__, __LINE__, TRI_ERROR_INTERNAL, message))); //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a parameter exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_PARAMETER(scope, message) \ return scope.Close(v8::ThrowException( \ TRI_CreateErrorObject(__FILE__, __LINE__, TRI_ERROR_BAD_PARAMETER, message))); //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an out-of-memory exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_MEMORY(scope) \ return scope.Close(v8::ThrowException( \ TRI_CreateErrorObject(__FILE__, __LINE__, TRI_ERROR_OUT_OF_MEMORY))); //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an exception for an system error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_SYS(scope, message) \ do { \ TRI_set_errno(TRI_ERROR_SYS_ERROR); \ std::string msg = message; \ msg += ": "; \ msg += TRI_LAST_ERROR_STR; \ return scope.Close(v8::ThrowException( \ TRI_CreateErrorObject( \ __FILE__, __LINE__, \ TRI_errno(), \ msg.c_str()))); \ } \ while (0) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_ERROR(scope, message) \ return scope.Close(v8::ThrowException(v8::Exception::Error(v8::String::New(message)))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a range error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_RANGE_ERROR(scope, message) \ return scope.Close(v8::ThrowException(v8::Exception::RangeError(v8::String::New(message)))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a syntax error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_SYNTAX_ERROR(scope, message) \ return scope.Close(v8::ThrowException(v8::Exception::SyntaxError(v8::String::New(message)))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a type error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_TYPE_ERROR(scope, message) \ return scope.Close(v8::ThrowException(v8::Exception::TypeError(v8::String::New(message)))) //////////////////////////////////////////////////////////////////////////////// /// @brief "not yet implemented" handler for sharding //////////////////////////////////////////////////////////////////////////////// #define TRI_SHARDING_COLLECTION_NOT_YET_IMPLEMENTED(scope, collection) \ if (collection != 0 && ! collection->_isLocal) { \ TRI_V8_EXCEPTION(scope, TRI_ERROR_NOT_IMPLEMENTED); \ } // ----------------------------------------------------------------------------- // --SECTION-- public types // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief globals stored in the isolate //////////////////////////////////////////////////////////////////////////////// typedef struct TRI_v8_global_s { //////////////////////////////////////////////////////////////////////////////// /// @brief constructor //////////////////////////////////////////////////////////////////////////////// TRI_v8_global_s (v8::Isolate*); //////////////////////////////////////////////////////////////////////////////// /// @brief destructor //////////////////////////////////////////////////////////////////////////////// ~TRI_v8_global_s (); // ----------------------------------------------------------------------------- // --SECTION-- HELPERS // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief barrier mapping for weak pointers //////////////////////////////////////////////////////////////////////////////// std::map< void*, v8::Persistent > JSBarriers; //////////////////////////////////////////////////////////////////////////////// /// @brief collection mapping for weak pointers //////////////////////////////////////////////////////////////////////////////// std::map< void*, v8::Persistent > JSCollections; // ----------------------------------------------------------------------------- // --SECTION-- JAVASCRIPT OBJECT TEMPLATES // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief agency template //////////////////////////////////////////////////////////////////////////////// v8::Persistent AgencyTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief clusterinfo template //////////////////////////////////////////////////////////////////////////////// v8::Persistent ClusterInfoTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief server state template //////////////////////////////////////////////////////////////////////////////// v8::Persistent ServerStateTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief cluster comm template //////////////////////////////////////////////////////////////////////////////// v8::Persistent ClusterCommTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief ArangoError template //////////////////////////////////////////////////////////////////////////////// v8::Persistent ArangoErrorTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief SleepAndRequeue template //////////////////////////////////////////////////////////////////////////////// v8::Persistent SleepAndRequeueTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief SleepAndRequeue function template //////////////////////////////////////////////////////////////////////////////// v8::Persistent SleepAndRequeueFuncTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief general cursor template //////////////////////////////////////////////////////////////////////////////// v8::Persistent GeneralCursorTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief TRI_shaped_json_t template //////////////////////////////////////////////////////////////////////////////// v8::Persistent ShapedJsonTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief TRI_vocbase_col_t template //////////////////////////////////////////////////////////////////////////////// v8::Persistent VocbaseColTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief TRI_vocbase_t template //////////////////////////////////////////////////////////////////////////////// v8::Persistent VocbaseTempl; // ----------------------------------------------------------------------------- // --SECTION-- JAVASCRIPT FUNCTION TEMPLATES // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief Buffer template //////////////////////////////////////////////////////////////////////////////// v8::Persistent BufferTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief fast Buffer constructor //////////////////////////////////////////////////////////////////////////////// v8::Persistent FastBufferConstructor; // ----------------------------------------------------------------------------- // --SECTION-- JAVASCRIPT FUNCTIONS // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief Buffer template //////////////////////////////////////////////////////////////////////////////// v8::Persistent ExecuteFileCallback; // ----------------------------------------------------------------------------- // --SECTION-- JAVASCRIPT CONSTANTS // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief "Buffer" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent BufferConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "DELETE" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent DeleteConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "GET" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent GetConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "HEAD" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent HeadConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "OPTIONS" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent OptionsConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "PATCH" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent PatchConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "POST" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent PostConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "PUT" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent PutConstant; // ----------------------------------------------------------------------------- // --SECTION-- JAVASCRIPT KEY NAMES // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief "address" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent AddressKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "allowUseDatabase" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent AllowUseDatabaseKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "bodyFromFile" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent BodyFromFileKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "body" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent BodyKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "client" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ClientKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "clientTransactionID" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ClientTransactionIDKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "code" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent CodeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "compatibility" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent CompatibilityKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "contentType" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ContentTypeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "cookies" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent CookiesKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "coordTransactionID" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent CoordTransactionIDKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "database" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent DatabaseKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "doCompact" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent DoCompactKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "domain" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent DomainKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "error" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ErrorKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "errorMessage" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ErrorMessageKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "errorNum" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ErrorNumKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "headers" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent HeadersKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "httpOnly" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent HttpOnlyKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "id" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent IdKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "isSystem" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent IsSystemKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "isVolatile" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent IsVolatileKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "journalSize" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent JournalSizeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "keepNull" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent KeepNullKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "keyOptions" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent KeyOptionsKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "length" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent LengthKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "lifeTime" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent LifeTimeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "mergeObjects" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent MergeObjectsKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "name" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent NameKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "operationID" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent OperationIDKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "overwrite" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent OverwriteKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "parameters" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ParametersKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "path" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent PathKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "prefix" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent PrefixKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "port" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent PortKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "portType" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent PortTypeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "protocol" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ProtocolKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "requestBody" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent RequestBodyKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "requestType" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent RequestTypeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "responseCode" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ResponseCodeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "secure" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent SecureKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "server" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent ServerKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "shardID" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ShardIDKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "silent" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent SilentKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "sleep" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent SleepKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "status" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent StatusKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "suffix" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent SuffixKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "timeout" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent TimeoutKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "transformations" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent TransformationsKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "url" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent UrlKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "user" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent UserKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "value" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent ValueKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "version" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent VersionKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "waitForSync" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent WaitForSyncKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_from" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _FromKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_dbName" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _DbNameKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_id" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _IdKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_key" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _KeyKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_oldRev" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _OldRevKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_rev" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _RevKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_to" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _ToKey; // ----------------------------------------------------------------------------- // --SECTION-- DATABASE // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief currently request object (might be invalid!) //////////////////////////////////////////////////////////////////////////////// v8::Handle _currentRequest; //////////////////////////////////////////////////////////////////////////////// /// @brief currently response object (might be invalid!) //////////////////////////////////////////////////////////////////////////////// v8::Handle _currentResponse; //////////////////////////////////////////////////////////////////////////////// /// @brief information about the currently running transaction //////////////////////////////////////////////////////////////////////////////// void* _transactionContext; //////////////////////////////////////////////////////////////////////////////// /// @brief query registry //////////////////////////////////////////////////////////////////////////////// void* _queryRegistry; //////////////////////////////////////////////////////////////////////////////// /// @brief current AQL query //////////////////////////////////////////////////////////////////////////////// void* _query; //////////////////////////////////////////////////////////////////////////////// /// @brief pointer to the server (TRI_server_t*) //////////////////////////////////////////////////////////////////////////////// void* _server; //////////////////////////////////////////////////////////////////////////////// /// @brief pointer to the vocbase (TRI_vocbase_t*) //////////////////////////////////////////////////////////////////////////////// struct TRI_vocbase_s* _vocbase; //////////////////////////////////////////////////////////////////////////////// /// @brief whether or not useDatabase() is allowed //////////////////////////////////////////////////////////////////////////////// bool _allowUseDatabase; //////////////////////////////////////////////////////////////////////////////// /// @brief whether or not dead objects (ex-wrapped V8 objects) have been /// deallocated in the context //////////////////////////////////////////////////////////////////////////////// bool _hasDeadObjects; // ----------------------------------------------------------------------------- // --SECTION-- GENERAL // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief pointer to the context dealer (ApplicationV8*) //////////////////////////////////////////////////////////////////////////////// triagens::arango::ApplicationV8* _applicationV8; //////////////////////////////////////////////////////////////////////////////// /// @brief pointer to the startup loader (JSLoader*) //////////////////////////////////////////////////////////////////////////////// triagens::arango::JSLoader* _loader; //////////////////////////////////////////////////////////////////////////////// /// @brief cancel has been caught //////////////////////////////////////////////////////////////////////////////// bool _canceled; } TRI_v8_global_t; // ----------------------------------------------------------------------------- // --SECTION-- GLOBAL FUNCTIONS // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief creates a global context //////////////////////////////////////////////////////////////////////////////// TRI_v8_global_t* TRI_CreateV8Globals(v8::Isolate*); //////////////////////////////////////////////////////////////////////////////// /// @brief gets the global context //////////////////////////////////////////////////////////////////////////////// TRI_v8_global_t* TRI_GetV8Globals(v8::Isolate*); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a method to the prototype of an object //////////////////////////////////////////////////////////////////////////////// template void TRI_V8_AddProtoMethod (TARGET tpl, char const* name, v8::InvocationCallback callback, bool isHidden = false) { // hidden method if (isHidden) { tpl->PrototypeTemplate()->Set(TRI_V8_SYMBOL(name), v8::FunctionTemplate::New(callback), v8::DontEnum); } // normal method else { tpl->PrototypeTemplate()->Set(TRI_V8_SYMBOL(name), v8::FunctionTemplate::New(callback)); } } //////////////////////////////////////////////////////////////////////////////// /// @brief adds a method to an object //////////////////////////////////////////////////////////////////////////////// template inline void TRI_V8_AddMethod (TARGET tpl, char const* name, v8::Handle callback, bool isHidden = false) { // hidden method if (isHidden) { tpl->Set(TRI_V8_SYMBOL(name), callback->GetFunction(), v8::DontEnum); } // normal method else { tpl->Set(TRI_V8_SYMBOL(name), callback->GetFunction()); } } template inline void TRI_V8_AddMethod (TARGET tpl, char const* name, v8::InvocationCallback callback, bool isHidden = false) { // hidden method if (isHidden) { tpl->Set(TRI_V8_SYMBOL(name), v8::FunctionTemplate::New(callback)->GetFunction(), v8::DontEnum); } // normal method else { tpl->Set(TRI_V8_SYMBOL(name), v8::FunctionTemplate::New(callback)->GetFunction()); } } template <> inline void TRI_V8_AddMethod (v8::Handle tpl, const char* const name, v8::InvocationCallback callback, bool isHidden) { TRI_V8_AddMethod(tpl->GetFunction(), name, callback, isHidden); } //////////////////////////////////////////////////////////////////////////////// /// @brief adds a method to an object //////////////////////////////////////////////////////////////////////////////// void TRI_AddMethodVocbase (v8::Handle tpl, char const* name, v8::Handle(*func)(v8::Arguments const&), bool isHidden = false); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a global function to the given context //////////////////////////////////////////////////////////////////////////////// void TRI_AddGlobalFunctionVocbase (v8::Handle context, char const* name, v8::Handle(*func)(v8::Arguments const&), bool isHidden = false); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a global function to the given context //////////////////////////////////////////////////////////////////////////////// void TRI_AddGlobalFunctionVocbase (v8::Handle context, char const* name, v8::Handle func, bool isHidden = false); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a global read-only variable to the given context //////////////////////////////////////////////////////////////////////////////// void TRI_AddGlobalVariableVocbase (v8::Handle context, char const* name, v8::Handle value); #endif // ----------------------------------------------------------------------------- // --SECTION-- END-OF-FILE // ----------------------------------------------------------------------------- // Local Variables: // mode: outline-minor // outline-regexp: "/// @brief\\|/// {@inheritDoc}\\|/// @page\\|// --SECTION--\\|/// @\\}" // End: