I found my mistake. It's really simple, when I run, in my first code sample, "String::AsciiValue", the context isn't entered...
The fix is just to create a Context::Scope just before converting to AsciiValue using the context from the Engine class. Remi Gillig. On Jan 17, 12:46 pm, Remi Gillig <[email protected]> wrote: > Well, ToString() does not seem to throw an exception when I'm trying > to convert my result to a string. > > I just tried to make everything in the main, context creation, handle > scope, etc. > > The code is very much like the hello world example from the wiki : > > // Create a stack-allocated handle scope. > HandleScope handle_scope; > > // Create a new context. > Persistent<Context> context = Context::New(); > > // 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("42;"); > > // Compile the source code. > Handle<Script> script = Script::Compile(source); > > // 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); > > // Dispose the persistent context. > context.Dispose(); > > And here it works as expected and outputs "42". I am just guessing but > couldn't it be a problem of handle destruction? However, even with > "handleScope.Close", it still crashes. > > Remi Gillig. > > On Jan 17, 5:03 am, Abdulla Kamar <[email protected]> wrote: > > > You should be checking whether *str* is actually a string with * > > str->IsString()*. Or you could try using *str->ToString()*, but I'm not sure > > if that performs the type conversion for you (try checking the docs and/or > > the source code). > > > On Sun, Jan 17, 2010 at 8:59 AM, Remi Gillig <[email protected]> wrote: > > > Hello, > > > > I have a little problem with this code : > > > > #include <exception> > > > #include <string> > > > #include <v8/v8.h> > > > > using namespace v8; > > > > class Engine > > > { > > > private: > > > Persistent<Context> context; > > > public: > > > Engine() > > > { > > > context = Context::New(); > > > } > > > > Handle<Value> Run(const std::string& scriptContent) > > > { > > > Context::Scope contextScope(context); > > > > HandleScope handleScope; > > > > Handle<String> source = String::New(scriptContent.c_str()); > > > > Handle<Script> script = Script::Compile(source); > > > > TryCatch trycatch; > > > > Handle<Value> result = script->Run(); > > > > if (result.IsEmpty()) > > > { > > > Handle<Value> exception = trycatch.Exception(); > > > String::AsciiValue exceptionString(exception); > > > throw std::exception(*exceptionString); > > > } > > > > return handleScope.Close(result); > > > } > > > > ~Engine() > > > { > > > context.Dispose(); > > > } > > > }; > > > > int main(int argc, char* argv[]) > > > { > > > Engine engine; > > > > HandleScope handleScope; > > > Handle<Value> str = engine.Run("42;"); > > > > String::AsciiValue ascii(str); > > > printf("%s", *ascii); > > > > return 0; > > > } > > > > I am using Visual Studio 2008 and this code crashes at the conversion > > > to AsciiValue and the debugger breaks at line 38 in contexts.cc inside > > > Context::builtins() : GlobalObject* object = global(); > > > > What I would like to create is a little class which would load > > > configuration scripts and keep the context so that I can retrieve the > > > config data for my application. > > > > Thanks for any help! > > > > Remi Gillig. > > > > -- > > > v8-users mailing list > > > [email protected] > > >http://groups.google.com/group/v8-users > > > -- > > Thank you > > Abdulla
-- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
