| #include "dtrace_provider.h" |
| #include <nan.h> |
|
|
| namespace node { |
|
|
| using namespace v8; |
|
|
| |
|
|
| #ifdef __x86_64__ |
| # define INTMETHOD ToInteger() |
| #else |
| # define INTMETHOD ToInt32() |
| #endif |
|
|
| void * DTraceIntegerArgument::ArgumentValue(v8::Local<Value> value) { |
| if (value->IsUndefined()) |
| return 0; |
| else |
| return (void *)(long) value->INTMETHOD->Value(); |
| } |
|
|
| void DTraceIntegerArgument::FreeArgument(void *arg) { |
| } |
|
|
| const char * DTraceIntegerArgument::Type() { |
| return "int"; |
| } |
|
|
| |
|
|
| void * DTraceStringArgument::ArgumentValue(v8::Local<Value> value) { |
| if (value->IsUndefined()) |
| return (void *) strdup("undefined"); |
|
|
| String::Utf8Value str(value->ToString()); |
| return (void *) strdup(*str); |
| } |
|
|
| void DTraceStringArgument::FreeArgument(void *arg) { |
| free(arg); |
| } |
|
|
| const char * DTraceStringArgument::Type() { |
| return "char *"; |
| } |
|
|
| |
|
|
| DTraceJsonArgument::DTraceJsonArgument() { |
| Nan::HandleScope scope; |
| v8::Local<Context> context = Nan::GetCurrentContext(); |
| v8::Local<Object> global = context->Global(); |
| v8::Local<Object> l_JSON = global->Get(Nan::New<String>("JSON").ToLocalChecked())->ToObject(); |
| v8::Local<Function> l_JSON_stringify |
| = v8::Local<Function>::Cast(l_JSON->Get(Nan::New<String>("stringify").ToLocalChecked())); |
| JSON.Reset(l_JSON); |
| JSON_stringify.Reset(l_JSON_stringify); |
| } |
|
|
| DTraceJsonArgument::~DTraceJsonArgument() { |
| JSON.Reset(); |
| JSON_stringify.Reset(); |
| } |
|
|
| void * DTraceJsonArgument::ArgumentValue(v8::Local<Value> value) { |
| Nan::HandleScope scope; |
|
|
| if (value->IsUndefined()) |
| return (void *) strdup("undefined"); |
|
|
| v8::Local<Value> info[1]; |
| info[0] = value; |
| v8::Local<Value> j = Nan::New<Function>(JSON_stringify)->Call( |
| Nan::New<Object>(JSON), 1, info); |
|
|
| if (*j == NULL) |
| return (void *) strdup("{ \"error\": \"stringify failed\" }"); |
|
|
| String::Utf8Value json(j->ToString()); |
| return (void *) strdup(*json); |
| } |
|
|
| void DTraceJsonArgument::FreeArgument(void *arg) { |
| free(arg); |
| } |
|
|
| const char * DTraceJsonArgument::Type() { |
| return "char *"; |
| } |
|
|
| } |
|
|