+
+JSLexicalEnvironment* CallFrame::lexicalEnvironmentOrNullptr() const
+{
+ CodeBlock* codeBlock = this->codeBlock();
+ return codeBlock->needsActivation() ? lexicalEnvironment() : nullptr;
+}
+
+void CallFrame::setActivation(JSLexicalEnvironment* lexicalEnvironment)
+{
+ CodeBlock* codeBlock = this->codeBlock();
+ RELEASE_ASSERT(codeBlock->needsActivation());
+ VirtualRegister activationRegister = codeBlock->activationRegister();
+ registers()[activationRegister.offset()] = lexicalEnvironment;
+}
+
+void CallFrame::dump(PrintStream& out)
+{
+ if (CodeBlock* codeBlock = this->codeBlock()) {
+ out.print(codeBlock->inferredName(), "#", codeBlock->hashAsStringIfPossible(), " [", codeBlock->jitType(), "]");
+
+ out.print("(");
+ thisValue().dumpForBacktrace(out);
+
+ for (size_t i = 0; i < argumentCount(); ++i) {
+ out.print(", ");
+ JSValue value = argument(i);
+ value.dumpForBacktrace(out);
+ }
+
+ out.print(")");
+
+ return;
+ }
+
+ out.print(returnPC());
+}
+
+const char* CallFrame::describeFrame()
+{
+ const size_t bufferSize = 200;
+ static char buffer[bufferSize + 1];
+
+ WTF::StringPrintStream stringStream;
+
+ dump(stringStream);
+
+ strncpy(buffer, stringStream.toCString().data(), bufferSize);
+ buffer[bufferSize] = '\0';
+
+ return buffer;
+}
+
+} // namespace JSC