1/* 2 * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) 3 * Copyright (C) 2001 Peter Kelly (pmk@post.com) 4 * Copyright (C) 2003, 2007, 2013 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 "CodeProfiling.h" 28#include "Debugger.h" 29#include "Interpreter.h" 30#include "JSGlobalObject.h" 31#include "JSLock.h" 32#include "JSCInlines.h" 33#include "Parser.h" 34#include <wtf/WTFThreadData.h> 35 36namespace JSC { 37 38bool checkSyntax(ExecState* exec, const SourceCode& source, JSValue* returnedException) 39{ 40 JSLockHolder lock(exec); 41 RELEASE_ASSERT(exec->vm().atomicStringTable() == wtfThreadData().atomicStringTable()); 42 43 ProgramExecutable* program = ProgramExecutable::create(exec, source); 44 JSObject* error = program->checkSyntax(exec); 45 if (error) { 46 if (returnedException) 47 *returnedException = error; 48 return false; 49 } 50 51 return true; 52} 53 54bool checkSyntax(VM& vm, const SourceCode& source, ParserError& error) 55{ 56 JSLockHolder lock(vm); 57 RELEASE_ASSERT(vm.atomicStringTable() == wtfThreadData().atomicStringTable()); 58 RefPtr<ProgramNode> programNode = parse<ProgramNode>(&vm, source, 0, Identifier(), JSParseNormal, JSParseProgramCode, error); 59 return programNode; 60} 61 62JSValue evaluate(ExecState* exec, const SourceCode& source, JSValue thisValue, JSValue* returnedException) 63{ 64 JSLockHolder lock(exec); 65 RELEASE_ASSERT(exec->vm().atomicStringTable() == wtfThreadData().atomicStringTable()); 66 RELEASE_ASSERT(!exec->vm().isCollectorBusy()); 67 68 CodeProfiling profile(source); 69 70 ProgramExecutable* program = ProgramExecutable::create(exec, source); 71 if (!program) { 72 if (returnedException) 73 *returnedException = exec->vm().exception(); 74 75 exec->vm().clearException(); 76 return jsUndefined(); 77 } 78 79 if (!thisValue || thisValue.isUndefinedOrNull()) 80 thisValue = exec->vmEntryGlobalObject(); 81 JSObject* thisObj = jsCast<JSObject*>(thisValue.toThis(exec, NotStrictMode)); 82 JSValue result = exec->interpreter()->execute(program, exec, thisObj); 83 84 if (exec->hadException()) { 85 if (returnedException) 86 *returnedException = exec->exception(); 87 88 exec->clearException(); 89 return jsUndefined(); 90 } 91 92 RELEASE_ASSERT(result); 93 return result; 94} 95 96} // namespace JSC 97