loading javascript file

657 views
Skip to first unread message

bijay

unread,
Dec 24, 2008, 12:23:54 AM12/24/08
to v8-users
Hi All,
I want to load a javascript file in v8 c++.
The v8 C++ program will get arguments from command line
and execute the javascript file with those two arguments and send the
output.
Javascript function will bw like this.
func(a,b)
{
c = a+b;
return c;
}
can any one suggest me..Any solution is welcome.

Bryan White

unread,
Dec 24, 2008, 9:15:50 AM12/24/08
to v8-u...@googlegroups.com
On Wed, Dec 24, 2008 at 12:23 AM, bijay <bijayku...@gmail.com> wrote:
> can any one suggest me..Any solution is welcome.

Note to be rude, but a solution would require a problem to solve. Or
are you asking someone to write a program for you? I suggest you look
over the samples and read the documentation.


--
Bryan White

bijay

unread,
Dec 25, 2008, 11:26:05 PM12/25/08
to v8-users
Hi All,
I actually want to execute the javascript file "add.js" in
"loadNExecuteJavascript.cc".
add.js a simple javascript file to return the result of a+b.The file
is like bellow.

function add(a,b){
this.a = a;
this.b = b;
}

add.prototype.addObj = function () {
return (this.a+this.b)
}

/////////////////////loadNExecuteJavascript.cc////////////////

#include <v8.h>
#include <cstring>
#include <cstdio>
#include <cstdlib>

void RunShell(v8::Handle<v8::Context> context);
bool ExecuteString(v8::Handle<v8::String> source,
v8::Handle<v8::Value> name,
bool print_result,
bool report_exceptions);

v8::Handle<v8::Value> Print(const v8::Arguments& args);

v8::Handle<v8::Value> Load(const v8::Arguments& args);

v8::Handle<v8::Value> Quit(const v8::Arguments& args);

v8::Handle<v8::Value> Version(const v8::Arguments& args);

v8::Handle<v8::String> ReadFile(const char* name);

void ReportException(v8::TryCatch* handler);

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

v8::V8::SetFlagsFromCommandLine(&argc, argv, true);


v8::HandleScope handle_scope;

// Create a template for the global object.
v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();

// Bind the global 'print' function to the C++ Print callback.
global->Set(v8::String::New("print"), v8::FunctionTemplate::New
(Print));

// Bind the global 'load' function to the C++ Load callback.
global->Set(v8::String::New("load"), v8::FunctionTemplate::New
(Load));

// Bind the 'quit' function to the C++ Load callback.
global->Set(v8::String::New("quit"), v8::FunctionTemplate::New
(Quit));

// Bind the 'version' function to the C++ Load callback.
global->Set(v8::String::New("version"), v8::FunctionTemplate::New
(Version));

// Create a new execution environment containing the built-in
functions
v8::Handle<v8::Context> context = v8::Context::New(NULL, global);

// Enter the newly created execution environment.
v8::Context::Scope context_scope(context);

bool run_shell = (argc == 1);

for (int i = 1; i < argc; i++)
{

const char* str = argv[i];
if (strcmp(str, "--shell") == 0)
{
run_shell = true;
}

else if (strcmp(str, "-f") == 0)
{

// Ignore any -f flags for compatibility with the other stand-
alone JavaScript engines.
continue;

}
else if (strncmp(str, "--", 2) == 0)
{

printf("Warning: unknown flag %s.\n", str);

}
else if (strcmp(str, "-e") == 0 && i + 1 < argc)
{
// Execute argument given to -e option directly
v8::HandleScope handle_scope;
v8::Handle<v8::String> file_name = v8::String::New("unnamed");
v8::Handle<v8::String> source = v8::String::New(argv[i + 1]);
if (!ExecuteString(source, file_name, false, true))
return 1;
i++;
}

else
{
// Use all other arguments as names of files to load and run.
v8::HandleScope handle_scope;
v8::Handle<v8::String> file_name = v8::String::New(str);
v8::Handle<v8::String> source = ReadFile(str);
if (source.IsEmpty())
{
printf("Error reading '%s'\n", str);
return 1;
}
if (!ExecuteString(source, file_name, false, true))
return 1;
}
}
if (run_shell) RunShell(context);
return 0;
}


// The callback that is invoked by v8 whenever the JavaScript 'print'
// function is called. Prints its arguments on stdout separated by
// spaces and ending with a newline.
v8::Handle<v8::Value> Print(const v8::Arguments& args)
{

bool first = true;
for (int i = 0; i < args.Length(); i++)
{
v8::HandleScope handle_scope;
if (first)
{
first = false;
}
else
{
printf(" ");
}
v8::String::Utf8Value str(args[i]);
printf("%s", *str);
}

printf("\n");
return v8::Undefined();

}


