зеркало из https://github.com/mozilla/gecko-dev.git
Bug 917454 - Add objectType function r=till
This commit is contained in:
Родитель
22f3deb912
Коммит
1e13d8499d
|
@ -41,6 +41,11 @@ const Class js::TypedObjectClass = {
|
||||||
JS_ConvertStub
|
JS_ConvertStub
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const JSFunctionSpec TypedObjectMethods[] = {
|
||||||
|
JS_SELF_HOSTED_FN("objectType", "TypeOfTypedDatum", 1, 0),
|
||||||
|
JS_FS_END
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ReportCannotConvertTo(JSContext *cx, HandleValue fromValue, const char *toType)
|
ReportCannotConvertTo(JSContext *cx, HandleValue fromValue, const char *toType)
|
||||||
{
|
{
|
||||||
|
@ -1349,6 +1354,9 @@ js_InitTypedObjectClass(JSContext *cx, HandleObject obj)
|
||||||
if (!module)
|
if (!module)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
if (!JS_DefineFunctions(cx, module, TypedObjectMethods))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
// Define TypedObject global.
|
// Define TypedObject global.
|
||||||
|
|
||||||
RootedValue moduleValue(cx, ObjectValue(*module));
|
RootedValue moduleValue(cx, ObjectValue(*module));
|
||||||
|
@ -2518,6 +2526,15 @@ const JSJitInfo js::MemcpyJitInfo =
|
||||||
JS_JITINFO_NATIVE_PARALLEL(
|
JS_JITINFO_NATIVE_PARALLEL(
|
||||||
JSParallelNativeThreadSafeWrapper<js::Memcpy>);
|
JSParallelNativeThreadSafeWrapper<js::Memcpy>);
|
||||||
|
|
||||||
|
bool
|
||||||
|
js::StandardTypeObjectDescriptors(JSContext *cx, unsigned argc, Value *vp)
|
||||||
|
{
|
||||||
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
Rooted<GlobalObject*> global(cx, cx->global());
|
||||||
|
args.rval().setObject(global->getTypedObject());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#define JS_STORE_SCALAR_CLASS_IMPL(_constant, T, _name) \
|
#define JS_STORE_SCALAR_CLASS_IMPL(_constant, T, _name) \
|
||||||
bool \
|
bool \
|
||||||
js::StoreScalar##T::Func(ThreadSafeContext *, unsigned argc, Value *vp) \
|
js::StoreScalar##T::Func(ThreadSafeContext *, unsigned argc, Value *vp) \
|
||||||
|
|
|
@ -426,6 +426,17 @@ extern const JSJitInfo ClampToUint8JitInfo;
|
||||||
bool Memcpy(ThreadSafeContext *cx, unsigned argc, Value *vp);
|
bool Memcpy(ThreadSafeContext *cx, unsigned argc, Value *vp);
|
||||||
extern const JSJitInfo MemcpyJitInfo;
|
extern const JSJitInfo MemcpyJitInfo;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Usage: StandardTypeObjectDescriptors()
|
||||||
|
*
|
||||||
|
* Returns the global "typed object" object, which provides access
|
||||||
|
* to the various builtin type descriptors. These are currently
|
||||||
|
* exported as immutable properties so it is safe for self-hosted code
|
||||||
|
* to access them; eventually this should be linked into the module
|
||||||
|
* system.
|
||||||
|
*/
|
||||||
|
bool StandardTypeObjectDescriptors(JSContext *cx, unsigned argc, Value *vp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Usage: Store_int8(targetDatum, targetOffset, value)
|
* Usage: Store_int8(targetDatum, targetOffset, value)
|
||||||
* ...
|
* ...
|
||||||
|
|
|
@ -608,6 +608,31 @@ function HandleTest(obj) {
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// Miscellaneous
|
// Miscellaneous
|
||||||
|
|
||||||
|
// This is the `objectType()` function defined in the spec.
|
||||||
|
// It returns the type of its argument.
|
||||||
|
//
|
||||||
|
// Warning: user exposed!
|
||||||
|
function TypeOfTypedDatum(obj) {
|
||||||
|
if (IsObject(obj) && ObjectIsTypedDatum(obj))
|
||||||
|
return DATUM_TYPE_OBJ(obj);
|
||||||
|
|
||||||
|
// Note: Do not create bindings for `Any`, `String`, etc in
|
||||||
|
// Utilities.js, but rather access them through
|
||||||
|
// `StandardTypeObjectDescriptors()`. The reason is that bindings
|
||||||
|
// you create in Utilities.js are part of the self-hosted global,
|
||||||
|
// vs the user-accessible global, and hence should not escape to
|
||||||
|
// user script.
|
||||||
|
var T = StandardTypeObjectDescriptors();
|
||||||
|
switch (typeof obj) {
|
||||||
|
case "object": return T.Object;
|
||||||
|
case "function": return T.Object;
|
||||||
|
case "string": return T.String;
|
||||||
|
case "number": return T.float64;
|
||||||
|
case "undefined": return T.Any;
|
||||||
|
default: return T.Any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function ObjectIsTypedDatum(obj) {
|
function ObjectIsTypedDatum(obj) {
|
||||||
assert(IsObject(obj), "ObjectIsTypedDatum invoked with non-object")
|
assert(IsObject(obj), "ObjectIsTypedDatum invoked with non-object")
|
||||||
return ObjectIsTypedObject(obj) || ObjectIsTypedHandle(obj);
|
return ObjectIsTypedObject(obj) || ObjectIsTypedHandle(obj);
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
macro(DataView, 35, js_InitTypedArrayClasses) \
|
macro(DataView, 35, js_InitTypedArrayClasses) \
|
||||||
macro(ParallelArray, 36, js_InitParallelArrayClass) \
|
macro(ParallelArray, 36, js_InitParallelArrayClass) \
|
||||||
macro(Intl, 37, js_InitIntlClass) \
|
macro(Intl, 37, js_InitIntlClass) \
|
||||||
macro(TypedObject, 38, js_InitTypedObjectDummy) \
|
macro(TypedObject, 38, js_InitTypedObjectClass) \
|
||||||
macro(GeneratorFunction, 39, js_InitIteratorClasses) \
|
macro(GeneratorFunction, 39, js_InitIteratorClasses) \
|
||||||
|
|
||||||
#endif /* jsprototypes_h */
|
#endif /* jsprototypes_h */
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
// |reftest| skip-if(!this.hasOwnProperty("TypedObject"))
|
||||||
|
var BUGNUMBER = 917454;
|
||||||
|
var summary = 'objecttype';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/licenses/publicdomain/
|
||||||
|
*/
|
||||||
|
|
||||||
|
var T = TypedObject;
|
||||||
|
|
||||||
|
function runTests() {
|
||||||
|
var Point = new T.ArrayType(T.float32, 3);
|
||||||
|
var Line = new T.StructType({from: Point, to: Point});
|
||||||
|
var Lines = new T.ArrayType(Line, 3);
|
||||||
|
|
||||||
|
var lines = new Lines([
|
||||||
|
{from: [1, 2, 3], to: [4, 5, 6]},
|
||||||
|
{from: [7, 8, 9], to: [10, 11, 12]},
|
||||||
|
{from: [13, 14, 15], to: [16, 17, 18]}
|
||||||
|
]);
|
||||||
|
|
||||||
|
assertEq(T.objectType(lines), Lines);
|
||||||
|
assertEq(T.objectType(lines[0]), Line);
|
||||||
|
assertEq(T.objectType(lines[0].from[0]), T.float64);
|
||||||
|
assertEq(T.objectType(""), T.String);
|
||||||
|
assertEq(T.objectType({}), T.Object);
|
||||||
|
assertEq(T.objectType([]), T.Object);
|
||||||
|
assertEq(T.objectType(function() { }), T.Object);
|
||||||
|
assertEq(T.objectType(undefined), T.Any);
|
||||||
|
|
||||||
|
reportCompare(true, true);
|
||||||
|
print("Tests complete");
|
||||||
|
}
|
||||||
|
|
||||||
|
runTests();
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,11 @@ var summary = 'TypedObjects reference type trace';
|
||||||
var actual = '';
|
var actual = '';
|
||||||
var expect = '';
|
var expect = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/licenses/publicdomain/
|
||||||
|
*/
|
||||||
|
|
||||||
var ArrayType = TypedObject.ArrayType;
|
var ArrayType = TypedObject.ArrayType;
|
||||||
var StructType = TypedObject.StructType;
|
var StructType = TypedObject.StructType;
|
||||||
var Any = TypedObject.Any;
|
var Any = TypedObject.Any;
|
||||||
|
|
|
@ -418,6 +418,13 @@ class GlobalObject : public JSObject
|
||||||
return getOrCreateObject(cx, APPLICATION_SLOTS + JSProto_Intl, initIntlObject);
|
return getOrCreateObject(cx, APPLICATION_SLOTS + JSProto_Intl, initIntlObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JSObject &getTypedObject() {
|
||||||
|
Value v = getConstructor(JSProto_TypedObject);
|
||||||
|
// only gets called from contexts where TypedObject must be initialized
|
||||||
|
JS_ASSERT(v.isObject());
|
||||||
|
return v.toObject();
|
||||||
|
}
|
||||||
|
|
||||||
JSObject *getIteratorPrototype() {
|
JSObject *getIteratorPrototype() {
|
||||||
return &getPrototype(JSProto_Iterator).toObject();
|
return &getPrototype(JSProto_Iterator).toObject();
|
||||||
}
|
}
|
||||||
|
|
|
@ -658,6 +658,9 @@ static const JSFunctionSpec intrinsic_functions[] = {
|
||||||
JS_FNINFO("Memcpy",
|
JS_FNINFO("Memcpy",
|
||||||
JSNativeThreadSafeWrapper<js::Memcpy>,
|
JSNativeThreadSafeWrapper<js::Memcpy>,
|
||||||
&js::MemcpyJitInfo, 5, 0),
|
&js::MemcpyJitInfo, 5, 0),
|
||||||
|
JS_FN("StandardTypeObjectDescriptors",
|
||||||
|
js::StandardTypeObjectDescriptors,
|
||||||
|
0, 0),
|
||||||
|
|
||||||
#define LOAD_AND_STORE_SCALAR_FN_DECLS(_constant, _type, _name) \
|
#define LOAD_AND_STORE_SCALAR_FN_DECLS(_constant, _type, _name) \
|
||||||
JS_FNINFO("Store_" #_name, \
|
JS_FNINFO("Store_" #_name, \
|
||||||
|
|
Загрузка…
Ссылка в новой задаче