X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/2d39b0e377c0896910ee49ae70082ba665faf986..refs/heads/master:/ftl/FTLExitValue.cpp diff --git a/ftl/FTLExitValue.cpp b/ftl/FTLExitValue.cpp index 81df770..24a0f3c 100644 --- a/ftl/FTLExitValue.cpp +++ b/ftl/FTLExitValue.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013, 2014 Apple Inc. All rights reserved. + * Copyright (C) 2013-2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -28,10 +28,62 @@ #if ENABLE(FTL_JIT) +#include "FTLExitTimeObjectMaterialization.h" #include "JSCInlines.h" +#include "TrackedReferences.h" namespace JSC { namespace FTL { +ExitValue ExitValue::materializeNewObject(ExitTimeObjectMaterialization* data) +{ + ExitValue result; + result.m_kind = ExitValueMaterializeNewObject; + result.u.newObjectMaterializationData = data; + return result; +} + +ExitValue ExitValue::withLocalsOffset(int offset) const +{ + if (!isInJSStackSomehow()) + return *this; + if (!virtualRegister().isLocal()) + return *this; + return withVirtualRegister(virtualRegister() + offset); +} + +ValueFormat ExitValue::valueFormat() const +{ + switch (kind()) { + case InvalidExitValue: + RELEASE_ASSERT_NOT_REACHED(); + return InvalidValueFormat; + + case ExitValueDead: + case ExitValueConstant: + case ExitValueInJSStack: + case ExitValueMaterializeNewObject: + return ValueFormatJSValue; + + case ExitValueArgument: + return exitArgument().format(); + + case ExitValueInJSStackAsInt32: + return ValueFormatInt32; + + case ExitValueInJSStackAsInt52: + return ValueFormatInt52; + + case ExitValueInJSStackAsDouble: + return ValueFormatDouble; + + case ExitValueRecovery: + return recoveryFormat(); + } + + RELEASE_ASSERT_NOT_REACHED(); + return InvalidValueFormat; +} + void ExitValue::dumpInContext(PrintStream& out, DumpContext* context) const { switch (kind()) { @@ -48,23 +100,23 @@ void ExitValue::dumpInContext(PrintStream& out, DumpContext* context) const out.print("Constant(", inContext(constant(), context), ")"); return; case ExitValueInJSStack: - out.print("InJSStack:r", virtualRegister()); + out.print("InJSStack:", virtualRegister()); return; case ExitValueInJSStackAsInt32: - out.print("InJSStackAsInt32:r", virtualRegister()); + out.print("InJSStackAsInt32:", virtualRegister()); return; case ExitValueInJSStackAsInt52: - out.print("InJSStackAsInt52:r", virtualRegister()); + out.print("InJSStackAsInt52:", virtualRegister()); return; case ExitValueInJSStackAsDouble: - out.print("InJSStackAsDouble:r", virtualRegister()); - return; - case ExitValueArgumentsObjectThatWasNotCreated: - out.print("ArgumentsObjectThatWasNotCreated"); + out.print("InJSStackAsDouble:", virtualRegister()); return; case ExitValueRecovery: out.print("Recovery(", recoveryOpcode(), ", arg", leftRecoveryArgument(), ", arg", rightRecoveryArgument(), ", ", recoveryFormat(), ")"); return; + case ExitValueMaterializeNewObject: + out.print("Materialize(", WTF::RawPointer(objectMaterialization()), ")"); + return; } RELEASE_ASSERT_NOT_REACHED(); @@ -75,6 +127,12 @@ void ExitValue::dump(PrintStream& out) const dumpInContext(out, 0); } +void ExitValue::validateReferences(const TrackedReferences& trackedReferences) const +{ + if (isConstant()) + trackedReferences.check(constant()); +} + } } // namespace JSC::FTL #endif // ENABLE(FTL_JIT)