1/* 2 * Copyright (C) 2014 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 27#include "config.h" 28#include "BuiltinExecutables.h" 29 30#include "BuiltinNames.h" 31#include "Executable.h" 32#include "JSCInlines.h" 33#include "Parser.h" 34 35namespace JSC { 36 37BuiltinExecutables::BuiltinExecutables(VM& vm) 38 : m_vm(vm) 39#define INITIALIZE_BUILTIN_SOURCE_MEMBERS(name, functionName, length) , m_##name##Source(makeSource(StringImpl::createFromLiteral(s_##name, length))) 40 JSC_FOREACH_BUILTIN(INITIALIZE_BUILTIN_SOURCE_MEMBERS) 41#undef EXPOSE_BUILTIN_STRINGS 42{ 43} 44 45UnlinkedFunctionExecutable* BuiltinExecutables::createBuiltinExecutable(const SourceCode& source, const Identifier& name) 46{ 47 JSTextPosition positionBeforeLastNewline; 48 ParserError error; 49 RefPtr<ProgramNode> program = parse<ProgramNode>(&m_vm, source, 0, Identifier(), JSParseBuiltin, JSParseProgramCode, error, &positionBeforeLastNewline); 50 51 if (!program) { 52 dataLog("Fatal error compiling builtin function '", name.string(), "': ", error.m_message); 53 CRASH(); 54 } 55 56 StatementNode* exprStatement = program->singleStatement(); 57 RELEASE_ASSERT(exprStatement); 58 RELEASE_ASSERT(exprStatement->isExprStatement()); 59 ExpressionNode* funcExpr = static_cast<ExprStatementNode*>(exprStatement)->expr(); 60 RELEASE_ASSERT(funcExpr); 61 RELEASE_ASSERT(funcExpr->isFuncExprNode()); 62 FunctionBodyNode* body = static_cast<FuncExprNode*>(funcExpr)->body(); 63 RELEASE_ASSERT(!program->hasCapturedVariables()); 64 65 body->setEndPosition(positionBeforeLastNewline); 66 RELEASE_ASSERT(body); 67 RELEASE_ASSERT(body->ident().isNull()); 68 69 // This function assumes an input string that would result in a single anonymous function expression. 70 body->setEndPosition(positionBeforeLastNewline); 71 RELEASE_ASSERT(body); 72 for (const auto& closedVariable : program->closedVariables()) { 73 if (closedVariable == m_vm.propertyNames->arguments.impl()) 74 continue; 75 76 if (closedVariable == m_vm.propertyNames->undefinedKeyword.impl()) 77 continue; 78 RELEASE_ASSERT(closedVariable->isEmptyUnique()); 79 } 80 body->overrideName(name); 81 UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&m_vm, source, body, UnlinkedBuiltinFunction); 82 functionExecutable->m_nameValue.set(m_vm, functionExecutable, jsString(&m_vm, name.string())); 83 return functionExecutable; 84} 85 86#define DEFINE_BUILTIN_EXECUTABLES(name, functionName, length) \ 87UnlinkedFunctionExecutable* BuiltinExecutables::name##Executable() \ 88{\ 89 if (!m_##name##Executable)\ 90 m_##name##Executable = createBuiltinExecutable(m_##name##Source, m_vm.propertyNames->builtinNames().functionName##PublicName());\ 91 return m_##name##Executable.get();\ 92} 93JSC_FOREACH_BUILTIN(DEFINE_BUILTIN_EXECUTABLES) 94#undef EXPOSE_BUILTIN_SOURCES 95 96} 97