X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/ba379fdc102753d6be2c4d937058fe40257329fe..14957cd040308e3eeec43d26bae5d76da13fcd85:/runtime/JSFunction.h?ds=sidebyside diff --git a/runtime/JSFunction.h b/runtime/JSFunction.h index b27e515..42fd62a 100644 --- a/runtime/JSFunction.h +++ b/runtime/JSFunction.h @@ -24,112 +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 { - friend class JIT; - friend class VPtrSet; + EncodedJSValue JSC_HOST_CALL callHostFunctionAsConstructor(ExecState*); - typedef InternalFunction Base; + class JSFunction : public JSObjectWithGlobalObject { + friend class JIT; + friend class JSGlobalData; - JSFunction(PassRefPtr structure) - : InternalFunction(structure) - { - clearScopeChain(); - } + typedef JSObjectWithGlobalObject Base; public: - JSFunction(ExecState*, PassRefPtr, int length, const Identifier&, NativeFunction); - JSFunction(ExecState*, const Identifier&, FunctionBodyNode*, ScopeChainNode*); - ~JSFunction(); - - virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); - virtual void put(ExecState*, const Identifier& propertyName, JSValue, 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&); - JSValue call(ExecState*, JSValue thisValue, const ArgList&); + const UString& name(ExecState*); + const UString displayName(ExecState*); + const UString calculatedDisplayName(ExecState*); - void setScope(const ScopeChain& scopeChain) { setScopeChain(scopeChain); } - ScopeChain& scope() { return 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 JS_EXPORTDATA const ClassInfo info; + static JS_EXPORTDATA const ClassInfo s_info; - static PassRefPtr createStructure(JSValue 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); } -#if ENABLE(JIT) - bool isHostFunction() const { return m_body && m_body->isHostFunction(); } -#else - bool isHostFunction() const { return false; } -#endif - NativeFunction nativeFunction() - { - return *reinterpret_cast(m_data); - } + NativeFunction nativeFunction(); virtual ConstructType getConstructData(ConstructData&); virtual CallType getCallData(CallData&); + protected: + const static unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesVisitChildren | OverridesGetPropertyNames | JSObject::StructureFlags; + private: - virtual const ClassInfo* classInfo() const { return &info; } + explicit JSFunction(VPtrStealingHackType); - static JSValue argumentsGetter(ExecState*, const Identifier&, const PropertySlot&); - static JSValue callerGetter(ExecState*, const Identifier&, const PropertySlot&); - static JSValue lengthGetter(ExecState*, const Identifier&, const PropertySlot&); + bool isHostFunctionNonInline() const; - RefPtr m_body; - ScopeChain& scopeChain() - { - ASSERT(!isHostFunction()); - return *reinterpret_cast(m_data); - } - void clearScopeChain() - { - ASSERT(!isHostFunction()); - new (m_data) ScopeChain(NoScopeChain()); - } - void setScopeChain(ScopeChainNode* sc) - { - ASSERT(!isHostFunction()); - new (m_data) ScopeChain(sc); - } - void setScopeChain(const ScopeChain& sc) - { - ASSERT(!isHostFunction()); - *reinterpret_cast(m_data) = sc; - } - void setNativeFunction(NativeFunction func) - { - *reinterpret_cast(m_data) = func; - } - unsigned char m_data[sizeof(void*)]; + 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&); + + WriteBarrier m_executable; + WriteBarrier m_scopeChain; }; JSFunction* asFunction(JSValue); inline JSFunction* asFunction(JSValue value) { - ASSERT(asObject(value)->inherits(&JSFunction::info)); + ASSERT(asObject(value)->inherits(&JSFunction::s_info)); return static_cast(asObject(value)); }