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 "WTFThreadData.h"
     33 #include <stdio.h>
     34 
     35 namespace JSC {
     36 
     37 Completion checkSyntax(ExecState* exec, const SourceCode& source)
     38 {
     39     JSLock lock(exec);
     40     ASSERT(exec->globalData().identifierTable == wtfThreadData().currentIdentifierTable());
     41 
     42     ProgramExecutable* program = ProgramExecutable::create(exec, source);
     43     JSObject* error = program->checkSyntax(exec);
     44     if (error)
     45         return Completion(Throw, error);
     46 
     47     return Completion(Normal);
     48 }
     49 
     50 Completion evaluate(ExecState* exec, ScopeChainNode* scopeChain, const SourceCode& source, JSValue thisValue)
     51 {
     52     JSLock lock(exec);
     53     ASSERT(exec->globalData().identifierTable == wtfThreadData().currentIdentifierTable());
     54 
     55     ProgramExecutable* program = ProgramExecutable::create(exec, source);
     56     if (!program) {
     57         JSValue exception = exec->globalData().exception;
     58         exec->globalData().exception = JSValue();
     59         return Completion(Throw, exception);
     60     }
     61 
     62     JSObject* thisObj = (!thisValue || thisValue.isUndefinedOrNull()) ? exec->dynamicGlobalObject() : thisValue.toObject(exec);
     63 
     64     JSValue result = exec->interpreter()->execute(program, exec, scopeChain, thisObj);
     65 
     66     if (exec->hadException()) {
     67         JSValue exception = exec->exception();
     68         exec->clearException();
     69 
     70         ComplType exceptionType = Throw;
     71         if (exception.isObject())
     72             exceptionType = asObject(exception)->exceptionType();
     73         return Completion(exceptionType, exception);
     74     }
     75     return Completion(Normal, result);
     76 }
     77 
     78 } // namespace JSC
     79