3

It’s all the day that I’m trying to make this code working. It should be the same code presented in the QScript help page but unfortunately it doesn’t work at all!

class Person
{
public:
 QString nm;

 Person()
 {

 }

 Person(QString& name)
  :nm(name)
 {

 }
};

Q_DECLARE_METATYPE(Person)
Q_DECLARE_METATYPE(Person*)

QScriptValue Person_ctor(QScriptContext* c,QScriptEngine* e)
{
 QString x = c->argument(0).toString();
 return e->toScriptValue(Person(x));
}

QScriptValue Person_prototype_toString(QScriptContext* c,QScriptEngine* e)
{
 Person* per = qscriptvalue_cast(c->thisObject());
 qDebug(qPrintable(per->nm));
 return e->undefinedValue();
}


....
 QScriptValue per_ctr = eng->newFunction(Person_ctor);
 per_ctr.property("prototype").setProperty("toString",eng->newFunction(Person_prototype_toString));
 per_ctr.property("prototype").setProperty("myPrint",eng->newFunction(Person_prototype_toString));
 eng->globalObject().setProperty("Person",per_ctr);
...

If I try to evaluate the following code in JavaScript

var p = new Person("Guido");
p.toString();
p.myPrint();

I should obtain:

Guido
Guido

instead what I really obtain is a white string from the toString function (probabily is calling the Object.toString function) and a “Interpreter Error: line 2: TypeError: Result of expression ‘p.myPrint’ [undefined] is not a function.” error message from myPrint. I suppose that I didn’t connect correctly the two functions to the Person prototype even if I tried to follow litteraly the documentation pages…PLEASE Could someone explains me what is my fault?!? Thanks!

Guido
  • 41
  • 2

2 Answers2

0

what happens if you remove the brackets after toString and myPrint?

koo5
  • 485
  • 4
  • 9
  • if I remove the brackets var p = new Person("Guido"); p.toString; p.myPrint; I have no error messages but I have not Guido Guido like I was expecting but an empty string... – Guido Aug 23 '10 at 14:06
  • return e->toScriptValue(Person()); shouldnt it be return e->toScriptValue(Person(x)); ? – koo5 Aug 23 '10 at 14:22
  • thanks for the notification! unfortunately it is not the problem... :( it continues to act in the same way (white string from toString and error message from myPrint) – Guido Aug 23 '10 at 14:33
  • how about qDebug() << qPrintable(per->nm); looks like qDebug() is a constructor http://doc.qt.nokia.com/4.6/qdebug.html#QDebug-2 – koo5 Aug 23 '10 at 14:44
  • f I try to check the presence of the property myPrint from the C++ side with per_ctr.property("prototype").property("myPrint").call(); the function is called (even if it clearly crashes because it’s not called on a valid object). But this means that at least in the c++ side of the application the myPrint function exists in the Person’s prototype. I cannot say the same thing in the JavaScript side when i get an Interpreter Error: line 2: TypeError: Result of expression ‘v.myPrint’ [undefined] is not a function. – Guido Aug 23 '10 at 16:52
0

Shouldn't:

Person* per = qscriptvalue_cast(c->thisObject());

be:

Person per = qscriptvalue_cast(c->thisObject());