2015-06-12 6 views
0

Моя нативная функция должна возвращать объект, но возвращает вызываемый объект функции. Я использую spidermonkey jsapi для расширения моего приложения. Я определяю несколько классов, которые являются прокси-серверами своих C++-аналогов. Использование похоже на основной объект, называемый «mx», используемый для создания объектов типа «виджет» с использованием функции с именем «widget».Spidermonkey api: функция объекта, возвращающая объект

Каждый объект приложения имеет идентификатор какого-либо типа, который может быть передан конструктору объекта js как Аргумент. В SpiderMonkey 1.8.5 я мог бы создать объект JS виджет с помощью метода тх WIDGET

function on_trigger(triggervalue) 
{ 
w = mx.widget("somename"); 
print_console("mx is " + mx); 
print_console("w is " + w); 
} 

Но mx.widget («SomeName») не возвращает объект типа виджета, он возвращает объект функции:

mx is [object mx] 
w is function widget() { 
    [native code] 
} 

Это, как классы и функции JSAPI реализованы:

JSBool mx_wrapper_getwidget(JSContext* cx, unsigned argc, jsval* argv) 
{ 
    JSObject *global = JS_GetGlobalForScopeChain(cx); 

    jsval v; 
    JS_GetProperty(cx, global, widget_wrapper_class.name, &v); 

    JS::CallArgs args = JS::CallArgsFromVp(argc, argv); 
    JSObject *w = JS_New(cx, JSVAL_TO_OBJECT(v), argc, args.array()); 
    args.rval().setObject(*w); 

    return JS_TRUE; 
} 

static JSFunctionSpec mx_wrapper_methods[] = 
{ 
    JS_FS("widget", mx_wrapper_getwidget, 1, 0), 
    JS_FS_END 
}; 

JS_InitClass(cx, global, NULL, &mx_wrapper_class, mx_wrapper_cons, 0, mx_wrapper_properties, mx_wrapper_methods, NULL, NULL) 
JS_DefineObject(cx, global, "mx", &mx_wrapper_class, mx_wrapper_proto, 0); 

Почему JSBool mx_wrapper_getwidget() возвращения функции объекта, а не только что созданный объект?

Все лучшее Хайнер

ответ

0

ответив себе: среди различных других второстепенных вопросов, я не определил мой класс правильно

неправильно (widget_wrapper_finalize, JSCLASS_NO_OPTIONAL_MEMBERS недостающую):

static JSClass widget_wrapper_class = 
{ 
    MX_JS_WIDGET_CLASSNAME, JSCLASS_HAS_PRIVATE, 
    JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub, 
    JS_EnumerateStub, JS_ResolveStub, NULL 
}; 

право :

static JSClass widget_wrapper_class = 
{ 
    MX_JS_WIDGET_CLASSNAME, JSCLASS_HAS_PRIVATE, 
    JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub, 
    JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, widget_wrapper_finalize, JSCLASS_NO_OPTIONAL_MEMBERS 
};