Ignore:
Timestamp:
11/11/12 19:53:36 (12 years ago)
Author:
tbretz
Message:
Added AddFormatToGlobal; improved exception reporting (enabled stack traces); to get proper stack traces throw Error() instead of strings in internal functions.
File:
1 edited

Legend:

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

    r14602 r14603  
    1919
    2020#include <v8.h>
     21
     22#include "tools.h"
    2123
    2224using namespace std;
     
    117119    HandleScope handle_scope;
    118120
    119     const Handle<Script> script = Script::Compile(String::New(code.c_str()));
     121    const Handle<Script> script = Script::Compile(String::New(code.c_str()), String::New("internal"));
    120122    if (script.IsEmpty())
    121123        return Undefined();
     
    140142    TryCatch exception;
    141143
    142     const Handle<Script> sleep = Script::Compile(String::New(("dim.sleep("+to_string(ms)+");").c_str()));
     144    const Handle<Script> sleep = Script::Compile(String::New(("dim.sleep("+to_string(ms)+");").c_str()), String::New("internal"));
    143145    if (ms==0 || (!sleep.IsEmpty() && !sleep->Run().IsEmpty()))
    144146    {
     
    249251                      "{"
    250252                         "var s = dim.state(name);"
    251                          "if(!"+index+")throw 'Waitig for state "+arg1+" of server "+arg0+" failed.';"
     253                         "if(!"+index+")throw new Error('Waitig for state "+arg1+" of server "+arg0+" failed.');"
    252254                         "if(state=="+index+")return true;";
    253255    if (timeout)
     
    269271    TryCatch exception;
    270272
    271     const Handle<Script> script = Script::Compile(String::New(code.c_str()));
     273    const Handle<Script> script = Script::Compile(String::New(code.c_str()), String::New("internal"));
    272274    if (script.IsEmpty())
    273275        return Undefined();
     
    874876    HandleScope handle_scope;
    875877
    876     const Handle<Script> sleep = Script::Compile(String::New("dim.sleep();"));
     878    const Handle<Script> sleep = Script::Compile(String::New("dim.sleep();"), String::New("internal"));
    877879    if (sleep.IsEmpty())
    878880        return Undefined();
     
    14091411        return false;
    14101412
    1411     // Print (filename):(line number): (message).
    1412     const String::Utf8Value filename(message->GetScriptResourceName());
    1413 
    14141413    ostringstream out;
    14151414
    1416     if (*filename)
    1417         out << *filename << ": ";
    1418     out << "l." << message->GetLineNumber();
     1415    if (!message->GetScriptResourceName()->IsUndefined())
     1416    {
     1417        // Print (filename):(line number): (message).
     1418        const String::Utf8Value filename(message->GetScriptResourceName());
     1419
     1420        if (*filename)
     1421            out << *filename << ": ";
     1422        out << "l." << message->GetLineNumber();
     1423        if (*exception)
     1424            out << ": ";
     1425    }
     1426
    14191427    if (*exception)
    1420         out << ": " << *exception;
     1428        out << *exception;
    14211429
    14221430    JsException(out.str());
     
    14381446    JsException(out.str());
    14391447
    1440     String::Utf8Value stack_trace(try_catch->StackTrace());
     1448    const String::Utf8Value stack_trace(try_catch->StackTrace());
    14411449    if (stack_trace.length()<=0)
    14421450        return false;
    14431451
    1444     //if (*stack_trace)
    1445     //    JsException(string("\n")+*stack_trace);
     1452    if (!*stack_trace)
     1453        return false;
     1454
     1455    const string trace(*stack_trace);
     1456
     1457    typedef boost::char_separator<char> separator;
     1458    const boost::tokenizer<separator> tokenizer(trace, separator("\n"));
     1459
     1460    auto it = tokenizer.begin();
     1461    JsException("");
     1462    while (it!=tokenizer.end())
     1463        JsException(*it++);
    14461464
    14471465    return false;
     
    15211539//                                  CORE
    15221540// ==========================================================================
     1541
     1542void InterpreterV8::AddFormatToGlobal() const
     1543{
     1544    const string code =
     1545        "dim.format = function(str, arr)"
     1546        "{"
     1547            "var i = -1;"
     1548            "function callback(exp, p0, p1, p2, p3, p4/*, pos, str*/)"
     1549            "{"
     1550                "if (exp=='%%')"
     1551                    "return '%';"
     1552                ""
     1553                "if (arr[++i]===undefined)"
     1554                    "return undefined;"
     1555                ""
     1556                "var exp  = p2 ? parseInt(p2.substr(1)) : undefined;"
     1557                "var base = p3 ? parseInt(p3.substr(1)) : undefined;"
     1558                ""
     1559                "var val;"
     1560                "switch (p4)"
     1561                "{"
     1562                "case 's': val = arr[i]; break;"
     1563                "case 'c': val = arr[i][0]; break;"
     1564                "case 'f': val = parseFloat(arr[i]).toFixed(exp); break;"
     1565                "case 'p': val = parseFloat(arr[i]).toPrecision(exp); break;"
     1566                "case 'e': val = parseFloat(arr[i]).toExponential(exp); break;"
     1567                "case 'x': val = parseInt(arr[i]).toString(base?base:16); break;"
     1568                "case 'd': val = parseFloat(parseInt(arr[i], base?base:10).toPrecision(exp)).toFixed(0); break;"
     1569                "default:\n"
     1570                "    throw new SyntaxError('Conversion specifier '+p4+' unknown.');\n"
     1571                "}"
     1572                ""
     1573                "val = typeof(val)=='object' ? JSON.stringify(val) : val.toString(base);"
     1574                ""
     1575                "var sz = parseInt(p1); /* padding size */"
     1576                "var ch = p1 && p1[0]=='0' ? '0' : ' '; /* isnull? */"
     1577                "while (val.length<sz)"
     1578                    "val = p0 !== undefined ? val+ch : ch+val; /* isminus? */"
     1579                ""
     1580                "return val;"
     1581            "}"
     1582            ""
     1583            "var regex = /%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?(.)/g;"
     1584            "return str.replace(regex, callback);"
     1585        "}"
     1586        "\n"
     1587        "String.prototype.format = function()"
     1588        "{"
     1589            "return dim.format(this, Array.prototype.slice.call(arguments));"
     1590        "}"
     1591        "\n"
     1592        "var format = function()"
     1593        "{"
     1594            "return dim.format(arguments[0], Array.prototype.slice.call(arguments,1));"
     1595        "}";
     1596
     1597    Script::New(String::New(code.c_str()), String::New("internal"))->Run();
     1598}
    15231599
    15241600bool InterpreterV8::JsRun(const string &filename, const map<string, string> &map)
     
    15871663    fGlobalContext->Global()->Set(String::New("arg"), args, ReadOnly);
    15881664
     1665    AddFormatToGlobal();
     1666
    15891667    JsStart(filename);
    15901668
Note: See TracChangeset for help on using the changeset viewer.