bool StoreUnboxedScalarPolicy::adjustValueInput(TempAllocator& alloc, MInstruction* ins, Scalar::Type writeType, MDefinition* value, int valueOperand) { // Storing a SIMD value requires a valueOperand that has already been // SimdUnboxed. See IonBuilder::inlineSimdStore(() if (Scalar::isSimdType(writeType)) { MOZ_ASSERT(IsSimdType(value->type())); return true; } MDefinition* curValue = value; // First, ensure the value is int32, boolean, double or Value. // The conversion is based on TypedArrayObjectTemplate::setElementTail. switch (value->type()) { case MIRType::Int32: case MIRType::Double: case MIRType::Float32: case MIRType::Boolean: case MIRType::Value: break; case MIRType::Null: value->setImplicitlyUsedUnchecked(); value = MConstant::New(alloc, Int32Value(0)); ins->block()->insertBefore(ins, value->toInstruction()); break; case MIRType::Undefined: value->setImplicitlyUsedUnchecked(); value = MConstant::New(alloc, DoubleNaNValue()); ins->block()->insertBefore(ins, value->toInstruction()); break; case MIRType::Object: case MIRType::String: case MIRType::Symbol: value = BoxAt(alloc, ins, value); break; default: MOZ_CRASH("Unexpected type"); } if (value != curValue) { ins->replaceOperand(valueOperand, value); curValue = value; } MOZ_ASSERT(value->type() == MIRType::Int32 || value->type() == MIRType::Boolean || value->type() == MIRType::Double || value->type() == MIRType::Float32 || value->type() == MIRType::Value); switch (writeType) { case Scalar::Int8: case Scalar::Uint8: case Scalar::Int16: case Scalar::Uint16: case Scalar::Int32: case Scalar::Uint32: if (value->type() != MIRType::Int32) { value = MTruncateToInt32::New(alloc, value); ins->block()->insertBefore(ins, value->toInstruction()); } break; case Scalar::Uint8Clamped: // IonBuilder should have inserted ClampToUint8. MOZ_ASSERT(value->type() == MIRType::Int32); break; case Scalar::Float32: if (value->type() != MIRType::Float32) { value = MToFloat32::New(alloc, value); ins->block()->insertBefore(ins, value->toInstruction()); } break; case Scalar::Float64: if (value->type() != MIRType::Double) { value = MToDouble::New(alloc, value); ins->block()->insertBefore(ins, value->toInstruction()); } break; default: MOZ_CRASH("Invalid array type"); } if (value != curValue) ins->replaceOperand(valueOperand, value); return true; }
JSRuntime::JSRuntime(JSUseHelperThreads useHelperThreads) : JS::shadow::Runtime( #ifdef JSGC_GENERATIONAL &gcStoreBuffer #endif ), mainThread(this), interrupt(0), handlingSignal(false), operationCallback(nullptr), #ifdef JS_THREADSAFE operationCallbackLock(nullptr), operationCallbackOwner(nullptr), workerThreadState(nullptr), exclusiveAccessLock(nullptr), exclusiveAccessOwner(nullptr), mainThreadHasExclusiveAccess(false), numExclusiveThreads(0), #endif systemZone(nullptr), numCompartments(0), localeCallbacks(nullptr), defaultLocale(nullptr), defaultVersion_(JSVERSION_DEFAULT), #ifdef JS_THREADSAFE ownerThread_(nullptr), #endif tempLifoAlloc(TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE), freeLifoAlloc(TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE), execAlloc_(nullptr), bumpAlloc_(nullptr), jitRuntime_(nullptr), selfHostingGlobal_(nullptr), nativeStackBase(0), cxCallback(nullptr), destroyCompartmentCallback(nullptr), destroyZoneCallback(nullptr), sweepZoneCallback(nullptr), compartmentNameCallback(nullptr), activityCallback(nullptr), activityCallbackArg(nullptr), #ifdef JS_THREADSAFE requestDepth(0), # ifdef DEBUG checkRequestDepth(0), # endif #endif gcSystemAvailableChunkListHead(nullptr), gcUserAvailableChunkListHead(nullptr), gcBytes(0), gcMaxBytes(0), gcMaxMallocBytes(0), gcNumArenasFreeCommitted(0), gcMarker(this), gcVerifyPreData(nullptr), gcVerifyPostData(nullptr), gcChunkAllocationSinceLastGC(false), gcNextFullGCTime(0), gcLastGCTime(0), gcJitReleaseTime(0), gcAllocationThreshold(30 * 1024 * 1024), gcHighFrequencyGC(false), gcHighFrequencyTimeThreshold(1000), gcHighFrequencyLowLimitBytes(100 * 1024 * 1024), gcHighFrequencyHighLimitBytes(500 * 1024 * 1024), gcHighFrequencyHeapGrowthMax(3.0), gcHighFrequencyHeapGrowthMin(1.5), gcLowFrequencyHeapGrowth(1.5), gcDynamicHeapGrowth(false), gcDynamicMarkSlice(false), gcDecommitThreshold(32 * 1024 * 1024), gcShouldCleanUpEverything(false), gcGrayBitsValid(false), gcIsNeeded(0), gcStats(thisFromCtor()), gcNumber(0), gcStartNumber(0), gcIsFull(false), gcTriggerReason(JS::gcreason::NO_REASON), gcStrictCompartmentChecking(false), #ifdef DEBUG gcDisableStrictProxyCheckingCount(0), #endif gcIncrementalState(gc::NO_INCREMENTAL), gcLastMarkSlice(false), gcSweepOnBackgroundThread(false), gcFoundBlackGrayEdges(false), gcSweepingZones(nullptr), gcZoneGroupIndex(0), gcZoneGroups(nullptr), gcCurrentZoneGroup(nullptr), gcSweepPhase(0), gcSweepZone(nullptr), gcSweepKindIndex(0), gcAbortSweepAfterCurrentGroup(false), gcArenasAllocatedDuringSweep(nullptr), #ifdef DEBUG gcMarkingValidator(nullptr), #endif gcInterFrameGC(0), gcSliceBudget(SliceBudget::Unlimited), gcIncrementalEnabled(true), gcGenerationalEnabled(true), gcManipulatingDeadZones(false), gcObjectsMarkedInDeadZones(0), gcPoke(false), heapState(Idle), #ifdef JSGC_GENERATIONAL gcNursery(thisFromCtor()), gcStoreBuffer(thisFromCtor(), gcNursery), #endif #ifdef JS_GC_ZEAL gcZeal_(0), gcZealFrequency(0), gcNextScheduled(0), gcDeterministicOnly(false), gcIncrementalLimit(0), #endif gcValidate(true), gcFullCompartmentChecks(false), gcCallback(nullptr), gcSliceCallback(nullptr), gcFinalizeCallback(nullptr), gcMallocBytes(0), gcMallocGCTriggered(false), scriptAndCountsVector(nullptr), NaNValue(DoubleNaNValue()), negativeInfinityValue(DoubleValue(NegativeInfinity())), positiveInfinityValue(DoubleValue(PositiveInfinity())), emptyString(nullptr), debugMode(false), spsProfiler(thisFromCtor()), profilingScripts(false), alwaysPreserveCode(false), hadOutOfMemory(false), haveCreatedContext(false), data(nullptr), gcLock(nullptr), gcLockOwner(nullptr), gcHelperThread(thisFromCtor()), signalHandlersInstalled_(false), defaultFreeOp_(thisFromCtor(), false), debuggerMutations(0), securityCallbacks(const_cast<JSSecurityCallbacks *>(&NullSecurityCallbacks)), DOMcallbacks(nullptr), destroyPrincipals(nullptr), structuredCloneCallbacks(nullptr), telemetryCallback(nullptr), propertyRemovals(0), #if !EXPOSE_INTL_API thousandsSeparator(0), decimalSeparator(0), numGrouping(0), #endif heapProtected_(false), mathCache_(nullptr), activeCompilations_(0), keepAtoms_(0), trustedPrincipals_(nullptr), atomsCompartment_(nullptr), beingDestroyed_(false), wrapObjectCallbacks(&DefaultWrapObjectCallbacks), preserveWrapperCallback(nullptr), #ifdef DEBUG noGCOrAllocationCheck(0), #endif jitHardening(false), jitSupportsFloatingPoint(false), ionPcScriptCache(nullptr), threadPool(this), defaultJSContextCallback(nullptr), ctypesActivityCallback(nullptr), parallelWarmup(0), ionReturnOverride_(MagicValue(JS_ARG_POISON)), useHelperThreads_(useHelperThreads), #ifdef JS_THREADSAFE cpuCount_(GetCPUCount()), #else cpuCount_(1), #endif parallelIonCompilationEnabled_(true), parallelParsingEnabled_(true), isWorkerRuntime_(false) #ifdef DEBUG , enteredPolicy(nullptr) #endif { MOZ_ASSERT(cpuCount_ > 0, "GetCPUCount() seems broken"); liveRuntimesCount++; setGCMode(JSGC_MODE_GLOBAL); /* Initialize infallibly first, so we can goto bad and JS_DestroyRuntime. */ JS_INIT_CLIST(&onNewGlobalObjectWatchers); PodZero(&debugHooks); PodZero(&atomState); PodArrayZero(nativeStackQuota); PodZero(&asmJSCacheOps); #if JS_STACK_GROWTH_DIRECTION > 0 nativeStackLimit = UINTPTR_MAX; #endif }
JSRuntime::JSRuntime(JSRuntime* parentRuntime) : mainThread(this), jitTop(nullptr), jitJSContext(nullptr), jitActivation(nullptr), jitStackLimit_(0xbad), activation_(nullptr), profilingActivation_(nullptr), profilerSampleBufferGen_(0), profilerSampleBufferLapCount_(1), asmJSActivationStack_(nullptr), asyncStackForNewActivations(this), asyncCauseForNewActivations(this), asyncCallIsExplicit(false), entryMonitor(nullptr), parentRuntime(parentRuntime), interrupt_(false), telemetryCallback(nullptr), handlingSignal(false), interruptCallback(nullptr), exclusiveAccessLock(nullptr), exclusiveAccessOwner(nullptr), mainThreadHasExclusiveAccess(false), numExclusiveThreads(0), numCompartments(0), localeCallbacks(nullptr), defaultLocale(nullptr), defaultVersion_(JSVERSION_DEFAULT), ownerThread_(nullptr), ownerThreadNative_(0), tempLifoAlloc(TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE), jitRuntime_(nullptr), selfHostingGlobal_(nullptr), nativeStackBase(GetNativeStackBase()), cxCallback(nullptr), destroyCompartmentCallback(nullptr), destroyZoneCallback(nullptr), sweepZoneCallback(nullptr), compartmentNameCallback(nullptr), activityCallback(nullptr), activityCallbackArg(nullptr), requestDepth(0), #ifdef DEBUG checkRequestDepth(0), activeContext(nullptr), #endif gc(thisFromCtor()), gcInitialized(false), #ifdef JS_SIMULATOR simulator_(nullptr), #endif scriptAndCountsVector(nullptr), NaNValue(DoubleNaNValue()), negativeInfinityValue(DoubleValue(NegativeInfinity<double>())), positiveInfinityValue(DoubleValue(PositiveInfinity<double>())), emptyString(nullptr), spsProfiler(thisFromCtor()), profilingScripts(false), suppressProfilerSampling(false), hadOutOfMemory(false), handlingInitFailure(false), haveCreatedContext(false), allowRelazificationForTesting(false), data(nullptr), signalHandlersInstalled_(false), canUseSignalHandlers_(false), defaultFreeOp_(thisFromCtor()), debuggerMutations(0), securityCallbacks(const_cast<JSSecurityCallbacks*>(&NullSecurityCallbacks)), DOMcallbacks(nullptr), destroyPrincipals(nullptr), structuredCloneCallbacks(nullptr), errorReporter(nullptr), linkedAsmJSModules(nullptr), propertyRemovals(0), #if !EXPOSE_INTL_API thousandsSeparator(0), decimalSeparator(0), numGrouping(0), #endif mathCache_(nullptr), activeCompilations_(0), keepAtoms_(0), trustedPrincipals_(nullptr), beingDestroyed_(false), atoms_(nullptr), atomsCompartment_(nullptr), staticStrings(nullptr), commonNames(nullptr), permanentAtoms(nullptr), wellKnownSymbols(nullptr), wrapObjectCallbacks(&DefaultWrapObjectCallbacks), preserveWrapperCallback(nullptr), jitSupportsFloatingPoint(false), jitSupportsSimd(false), ionPcScriptCache(nullptr), scriptEnvironmentPreparer(nullptr), ctypesActivityCallback(nullptr), offthreadIonCompilationEnabled_(true), parallelParsingEnabled_(true), autoWritableJitCodeActive_(false), #ifdef DEBUG enteredPolicy(nullptr), #endif largeAllocationFailureCallback(nullptr), oomCallback(nullptr), debuggerMallocSizeOf(ReturnZeroSize), lastAnimationTime(0), stopwatch(thisFromCtor()) { setGCStoreBufferPtr(&gc.storeBuffer); liveRuntimesCount++; /* Initialize infallibly first, so we can goto bad and JS_DestroyRuntime. */ JS_INIT_CLIST(&onNewGlobalObjectWatchers); PodArrayZero(nativeStackQuota); PodZero(&asmJSCacheOps); }