/** * This source code is licensed under the terms found in the LICENSE file in * node-jsc's root directory. */ #include "config.h" #include "CallSite.h" #include "helpers.h" #include using namespace JSC; using namespace WebCore; namespace Zig { const JSC::ClassInfo CallSite::s_info = { "CallSite"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(CallSite) }; void CallSite::finishCreation(VM& vm, JSC::JSGlobalObject* globalObject, JSCStackFrame& stackFrame, bool encounteredStrictFrame) { Base::finishCreation(vm); /* From v8's "Stack Trace API" (https://github.com/v8/v8/wiki/Stack-Trace-API): * "To maintain restrictions imposed on strict mode functions, frames that have a * strict mode function and all frames below (its caller etc.) are not allow to access * their receiver and function objects. For those frames, getFunction() and getThis() * will return undefined.". * Thus, if we've already encountered a strict frame, we'll treat our frame as strict too. */ bool isStrictFrame = encounteredStrictFrame; if (!isStrictFrame) { JSC::CodeBlock* codeBlock = stackFrame.codeBlock(); if (codeBlock) { isStrictFrame = codeBlock->ownerExecutable()->isInStrictContext(); } } JSC::JSObject* calleeObject = JSC::jsCast(stackFrame.callee()); // Initialize "this" and "function" (and set the "IsStrict" flag if needed) JSC::CallFrame* callFrame = stackFrame.callFrame(); if (isStrictFrame) { m_thisValue.set(vm, this, JSC::jsUndefined()); m_function.set(vm, this, JSC::jsUndefined()); m_flags |= static_cast(Flags::IsStrict); } else { if (callFrame) { // We know that we're not in strict mode m_thisValue.set(vm, this, callFrame->thisValue().toThis(globalObject, JSC::ECMAMode::sloppy())); } else { m_thisValue.set(vm, this, JSC::jsUndefined()); } m_function.set(vm, this, stackFrame.callee()); } m_functionName.set(vm, this, stackFrame.functionName()); m_sourceURL.set(vm, this, stackFrame.sourceURL()); const auto* sourcePositions = stackFrame.getSourcePositions(); if (sourcePositions) { m_lineNumber = JSC::jsNumber(sourcePositions->line.oneBasedInt()); m_columnNumber = JSC::jsNumber(sourcePositions->startColumn.oneBasedInt()); } if (stackFrame.isEval()) { m_flags |= static_cast(Flags::IsEval); } if (stackFrame.isConstructor()) { m_flags |= static_cast(Flags::IsConstructor); } if (!stackFrame.codeBlock()) { m_flags |= static_cast(Flags::IsNative); } } template void CallSite::visitChildrenImpl(JSCell* cell, Visitor& visitor) { CallSite* thisCallSite = jsCast(cell); Base::visitChildren(thisCallSite, visitor); visitor.append(thisCallSite->m_thisValue); visitor.append(thisCallSite->m_function); visitor.append(thisCallSite->m_functionName); visitor.append(thisCallSite->m_sourceURL); } void CallSite::formatAsString(JSC::VM& vm, JSC::JSGlobalObject* globalObject, WTF::StringBuilder& sb) { JSString* myTypeName = jsTypeStringForValue(globalObject, thisValue()); JSString* myFunction = functionName().toString(globalObject); JSString* myFunctionName = functionName().toString(globalObject); JSString* mySourceURL = sourceURL().toString(globalObject); JSString* myColumnNumber = columnNumber().toInt32(globalObject) != -1 ? columnNumber().toString(globalObject) : jsEmptyString(vm); JSString* myLineNumber = lineNumber().toInt32(globalObject) != -1 ? lineNumber().toString(globalObject) : jsEmptyString(vm); bool myIsConstructor = isConstructor(); if (myFunctionName->length() > 0) { if (myIsConstructor) { sb.append("new "_s); } else { // TODO: print type or class name if available // sb.append(myTypeName->getString(globalObject)); // sb.append(" "_s); } sb.append(myFunctionName->getString(globalObject)); } else { sb.append(""_s); } sb.append(" ("_s); if (isNative()) { sb.append("native"_s); } else { sb.append(mySourceURL->getString(globalObject)); sb.append(":"_s); sb.append(myLineNumber->getString(globalObject)); sb.append(":"_s); sb.append(myColumnNumber->getString(globalObject)); } sb.append(")"_s); } DEFINE_VISIT_CHILDREN(CallSite); } ption value='dylan/resolve-rope-in-string'>dylan/resolve-rope-in-string Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2023-01-05Clean up some napi codeGravatar Jarred Sumner 2-70/+79
2023-01-05napi_boolean -> napi_numberGravatar Jarred Sumner 1-1/+1
2023-01-05Fixes #1733Gravatar Jarred Sumner 2-67/+79
2023-01-05[socket] fix double-free in `finalize()` (#1731)Gravatar Alex Lam S.L 3-53/+45
2023-01-05BumpGravatar Jarred Sumner 1-1/+1
2023-01-05fix `onConnectError()` error propagation (#1730)Gravatar Alex Lam S.L 1-2/+2
2023-01-05Update tcp-echo.bun.tsGravatar Jarred Sumner 1-13/+15
2023-01-05Really fix #1722Gravatar Jarred Sumner 2-3/+41
2023-01-05improve `.toThrow()` compatibility with Jest (#1728)Gravatar Alex Lam S.L 2-17/+33
2023-01-04Fix Bun.serve typings (#1714)Gravatar u9g 1-2/+2
2023-01-04implement `expect().toThrow()` (#1727)Gravatar Alex Lam S.L 5-130/+370
2023-01-04Add `SharedBuffer` from WebKit to make it easier to import more WebCore stuffGravatar Jarred Sumner 2-0/+1111
2023-01-04Fix default export for streamGravatar Jarred Sumner 1-11/+4
2023-01-04Fixes #1722Gravatar Jarred Sumner 1-1/+2
2023-01-04split server/client for tcp echo benchmark to better measure net.Socket perfGravatar Jarred Sumner 2-58/+60
2023-01-04buffer list clean-ups (#1721)Gravatar Alex Lam S.L 1-37/+68
2023-01-04Support non-classes in node:net (#1712)Gravatar Jarred Sumner 1-198/+216
2023-01-04Fixes #1716Gravatar Jarred Sumner 1-2/+2
2023-01-0410x faster `new Buffer` (#1717)Gravatar Jarred Sumner 19-520/+480
2023-01-03Update README.mdGravatar Jarred Sumner 1-2/+2
2023-01-03Add sqlite to vendorGravatar Jarred Sumner 1-4/+8
2023-01-03Fixes https://github.com/oven-sh/bun/issues/1695Gravatar Jarred Sumner 1-1/+1
2023-01-03Remove usages of std.xGravatar Jarred Sumner 7-98/+75
2023-01-03[streams] speed up `Readable` in some cases (#1708)Gravatar Alex Lam S.L 3-14/+140
2023-01-03Fix crash in BufferListGravatar Jarred Sumner 1-2/+2