// The callback that is invoked by v8 whenever the JavaScript 'load'
// function is called. Loads, compiles and executes its argument
// JavaScript file.
v8::Handle<v8::Value> Load(const v8::Arguments& args)
{
for (int i = 0; i < args.Length(); i++)
{
v8::HandleScope handle_scope;
v8::String::Utf8Value file(args[i]);
v8::Handle<v8::String> source = ReadFile(*file);

if (source.IsEmpty())
{
return v8::ThrowException(v8::String::New("Error loading
file"));
}

if (!ExecuteString(source, v8::String::New(*file), false,
false))
{
return v8::ThrowException(v8::String::New("Error executing
file"));
}
}
return v8::Undefined();
}

// The callback that is invoked by v8 whenever the JavaScript 'quit'
// function is called. Quits.
v8::Handle<v8::Value> Quit(const v8::Arguments& args)
{
// If not arguments are given args[0] will yield undefined which
// converts to the integer value 0.
int exit_code = args[0]->Int32Value();
exit(exit_code);
return v8::Undefined();
}

v8::Handle<v8::Value> Version(const v8::Arguments& args)
{
return v8::String::New(v8::V8::GetVersion());

}

// Reads a file into a v8 string.
v8::Handle<v8::String> ReadFile(const char* name)
{

FILE* file = fopen(name, "rb");
if (file == NULL) return v8::Handle<v8::String>();

fseek(file, 0, SEEK_END);
int size = ftell(file);
rewind(file);

char* chars = new char[size + 1];
chars[size] = '\0';
for (int i = 0; i < size;)
{
int read = fread(&chars[i], 1, size - i, file);
i += read;
}
fclose(file);
v8::Handle<v8::String> result = v8::String::New(chars, size);
delete[] chars;
return result;

}

// The read-eval-execute loop of the shell.
void RunShell(v8::Handle<v8::Context> context)
{

printf("V8 version %s\n", v8::V8::GetVersion());
static const int kBufferSize = 256;
while (true)
{
char buffer[kBufferSize];
printf("Enter Value Of A and B :");
scanf("%d,%d",&A,&B);

char* str = fgets(buffer, kBufferSize, stdin);
if (str == NULL) break;
v8::HandleScope handle_scope;
ExecuteString(v8::String::New(str),
v8::String::New("(shell)"),
true,
true);
}
printf("\n");
}

// Executes a string within the current v8 context.
bool ExecuteString(v8::Handle<v8::String> source,
v8::Handle<v8::Value> name,
bool print_result,
bool report_exceptions)
{
v8::HandleScope handle_scope;
v8::TryCatch try_catch;
v8::Handle<v8::Script> script = v8::Script::Compile(source, name);
if (script.IsEmpty())
{
// Print errors that happened during compilation.
if (report_exceptions)
ReportException(&try_catch);
return false;
}
else
{
v8::Handle<v8::Value> result = script->Run();
if (result.IsEmpty())
{
// Print errors that happened during execution.
if (report_exceptions)
ReportException(&try_catch);
return false;
}
else
{
if (print_result && !result->IsUndefined())
{
// If all went well and the result is defined and valid then
print the returned value.

v8::String::Utf8Value str(result);
printf(" Name of The Script You entered is::%s\n", *str);

}
return true;
}
}
}

void ReportException(v8::TryCatch* try_catch)
{

v8::HandleScope handle_scope;
v8::String::Utf8Value exception(try_catch->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.
printf("%s\n", *exception);
}
else
{
// Print (filename):(line number): (message).
v8::String::Utf8Value filename(message->GetScriptResourceName());
int linenum = message->GetLineNumber();
printf("%s:%i: %s\n", *filename, linenum, *exception);
// Print line of source code.
v8::String::Utf8Value sourceline(message->GetSourceLine());
printf("%s\n", *sourceline);
// Print wavy underline (GetUnderline is deprecated).
int start = message->GetStartColumn();
for (int i = 0; i < start; i++)
{
printf(" ");
}
int end = message->GetEndColumn();
for (int i = start; i < end; i++)
{
printf("^");
}
printf("\n");
}
}

But i am getting error like below.

Result is Empty.
The File Name is:
:Line Number: 1
:Exception: ReferenceError: add is not defined
Source Line:add.js

I think the code bellow in my "loadNExecuteJavascript.cc" file will
compile a javascript file as source.
But getting error like above.I got stock actually.Can any one suggest
what can be done.

Thanks in advance.

Reply all
Reply to author
Forward
0 new messages