2012-04-06 63 views
3

我想在全局函數中獲取腳本的原始文件名。如何在V8中獲取腳本的原始文件名

我試過下面的代碼,但filename.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(); 

有沒有正確的方法來訪問腳本的原始文件名?

+1

我解決了這個由自己,但現在我不能發佈,因爲口碑的答案。 我會稍後發帖。 – h2so5 2012-04-06 10:08:20

回答

3

由我自己解決:

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(); 
    }); 
相關問題