special function in js binding

typedef struct Event Event;
struct Event {
    EventData* const data;
    int intValue;
    float floatValue;
    const char* stringValue;
};

typedef struct EventData EventData;
struct EventData {
    const char* const name;
    int intValue;
    float floatValue;
    const char* stringValue;
};

i want to bingding this special struct such as CCPoint.

in cocos2d-x CCPoint use this function manual binding

jsval ccpoint_to_jsval(JSContext* cx, CCPoint& v) {
    JSObject *tmp = JS_NewObject(cx, NULL, NULL, NULL);
    if (!tmp) return JSVAL_NULL;
    JSBool ok = JS_DefineProperty(cx, tmp, "x", DOUBLE_TO_JSVAL(v.x), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
                JS_DefineProperty(cx, tmp, "y", DOUBLE_TO_JSVAL(v.y), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT);
    if (ok) {
        return OBJECT_TO_JSVAL(tmp);
    }
    return JSVAL_NULL;
}

but in my special struct is nested another struct. how to binding this nested struct? anyone have a good idea? thx

jsval eventdata_to_jsval(JSContext* cx, EventData& v) {
JSObject tmp = JS_NewObject;
if return JSVAL_NULL;
JSBool ok = JS_DefineProperty, NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty, NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty, NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty, NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT);
if {
return OBJECT_TO_JSVAL;
}
return JSVAL_NULL;
}
jsval event_to_jsval {
JSObject
tmp = JS_NewObject(cx, NULL, NULL, NULL);
if (!tmp) return JSVAL_NULL;
JSBool ok = JS_DefineProperty(cx, tmp, “intValue”, INT_TO_JSVAL(v.intValue), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty(cx, tmp, “floatValue”, DOUBLE_TO_JSVAL(v.floatValue), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty(cx, tmp, “stringValue”, c_string_to_jsval(cx,v.stringValue), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty(cx, tmp, “data”, eventdata_to_jsval(cx,*v.data), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT);
if (ok) {
return OBJECT_TO_JSVAL(tmp);
}
return JSVAL_NULL;
}

thx, it work.

but i have another question about special class.

here is a test code:

class b 
{
public:
    void setB();
};

class a : public b
{
public:
    void setA();
};

when i binding class A, i can use setA in JS, but i can’t use setB, if we overload setB in class A, setB is work in JS, but overload setB in class A is the only way to solve this situition?

class a: public b
{
public:
    void setA();
    void setB() { b::setB(); }
};

has another way to solve this question?

WenHai Lin wrote:

jsval eventdata_to_jsval(JSContext* cx, EventData& v) {
JSObject tmp = JS_NewObject;
if return JSVAL_NULL;
JSBool ok = JS_DefineProperty, NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty, NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty, NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty, NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT);
if {
return OBJECT_TO_JSVAL;
}
return JSVAL_NULL;
}
jsval event_to_jsval {
JSObject
tmp = JS_NewObject(cx, NULL, NULL, NULL);
if (!tmp) return JSVAL_NULL;
JSBool ok = JS_DefineProperty(cx, tmp, “intValue”, INT_TO_JSVAL(v.intValue), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty(cx, tmp, “floatValue”, DOUBLE_TO_JSVAL(v.floatValue), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty(cx, tmp, “stringValue”, c_string_to_jsval(cx,v.stringValue), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT) &&
JS_DefineProperty(cx, tmp, “data”, eventdata_to_jsval(cx,*v.data), NULL, NULL, JSPROP_ENUMERATE | JSPROP_PERMANENT);
if (ok) {
return OBJECT_TO_JSVAL(tmp);
}
return JSVAL_NULL;
}

Hi,WenHai Lin,
How do you write JS BINDING code as above?