Ignore:
Timestamp:
06/03/12 21:39:43 (12 years ago)
Author:
tbretz
Message:
Added the possibility to run with arguments; added exit() command to JS
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/InterpreterV8.cc

    r14051 r14055  
    1313using namespace v8;
    1414
    15 void InterpreterV8::ReportException(TryCatch* try_catch)
     15bool InterpreterV8::ReportException(TryCatch* try_catch)
    1616{
    1717    const HandleScope handle_scope;
    1818
    1919    const String::Utf8Value exception(try_catch->Exception());
     20
     21    if (*exception && string(*exception)=="exit")
     22        return true;
    2023
    2124    const Handle<Message> message = try_catch->Message();
     
    2932        out << *filename;
    3033    if (!message.IsEmpty())
    31         out << ": l. " << message->GetLineNumber();
     34        out << ": l." << message->GetLineNumber();
    3235    if (*exception)
    3336        out << ": " << *exception;
     
    3639
    3740    if (message.IsEmpty())
    38         return;
     41        return false;
    3942
    4043    // Print line of source code.
     
    4851
    4952    out.str("");
    50     out << setfill(' ') <<  setw(start)     << ' ';
    51     out << setfill('^') <<  setw(end-start) << '^';
     53    if (start>0)
     54        out << setfill(' ') << setw(start) << ' ';
     55    out << setfill('^') << setw(end-start) << '^';
    5256
    5357    JsException(out.str());
     
    5559    String::Utf8Value stack_trace(try_catch->StackTrace());
    5660    if (stack_trace.length()<=0)
    57         return;
    58 
    59     if (*stack_trace)
    60         JsException(string("\n")+*stack_trace);
     61        return false;
     62
     63    //if (*stack_trace)
     64    //    JsException(string("\n")+*stack_trace);
     65
     66    return false;
    6167}
    6268
     
    95101
    96102    if (exception.HasCaught())
    97     {
    98         ReportException(&exception);
    99         return false;
    100     }
     103        return ReportException(&exception);
     104
    101105    return rc;
    102106}
     
    191195    JsSleep(args[0]->Int32Value());
    192196
     197    return Undefined();
     198}
     199
     200Handle<Value> InterpreterV8::FuncExit(const Arguments &)
     201{
     202    v8::V8::TerminateExecution(fThreadId);
     203    return ThrowException(String::New("exit"));
     204/*
     205    if (args.Length()!=1)
     206        return ThrowException(String::New("Number of arguments must be exactly 1."));
     207
     208    if (!args[0]->IsUint32())
     209        return ThrowException(String::New("Argument 1 must be an uint32."));
     210
     211    const HandleScope handle_scope;
     212
     213    JsSleep(args[0]->Int32Value());
     214*/
    193215    return Undefined();
    194216}
     
    234256}
    235257
    236 bool InterpreterV8::JsRun(const string &filename)
     258#include <iostream>
     259
     260bool InterpreterV8::JsRun(const string &filename, const map<string, string> &map)
    237261{
    238262    v8::Locker locker;
     
    253277    global->Set(String::New("include"), FunctionTemplate::New(WrapInclude),                ReadOnly);
    254278    global->Set(String::New("sleep"),   FunctionTemplate::New(WrapSleep),                  ReadOnly);
     279    global->Set(String::New("exit"),    FunctionTemplate::New(WrapExit),                   ReadOnly);
    255280    global->Set(String::New("version"), FunctionTemplate::New(InterpreterV8::FuncVersion), ReadOnly);
    256281
     
    263288    }
    264289
     290    v8::Context::Scope scope(context);
     291
     292    Local<Array> args = Array::New(map.size());
     293    for (auto it=map.begin(); it!=map.end(); it++)
     294        args->Set(String::New(it->first.c_str()), String::New(it->second.c_str()));
     295    context->Global()->Set(String::New("arg"), args);
     296
    265297    JsStart(filename);
    266298
    267     v8::Context::Scope scope(context);
    268299    //context->Enter();
    269 
    270300    v8::Locker::StartPreemption(10);
    271301    const bool rc = ExecuteFile(filename);
    272302    v8::Locker::StopPreemption();
    273 
    274303    //context->Exit();
    275304
Note: See TracChangeset for help on using the changeset viewer.