- 
                Notifications
    You must be signed in to change notification settings 
- Fork 119
Description
Hi Pavel, and/or others that can hopefully point me in the right direction.. 🙂
First of all great project, I've been using it for a couple of years and it's awesome!
Let me start by saying, this could very well be a user-error, so I'm submitting this as a question at first, unless someone else can confirm that something indeed did break. I might be unique that I'm not using the module feature? Because I'm not using this within the context of Nodejs...
I'm using v8pp in C++ to embed V8, and I noticed that the following commit:
And in particular this specific bit:
a6a3a9e#diff-a4ae90fbc3497ac69ffe7b5daf8f89f04f9a653c4d251f134a998e9a96ef3d95L339-L340
Has broken the behavior of calling a setter and getter on a class. I think this is the simplest way to reproduce:
#include <iostream>
#include "v8pp/class.hpp"
#include "v8pp/context.hpp"
#include "libplatform/libplatform.h"
v8::Local<v8::String> v8_str(v8::Isolate *isolate, const std::string &str) {
  return v8::String::NewFromUtf8(isolate, str.c_str(), v8::NewStringType::kNormal).ToLocalChecked();
}
class Test {
public:
  explicit Test() = default;
  double getter() {
    std::cout << "getter called" << std::endl;
    return 123;
  }
  void setter(double value) {
    std::cout << "setter called: " << value << std::endl;
  }
};
int main() {
  v8::V8::InitializeExternalStartupData("test");
  std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform(1);
  v8::V8::InitializePlatform(platform.get());
  v8::V8::Initialize();
  v8pp::context ctx;
  v8::HandleScope scope(ctx.isolate());
  Test *instance = new Test();
  v8pp::class_<Test> MyObject_class(ctx.isolate());
  MyObject_class
      .ctor()
      .property("x", &Test::getter, &Test::setter);
  v8::Local<v8::Object> obj = MyObject_class.reference_external(ctx.isolate(), instance);
  // Try setter
  obj->Set(ctx.impl(), v8_str(ctx.isolate(), "x"), v8::Number::New(ctx.isolate(), 14)).FromJust();
  
  // Try getter
  obj->Get(ctx.impl(), v8_str(ctx.isolate(), "x")).ToLocalChecked()->NumberValue(ctx.impl()).ToChecked();
}
It does not output anything, unless I revert back V8 to version 10 (which still has the old SetAccessor functions)
Then I get output that confirms calls to my getter and setter are being made..
I've tried many things in the meantime, like explicitly running a script to do "x = MyClass(); x" (playing around with x inside the same script, using ctx->class_("MyClass", MyObject_class);, and a lot of stuff I forgot from the past few days)
So any pointers would be greatly appreciated.
For others running into similar issues, this is some info I found for the API change: