QVariant KJSProxyImpl::evaluate(QString filename, int baseLine,
                                const QString&str, const DOM::Node &n, Completion *completion) {
  // evaluate code. Returns the JS return value or an invalid QVariant
  // if there was none, an error occured or the type couldn't be converted.

  initScript();
  // inlineCode is true for <a href="javascript:doSomething()">
  // and false for <script>doSomething()</script>. Check if it has the
  // expected value in all cases.
  // See smart window.open policy for where this is used.
  bool inlineCode = filename.isNull();
  //kdDebug(6070) << "KJSProxyImpl::evaluate inlineCode=" << inlineCode << endl;

#ifdef KJS_DEBUGGER
  if (inlineCode)
    filename = "(unknown file)";
  if (KJSDebugWin::instance()) {
    KJSDebugWin::instance()->attach(m_script);
    KJSDebugWin::instance()->setNextSourceInfo(filename,baseLine);
  //    KJSDebugWin::instance()->setMode(KJSDebugWin::Step);
  }
#else
  Q_UNUSED(baseLine);
#endif

  m_script->setInlineCode(inlineCode);
  Window* window = Window::retrieveWindow( m_part );
  KJS::Value thisNode = n.isNull() ? Window::retrieve( m_part ) : getDOMNode(m_script->globalExec(),n);

  UString code( str );

  KJSCPUGuard guard;
  guard.start();
  Completion comp = m_script->evaluate(code, thisNode);
  guard.stop();

  bool success = ( comp.complType() == Normal ) || ( comp.complType() == ReturnValue );

  if (completion)
    *completion = comp;

#ifdef KJS_DEBUGGER
    //    KJSDebugWin::instance()->setCode(QString::null);
#endif

  window->afterScriptExecution();

  // let's try to convert the return value
  if (success && !comp.value().isNull())
    return ValueToVariant( m_script->globalExec(), comp.value());
  else
  {
    if ( comp.complType() == Throw )
    {
        UString msg = comp.value().toString(m_script->globalExec());
        kdWarning(6070) << "Script threw exception: " << msg.qstring() << endl;
    }
    return QVariant();
  }
}
Example #2
0
void KJSDebugWin::slotEval()
{
    // Work out which execution state to use. If we're currently in a debugging session,
    // use the current context - otherwise, use the global execution state from the interpreter
    // corresponding to the currently displayed source file.
    ExecState *exec;
    Object thisobj;
    if(m_execStates.isEmpty())
    {
        if(m_sourceSel->currentItem() < 0)
            return;
        SourceFile *sourceFile = m_sourceSelFiles.at(m_sourceSel->currentItem());
        if(!sourceFile->interpreter)
            return;
        exec = sourceFile->interpreter->globalExec();
        thisobj = exec->interpreter()->globalObject();
    }
    else
    {
        exec = m_execStates.top();
        thisobj = exec->context().thisValue();
    }

    // Evaluate the js code from m_evalEdit
    UString code(m_evalEdit->code());
    QString msg;

    KJSCPUGuard guard;
    guard.start();

    Interpreter *interp = exec->interpreter();

    Object obj = Object::dynamicCast(interp->globalObject().get(exec, "eval"));
    List args;
    args.append(String(code));

    m_evalDepth++;
    Value retval = obj.call(exec, thisobj, args);
    m_evalDepth--;
    guard.stop();

    // Print the return value or exception message to the console
    if(exec->hadException())
    {
        Value exc = exec->exception();
        exec->clearException();
        msg = "Exception: " + exc.toString(interp->globalExec()).qstring();
    }
    else
    {
        msg = retval.toString(interp->globalExec()).qstring();
    }

    m_evalEdit->insert(msg + "\n");
    updateContextList();
}