diff --git a/src/imports/qtcanvas3d/context3d.cpp b/src/imports/qtcanvas3d/context3d.cpp
index 95c02846bdbce68238dc7e32d23e093278eea479..abb2b8cadb2926b740ca15acf83ca56790667ad6 100644
--- a/src/imports/qtcanvas3d/context3d.cpp
+++ b/src/imports/qtcanvas3d/context3d.cpp
@@ -2049,25 +2049,29 @@ void CanvasContext::attachShader(QJSValue program3D, QJSValue shader3D)
 /*!
  * \internal
  */
-QVariantList CanvasContext::getAttachedShaders(QJSValue program3D)
+QJSValue CanvasContext::getAttachedShaders(QJSValue program3D)
 {
     qCDebug(canvas3drendering).nospace() << "Context3D::" << __FUNCTION__
                                          << "(program3D:" << program3D.toString()
                                          << ")";
 
-    QVariantList shaderList;
+    int index = 0;
 
     CanvasProgram *program = getAsProgram3D(program3D);
 
-    if (!program || !checkParent(program, __FUNCTION__))
-        return shaderList;
+    if (!program || !checkParent(program, __FUNCTION__)) {
+        m_error |= CANVAS_INVALID_VALUE;
+        return QJSValue(QJSValue::NullValue);
+    }
 
     QList<CanvasShader *> shaders = program->attachedShaders();
 
+    QJSValue shaderList = m_engine->newArray(shaders.count());
+
     for (QList<CanvasShader *>::const_iterator iter = shaders.constBegin();
          iter != shaders.constEnd(); iter++) {
         CanvasShader *shader = *iter;
-        shaderList << QVariant::fromValue(shader);
+        shaderList.setProperty(index++, m_engine->newQObject((CanvasShader *)shader));
     }
 
     return shaderList;
diff --git a/src/imports/qtcanvas3d/context3d_p.h b/src/imports/qtcanvas3d/context3d_p.h
index a45c944faaf41655c4051adb21cd5dbda21a1e47..60ffcfe49af5eaf9a021689a5c466d3f8fda516a 100644
--- a/src/imports/qtcanvas3d/context3d_p.h
+++ b/src/imports/qtcanvas3d/context3d_p.h
@@ -1160,7 +1160,7 @@ public:
 
     Q_INVOKABLE CanvasActiveInfo *getActiveAttrib(QJSValue program, uint index);
     Q_INVOKABLE CanvasActiveInfo *getActiveUniform(QJSValue program, uint index);
-    Q_INVOKABLE QVariantList getAttachedShaders(QJSValue program);
+    Q_INVOKABLE QJSValue getAttachedShaders(QJSValue program);
 
     Q_INVOKABLE void stencilFunc(glEnums func, int ref, uint mask);
     Q_INVOKABLE void stencilFuncSeparate(glEnums face, glEnums func, int ref, uint mask);