⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 functionconstructor.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org) *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Lesser General Public *  License as published by the Free Software Foundation; either *  version 2 of the License, or (at your option) any later version. * *  This library is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Lesser General Public License for more details. * *  You should have received a copy of the GNU Lesser General Public *  License along with this library; if not, write to the Free Software *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA * */#include "config.h"#include "FunctionConstructor.h"#include "FunctionPrototype.h"#include "JSFunction.h"#include "JSGlobalObject.h"#include "JSString.h"#include "Parser.h"#include "Debugger.h"#include "Lexer.h"#include "Nodes.h"namespace JSC {ASSERT_CLASS_FITS_IN_CELL(FunctionConstructor);FunctionConstructor::FunctionConstructor(ExecState* exec, PassRefPtr<Structure> structure, FunctionPrototype* functionPrototype)    : InternalFunction(&exec->globalData(), structure, Identifier(exec, functionPrototype->classInfo()->className)){    putDirectWithoutTransition(exec->propertyNames().prototype, functionPrototype, DontEnum | DontDelete | ReadOnly);    // Number of arguments for constructor    putDirectWithoutTransition(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly | DontDelete | DontEnum);}static JSObject* constructWithFunctionConstructor(ExecState* exec, JSObject*, const ArgList& args){    return constructFunction(exec, args);}ConstructType FunctionConstructor::getConstructData(ConstructData& constructData){    constructData.native.function = constructWithFunctionConstructor;    return ConstructTypeHost;}static JSValuePtr callFunctionConstructor(ExecState* exec, JSObject*, JSValuePtr, const ArgList& args){    return constructFunction(exec, args);}// ECMA 15.3.1 The Function Constructor Called as a FunctionCallType FunctionConstructor::getCallData(CallData& callData){    callData.native.function = callFunctionConstructor;    return CallTypeHost;}FunctionBodyNode* extractFunctionBody(ProgramNode* program){    if (!program)        return 0;    StatementVector& children = program->children();    if (children.size() != 1)        return 0;    ExprStatementNode* exprStatement = static_cast<ExprStatementNode*>(children[0].get());     ASSERT(exprStatement->isExprStatement());    if (!exprStatement || !exprStatement->isExprStatement())        return 0;    FuncExprNode* funcExpr = static_cast<FuncExprNode*>(exprStatement->expr());    ASSERT(funcExpr->isFuncExprNode());    if (!funcExpr || !funcExpr->isFuncExprNode())        return 0;    FunctionBodyNode* body = funcExpr->body();    ASSERT(body);    return body;}// ECMA 15.3.2 The Function ConstructorJSObject* constructFunction(ExecState* exec, const ArgList& args, const Identifier& functionName, const UString& sourceURL, int lineNumber){    UString program;    if (args.isEmpty())        program = "(function(){})";    else if (args.size() == 1)        program = "(function(){" + args.at(exec, 0).toString(exec) + "})";    else {        program = "(function(" + args.at(exec, 0).toString(exec);        for (size_t i = 1; i < args.size() - 1; i++)            program += "," + args.at(exec, i).toString(exec);        program += "){" + args.at(exec, args.size() - 1).toString(exec) + "})";    }    int errLine;    UString errMsg;    SourceCode source = makeSource(program, sourceURL, lineNumber);    RefPtr<ProgramNode> programNode = exec->globalData().parser->parse<ProgramNode>(exec, exec->dynamicGlobalObject()->debugger(), source, &errLine, &errMsg);    FunctionBodyNode* body = extractFunctionBody(programNode.get());    if (!body)        return throwError(exec, SyntaxError, errMsg, errLine, source.provider()->asID(), source.provider()->url());    JSGlobalObject* globalObject = exec->lexicalGlobalObject();    ScopeChain scopeChain(globalObject, globalObject->globalData(), exec->globalThisValue());    return new (exec) JSFunction(exec, functionName, body, scopeChain.node());}// ECMA 15.3.2 The Function ConstructorJSObject* constructFunction(ExecState* exec, const ArgList& args){    return constructFunction(exec, args, Identifier(exec, "anonymous"), UString(), 1);}} // namespace JSC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -