Fix #476 (Use JS_New for ScriptInterface::CallConstructor)
This was SVN commit r8638.
This commit is contained in:
parent
222095fa44
commit
f0476b61fb
@ -404,55 +404,13 @@ AutoGCRooter* ScriptInterface::ReplaceAutoGCRooter(AutoGCRooter* rooter)
|
|||||||
|
|
||||||
jsval ScriptInterface::CallConstructor(jsval ctor)
|
jsval ScriptInterface::CallConstructor(jsval ctor)
|
||||||
{
|
{
|
||||||
// Constructing JS objects similarly to "new Foo" is non-trivial.
|
if (!JSVAL_IS_OBJECT(ctor))
|
||||||
// https://developer.mozilla.org/En/SpiderMonkey/JSAPI_Phrasebook#Constructing_an_object_with_new
|
|
||||||
// suggests some ugly ways, so we'll use a different way that's less compatible but less ugly
|
|
||||||
|
|
||||||
if (!(JSVAL_IS_OBJECT(ctor) && JS_ObjectIsFunction(m->m_cx, JSVAL_TO_OBJECT(ctor))))
|
|
||||||
{
|
{
|
||||||
LOGERROR(L"CallConstructor: ctor is not a function object");
|
LOGERROR(L"CallConstructor: ctor is not an object");
|
||||||
return JSVAL_VOID;
|
return JSVAL_VOID;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the constructor's prototype
|
return OBJECT_TO_JSVAL(JS_New(m->m_cx, JSVAL_TO_OBJECT(ctor), 0, NULL));
|
||||||
// (Can't use JS_GetPrototype, since we want .prototype not .__proto__)
|
|
||||||
jsval protoVal;
|
|
||||||
if (!JS_GetProperty(m->m_cx, JSVAL_TO_OBJECT(ctor), "prototype", &protoVal))
|
|
||||||
{
|
|
||||||
LOGERROR(L"CallConstructor: can't get prototype");
|
|
||||||
return JSVAL_VOID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!JSVAL_IS_OBJECT(protoVal))
|
|
||||||
{
|
|
||||||
LOGERROR(L"CallConstructor: prototype is not an object");
|
|
||||||
return JSVAL_VOID;
|
|
||||||
}
|
|
||||||
|
|
||||||
JSObject* proto = JSVAL_TO_OBJECT(protoVal);
|
|
||||||
JSObject* parent = JS_GetParent(m->m_cx, JSVAL_TO_OBJECT(ctor));
|
|
||||||
// TODO: rooting?
|
|
||||||
if (!proto || !parent)
|
|
||||||
{
|
|
||||||
LOGERROR(L"CallConstructor: null proto/parent");
|
|
||||||
return JSVAL_VOID;
|
|
||||||
}
|
|
||||||
|
|
||||||
JSObject* obj = JS_NewObject(m->m_cx, NULL, proto, parent);
|
|
||||||
if (!obj)
|
|
||||||
{
|
|
||||||
LOGERROR(L"CallConstructor: object creation failed");
|
|
||||||
return JSVAL_VOID;
|
|
||||||
}
|
|
||||||
|
|
||||||
jsval rval;
|
|
||||||
if (!JS_CallFunctionValue(m->m_cx, obj, ctor, 0, NULL, &rval))
|
|
||||||
{
|
|
||||||
LOGERROR(L"CallConstructor: ctor failed");
|
|
||||||
return JSVAL_VOID;
|
|
||||||
}
|
|
||||||
|
|
||||||
return OBJECT_TO_JSVAL(obj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ScriptInterface::CallFunctionVoid(jsval val, const char* name)
|
bool ScriptInterface::CallFunctionVoid(jsval val, const char* name)
|
||||||
|
Loading…
Reference in New Issue
Block a user