Changeset 14626


Ignore:
Timestamp:
11/15/12 17:40:17 (12 years ago)
Author:
tbretz
Message:
Changes to th bahaviour of get(); fixex a problem with the return value of ExecuteInternal in Timout
File:
1 edited

Legend:

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

    r14607 r14626  
    427427}
    428428
     429Handle<Value> InterpreterV8::FuncFile(const Arguments& args)
     430{
     431    for (int i=0; i<1; i++)
     432    {
     433        const String::Utf8Value file(args[i]);
     434        if (*file == NULL)
     435            return ThrowException(String::New("File name missing"));
     436
     437        ifstream fin(*file);
     438        if (!fin)
     439            return ThrowException(String::New(("Error - Could not open file '"+string(*file)+"'").c_str()));
     440
     441        string buffer;
     442        if (!getline(fin, buffer, '\0'))
     443            return ThrowException(String::New(("Error - Could read file '"+string(*file)+"'").c_str()));
     444
     445        if (fin.fail())
     446            return ThrowException(String::New(("Error - Could read file '"+string(*file)+"'").c_str()));
     447
     448        return String::New(buffer.c_str());
     449
     450    }
     451    return Boolean::New(true);
     452}
     453
    429454Handle<Value> InterpreterV8::FuncVersion(const Arguments&)
    430455{
     
    663688            ostringstream val;
    664689            val << setprecision(7) << *reinterpret_cast<const float*>(ptr);
    665             Handle<Value> v=Number::New(stod(val.str()));
    666             ptr+=4;
    667             return v;
     690            ptr += 4;
     691            return Number::New(stod(val.str()));
    668692        }
    669693    case 'D':  { Handle<Value> v=Number::New(*reinterpret_cast<const double*>(ptr)); ptr+=8; return v; }
     
    709733    const vector<Description> vec = JsDescription(str);
    710734
    711     Handle<Array> ret = Array::New();
     735    Handle<Object> ret = Object::New();
    712736    if (ret.IsEmpty())
    713737        return Undefined();
     
    719743    ret->Set(String::New("name"),    String::New(str),             ReadOnly);
    720744    ret->Set(String::New("format"),  String::New(evt->GetFormat().c_str()), ReadOnly);
    721     ret->Set(String::New("named"),   Boolean::New(vec.size()>0),    ReadOnly);
    722745    ret->Set(String::New("qos"),     Integer::New(evt->GetQoS()),   ReadOnly);
    723746    ret->Set(String::New("size"),    Integer::New(evt->GetSize()),  ReadOnly);
    724747    ret->Set(String::New("counter"), Integer::New(counter),         ReadOnly);
    725     ret->Set(String::New("time"), date, ReadOnly);
     748    ret->Set(String::New("time"),    date, ReadOnly);
    726749
    727750    // If no event was received (usually a disconnection event in
     
    730753        return ret;
    731754
     755    // If names are available data will also be provided as an
     756    // object. If an empty event was received, but names are available,
     757    // the object will be empty. Otherwise 'obj' will be undefined.
     758    // obj===undefined:               no data received
     759    // obj!==undefined, length==0:    names for event available
     760    // obj!==undefined, obj.length>0: names available, data received
     761    Handle<Object> named = Object::New();
     762    if (named.IsEmpty())
     763        return Undefined();
     764
     765    if (vec.size()>0)
     766        ret->Set(String::New("obj"), named, ReadOnly);
     767
    732768    // If valid data was received, but the size was zero, then
    733769    // null is returned as data
     770    // data===undefined: no data received
     771    // data===null:      event received, but no data
     772    // data.length>0:    event received, contains data
    734773    if (evt->GetSize()==0 || evt->GetFormat().empty())
    735774    {
     
    743782    const vector<string> tok(tokenizer.begin(), tokenizer.end());
    744783
    745     Handle<Array> obj = tok.size()>1 ? Array::New() : ret;
    746     if (obj.IsEmpty())
     784    Handle<Object> arr = tok.size()>1 ? Array::New() : ret;
     785    if (arr.IsEmpty())
    747786        return Undefined();
    748787
     
    770809            const uint32_t cnt = it==tok.end() ? 1 : stoi(it->c_str());
    771810
     811            Handle<Value> v;
    772812            if (cnt==1)
    773813            {
    774                 const Handle<Value> v = Convert(type, ptr);
    775                 if (tok.size()>1)
    776                     obj->Set(pos-1, v);
    777                 if (!name.empty())
    778                     obj->Set(String::New(name.c_str()), v);
     814                v = Convert(type, ptr);
    779815            }
    780816            else
    781817            {
    782                 Handle<Array> a = Array::New(cnt);
     818                Handle<Object> a = Array::New(cnt);
    783819                if (a.IsEmpty())
    784820                    return Undefined();
     
    786822                for (uint32_t i=0; i<cnt; i++)
    787823                    a->Set(i, Convert(type, ptr));
    788                 if (tok.size()>1)
    789                     obj->Set(pos-1, a);
    790                 if (!name.empty())
    791                     obj->Set(String::New(name.c_str()), a);
     824
     825                v = a;
     826            }
     827
     828            if (tok.size()>1)
     829                arr->Set(pos-1, v);
     830
     831            if (!name.empty())
     832            {
     833                const Handle<String> n = String::New(name.c_str());
     834                named->Set(n, v);
    792835            }
    793836
     
    797840
    798841        if (tok.size()>1)
    799             ret->Set(String::New("data"), obj, ReadOnly);
     842            ret->Set(String::New("data"), arr, ReadOnly);
    800843
    801844        return ret;
     
    828871Handle<Value> InterpreterV8::FuncGetData(const Arguments &args)
    829872{
    830     if (args.Length()>1)
    831         return ThrowException(String::New("Number of arguments must not be greatr than 1."));
    832 
    833     if (args.Length()==1 && !args[0]->IsInt32() && !args[0]->IsNull())
    834         return ThrowException(String::New("Argument 1 not an int32."));
     873    if (args.Length()>2)
     874        return ThrowException(String::New("Number of arguments must not be greater than 2."));
     875
     876    if (args.Length()>=1 && !args[0]->IsInt32() && !args[0]->IsNull())
     877        return ThrowException(String::New("Argument 1 not an uint32."));
     878
     879    if (args.Length()==2 && !args[1]->IsBoolean())
     880        return ThrowException(String::New("Argument 2 not a boolean."));
    835881
    836882    // Using a Javascript function has the advantage that it is fully
    837883    // interruptable without the need of C++ code
    838     const bool    null    = args.Length()==1 && args[0]->IsNull();
    839     const int32_t timeout = args.Length()==1 ? args[0]->Int32Value() : 0;
     884    const bool    null    = args.Length()>=1 && args[0]->IsNull();
     885    const int32_t timeout = args.Length()>=1 ? args[0]->Int32Value() : 0;
     886    const bool    named   = args.Length()<2 || args[1]->BooleanValue();
    840887
    841888    HandleScope handle_scope;
     
    845892        return Undefined();
    846893
    847     const Handle<String> data  = String::New("data");
    848     const Handle<String> named = String::New("named");
     894    //const Handle<String> data   = String::New("data");
     895    const Handle<String> object = String::New("obj");
    849896
    850897    const String::Utf8Value name(args.Holder()->Get(String::New("name")));
     
    867914            if (!val.IsEmpty() && val->IsObject())
    868915            {
    869                 const Handle<Object> obj = val->ToObject();
    870                 if (obj->Has(data) && obj->Get(named)->ToBoolean()->Value())
     916                if (!named)
    871917                    return handle_scope.Close(val);
     918
     919                const Handle<Object> event = val->ToObject();
     920                const Handle<Value>  obj   = event->Get(object);
     921
     922                if (!obj.IsEmpty() && obj->IsObject())
     923                {
     924                    // Has names and data was received?
     925                    if (obj->ToObject()->GetOwnPropertyNames()->Length()>0)
     926                        return handle_scope.Close(val);
     927                }
    872928            }
    873929        }
     
    888944        return exception.ReThrow();
    889945
    890     if (timeout>=0)
     946    if (timeout<0)
    891947        return Undefined();
    892948
     
    14291485Handle<Value> InterpreterV8::ExecuteInternal(const string &code)
    14301486{
     1487    // Try/catch and re-throw hides our internal code from
     1488    // the displayed exception showing the origin and shows
     1489    // the user function instead.
    14311490    TryCatch exception;
     1491
    14321492    const Handle<Value> result = ExecuteCode(code);
    1433     return exception.HasCaught() ? exception.ReThrow() : result;
     1493    if (exception.HasCaught())
     1494        exception.ReThrow();
     1495
     1496    return result;
    14341497}
    14351498
     
    14521515    const Handle<Value> result = script->Run();
    14531516    if (result.IsEmpty())
    1454         return result;
     1517        return Handle<Value>();
    14551518
    14561519    // If all went well and the result wasn't undefined then print
     
    15481611bool InterpreterV8::JsRun(const string &filename, const map<string, string> &map)
    15491612{
     1613    //const string argv = "--prof";
     1614    //V8::SetFlagsFromString(argv.c_str(), argv.size());
     1615
    15501616    const Locker locker;
    15511617    fThreadId = V8::GetCurrentThreadId();
     
    15711637    dim->Set(String::New("subscribe"), FunctionTemplate::New(WrapSubscribe), ReadOnly);
    15721638    dim->Set(String::New("database"),  FunctionTemplate::New(WrapDatabase),  ReadOnly);
     1639    //dim->Set(String::New("file"),      FunctionTemplate::New(WrapFile),      ReadOnly);
    15731640
    15741641    Handle<ObjectTemplate> onchange = ObjectTemplate::New();
     
    16111678    fGlobalContext->Global()->Set(String::New("arg"), args, ReadOnly);
    16121679
     1680    //V8::ResumeProfiler();
     1681
    16131682    AddFormatToGlobal();
    16141683
     
    16211690    Locker::StartPreemption(10);
    16221691    bool rc = ExecuteFile(filename, true);
     1692
    16231693    Locker::StopPreemption();
    16241694
     
    16271697    if (exception.HasCaught())
    16281698        rc = ReportException(&exception);
     1699
     1700    // IsProfilerPaused()
     1701    // V8::PauseProfiler();
    16291702
    16301703    // -----
Note: See TracChangeset for help on using the changeset viewer.