int main(int argc, char **argv) { QCoreApplication app(argc, argv); QScriptEngine eng; ByteArrayClass *baClass = new ByteArrayClass(&eng); eng.globalObject().setProperty("ByteArray", baClass->constructor()); qDebug() << "ba = new ByteArray(4):" << eng.evaluate("ba = new ByteArray(4)").toString(); qDebug() << "ba instanceof ByteArray:" << eng.evaluate("ba instanceof ByteArray").toBool(); qDebug() << "ba.length:" << eng.evaluate("ba.length").toNumber(); qDebug() << "ba[1] = 123; ba[1]:" << eng.evaluate("ba[1] = 123; ba[1]").toNumber(); qDebug() << "ba[7] = 224; ba.length:" << eng.evaluate("ba[7] = 224; ba.length").toNumber(); qDebug() << "for-in loop:" << eng.evaluate("result = '';\n" "for (var p in ba) {\n" " if (result.length > 0)\n" " result += ', ';\n" " result += '(' + p + ',' + ba[p] + ')';\n" "} result").toString(); qDebug() << "ba.toBase64():" << eng.evaluate("b64 = ba.toBase64()").toString(); qDebug() << "ba.toBase64().toLatin1String():" << eng.evaluate("b64.toLatin1String()").toString(); qDebug() << "ba.valueOf():" << eng.evaluate("ba.valueOf()").toString(); qDebug() << "ba.chop(2); ba.length:" << eng.evaluate("ba.chop(2); ba.length").toNumber(); qDebug() << "ba2 = new ByteArray(ba):" << eng.evaluate("ba2 = new ByteArray(ba)").toString(); qDebug() << "ba2.equals(ba):" << eng.evaluate("ba2.equals(ba)").toBool(); qDebug() << "ba2.equals(new ByteArray()):" << eng.evaluate("ba2.equals(new ByteArray())").toBool(); return 0; }
QScriptValue ByteArrayClass::toScriptValue(QScriptEngine *eng, const QByteArray &ba) { QScriptValue ctor = eng->globalObject().property("ByteArray"); ByteArrayClass *cls = qscriptvalue_cast<ByteArrayClass*>(ctor.data()); if (!cls) return eng->newVariant(QVariant::fromValue(ba)); return cls->newInstance(ba); }
QScriptValue ByteArrayClass::construct(QScriptContext *ctx, QScriptEngine *) { ByteArrayClass *cls = qscriptvalue_cast<ByteArrayClass*>(ctx->callee().data()); if (!cls) return QScriptValue(); QScriptValue arg = ctx->argument(0); if (arg.instanceOf(ctx->callee())) return cls->newInstance(qscriptvalue_cast<QByteArray>(arg)); int size = arg.toInt32(); return cls->newInstance(size); }
int main(int argc, char *argv[]) { QApplication *app; if (argc >= 2 && !qstrcmp(argv[1], "-tty")) { ++argv; --argc; app = new QApplication(argc, argv, QApplication::Tty); } else { app = new QApplication(argc, argv); } QScriptEngine *eng = new QScriptEngine(); QScriptValue globalObject = eng->globalObject(); globalObject.setProperty("load", eng->newFunction(loadScripts, /*length=*/1)); { if (!globalObject.property("qt").isObject()) globalObject.setProperty("qt", eng->newObject()); QScriptValue qscript = eng->newObject(); qscript.setProperty("importExtension", eng->newFunction(importExtension)); globalObject.property("qt").setProperty("script", qscript); } ByteArrayClass *byteArrayClass = new ByteArrayClass(eng); globalObject.setProperty("ByteArray", byteArrayClass->constructor()); if (! *++argv) { interactive(eng); return EXIT_SUCCESS; } while (const char *arg = *argv++) { QString fn = QString::fromLocal8Bit(arg); if (fn == QLatin1String("-i")) { interactive(eng); break; } QString contents; int lineNumber = 1; if (fn == QLatin1String("-")) { QTextStream stream(stdin, QFile::ReadOnly); contents = stream.readAll(); } else { QFile file(fn); if (file.open(QFile::ReadOnly)) { QTextStream stream(&file); contents = stream.readAll(); file.close(); // strip off #!/usr/bin/env qscript line if (contents.startsWith("#!")) { contents.remove(0, contents.indexOf("\n")); ++lineNumber; } } } if (contents.isEmpty()) continue; QScriptValue r = eng->evaluate(contents, fn, lineNumber); if (eng->hasUncaughtException()) { QStringList backtrace = eng->uncaughtExceptionBacktrace(); fprintf (stderr, " %s\n%s\n\n", qPrintable(r.toString()), qPrintable(backtrace.join("\n"))); return EXIT_FAILURE; } } delete eng; delete app; return EXIT_SUCCESS; }
QScriptValue FilePrototype::newByteArray(const QByteArray &bytes) { ByteArrayClass *cls = getByteArrayClass(engine()); return cls ? cls->newInstance(bytes) : engine()->newVariant(QVariant::fromValue(bytes)); }