X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..14957cd040308e3eeec43d26bae5d76da13fcd85:/runtime/JSFunction.h diff --git a/runtime/JSFunction.h b/runtime/JSFunction.h index 6a43737..42fd62a 100644 --- a/runtime/JSFunction.h +++ b/runtime/JSFunction.h @@ -24,77 +24,95 @@ #ifndef JSFunction_h #define JSFunction_h -#include "InternalFunction.h" -#include "JSVariableObject.h" -#include "SymbolTable.h" -#include "Nodes.h" -#include "JSObject.h" +#include "JSObjectWithGlobalObject.h" namespace JSC { - class FunctionBodyNode; + class ExecutableBase; + class FunctionExecutable; class FunctionPrototype; class JSActivation; class JSGlobalObject; + class NativeExecutable; + class VPtrHackExecutable; - class JSFunction : public InternalFunction { + EncodedJSValue JSC_HOST_CALL callHostFunctionAsConstructor(ExecState*); + + class JSFunction : public JSObjectWithGlobalObject { friend class JIT; - friend class Interpreter; + friend class JSGlobalData; - typedef InternalFunction Base; - - JSFunction(PassRefPtr structure) - : InternalFunction(structure) - , m_scopeChain(NoScopeChain()) - { - } + typedef JSObjectWithGlobalObject Base; public: - JSFunction(ExecState*, const Identifier&, FunctionBodyNode*, ScopeChainNode*); - ~JSFunction(); - - virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); - virtual void put(ExecState*, const Identifier& propertyName, JSValuePtr, PutPropertySlot&); - virtual bool deleteProperty(ExecState*, const Identifier& propertyName); + JSFunction(ExecState*, JSGlobalObject*, Structure*, int length, const Identifier&, NativeFunction); + JSFunction(ExecState*, JSGlobalObject*, Structure*, int length, const Identifier&, NativeExecutable*); + JSFunction(ExecState*, FunctionExecutable*, ScopeChainNode*); + virtual ~JSFunction(); - JSObject* construct(ExecState*, const ArgList&); - JSValuePtr call(ExecState*, JSValuePtr thisValue, const ArgList&); + const UString& name(ExecState*); + const UString displayName(ExecState*); + const UString calculatedDisplayName(ExecState*); - void setScope(const ScopeChain& scopeChain) { m_scopeChain = scopeChain; } - ScopeChain& scope() { return m_scopeChain; } + ScopeChainNode* scope() + { + ASSERT(!isHostFunctionNonInline()); + return m_scopeChain.get(); + } + void setScope(JSGlobalData& globalData, ScopeChainNode* scopeChain) + { + ASSERT(!isHostFunctionNonInline()); + m_scopeChain.set(globalData, this, scopeChain); + } - void setBody(FunctionBodyNode* body) { m_body = body; } - void setBody(PassRefPtr body) { m_body = body; } - FunctionBodyNode* body() const { return m_body.get(); } + ExecutableBase* executable() const { return m_executable.get(); } - virtual void mark(); + // To call either of these methods include Executable.h + inline bool isHostFunction() const; + FunctionExecutable* jsExecutable() const; - static const ClassInfo info; + static JS_EXPORTDATA const ClassInfo s_info; - static PassRefPtr createStructure(JSValuePtr prototype) + static Structure* createStructure(JSGlobalData& globalData, JSValue prototype) { - return Structure::create(prototype, TypeInfo(ObjectType, ImplementsHasInstance)); + return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); } - private: - virtual const ClassInfo* classInfo() const { return &info; } + NativeFunction nativeFunction(); virtual ConstructType getConstructData(ConstructData&); virtual CallType getCallData(CallData&); - static JSValuePtr argumentsGetter(ExecState*, const Identifier&, const PropertySlot&); - static JSValuePtr callerGetter(ExecState*, const Identifier&, const PropertySlot&); - static JSValuePtr lengthGetter(ExecState*, const Identifier&, const PropertySlot&); + protected: + const static unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesVisitChildren | OverridesGetPropertyNames | JSObject::StructureFlags; + + private: + explicit JSFunction(VPtrStealingHackType); + + bool isHostFunctionNonInline() const; + + virtual void preventExtensions(JSGlobalData&); + virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); + virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&); + virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties); + virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&); + virtual bool deleteProperty(ExecState*, const Identifier& propertyName); + + virtual void visitChildren(SlotVisitor&); + + static JSValue argumentsGetter(ExecState*, JSValue, const Identifier&); + static JSValue callerGetter(ExecState*, JSValue, const Identifier&); + static JSValue lengthGetter(ExecState*, JSValue, const Identifier&); - RefPtr m_body; - ScopeChain m_scopeChain; + WriteBarrier m_executable; + WriteBarrier m_scopeChain; }; - JSFunction* asFunction(JSValuePtr); + JSFunction* asFunction(JSValue); - inline JSFunction* asFunction(JSValuePtr value) + inline JSFunction* asFunction(JSValue value) { - ASSERT(asObject(value)->inherits(&JSFunction::info)); + ASSERT(asObject(value)->inherits(&JSFunction::s_info)); return static_cast(asObject(value)); }