mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-26 03:35:33 +00:00
Bug 1165053 - Part 0.3: Inline ArrayBufferByteLength self-hosting intrinsic. r=jwalden
This commit is contained in:
parent
863f2c7e9c
commit
cb9286f0aa
20
js/src/jit-test/tests/ion/testArrayBufferByteLength.js
Normal file
20
js/src/jit-test/tests/ion/testArrayBufferByteLength.js
Normal file
@ -0,0 +1,20 @@
|
||||
var ArrayBufferByteLength = getSelfHostedValue("ArrayBufferByteLength");
|
||||
|
||||
setJitCompilerOption("ion.warmup.trigger", 50);
|
||||
|
||||
function testBasic() {
|
||||
var arr = [1, 2, 3];
|
||||
var tarr = new Int32Array(arr);
|
||||
var abuf = tarr.buffer;
|
||||
|
||||
var arrLength = arr.length;
|
||||
var bytesPerElement = Int32Array.BYTES_PER_ELEMENT;
|
||||
|
||||
var f = function() {
|
||||
assertEq(ArrayBufferByteLength(abuf), arrLength * bytesPerElement);
|
||||
};
|
||||
do {
|
||||
f();
|
||||
} while (!inIon());
|
||||
}
|
||||
testBasic();
|
@ -111,6 +111,7 @@
|
||||
\
|
||||
_(IntrinsicGetNextMapEntryForIterator) \
|
||||
\
|
||||
_(IntrinsicArrayBufferByteLength) \
|
||||
_(IntrinsicPossiblyWrappedArrayBufferByteLength) \
|
||||
\
|
||||
_(IntrinsicIsTypedArray) \
|
||||
|
@ -847,6 +847,7 @@ class IonBuilder
|
||||
InliningStatus inlineGetNextMapEntryForIterator(CallInfo& callInfo);
|
||||
|
||||
// ArrayBuffer intrinsics.
|
||||
InliningStatus inlineArrayBufferByteLength(CallInfo& callInfo);
|
||||
InliningStatus inlinePossiblyWrappedArrayBufferByteLength(CallInfo& callInfo);
|
||||
|
||||
// TypedArray intrinsics.
|
||||
|
@ -265,6 +265,8 @@ IonBuilder::inlineNativeCall(CallInfo& callInfo, JSFunction* target)
|
||||
return inlineGetNextMapEntryForIterator(callInfo);
|
||||
|
||||
// ArrayBuffer intrinsics.
|
||||
case InlinableNative::IntrinsicArrayBufferByteLength:
|
||||
return inlineArrayBufferByteLength(callInfo);
|
||||
case InlinableNative::IntrinsicPossiblyWrappedArrayBufferByteLength:
|
||||
return inlinePossiblyWrappedArrayBufferByteLength(callInfo);
|
||||
|
||||
@ -2250,6 +2252,25 @@ IsArrayBufferObject(CompilerConstraintList* constraints, MDefinition* def)
|
||||
return types->getKnownClass(constraints) == &ArrayBufferObject::class_;
|
||||
}
|
||||
|
||||
IonBuilder::InliningStatus
|
||||
IonBuilder::inlineArrayBufferByteLength(CallInfo& callInfo)
|
||||
{
|
||||
MOZ_ASSERT(!callInfo.constructing());
|
||||
MOZ_ASSERT(callInfo.argc() == 1);
|
||||
|
||||
MDefinition* objArg = callInfo.getArg(0);
|
||||
if (objArg->type() != MIRType_Object)
|
||||
return InliningStatus_NotInlined;
|
||||
if (getInlineReturnType() != MIRType_Int32)
|
||||
return InliningStatus_NotInlined;
|
||||
|
||||
MInstruction* ins = addArrayBufferByteLength(objArg);
|
||||
current->push(ins);
|
||||
|
||||
callInfo.setImplicitlyUsedUnchecked();
|
||||
return InliningStatus_Inlined;
|
||||
}
|
||||
|
||||
IonBuilder::InliningStatus
|
||||
IonBuilder::inlinePossiblyWrappedArrayBufferByteLength(CallInfo& callInfo)
|
||||
{
|
||||
|
@ -2168,7 +2168,8 @@ static const JSFunctionSpec intrinsic_functions[] = {
|
||||
JS_FN("IsSharedArrayBuffer",
|
||||
intrinsic_IsInstanceOfBuiltin<SharedArrayBufferObject>, 1,0),
|
||||
|
||||
JS_FN("ArrayBufferByteLength", intrinsic_ArrayBufferByteLength, 1,0),
|
||||
JS_INLINABLE_FN("ArrayBufferByteLength", intrinsic_ArrayBufferByteLength, 1,0,
|
||||
IntrinsicArrayBufferByteLength),
|
||||
JS_INLINABLE_FN("PossiblyWrappedArrayBufferByteLength", intrinsic_PossiblyWrappedArrayBufferByteLength, 1,0,
|
||||
IntrinsicPossiblyWrappedArrayBufferByteLength),
|
||||
JS_FN("ArrayBufferCopyData", intrinsic_ArrayBufferCopyData, 4,0),
|
||||
|
Loading…
Reference in New Issue
Block a user