Home | History | Annotate | Download | only in runtime
      1 /*
      2  *  Copyright (C) 1999-2001 Harri Porten (porten (at) kde.org)
      3  *  Copyright (C) 2001 Peter Kelly (pmk (at) post.com)
      4  *  Copyright (C) 2003, 2007 Apple Inc.
      5  *
      6  *  This library is free software; you can redistribute it and/or
      7  *  modify it under the terms of the GNU Library General Public
      8  *  License as published by the Free Software Foundation; either
      9  *  version 2 of the License, or (at your option) any later version.
     10  *
     11  *  This library is distributed in the hope that it will be useful,
     12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  *  Library General Public License for more details.
     15  *
     16  *  You should have received a copy of the GNU Library General Public License
     17  *  along with this library; see the file COPYING.LIB.  If not, write to
     18  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     19  *  Boston, MA 02110-1301, USA.
     20  *
     21  */
     22 
     23 #include "config.h"
     24 #include "Completion.h"
     25 
     26 #include "CallFrame.h"
     27 #include "JSGlobalObject.h"
     28 #include "JSLock.h"
     29 #include "Interpreter.h"
     30 #include "Parser.h"
     31 #include "Debugger.h"
     32 #include <stdio.h>
     33 
     34 namespace JSC {
     35 
     36 Completion checkSyntax(ExecState* exec, const SourceCode& source)
     37 {
     38     JSLock lock(exec);
     39     ASSERT(exec->globalData().identifierTable == currentIdentifierTable());
     40 
     41     RefPtr<ProgramExecutable> program = ProgramExecutable::create(exec, source);
     42     JSObject* error = program->checkSyntax(exec);
     43     if (error)
     44         return Completion(Throw, error);
     45 
     46     return Completion(Normal);
     47 }
     48 
     49 Completion evaluate(ExecState* exec, ScopeChain& scopeChain, const SourceCode& source, JSValue thisValue)
     50 {
     51     JSLock lock(exec);
     52     ASSERT(exec->globalData().identifierTable == currentIdentifierTable());
     53 
     54     RefPtr<ProgramExecutable> program = ProgramExecutable::create(exec, source);
     55     JSObject* error = program->compile(exec, scopeChain.node());
     56     if (error)
     57         return Completion(Throw, error);
     58 
     59     JSObject* thisObj = (!thisValue || thisValue.isUndefinedOrNull()) ? exec->dynamicGlobalObject() : thisValue.toObject(exec);
     60 
     61     JSValue exception;
     62     JSValue result = exec->interpreter()->execute(program.get(), exec, scopeChain.node(), thisObj, &exception);
     63 
     64     if (exception) {
     65         if (exception.isObject() && asObject(exception)->isWatchdogException())
     66             return Completion(Interrupted, exception);
     67         return Completion(Throw, exception);
     68     }
     69     return Completion(Normal, result);
     70 }
     71 
     72 } // namespace JSC
     73