2012-04-06 14 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

答えて

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(); 
    }); 
関連する問題