Bug 1027131 - Add support for function cloning in StackScopedClone. r=gabor

This commit is contained in:
Bobby Holley 2014-06-23 13:25:08 -07:00
Родитель 5fe6fbfe2e
Коммит 4cea2d6728
2 изменённых файлов: 30 добавлений и 2 удалений

Просмотреть файл

@ -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 *