如何在 V8 中获取脚本的源文件名

How to get script's origin filename in V8

本文关键字:脚本 源文件 文件名 获取 V8      更新时间:2023-10-16

我想在全局函数中获取脚本的源文件名。

我尝试了以下代码,但文件名。IsEmpty() 返回 true。

using namespace v8;
HandleScope handle_scope;
// Define Global Function 'func'
Handle<ObjectTemplate> global = ObjectTemplate::New();
auto func_name = v8::String::New("func");
auto func = v8::FunctionTemplate::New(
        [](const v8::Arguments& args) -> v8::Handle<v8::Value>{
            // I want to get Filename here.
            auto filename = args.Callee()->GetScriptOrigin().ResourceName();
            std::cout << filename.IsEmpty() << std::endl;
            return v8::Undefined();
        });
global->Set(func_name, func);
auto context = Context::New(nullptr, global);
Context::Scope context_scope(context);
auto source = String::New("func()");
// Set Filename
auto filename = String::New("abc.js");
auto script = v8::Script::Compile(source, filename);
script->Run();
context.Dispose();

是否有正确的方法来访问脚本的源文件名?

我自己解决:

auto func = v8::FunctionTemplate::New(
    [](const v8::Arguments& args) -> v8::Handle<v8::Value>{
          // Get Filename
          auto filename = v8::StackTrace::CurrentStackTrace(1,v8::StackTrace::kScriptName)
                                ->GetFrame(0)->GetScriptName();
          std::cout << *v8::String::AsciiValue(filename) << std::endl;
        return v8::Undefined();
    });