Skip to content

Commit

Permalink
Make QuickJSBuiltinBinder less static
Browse files Browse the repository at this point in the history
  • Loading branch information
Geequlim committed Dec 31, 2019
1 parent 80d53f9 commit fbd59cb
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 30 deletions.
2 changes: 1 addition & 1 deletion quickjs/builtin_binding_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ def generate_constructor(cls):
static JSValue ${func}(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv) {
${class} *ptr = memnew(${class});
${initializer}
return QuickJSBuiltinBinder::bind_builtin_object(ctx, ${type}, ptr);
return QuickJSBuiltinBinder::bind_builtin_object_static(ctx, ${type}, ptr);
}
'''
TemplatePoolArrays = '''
Expand Down
7 changes: 3 additions & 4 deletions quickjs/quickjs_binder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -958,9 +958,8 @@ void QuickJSBinder::language_finalize() {
memdelete(ptr);
memdelete(data);
} else {
Variant value = data->get_value();
if (data->flags & ECMAScriptGCHandler::FLAG_BUILTIN_CLASS) {
QuickJSBuiltinBinder::builtin_finalizer(data);
builtin_binder.builtin_finalizer(data);
} else if (data->is_reference()) {
memdelete(data->godot_reference);
}
Expand Down Expand Up @@ -1174,7 +1173,7 @@ void QuickJSBinder::origin_finalizer(JSRuntime *rt, JSValue val) {
if (bind->type == Variant::OBJECT) {
object_finalizer(bind);
} else {
QuickJSBuiltinBinder::builtin_finalizer(bind);
binder->builtin_binder.builtin_finalizer(bind);
}
}
}
Expand Down Expand Up @@ -1730,7 +1729,7 @@ JSValue QuickJSBinder::worker_adopt_value(JSContext *ctx, JSValue this_val, int
memdelete(data);
} else {
if (data->flags & ECMAScriptGCHandler::FLAG_BUILTIN_CLASS) {
ret = QuickJSBuiltinBinder::bind_builtin_object(ctx, data->type, data->godot_builtin_object_ptr);
ret = QuickJSBuiltinBinder::bind_builtin_object_static(ctx, data->type, data->godot_builtin_object_ptr);
memdelete(data);
} else if (data->type == Variant::OBJECT) {
Variant value = data->get_value();
Expand Down
84 changes: 79 additions & 5 deletions quickjs/quickjs_builtin_binder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,8 @@ QuickJSBuiltinBinder::~QuickJSBuiltinBinder() {

#include <core/math/vector2.h>

JSValue QuickJSBuiltinBinder::bind_builtin_object(JSContext *ctx, Variant::Type p_type, void *p_object) {
JSValue QuickJSBuiltinBinder::bind_builtin_object(Variant::Type p_type, void *p_object) {

ERR_FAIL_NULL_V(ctx, JS_UNDEFINED);

QuickJSBinder *binder = QuickJSBinder::get_context_binder(ctx);
const QuickJSBuiltinBinder::BuiltinClass &cls = binder->builtin_binder.get_class(p_type);
JSValue obj = JS_NewObjectProtoClass(ctx, cls.class_prototype, binder->get_origin_class_id());

Expand Down Expand Up @@ -166,6 +163,10 @@ void QuickJSBuiltinBinder::uninitialize() {
JS_FreeAtom(ctx, js_key_to_string);
}

JSValue QuickJSBuiltinBinder::bind_builtin_object_static(JSContext *ctx, Variant::Type p_type, void *p_object) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(p_type, p_object);
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Variant &p_val) {
void *ptr = NULL;
switch (p_val.get_type()) {
Expand Down Expand Up @@ -246,7 +247,80 @@ JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Variant &p_v
ptr = v;
} break;
}
return bind_builtin_object(ctx, p_val.get_type(), ptr);

return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(p_val.get_type(), ptr);
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Vector2 &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::VECTOR2, memnew(Vector2(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Vector3 &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::VECTOR3, memnew(Vector3(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Rect2 &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::RECT2, memnew(Rect2(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Color &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::COLOR, memnew(Color(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Transform2D &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::TRANSFORM2D, memnew(Transform2D(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Transform &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::TRANSFORM, memnew(Transform(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Quat &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::QUAT, memnew(Quat(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Plane &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::PLANE, memnew(Plane(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const RID &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::_RID, memnew(RID(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const AABB &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::AABB, memnew(AABB(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const Basis &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::BASIS, memnew(Basis(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const PoolIntArray &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::POOL_INT_ARRAY, memnew(PoolIntArray(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const PoolByteArray &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::POOL_BYTE_ARRAY, memnew(PoolByteArray(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const PoolRealArray &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::POOL_REAL_ARRAY, memnew(PoolRealArray(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const PoolColorArray &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::POOL_COLOR_ARRAY, memnew(PoolColorArray(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const PoolStringArray &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::POOL_STRING_ARRAY, memnew(PoolStringArray(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const PoolVector2Array &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::POOL_VECTOR2_ARRAY, memnew(PoolVector2Array(p_val)));
}

JSValue QuickJSBuiltinBinder::new_object_from(JSContext *ctx, const PoolVector3Array &p_val) {
return QuickJSBinder::get_context_binder(ctx)->builtin_binder.bind_builtin_object(Variant::POOL_VECTOR3_ARRAY, memnew(PoolVector3Array(p_val)));
}

void QuickJSBuiltinBinder::bind_builtin_propties_manually() {
Expand Down
41 changes: 21 additions & 20 deletions quickjs/quickjs_builtin_binder.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ class QuickJSBuiltinBinder {
JSAtom js_key_to_string;

public:
static void builtin_finalizer(ECMAScriptGCHandler *p_bind);
static JSValue bind_builtin_object(JSContext *ctx, Variant::Type p_type, void *p_object);
void builtin_finalizer(ECMAScriptGCHandler *p_bind);
JSValue bind_builtin_object(Variant::Type p_type, void *p_object);

void register_builtin_class(Variant::Type p_type, const char *p_name, JSConstructorFunc p_constructor, int argc);
void register_property(Variant::Type p_type, const char *p_name, JSCFunctionMagic *p_getter, JSCFunctionMagic *p_setter, int magic);
Expand All @@ -49,25 +49,26 @@ class QuickJSBuiltinBinder {
_FORCE_INLINE_ JSClassID get_classid(Variant::Type p_type) { return builtin_class_map[p_type].id; }
_FORCE_INLINE_ BuiltinClass &get_class(Variant::Type p_type) { return *(builtin_class_map + p_type); }

static JSValue bind_builtin_object_static(JSContext *ctx, Variant::Type p_type, void *p_object);
static JSValue new_object_from(JSContext *ctx, const Variant &p_val);
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const Vector2 &p_val) { return bind_builtin_object(ctx, Variant::VECTOR2, memnew(Vector2(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const Vector3 &p_val) { return bind_builtin_object(ctx, Variant::VECTOR3, memnew(Vector3(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const Rect2 &p_val) { return bind_builtin_object(ctx, Variant::RECT2, memnew(Rect2(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const Color &p_val) { return bind_builtin_object(ctx, Variant::COLOR, memnew(Color(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const Transform2D &p_val) { return bind_builtin_object(ctx, Variant::TRANSFORM2D, memnew(Transform2D(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const Transform &p_val) { return bind_builtin_object(ctx, Variant::TRANSFORM, memnew(Transform(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const Quat &p_val) { return bind_builtin_object(ctx, Variant::QUAT, memnew(Quat(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const Plane &p_val) { return bind_builtin_object(ctx, Variant::PLANE, memnew(Plane(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const RID &p_val) { return bind_builtin_object(ctx, Variant::_RID, memnew(RID(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const AABB &p_val) { return bind_builtin_object(ctx, Variant::AABB, memnew(AABB(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const Basis &p_val) { return bind_builtin_object(ctx, Variant::BASIS, memnew(Basis(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const PoolIntArray &p_val) { return bind_builtin_object(ctx, Variant::POOL_INT_ARRAY, memnew(PoolIntArray(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const PoolByteArray &p_val) { return bind_builtin_object(ctx, Variant::POOL_BYTE_ARRAY, memnew(PoolByteArray(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const PoolRealArray &p_val) { return bind_builtin_object(ctx, Variant::POOL_REAL_ARRAY, memnew(PoolRealArray(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const PoolColorArray &p_val) { return bind_builtin_object(ctx, Variant::POOL_COLOR_ARRAY, memnew(PoolColorArray(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const PoolStringArray &p_val) { return bind_builtin_object(ctx, Variant::POOL_STRING_ARRAY, memnew(PoolStringArray(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const PoolVector2Array &p_val) { return bind_builtin_object(ctx, Variant::POOL_VECTOR2_ARRAY, memnew(PoolVector2Array(p_val))); }
_FORCE_INLINE_ static JSValue new_object_from(JSContext *ctx, const PoolVector3Array &p_val) { return bind_builtin_object(ctx, Variant::POOL_VECTOR3_ARRAY, memnew(PoolVector3Array(p_val))); }
static JSValue new_object_from(JSContext *ctx, const Vector2 &p_val);
static JSValue new_object_from(JSContext *ctx, const Vector3 &p_val);
static JSValue new_object_from(JSContext *ctx, const Rect2 &p_val);
static JSValue new_object_from(JSContext *ctx, const Color &p_val);
static JSValue new_object_from(JSContext *ctx, const Transform2D &p_val);
static JSValue new_object_from(JSContext *ctx, const Transform &p_val);
static JSValue new_object_from(JSContext *ctx, const Quat &p_val);
static JSValue new_object_from(JSContext *ctx, const Plane &p_val);
static JSValue new_object_from(JSContext *ctx, const RID &p_val);
static JSValue new_object_from(JSContext *ctx, const AABB &p_val);
static JSValue new_object_from(JSContext *ctx, const Basis &p_val);
static JSValue new_object_from(JSContext *ctx, const PoolIntArray &p_val);
static JSValue new_object_from(JSContext *ctx, const PoolByteArray &p_val);
static JSValue new_object_from(JSContext *ctx, const PoolRealArray &p_val);
static JSValue new_object_from(JSContext *ctx, const PoolColorArray &p_val);
static JSValue new_object_from(JSContext *ctx, const PoolStringArray &p_val);
static JSValue new_object_from(JSContext *ctx, const PoolVector2Array &p_val);
static JSValue new_object_from(JSContext *ctx, const PoolVector3Array &p_val);
};

#endif // QUICKJS_BUILTIN_BINDER_H

0 comments on commit fbd59cb

Please sign in to comment.