@@ -254,12 +254,53 @@ static void ParseEnv(const FunctionCallbackInfo<Value>& args) {
254254 args.GetReturnValue ().Set (dotenv.ToObject (env));
255255}
256256
257+ static void GetCallSite (const FunctionCallbackInfo<Value>& args) {
258+ Environment* env = Environment::GetCurrent (args);
259+ Isolate* isolate = env->isolate ();
260+
261+ Local<StackTrace> stack =
262+ StackTrace::CurrentStackTrace (isolate, env->stack_trace_limit ());
263+ Local<Array> callsites = Array::New (isolate);
264+
265+ // Frame 0 is node:util. It should be skipped.
266+ for (int i = 1 ; i < stack->GetFrameCount (); ++i) {
267+ Local<Object> obj = Object::New (isolate);
268+ Local<StackFrame> stack_frame = stack->GetFrame (isolate, i);
269+
270+ Utf8Value function_name (isolate, stack_frame->GetFunctionName ());
271+ Utf8Value script_name (isolate, stack_frame->GetScriptName ());
272+
273+ obj->Set (env->context (),
274+ env->function_name_string (),
275+ String::NewFromUtf8 (isolate, *function_name).ToLocalChecked ())
276+ .Check ();
277+ obj->Set (env->context (),
278+ env->script_name_string (),
279+ String::NewFromUtf8 (isolate, *script_name).ToLocalChecked ())
280+ .Check ();
281+ obj->Set (env->context (),
282+ env->line_number_string (),
283+ Integer::NewFromUnsigned (isolate, stack_frame->GetLineNumber ()))
284+ .Check ();
285+ obj->Set (env->context (),
286+ env->column_string (),
287+ Integer::NewFromUnsigned (isolate, stack_frame->GetColumn ()))
288+ .Check ();
289+ if (callsites->Set (env->context (), callsites->Length (), obj).IsNothing ()) {
290+ args.GetReturnValue ().Set (Array::New (isolate));
291+ return ;
292+ }
293+ }
294+ args.GetReturnValue ().Set (callsites);
295+ }
296+
257297void RegisterExternalReferences (ExternalReferenceRegistry* registry) {
258298 registry->Register (GetPromiseDetails);
259299 registry->Register (GetProxyDetails);
260300 registry->Register (GetCallerLocation);
261301 registry->Register (IsArrayBufferDetached);
262302 registry->Register (PreviewEntries);
303+ registry->Register (GetCallSite);
263304 registry->Register (GetOwnNonIndexProperties);
264305 registry->Register (GetConstructorName);
265306 registry->Register (GetExternalValue);
@@ -365,6 +406,7 @@ void Initialize(Local<Object> target,
365406 SetMethodNoSideEffect (
366407 context, target, " getConstructorName" , GetConstructorName);
367408 SetMethodNoSideEffect (context, target, " getExternalValue" , GetExternalValue);
409+ SetMethod (context, target, " getCallSite" , GetCallSite);
368410 SetMethod (context, target, " sleep" , Sleep);
369411 SetMethod (context, target, " parseEnv" , ParseEnv);
370412
0 commit comments