v8 :: Script :: Compile(v8 :: String :: New(“。make.some.syntax.errors”),v8 :: String :: New(“main”)) - > Run()导致分段错误

时间:2013-10-27 15:05:46

标签: c++ v8 embedded-v8

假设我有这段代码:

Local<Script> script = Script::Compile(String::New("x1 = 1;"), String::New("main.js"));
printf("before run\n");
script->Run();
printf("after run\n");

创建并输入了上下文。
此代码的输出为:

before run
after run

这是预期的。但是如果将一些javascript代码放入包含语法错误的source(例如".x11 = 1"),那么输出为:

main.js:0: Uncaught SyntaxError: Unexpected token .
before execution.
Segmentation fault (core dumped)

如果编译有错误但是如何检查它,也许我不应该调用Run

另外:(代码来自Getting Starget - Chrome V8 +代码,语法错误=同样的事情)

#include <v8.h>

using namespace v8;

int main(int argc, char* argv[]) {  

// Get the default Isolate created at startup.  

Isolate* isolate = Isolate::GetCurrent();  

// Create a stack-allocated handle scope.

HandleScope handle_scope(isolate);  

// Create a new context.  

Handle<Context> context = Context::New(isolate);  

// Here's how you could create a Persistent handle to the context, if needed.  

Persistent<Context> persistent_context(isolate, context); 


// Enter the created context for compiling and  

// running the hello world script.   

Context::Scope context_scope(context);  

// Create a string containing the JavaScript source code.  

Handle<String> source = String::New(".>make.some.syntax.errors<");  

// Compile the source code.  

Handle<Script> script = Script::Compile(source);  

// Run the script to get the result.  

Handle<Value> result = script->Run(); 

// The persistent handle needs to be eventually disposed.  

persistent_context.Dispose();  

// Convert the result to an ASCII string and print it.  

String::AsciiValue ascii(result);  

printf("%s\n", *ascii);  

return 0;

}

2 个答案:

答案 0 :(得分:1)

经过一段时间的头痛后,我找到了解决办法。

当脚本编译失败时,它不会向v8::Handle返回任何内容。因此,在这种情况下,script.IsEmpty()返回true。

为了清楚说明,我在Google的Hello World代码中进行了一些修改:

#include <v8.h>

using namespace v8;

int main(int argc, char* argv[]) {  

// Get the default Isolate created at startup.  

Isolate* isolate = Isolate::GetCurrent();  

// Create a stack-allocated handle scope.

HandleScope handle_scope(isolate);  

// Create a new context.  

Handle<Context> context = Context::New(isolate);  

// Here's how you could create a Persistent handle to the context, if needed.  

Persistent<Context> persistent_context(isolate, context); 


// Enter the created context for compiling and  

// running the hello world script.   

Context::Scope context_scope(context);  

// Create a string containing the JavaScript source code.  

Handle<String> source = String::New(".>no.matter.what.code.is<");  

// Compile the source code.  

Handle<Script> script = Script::Compile(source);  
if(!script.IsEmpty()) // is script compiled ?
{
  // Run the script to get the result.  

  Handle<Value> result = script->Run(); 

  // Convert the result to an ASCII string and print it.  
  String::AsciiValue ascii(result);  

  printf("%s\n", *ascii);  
}

// The persistent handle needs to be eventually disposed.  

persistent_context.Dispose();      

return 0;

}

答案 1 :(得分:0)

基于sample / process.cc的v8源代码:

  // catch any exceptions the script might throw.
  TryCatch try_catch(GetIsolate());

  // Compile the script and check for errors.
  Local<Script> compiled_script;
  if (!Script::Compile(context, script).ToLocal(&compiled_script)) {
    String::Utf8Value error(GetIsolate(), try_catch.Exception());
    Log(*error);
    // The script failed to compile; bail out.
    return false;
  }

  // Run the script!
  Local<Value> result;
  if (!compiled_script->Run(context).ToLocal(&result)) {
    // The TryCatch above is still in effect and will have caught the error.
    String::Utf8Value error(GetIsolate(), try_catch.Exception());
    Log(*error);
    // Running the script failed; bail out.
    return false;
  }

我希望这会有所帮助。