| /* |
| * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| #include "config.h" |
| |
| #include "BridgeJSC.h" |
| #include "JSObject.h" |
| #include "JSValue.h" |
| #include "interpreter.h" |
| #include "qdebug.h" |
| #include "qobject.h" |
| #include "runtime_object.h" |
| #include "types.h" |
| #include <assert.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| |
| class MyObject : public QObject |
| { |
| Q_OBJECT |
| Q_PROPERTY(QString testString READ testString WRITE setTestString) |
| Q_PROPERTY(int testInt READ testInt WRITE setTestInt) |
| |
| public: |
| MyObject() : QObject(0), integer(0){} |
| |
| void setTestString(const QString &str) { |
| qDebug() << "called setTestString" << str; |
| string = str; |
| } |
| void setTestInt(int i) { |
| qDebug() << "called setTestInt" << i; |
| integer = i; |
| } |
| QString testString() const { |
| qDebug() << "called testString" << string; |
| return string; |
| } |
| int testInt() const { |
| qDebug() << "called testInt" << integer; |
| return integer; |
| } |
| QString string; |
| int integer; |
| |
| public slots: |
| void foo() { qDebug() << "foo invoked"; } |
| }; |
| |
| // -------------------------------------------------------- |
| |
| using namespace JSC; |
| using namespace JSC::Bindings; |
| |
| class Global : public JSNonFinalObject { |
| public: |
| virtual UString className() const { return "global"; } |
| }; |
| |
| static char code[] = |
| "myInterface.foo();\n" |
| "myInterface.testString = \"Hello\";\n" |
| "str = myInterface.testString;\n" |
| "myInterface.testInt = 10;\n" |
| "i = myInterface.testInt;\n"; |
| |
| int main(int argc, char** argv) |
| { |
| // expecting a filename |
| bool ret = true; |
| { |
| JSLock lock; |
| |
| // create interpreter w/ global object |
| Global* global = new Global(); |
| |
| // create interpreter |
| RefPtr<Interpreter> interp = new Interpreter(global); |
| ExecState* exec = interp->globalExec(); |
| |
| MyObject* myObject = new MyObject; |
| |
| global->put(exec, Identifier("myInterface"), Instance::createRuntimeObject(Instance::QtLanguage, (void*)myObject)); |
| |
| |
| if (code) { |
| // run |
| Completion comp(interp->evaluate("", 0, code)); |
| |
| if (comp.complType() == Throw) { |
| qDebug() << "exception thrown"; |
| JSValue* exVal = comp.value(); |
| char* msg = exVal->toString(exec).ascii(); |
| int lineno = -1; |
| if (exVal->type() == ObjectType) { |
| JSValue* lineVal = exVal->getObject()->get(exec, Identifier("line")); |
| if (lineVal->type() == NumberType) |
| lineno = int(lineVal->toNumber(exec)); |
| } |
| if (lineno != -1) |
| fprintf(stderr,"Exception, line %d: %s\n",lineno,msg); |
| else |
| fprintf(stderr,"Exception: %s\n",msg); |
| ret = false; |
| } |
| else if (comp.complType() == ReturnValue) { |
| char* msg = comp.value()->toString(interp->globalExec()).ascii(); |
| fprintf(stderr,"Return value: %s\n",msg); |
| } |
| } |
| |
| } // end block, so that Interpreter and global get deleted |
| |
| return ret ? 0 : 1; |
| } |
| |
| #include "testqtbindings.moc" |