зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1027131 - Add support for function cloning in StackScopedClone. r=gabor
This commit is contained in:
Родитель
5fe6fbfe2e
Коммит
4cea2d6728
|
@ -30,7 +30,8 @@ IsReflector(JSObject *obj)
|
|||
|
||||
enum StackScopedCloneTags {
|
||||
SCTAG_BASE = JS_SCTAG_USER_MIN,
|
||||
SCTAG_REFLECTOR
|
||||
SCTAG_REFLECTOR,
|
||||
SCTAG_FUNCTION
|
||||
};
|
||||
|
||||
class MOZ_STACK_CLASS StackScopedCloneData {
|
||||
|
@ -38,10 +39,12 @@ public:
|
|||
StackScopedCloneData(JSContext *aCx, StackScopedCloneOptions *aOptions)
|
||||
: mOptions(aOptions)
|
||||
, mReflectors(aCx)
|
||||
, mFunctions(aCx)
|
||||
{}
|
||||
|
||||
StackScopedCloneOptions *mOptions;
|
||||
AutoObjectVector mReflectors;
|
||||
AutoObjectVector mFunctions;
|
||||
};
|
||||
|
||||
static JSObject *
|
||||
|
@ -67,6 +70,21 @@ StackScopedCloneRead(JSContext *cx, JSStructuredCloneReader *reader, uint32_t ta
|
|||
return reflector;
|
||||
}
|
||||
|
||||
if (tag == SCTAG_FUNCTION) {
|
||||
MOZ_ASSERT(data < cloneData->mFunctions.length());
|
||||
|
||||
RootedValue functionValue(cx);
|
||||
RootedObject obj(cx, cloneData->mFunctions[data]);
|
||||
|
||||
if (!JS_WrapObject(cx, &obj))
|
||||
return nullptr;
|
||||
|
||||
if (!xpc::NewFunctionForwarder(cx, obj, true, &functionValue))
|
||||
return nullptr;
|
||||
|
||||
return &functionValue.toObject();
|
||||
}
|
||||
|
||||
MOZ_ASSERT_UNREACHABLE("Encountered garbage in the clone stream!");
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -121,6 +139,11 @@ StackScopedCloneWrite(JSContext *cx, JSStructuredCloneWriter *writer,
|
|||
return true;
|
||||
}
|
||||
|
||||
if (cloneData->mOptions->cloneFunctions && JS_ObjectIsCallable(cx, obj)) {
|
||||
cloneData->mFunctions.append(obj);
|
||||
return JS_WriteUint32Pair(writer, SCTAG_FUNCTION, cloneData->mFunctions.length() - 1);
|
||||
}
|
||||
|
||||
JS_ReportError(cx, "Encountered unsupported value type writing stack-scoped structured clone");
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -3421,11 +3421,16 @@ public:
|
|||
JSObject* options = nullptr)
|
||||
: OptionsBase(cx, options)
|
||||
, wrapReflectors(false)
|
||||
, cloneFunctions(false)
|
||||
{ }
|
||||
|
||||
virtual bool Parse() { return ParseBoolean("wrapReflectors", &wrapReflectors); };
|
||||
virtual bool Parse() {
|
||||
return ParseBoolean("wrapReflectors", &wrapReflectors) &&
|
||||
ParseBoolean("cloneFunctions", &cloneFunctions);
|
||||
};
|
||||
|
||||
bool wrapReflectors;
|
||||
bool cloneFunctions;
|
||||
};
|
||||
|
||||
JSObject *
|
||||
|
|
Загрузка…
Ссылка в новой задаче