Bug 952777 - part 4 - move JSParallelNative into the union; r=efaust,bz

This commit is contained in:
Nathan Froyd 2014-01-07 14:54:07 -05:00
parent bd985bf529
commit e82ef26e7b
6 changed files with 50 additions and 61 deletions

View File

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

View File

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

View File

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

View File

@ -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();

View File

@ -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[] = {

View File

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