Guest User

Untitled

a guest
Jan 17th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.65 KB | None | 0 0
  1. class Internal {};
  2.  
  3. class B {
  4. public:
  5. Internal internal;
  6. explicit B(Internal internal):internal(internal){}
  7. };
  8.  
  9. class A {
  10. public:
  11. A() : internal() {};
  12. B foo() { return B(internal); }
  13. private:
  14. Internal internal;
  15. };
  16.  
  17. const M = require('node_nan_minimal');
  18. const a = new M.A();
  19. const b = a.foo();
  20.  
  21. class AWrapper : public Nan::ObjectWrap { ... }
  22. class BWrapper : public Nan::ObjectWrap { ... }
  23.  
  24. static NAN_METHOD(foo) {
  25. AWrapper* obj = Nan::ObjectWrap::Unwrap<AWrapper>(info.Holder());
  26. B b = obj->a_.foo();
  27. BWrapper * result = new BWrapper(b);
  28. // Something to get a B object to javascript
  29. // ...
  30. // info.GetReturnValue().Set(result->Wrap());
  31. // ...
  32. // doesn't work - so what should it be?
  33. }
  34.  
  35. #include <node.h>
  36. #include <nan.h>
  37.  
  38. class Internal {
  39. };
  40.  
  41. class B {
  42. public:
  43. Internal internal;
  44. explicit B(Internal internal):internal(internal){}
  45. };
  46.  
  47. class A {
  48. public:
  49. A() : internal() {};
  50. B foo() { return B(internal); }
  51. private:
  52. Internal internal;
  53. };
  54.  
  55. class BWrapper : public Nan::ObjectWrap {
  56. public:
  57. B b_;
  58. explicit BWrapper(B b) : b_(b) {}
  59. ~BWrapper() {}
  60. };
  61.  
  62.  
  63. class AWrapper : public Nan::ObjectWrap {
  64. public:
  65. A a_;
  66. explicit AWrapper(A a) : a_(a) {}
  67. ~AWrapper() {}
  68.  
  69. static void register_class(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {
  70. v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
  71. tpl->SetClassName(Nan::New("A").ToLocalChecked());
  72. tpl->InstanceTemplate()->SetInternalFieldCount(1);
  73.  
  74. Nan::SetPrototypeMethod(tpl, "foo", foo);
  75.  
  76. constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked());
  77. Nan::Set(target, Nan::New("A").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked());
  78. }
  79.  
  80. private:
  81.  
  82. static NAN_METHOD(New) {
  83. if (info.IsConstructCall()) {
  84. A a;
  85. AWrapper *obj = new AWrapper(a);
  86. obj->Wrap(info.This());
  87. info.GetReturnValue().Set(info.This());
  88. } else {
  89. const int argc = 1;
  90. v8::Local<v8::Value> argv[argc] = {info[0]};
  91. v8::Local<v8::Function> cons = Nan::New(constructor());
  92. info.GetReturnValue().Set(cons->NewInstance(argc, argv));
  93. }
  94. }
  95.  
  96. static NAN_METHOD(foo) {
  97. AWrapper* obj = Nan::ObjectWrap::Unwrap<AWrapper>(info.Holder());
  98. B b = obj->a_.foo();
  99. BWrapper * result = new BWrapper(b);
  100. // Something to get a B object to javascript
  101. //...
  102. //info.GetReturnValue().Set(result->Wrap());
  103. }
  104.  
  105. static inline Nan::Persistent<v8::Function> & constructor() {
  106. static Nan::Persistent<v8::Function> my_constructor;
  107. return my_constructor;
  108. }
  109.  
  110. };
  111.  
  112.  
  113. NAN_MODULE_INIT(InitModule) {
  114. AWrapper::register_class(target);
  115. }
  116.  
  117. NODE_MODULE(NODE_GYP_MODULE_NAME, InitModule);
Add Comment
Please, Sign In to add comment