/** * 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); } ue='examples/starlog'>examples/starlog Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2021-11-19Fix blog example (#1910)Gravatar Matthew Phillips 1-1/+1
2021-11-19Version Packages (next) (#1907)astro@0.21.0-next.10Gravatar github-actions[bot] 23-21/+28
2021-11-19Remove further dependence on vite package (#1906)Gravatar Matthew Phillips 3-5/+9
2021-11-19Version Packages (next) (#1904)astro@0.21.0-next.9Gravatar github-actions[bot] 23-21/+30
2021-11-19Remove OSX \x00 workaround (#1901)Gravatar Matthew Phillips 2-5/+5
2021-11-19Resolve vite client modules to vendored vite (#1903)Gravatar Matthew Phillips 2-2/+7
2021-11-19[ci] yarn formatGravatar matthewp 1-3/+3
2021-11-19Add Debug tests (#1882)Gravatar Matthew Phillips 4-0/+62
2021-11-19[ci] collect statsGravatar FredKSchott 1-0/+1
2021-11-19Version Packages (next) (#1881)astro@0.21.0-next.8@astrojs/renderer-vue@0.2.0-next.2Gravatar github-actions[bot] 25-23/+42
2021-11-18Improve HMR (#1896)Gravatar Drew Powers 2-10/+18
2021-11-18update depsGravatar Fred K. Schott 5-352/+65
2021-11-18fix #1778Gravatar Fred K. Schott 2-1/+8
2021-11-18Update compiler (#1869)Gravatar Nate Moore 3-11/+6
2021-11-18remove unused remark dependency (#1894)Gravatar Fred K. Schott 2-245/+13
2021-11-18Improve error messages (#1875)Gravatar Drew Powers 39-61/+448
2021-11-18pin astro compiler to older versionGravatar Fred K. Schott 2-5/+5
2021-11-18Update yarn.lock to reflect the state of the package.json files (#1892)Gravatar Jonathan Neal 5-1300/+1000
2021-11-19[ci] yarn formatGravatar FredKSchott 1-5/+3