2  * Copyright (C) 2014 Apple Inc. All rights reserved. 
   4  * Redistribution and use in source and binary forms, with or without 
   5  * modification, are permitted provided that the following conditions 
   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. 
  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. 
  28 #include "BuiltinExecutables.h" 
  30 #include "BuiltinNames.h" 
  31 #include "Executable.h" 
  32 #include "JSCInlines.h" 
  37 BuiltinExecutables::BuiltinExecutables(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 
  45 UnlinkedFunctionExecutable
* BuiltinExecutables::createBuiltinExecutable(const SourceCode
& source
, const Identifier
& name
) 
  47     JSTextPosition positionBeforeLastNewline
; 
  49     RefPtr
<ProgramNode
> program 
= parse
<ProgramNode
>(&m_vm
, source
, 0, Identifier(), JSParseBuiltin
, JSParseProgramCode
, error
, &positionBeforeLastNewline
); 
  52         dataLog("Fatal error compiling builtin function '", name
.string(), "': ", error
.m_message
); 
  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()); 
  65     body
->setEndPosition(positionBeforeLastNewline
); 
  67     RELEASE_ASSERT(body
->ident().isNull()); 
  69     // This function assumes an input string that would result in a single anonymous function expression. 
  70     body
->setEndPosition(positionBeforeLastNewline
); 
  72     for (const auto& closedVariable 
: program
->closedVariables()) { 
  73         if (closedVariable 
== m_vm
.propertyNames
->arguments
.impl()) 
  76         if (closedVariable 
== m_vm
.propertyNames
->undefinedKeyword
.impl()) 
  78         RELEASE_ASSERT(closedVariable
->isEmptyUnique()); 
  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
; 
  86 #define DEFINE_BUILTIN_EXECUTABLES(name, functionName, length) \ 
  87 UnlinkedFunctionExecutable* BuiltinExecutables::name##Executable() \ 
  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();\ 
  93 JSC_FOREACH_BUILTIN(DEFINE_BUILTIN_EXECUTABLES
) 
  94 #undef EXPOSE_BUILTIN_SOURCES