First steps towards integrating libv8
This commit is contained in:
parent
1fdfac4aaf
commit
4c58674393
@ -31,6 +31,8 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#include <stxxl.h>
|
#include <stxxl.h>
|
||||||
#include "ExtractorStructs.h"
|
#include "ExtractorStructs.h"
|
||||||
|
|
||||||
|
#include "V8Helper.h"
|
||||||
|
|
||||||
typedef stxxl::vector<NodeID> STXXLNodeIDVector;
|
typedef stxxl::vector<NodeID> STXXLNodeIDVector;
|
||||||
typedef stxxl::vector<_Node> STXXLNodeVector;
|
typedef stxxl::vector<_Node> STXXLNodeVector;
|
||||||
typedef stxxl::vector<_Edge> STXXLEdgeVector;
|
typedef stxxl::vector<_Edge> STXXLEdgeVector;
|
||||||
@ -97,14 +99,62 @@ private:
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** V8 JavaScript Engine **/
|
||||||
|
v8::HandleScope handle_scope;
|
||||||
|
v8::Handle<v8::ObjectTemplate> global_templ;
|
||||||
|
v8::Persistent<v8::Context> context;
|
||||||
|
|
||||||
|
//forbid default c'tor
|
||||||
|
ExtractorCallbacks() {externalMemory = NULL; stringMap = NULL; }
|
||||||
public:
|
public:
|
||||||
ExtractorCallbacks(STXXLContainers * ext, Settings set, StringMap * strMap) {
|
explicit ExtractorCallbacks(STXXLContainers * ext, Settings set, StringMap * strMap) {
|
||||||
externalMemory = ext;
|
externalMemory = ext;
|
||||||
settings = set;
|
settings = set;
|
||||||
stringMap = strMap;
|
stringMap = strMap;
|
||||||
|
|
||||||
|
global_templ = v8::ObjectTemplate::New();
|
||||||
|
|
||||||
|
|
||||||
|
//register global print function
|
||||||
|
global_templ->Set(v8::String::New("print"), v8::FunctionTemplate::New(V8Helper::PrintToConsole));
|
||||||
|
|
||||||
|
//register global version function
|
||||||
|
global_templ->Set(v8::String::New("version"), v8::FunctionTemplate::New(V8Helper::Version));
|
||||||
|
|
||||||
|
// v8::Persistent<v8::Object> script_core;
|
||||||
|
|
||||||
|
context = v8::Context::New(0, global_templ);
|
||||||
|
//Enter the created context for compiling
|
||||||
|
v8::Context::Scope context_scope = v8::Context::Scope(context);
|
||||||
|
|
||||||
|
//todo: open speedprofile.js
|
||||||
|
std::string text = "print('Starting V8 Scripting Engine '+version());";
|
||||||
|
v8::Handle<v8::String> source = v8::String::New(text.c_str());
|
||||||
|
v8::TryCatch try_catch;
|
||||||
|
v8::Handle<v8::Script> script = v8::Script::Compile(source);
|
||||||
|
if (script.IsEmpty()) {
|
||||||
|
// Print errors that happened during compilation.
|
||||||
|
V8Helper::ReportException(&try_catch);
|
||||||
|
} else {
|
||||||
|
v8::Handle<v8::Value> result = script->Run();
|
||||||
|
if (result.IsEmpty()) {
|
||||||
|
assert(try_catch.HasCaught());
|
||||||
|
// Print errors that happened during execution.
|
||||||
|
V8Helper::ReportException(&try_catch);
|
||||||
|
} else {
|
||||||
|
assert(!try_catch.HasCaught());
|
||||||
|
if (!result->IsUndefined()) {
|
||||||
|
// If all went well and the result wasn't undefined then print
|
||||||
|
// the returned value.
|
||||||
|
v8::String::Utf8Value str(result);
|
||||||
|
std::cout << V8Helper::ToCString(str) << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~ExtractorCallbacks() {
|
~ExtractorCallbacks() {
|
||||||
|
context.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** warning: caller needs to take care of synchronization! */
|
/** warning: caller needs to take care of synchronization! */
|
||||||
|
@ -21,6 +21,22 @@ or see http://www.gnu.org/licenses/agpl.txt.
|
|||||||
#ifndef V8HELPER_H_
|
#ifndef V8HELPER_H_
|
||||||
#define V8HELPER_H_
|
#define V8HELPER_H_
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <v8.h>
|
||||||
|
|
||||||
|
namespace V8Helper {
|
||||||
|
//Provides an output mechanism to the V8 Engine
|
||||||
|
static v8::Handle<v8::Value> PrintToConsole (const v8::Arguments& args){
|
||||||
|
std::cout << "[JS] : " << *v8::String::AsciiValue(args[0]) << std::endl;
|
||||||
|
return v8::Undefined();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Returns the version of the V8 Engine
|
||||||
|
v8::Handle<v8::Value> Version(const v8::Arguments& args) {
|
||||||
|
return v8::String::New(v8::V8::GetVersion());
|
||||||
|
}
|
||||||
|
|
||||||
//Most of the stuff below is from http://blog.owned.co.za provided with an MIT License
|
//Most of the stuff below is from http://blog.owned.co.za provided with an MIT License
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
@ -101,5 +117,45 @@ v8::Handle<v8::Value> GetInt(v8::Local<v8::String> property, const v8::AccessorI
|
|||||||
return JSPropertyType::New(value);
|
return JSPropertyType::New(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Extracts a C string from a V8 Utf8Value.
|
||||||
|
const char* ToCString(const v8::String::Utf8Value& value) {
|
||||||
|
return *value ? *value : "<string conversion failed>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReportException(v8::TryCatch* try_catch) {
|
||||||
|
v8::HandleScope handle_scope;
|
||||||
|
v8::String::Utf8Value exception(try_catch->Exception());
|
||||||
|
const char* exception_string = ToCString(exception);
|
||||||
|
v8::Handle<v8::Message> message = try_catch->Message();
|
||||||
|
if (message.IsEmpty()) {
|
||||||
|
// V8 didn't provide any extra information about this error; just
|
||||||
|
// print the exception.
|
||||||
|
std::cout << exception_string << std::endl;
|
||||||
|
} else {
|
||||||
|
// Print (filename):(line number): (message).
|
||||||
|
v8::String::Utf8Value filename(message->GetScriptResourceName());
|
||||||
|
int linenum = message->GetLineNumber();
|
||||||
|
std::cout << ToCString(filename) << ":" << linenum << ": " << exception_string << std::endl;
|
||||||
|
// Print line of source code.
|
||||||
|
v8::String::Utf8Value sourceline(message->GetSourceLine());
|
||||||
|
std::cout << ToCString(sourceline) << std::endl;
|
||||||
|
|
||||||
|
// Print wavy underline (GetUnderline is deprecated).
|
||||||
|
int start = message->GetStartColumn();
|
||||||
|
for (int i = 0; i < start; ++i) {
|
||||||
|
std::cout << " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = start, end = message->GetEndColumn(); i < end; ++i) {
|
||||||
|
std::cout << "^";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
v8::String::Utf8Value stack_trace(try_catch->StackTrace());
|
||||||
|
if (stack_trace.length()) {
|
||||||
|
std::cout << ToCString(stack_trace) << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* V8HELPER_H_ */
|
#endif /* V8HELPER_H_ */
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
open source routing machine
|
|
||||||
Copyright (C) Dennis Luxen, others 2010
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU AFFERO General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
or see http://www.gnu.org/licenses/agpl.txt.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _OPENMPREPLACEMENTY_H
|
|
||||||
#define _OPENMPREPLACEMENTY_H
|
|
||||||
|
|
||||||
#ifdef _OPENMP
|
|
||||||
#include <omp.h>
|
|
||||||
#else
|
|
||||||
inline const int omp_get_num_procs() { return 1; }
|
|
||||||
inline const int omp_get_max_threads() { return 1; }
|
|
||||||
inline const int omp_get_thread_num() { return 0; }
|
|
||||||
inline const void omp_set_num_threads(int i) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue
Block a user