Home | History | Annotate | Download | only in bridge
      1 /*
      2  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 #include "config.h"
     26 
     27 #include "BridgeJSC.h"
     28 #include "JSObject.h"
     29 #include "JSValue.h"
     30 #include "interpreter.h"
     31 #include "qdebug.h"
     32 #include "qobject.h"
     33 #include "runtime_object.h"
     34 #include "types.h"
     35 #include <assert.h>
     36 #include <stdio.h>
     37 #include <string.h>
     38 
     39 
     40 class MyObject : public QObject
     41 {
     42     Q_OBJECT
     43     Q_PROPERTY(QString testString READ testString WRITE setTestString)
     44     Q_PROPERTY(int testInt READ testInt WRITE setTestInt)
     45 
     46 public:
     47     MyObject() : QObject(0), integer(0){}
     48 
     49     void setTestString(const QString &str) {
     50         qDebug() << "called setTestString" << str;
     51         string = str;
     52     }
     53     void setTestInt(int i) {
     54         qDebug() << "called setTestInt" << i;
     55         integer = i;
     56     }
     57     QString testString() const {
     58         qDebug() << "called testString" << string;
     59         return string;
     60     }
     61     int testInt() const {
     62         qDebug() << "called testInt" << integer;
     63         return integer;
     64     }
     65     QString string;
     66     int integer;
     67 
     68 public slots:
     69     void foo() { qDebug() << "foo invoked"; }
     70 };
     71 
     72 // --------------------------------------------------------
     73 
     74 using namespace JSC;
     75 using namespace JSC::Bindings;
     76 
     77 class Global : public JSNonFinalObject {
     78 public:
     79   virtual UString className() const { return "global"; }
     80 };
     81 
     82 static char code[] =
     83     "myInterface.foo();\n"
     84     "myInterface.testString = \"Hello\";\n"
     85     "str = myInterface.testString;\n"
     86     "myInterface.testInt = 10;\n"
     87     "i = myInterface.testInt;\n";
     88 
     89 int main(int argc, char** argv)
     90 {
     91     // expecting a filename
     92     bool ret = true;
     93     {
     94         JSLock lock;
     95 
     96         // create interpreter w/ global object
     97         Global* global = new Global();
     98 
     99         // create interpreter
    100         RefPtr<Interpreter> interp = new Interpreter(global);
    101         ExecState* exec = interp->globalExec();
    102 
    103         MyObject* myObject = new MyObject;
    104 
    105         global->put(exec, Identifier("myInterface"), Instance::createRuntimeObject(Instance::QtLanguage, (void*)myObject));
    106 
    107 
    108         if (code) {
    109             // run
    110             Completion comp(interp->evaluate("", 0, code));
    111 
    112             if (comp.complType() == Throw) {
    113                 qDebug() << "exception thrown";
    114                 JSValue* exVal = comp.value();
    115                 char* msg = exVal->toString(exec).ascii();
    116                 int lineno = -1;
    117                 if (exVal->type() == ObjectType) {
    118                     JSValue* lineVal = exVal->getObject()->get(exec, Identifier("line"));
    119                     if (lineVal->type() == NumberType)
    120                         lineno = int(lineVal->toNumber(exec));
    121                 }
    122                 if (lineno != -1)
    123                     fprintf(stderr,"Exception, line %d: %s\n",lineno,msg);
    124                 else
    125                     fprintf(stderr,"Exception: %s\n",msg);
    126                 ret = false;
    127             }
    128             else if (comp.complType() == ReturnValue) {
    129                 char* msg = comp.value()->toString(interp->globalExec()).ascii();
    130                 fprintf(stderr,"Return value: %s\n",msg);
    131             }
    132         }
    133 
    134     } // end block, so that Interpreter and global get deleted
    135 
    136     return ret ? 0 : 1;
    137 }
    138 
    139 #include "testqtbindings.moc"
    140