Skip to content

Commit

Permalink
DynamicObject::Create now returns a Value
Browse files Browse the repository at this point in the history
  • Loading branch information
craigminihan committed Apr 22, 2015
1 parent 36f75a9 commit a1ef9b0
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 40 deletions.
26 changes: 14 additions & 12 deletions src/libjsapi/dynamic_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,24 @@

JSClass rs::jsapi::DynamicObject::class_ = {
"rs_jsapi_dynamicobject", JSCLASS_HAS_PRIVATE, JS_PropertyStub, JS_DeletePropertyStub,
DynamicObject::GetCallback, DynamicObject::SetCallback, DynamicObject::EnumerateCallback, JS_ResolveStub,
JS_ConvertStub, DynamicObject::FinalizeCallback
DynamicObject::Get, DynamicObject::Set, DynamicObject::Enumerate, JS_ResolveStub,
JS_ConvertStub, DynamicObject::Finalize
};

bool rs::jsapi::DynamicObject::Create(Context& cx, Getter getter, DynamicObject::Setter setter, Enumerator enumerator, JS::RootedObject& obj) {
obj = JS::RootedObject(cx, JS_NewObject(cx, &class_, JS::NullPtr(), JS::NullPtr()));
bool rs::jsapi::DynamicObject::Create(Context& cx, GetCallback getter, DynamicObject::SetCallback setter, Enumerator enumerator, Value& obj) {
JS::RootedObject newObj(cx, JS_NewObject(cx, &class_, JS::NullPtr(), JS::NullPtr()));

if (obj) {
if (newObj) {
auto callbacks = new ClassCallbacks { getter, setter, enumerator };
DynamicObject::SetObjectCallbacks(obj, callbacks);
DynamicObject::SetObjectCallbacks(newObj, callbacks);

obj.set(newObj);
}

return obj;
return newObj;
}

bool rs::jsapi::DynamicObject::GetCallback(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::MutableHandleValue vp) {
bool rs::jsapi::DynamicObject::Get(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::MutableHandleValue vp) {
auto callbacks = DynamicObject::GetObjectCallbacks(obj);

if (callbacks != nullptr && callbacks->getter != nullptr) {
Expand Down Expand Up @@ -52,7 +54,7 @@ bool rs::jsapi::DynamicObject::GetCallback(JSContext* cx, JS::HandleObject obj,
}
}

bool rs::jsapi::DynamicObject::SetCallback(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool strict, JS::MutableHandleValue vp) {
bool rs::jsapi::DynamicObject::Set(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool strict, JS::MutableHandleValue vp) {
auto callbacks = DynamicObject::GetObjectCallbacks(obj);

if (callbacks != nullptr && callbacks->setter != nullptr) {
Expand All @@ -78,7 +80,7 @@ bool rs::jsapi::DynamicObject::SetCallback(JSContext* cx, JS::HandleObject obj,
}
}

bool rs::jsapi::DynamicObject::EnumerateCallback(JSContext* cx, JS::HandleObject obj) {
bool rs::jsapi::DynamicObject::Enumerate(JSContext* cx, JS::HandleObject obj) {
auto status = true;
auto callbacks = DynamicObject::GetObjectCallbacks(obj);
if (callbacks != nullptr && callbacks->enumerator != nullptr) {
Expand All @@ -88,7 +90,7 @@ bool rs::jsapi::DynamicObject::EnumerateCallback(JSContext* cx, JS::HandleObject
if (status) {
for (auto p : props) {
JS_DefineProperty(cx, obj, p.c_str(), JS::NullHandleValue, JSPROP_ENUMERATE,
DynamicObject::GetCallback, DynamicObject::SetCallback);
DynamicObject::Get, DynamicObject::Set);
}

for (auto f : funcs) {
Expand All @@ -99,7 +101,7 @@ bool rs::jsapi::DynamicObject::EnumerateCallback(JSContext* cx, JS::HandleObject
return status;
}

void rs::jsapi::DynamicObject::FinalizeCallback(JSFreeOp* fop, JSObject* obj) {
void rs::jsapi::DynamicObject::Finalize(JSFreeOp* fop, JSObject* obj) {
delete GetObjectCallbacks(obj);
SetObjectCallbacks(obj, nullptr);
}
Expand Down
16 changes: 8 additions & 8 deletions src/libjsapi/dynamic_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,19 @@ class Value;

class DynamicObject final {
public:
typedef std::function<bool(const char* name, Value& value)> Getter;
typedef std::function<bool(const char* name, const Value& value)> Setter;
typedef std::function<bool(const char* name, Value& value)> GetCallback;
typedef std::function<bool(const char* name, const Value& value)> SetCallback;
typedef std::function<bool(std::vector<std::string>& props, std::vector<std::pair<std::string, JSNative>>& funcs)> Enumerator;

static bool Create(Context& cx, Getter getter, Setter setter, Enumerator enumerator, JS::RootedObject& obj);
static bool Create(Context& cx, GetCallback getter, SetCallback setter, Enumerator enumerator, Value& obj);

private:
struct ClassCallbacks { Getter getter; Setter setter; Enumerator enumerator; };
struct ClassCallbacks { GetCallback getter; SetCallback setter; Enumerator enumerator; };

static bool GetCallback(JSContext*, JS::HandleObject, JS::HandleId, JS::MutableHandleValue);
static bool SetCallback(JSContext*, JS::HandleObject, JS::HandleId, bool, JS::MutableHandleValue);
static bool EnumerateCallback(JSContext* cx, JS::HandleObject obj);
static void FinalizeCallback(JSFreeOp* fop, JSObject* obj);
static bool Get(JSContext*, JS::HandleObject, JS::HandleId, JS::MutableHandleValue);
static bool Set(JSContext*, JS::HandleObject, JS::HandleId, bool, JS::MutableHandleValue);
static bool Enumerate(JSContext* cx, JS::HandleObject obj);
static void Finalize(JSFreeOp* fop, JSObject* obj);
static ClassCallbacks* GetObjectCallbacks(JSObject* obj);
static void SetObjectCallbacks(JSObject* obj, ClassCallbacks* callbacks);

Expand Down
36 changes: 16 additions & 20 deletions src/libjsapi/tests/simple_dynamic_object_tests.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
#include <gtest/gtest.h>

#include <thread>
#include <vector>
#include <string>

#include "../libjsapi.h"

rs::jsapi::Runtime rt_;
Expand All @@ -22,7 +18,7 @@ class SimpleDynamicObjectTests : public ::testing::Test {
TEST_F(SimpleDynamicObjectTests, test1) {
auto context = rt_.NewContext();

JS::RootedObject obj(*context);
rs::jsapi::Value obj(*context);
rs::jsapi::DynamicObject::Create(
*context,
[](const char* name, rs::jsapi::Value& value) {
Expand All @@ -32,7 +28,7 @@ TEST_F(SimpleDynamicObjectTests, test1) {
nullptr,
nullptr,
obj);
ASSERT_TRUE(obj);
ASSERT_TRUE(!!obj);

context->Evaluate("var myfunc=function(n){return n.hello;};");

Expand All @@ -49,7 +45,7 @@ TEST_F(SimpleDynamicObjectTests, test1) {
TEST_F(SimpleDynamicObjectTests, test2) {
auto context = rt_.NewContext();

JS::RootedObject obj(*context);
rs::jsapi::Value obj(*context);
rs::jsapi::DynamicObject::Create(
*context,
[](const char* name, rs::jsapi::Value& value) {
Expand All @@ -59,7 +55,7 @@ TEST_F(SimpleDynamicObjectTests, test2) {
nullptr,
nullptr,
obj);
ASSERT_TRUE(obj);
ASSERT_TRUE(!!obj);

context->Evaluate("var myfunc=function(n){return n.hello;};");

Expand All @@ -77,7 +73,7 @@ TEST_F(SimpleDynamicObjectTests, test3) {
std::string longFieldName(384, '1');
auto context = rt_.NewContext();

JS::RootedObject obj(*context);
rs::jsapi::Value obj(*context);
rs::jsapi::DynamicObject::Create(
*context,
[](const char* name, rs::jsapi::Value& value) {
Expand All @@ -87,7 +83,7 @@ TEST_F(SimpleDynamicObjectTests, test3) {
nullptr,
nullptr,
obj);
ASSERT_TRUE(obj);
ASSERT_TRUE(!!obj);

std::stringstream script;
script << "var myfunc=function(o){ return o['" << longFieldName << "'];};";
Expand All @@ -108,7 +104,7 @@ TEST_F(SimpleDynamicObjectTests, test4) {

auto context = rt_.NewContext();

JS::RootedObject obj(*context);
rs::jsapi::Value obj(*context);
rs::jsapi::DynamicObject::Create(
*context,
nullptr,
Expand All @@ -118,7 +114,7 @@ TEST_F(SimpleDynamicObjectTests, test4) {
},
nullptr,
obj);
ASSERT_TRUE(obj);
ASSERT_TRUE(!!obj);

rt_.Evaluate("var myfunc=function(o){ o.test = 'world';};");

Expand All @@ -137,7 +133,7 @@ TEST_F(SimpleDynamicObjectTests, test5) {

auto context = rt_.NewContext();

JS::RootedObject obj(*context);
rs::jsapi::Value obj(*context);
rs::jsapi::DynamicObject::Create(
*context,
nullptr,
Expand All @@ -147,7 +143,7 @@ TEST_F(SimpleDynamicObjectTests, test5) {
},
nullptr,
obj);
ASSERT_TRUE(obj);
ASSERT_TRUE(!!obj);

std::stringstream script;
script << "var myfunc=function(o){ o['" << longFieldName << "'] = 'world';};";
Expand All @@ -165,7 +161,7 @@ TEST_F(SimpleDynamicObjectTests, test5) {
TEST_F(SimpleDynamicObjectTests, test6) {
auto context = rt_.NewContext();

JS::RootedObject obj(*context);
rs::jsapi::Value obj(*context);
rs::jsapi::DynamicObject::Create(
*context,
nullptr,
Expand All @@ -177,7 +173,7 @@ TEST_F(SimpleDynamicObjectTests, test6) {
return true;
},
obj);
ASSERT_TRUE(obj);
ASSERT_TRUE(!!obj);

context->Evaluate("var myfunc=function(o){var fields = 0; for (var prop in o) { ++fields; } return fields;};");

Expand All @@ -194,7 +190,7 @@ TEST_F(SimpleDynamicObjectTests, test6) {
TEST_F(SimpleDynamicObjectTests, test7) {
auto context = rt_.NewContext();

JS::RootedObject obj(*context);
rs::jsapi::Value obj(*context);
rs::jsapi::DynamicObject::Create(
*context,
nullptr,
Expand All @@ -207,7 +203,7 @@ TEST_F(SimpleDynamicObjectTests, test7) {
return true;
},
obj);
ASSERT_TRUE(obj);
ASSERT_TRUE(!!obj);

context->Evaluate("var myfunc=function(o){var fields = 0; for (var prop in o) { ++fields; } return fields;};");

Expand All @@ -224,7 +220,7 @@ TEST_F(SimpleDynamicObjectTests, test7) {
TEST_F(SimpleDynamicObjectTests, test8) {
auto context = rt_.NewContext();

JS::RootedObject obj(*context);
rs::jsapi::Value obj(*context);
rs::jsapi::DynamicObject::Create(
*context,
nullptr,
Expand All @@ -237,7 +233,7 @@ TEST_F(SimpleDynamicObjectTests, test8) {
return true;
},
obj);
ASSERT_TRUE(obj);
ASSERT_TRUE(!!obj);

context->Evaluate("var myfunc=function(o){var fields = []; for (var prop in o) { fields.push(prop); } return fields.toString();};");

Expand Down

0 comments on commit a1ef9b0

Please sign in to comment.