mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 15:25:52 +00:00
Bug 952777 - part 4 - move JSParallelNative into the union; r=efaust,bz
This commit is contained in:
parent
0ce6927f43
commit
ada036e541
@ -6371,8 +6371,7 @@ class CGMemberJITInfo(CGThing):
|
||||
" %s, /* isInSlot. Only relevant for getters. */\n"
|
||||
" %s, /* Reserved slot index, if we're stored in a slot, else 0. */\n"
|
||||
" JSJitInfo::%s, /* aliasSet. Not relevant for setters. */\n"
|
||||
" %s, /* argTypes. Only relevant for methods */\n"
|
||||
" nullptr /* parallelNative */\n"
|
||||
" %s /* argTypes. Only relevant for methods */\n"
|
||||
"};\n" % (argTypesDecl, infoName, opName, protoID, depth,
|
||||
opType, returnType, failstr, movablestr, slotStr,
|
||||
slotIndex, aliasSet, argTypes))
|
||||
|
@ -2539,9 +2539,7 @@ js::AttachHandle(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo js::AttachHandleJitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(
|
||||
JSParallelNativeThreadSafeWrapper<js::AttachHandle>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::AttachHandleJitInfo, AttachHandleJitInfo, js::AttachHandle);
|
||||
|
||||
bool
|
||||
js::ObjectIsTypeObject(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
@ -2553,9 +2551,7 @@ js::ObjectIsTypeObject(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo js::ObjectIsTypeObjectJitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(
|
||||
JSParallelNativeThreadSafeWrapper<js::ObjectIsTypeObject>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::ObjectIsTypeObjectJitInfo, ObjectIsTypeObjectJitInfo, js::ObjectIsTypeObject);
|
||||
|
||||
bool
|
||||
js::ObjectIsTypeRepresentation(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
@ -2567,9 +2563,7 @@ js::ObjectIsTypeRepresentation(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo js::ObjectIsTypeRepresentationJitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(
|
||||
JSParallelNativeThreadSafeWrapper<js::ObjectIsTypeRepresentation>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::ObjectIsTypeRepresentationJitInfo, ObjectIsTypeRepresentationJitInfo, js::ObjectIsTypeRepresentation);
|
||||
|
||||
bool
|
||||
js::ObjectIsTypedHandle(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
@ -2581,9 +2575,7 @@ js::ObjectIsTypedHandle(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo js::ObjectIsTypedHandleJitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(
|
||||
JSParallelNativeThreadSafeWrapper<js::ObjectIsTypedHandle>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::ObjectIsTypedHandleJitInfo, ObjectIsTypedHandleJitInfo, js::ObjectIsTypedHandle);
|
||||
|
||||
bool
|
||||
js::ObjectIsTypedObject(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
@ -2595,9 +2587,7 @@ js::ObjectIsTypedObject(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo js::ObjectIsTypedObjectJitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(
|
||||
JSParallelNativeThreadSafeWrapper<js::ObjectIsTypedObject>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::ObjectIsTypedObjectJitInfo, ObjectIsTypedObjectJitInfo, js::ObjectIsTypedObject);
|
||||
|
||||
bool
|
||||
js::IsAttached(ThreadSafeContext *cx, unsigned argc, Value *vp)
|
||||
@ -2608,9 +2598,7 @@ js::IsAttached(ThreadSafeContext *cx, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo js::IsAttachedJitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(
|
||||
JSParallelNativeThreadSafeWrapper<js::IsAttached>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::IsAttachedJitInfo, IsAttachedJitInfo, js::IsAttached);
|
||||
|
||||
bool
|
||||
js::ClampToUint8(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
@ -2622,9 +2610,7 @@ js::ClampToUint8(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo js::ClampToUint8JitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(
|
||||
JSParallelNativeThreadSafeWrapper<js::ClampToUint8>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::ClampToUint8JitInfo, ClampToUint8JitInfo, js::ClampToUint8);
|
||||
|
||||
bool
|
||||
js::Memcpy(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
@ -2645,9 +2631,7 @@ js::Memcpy(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo js::MemcpyJitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(
|
||||
JSParallelNativeThreadSafeWrapper<js::Memcpy>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::MemcpyJitInfo, MemcpyJitInfo, js::Memcpy);
|
||||
|
||||
bool
|
||||
js::GetTypedObjectModule(JSContext *cx, unsigned argc, Value *vp)
|
||||
@ -2701,10 +2685,7 @@ js::StoreScalar##T::Func(ThreadSafeContext *, unsigned argc, Value *vp) \
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
const JSJitInfo \
|
||||
js::StoreScalar##T::JitInfo = \
|
||||
JS_JITINFO_NATIVE_PARALLEL( \
|
||||
JSParallelNativeThreadSafeWrapper<Func>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::StoreScalar##T::JitInfo, StoreScalar##T, js::StoreScalar##T::Func);
|
||||
|
||||
#define JS_STORE_REFERENCE_CLASS_IMPL(_constant, T, _name) \
|
||||
bool \
|
||||
@ -2727,10 +2708,7 @@ js::StoreReference##T::Func(ThreadSafeContext *, unsigned argc, Value *vp)
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
const JSJitInfo \
|
||||
js::StoreReference##T::JitInfo = \
|
||||
JS_JITINFO_NATIVE_PARALLEL( \
|
||||
JSParallelNativeThreadSafeWrapper<Func>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::StoreReference##T::JitInfo, StoreReference##T, js::StoreReference##T::Func);
|
||||
|
||||
#define JS_LOAD_SCALAR_CLASS_IMPL(_constant, T, _name) \
|
||||
bool \
|
||||
@ -2751,10 +2729,7 @@ js::LoadScalar##T::Func(ThreadSafeContext *, unsigned argc, Value *vp) \
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
const JSJitInfo \
|
||||
js::LoadScalar##T::JitInfo = \
|
||||
JS_JITINFO_NATIVE_PARALLEL( \
|
||||
JSParallelNativeThreadSafeWrapper<Func>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::LoadScalar##T::JitInfo, LoadScalar##T, js::LoadScalar##T::Func);
|
||||
|
||||
#define JS_LOAD_REFERENCE_CLASS_IMPL(_constant, T, _name) \
|
||||
bool \
|
||||
@ -2776,10 +2751,7 @@ js::LoadReference##T::Func(ThreadSafeContext *, unsigned argc, Value *vp) \
|
||||
return true; \
|
||||
} \
|
||||
\
|
||||
const JSJitInfo \
|
||||
js::LoadReference##T::JitInfo = \
|
||||
JS_JITINFO_NATIVE_PARALLEL( \
|
||||
JSParallelNativeThreadSafeWrapper<Func>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(js::LoadReference##T::JitInfo, LoadReference##T, js::LoadReference##T::Func);
|
||||
|
||||
// Because the precise syntax for storing values/objects/strings
|
||||
// differs, we abstract it away using specialized variants of the
|
||||
|
@ -1452,7 +1452,7 @@ struct JSJitInfo {
|
||||
Getter,
|
||||
Setter,
|
||||
Method,
|
||||
OpType_None
|
||||
ParallelNative
|
||||
};
|
||||
|
||||
enum ArgType {
|
||||
@ -1494,20 +1494,27 @@ struct JSJitInfo {
|
||||
AliasEverything
|
||||
};
|
||||
|
||||
bool hasParallelNative() const
|
||||
{
|
||||
return type == ParallelNative;
|
||||
}
|
||||
|
||||
bool isDOMJitInfo() const
|
||||
{
|
||||
return type != OpType_None;
|
||||
return type != ParallelNative;
|
||||
}
|
||||
|
||||
union {
|
||||
JSJitGetterOp getter;
|
||||
JSJitSetterOp setter;
|
||||
JSJitMethodOp method;
|
||||
/* An alternative native that's safe to call in parallel mode. */
|
||||
JSParallelNative parallelNative;
|
||||
};
|
||||
|
||||
uint32_t protoID;
|
||||
uint32_t depth;
|
||||
// type not being OpType_None means this is a DOM method. If you
|
||||
// type not being ParallelNative means this is a DOM method. If you
|
||||
// change that, come up with a different way of implementing
|
||||
// isDOMJitInfo().
|
||||
OpType type;
|
||||
@ -1536,9 +1543,6 @@ struct JSJitInfo {
|
||||
if we have no type information for
|
||||
arguments. */
|
||||
|
||||
/* An alternative native that's safe to call in parallel mode. */
|
||||
JSParallelNative parallelNative;
|
||||
|
||||
private:
|
||||
static void staticAsserts()
|
||||
{
|
||||
@ -1551,8 +1555,27 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
#define JS_JITINFO_NATIVE_PARALLEL(op) \
|
||||
{{nullptr},0,0,JSJitInfo::OpType_None,JSVAL_TYPE_MISSING,false,false,false,0,JSJitInfo::AliasEverything,nullptr,op}
|
||||
/*
|
||||
* You may ask yourself: why do we define a wrapper around a wrapper here?
|
||||
* The answer is that some compilers don't understand initializing a union
|
||||
* as we do below with a construct like:
|
||||
*
|
||||
* reinterpret_cast<JSJitGetterOp>(JSParallelNativeThreadSafeWrapper<op>)
|
||||
*
|
||||
* (We need the reinterpret_cast because we must initialize the union with
|
||||
* a datum of the type of the union's first member.)
|
||||
*
|
||||
* Presumably this has something to do with template instantiation.
|
||||
* Initializing with a normal function pointer seems to work fine. Hence
|
||||
* the ugliness that you see before you.
|
||||
*/
|
||||
#define JS_JITINFO_NATIVE_PARALLEL(infoName, wrapperName, serialOp) \
|
||||
bool wrapperName##_ParallelNativeThreadSafeWrapper(js::ForkJoinSlice *slice, unsigned argc, JS::Value *vp) \
|
||||
{ \
|
||||
return JSParallelNativeThreadSafeWrapper<serialOp>(slice, argc, vp); \
|
||||
} \
|
||||
const JSJitInfo infoName = \
|
||||
{{reinterpret_cast<JSJitGetterOp>(wrapperName##_ParallelNativeThreadSafeWrapper)},0,0,JSJitInfo::ParallelNative,JSVAL_TYPE_MISSING,false,false,false,0,JSJitInfo::AliasEverything,nullptr}
|
||||
|
||||
static JS_ALWAYS_INLINE const JSJitInfo *
|
||||
FUNCTION_VALUE_TO_JITINFO(const JS::Value& v)
|
||||
|
@ -179,7 +179,7 @@ class JSFunction : public JSObject
|
||||
return isLambda() && displayAtom() && !hasGuessedAtom();
|
||||
}
|
||||
bool hasParallelNative() const {
|
||||
return isNative() && jitInfo() && !!jitInfo()->parallelNative;
|
||||
return isNative() && jitInfo() && jitInfo()->hasParallelNative();
|
||||
}
|
||||
|
||||
bool isBuiltinFunctionConstructor();
|
||||
|
@ -4840,8 +4840,7 @@ static const JSJitInfo dom_x_getterinfo = {
|
||||
false, /* isInSlot */
|
||||
0, /* slotIndex */
|
||||
JSJitInfo::AliasNone, /* aliasSet */
|
||||
nullptr, /* argTypes */
|
||||
nullptr /* parallelNative */
|
||||
nullptr /* argTypes */
|
||||
};
|
||||
|
||||
static const JSJitInfo dom_x_setterinfo = {
|
||||
@ -4855,8 +4854,7 @@ static const JSJitInfo dom_x_setterinfo = {
|
||||
false, /* isInSlot */
|
||||
0, /* slotIndex */
|
||||
JSJitInfo::AliasEverything, /* aliasSet */
|
||||
nullptr, /* argTypes */
|
||||
nullptr /* parallelNative */
|
||||
nullptr /* argTypes */
|
||||
};
|
||||
|
||||
static const JSJitInfo doFoo_methodinfo = {
|
||||
@ -4870,8 +4868,7 @@ static const JSJitInfo doFoo_methodinfo = {
|
||||
false, /* isInSlot */
|
||||
0, /* slotIndex */
|
||||
JSJitInfo::AliasEverything, /* aliasSet */
|
||||
nullptr, /* argTypes */
|
||||
nullptr /* parallelNative */
|
||||
nullptr /* argTypes */
|
||||
};
|
||||
|
||||
static const JSPropertySpec dom_props[] = {
|
||||
|
@ -266,8 +266,7 @@ intrinsic_Dump(ThreadSafeContext *cx, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo intrinsic_Dump_jitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(JSParallelNativeThreadSafeWrapper<intrinsic_Dump>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(intrinsic_Dump_jitInfo, intrinsic_Dump_jitInfo, intrinsic_Dump);
|
||||
|
||||
bool
|
||||
intrinsic_ParallelSpew(ThreadSafeContext *cx, unsigned argc, Value *vp)
|
||||
@ -287,8 +286,7 @@ intrinsic_ParallelSpew(ThreadSafeContext *cx, unsigned argc, Value *vp)
|
||||
return true;
|
||||
}
|
||||
|
||||
const JSJitInfo intrinsic_ParallelSpew_jitInfo =
|
||||
JS_JITINFO_NATIVE_PARALLEL(JSParallelNativeThreadSafeWrapper<intrinsic_ParallelSpew>);
|
||||
JS_JITINFO_NATIVE_PARALLEL(intrinsic_ParallelSpew_jitInfo, intrinsic_ParallelSpew_jitInfo, intrinsic_ParallelSpew);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user