Changeset 14055 for trunk/FACT++


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
Location:
trunk/FACT++/src
Files:
3 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
  • trunk/FACT++/src/InterpreterV8.h

    r14051 r14055  
    22#define FACT_InterpreterV8
    33
     4#include <map>
    45#include <string>
    56
     
    1516
    1617#ifdef HAVE_V8
    17     void ReportException(v8::TryCatch* try_catch);
     18    bool ReportException(v8::TryCatch* try_catch);
    1819    bool ExecuteStringNT(const v8::Handle<v8::String> &code, const v8::Handle<v8::Value>  &file);
    1920    bool ExecuteCode(const v8::Handle<v8::String> &code, const v8::Handle<v8::Value>  &file);
     
    2627    v8::Handle<v8::Value> FuncPrint(const v8::Arguments& args);
    2728    v8::Handle<v8::Value> FuncInclude(const v8::Arguments& args);
     29    v8::Handle<v8::Value> FuncExit(const v8::Arguments& args);
    2830
    2931    static v8::Handle<v8::Value> FuncVersion(const v8::Arguments&);
     
    3335    static v8::Handle<v8::Value> WrapSend(const v8::Arguments &args)    { if (This) return This->FuncSend(args);    else return v8::Undefined(); }
    3436    static v8::Handle<v8::Value> WrapSleep(const v8::Arguments &args)   { if (This) return This->FuncSleep(args);   else return v8::Undefined(); }
     37    static v8::Handle<v8::Value> WrapExit(const v8::Arguments &args)    { if (This) return This->FuncExit(args);    else return v8::Undefined(); }
    3538#endif
    3639
     
    5659    virtual int  JsWait(const std::string &, int32_t, uint32_t) { return -1; };
    5760
    58     bool JsRun(const std::string &filename);
     61    bool JsRun(const std::string &, const std::map<std::string,std::string> & = std::map<std::string,std::string>());
    5962    static void JsStop();
    6063};
    6164
    6265#ifndef HAVE_V8
    63 inline bool InterpreterV8::JsRun(const std::string &) { return false; }
     66inline bool InterpreterV8::JsRun(const std::string &, const std::map<std::string,std::string> & = std::map<std::string,std::string>()) { return false; }
    6467inline void InterpreterV8::JsStop() { }
    6568#endif
  • trunk/FACT++/src/RemoteControl.h

    r14050 r14055  
    249249        if (str.substr(0, 4)==".js ")
    250250        {
    251             JsRun(Tools::Trim(str.substr(3)));
     251            string opt(str.substr(4));
     252
     253            map<string,string> data = Tools::Split(opt, true);
     254            if (opt.size()==0)
     255            {
     256                if (data.size()==0)
     257                    lout << kRed << "JavaScript filename missing." << endl;
     258                else
     259                    lout << kRed << "Equal sign missing in argument '" << data.begin()->first << "'" << endl;
     260
     261                return true;
     262            }
     263
     264            JsRun(opt, data);
    252265            return true;
    253266        }
Note: See TracChangeset for help on using the changeset viewer.