1 // 2 // Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 3 // Free Software Foundation, Inc 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with this program; if not, write to the Free Software 17 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 #ifndef GNASH_SWF_FUNCTION_H 20 #define GNASH_SWF_FUNCTION_H 21 22 #include <vector> 23 #include <cassert> 24 #include <string> 25 26 #include "ConstantPool.h" 27 #include "UserFunction.h" 28 #include "ObjectURI.h" 29 30 // Forward declarations 31 namespace gnash { 32 class action_buffer; 33 class as_object; 34 class VM; 35 } 36 37 namespace gnash { 38 39 class TargetGuard 40 { 41 public: 42 43 // @param ch : target to set temporarely 44 // @param och : original target to set temporarily 45 TargetGuard(as_environment& e, DisplayObject* ch, DisplayObject* och); 46 ~TargetGuard(); 47 48 private: 49 50 as_environment& env; 51 DisplayObject* from; 52 DisplayObject* from_orig; 53 54 }; 55 56 /// A simple SWF-defined Function 57 // 58 /// This represents a callable Function defined in a SWF. The basic version 59 /// creates a scope in which 'arguments' array, 'this', 'super', and the 60 /// expected argument names are defined. 61 // 62 /// For a more advanced function, see Function2. 63 class Function : public UserFunction 64 { 65 66 public: 67 68 typedef std::vector<as_object*> ScopeStack; 69 70 /// \brief 71 /// Create an ActionScript function as defined in an 72 /// action_buffer starting at offset 'start' 73 // 74 Function(const action_buffer& ab, as_environment& env, size_t start, 75 ScopeStack with_stack); 76 ~Function()77 virtual ~Function() {} 78 getScopeStack()79 const ScopeStack& getScopeStack() const { 80 return _scopeStack; 81 } 82 getActionBuffer()83 const action_buffer& getActionBuffer() const { 84 return _action_buffer; 85 } 86 getStartPC()87 size_t getStartPC() const { 88 return _startPC; 89 } 90 getLength()91 size_t getLength() const { 92 return _length; 93 } 94 95 /// Get the number of registers required for function execution. 96 // 97 /// For ordinary Functions this is always 0. registers()98 virtual std::uint8_t registers() const { 99 return 0; 100 } 101 102 /// Add an expected argument for the function. 103 // 104 /// For ordinary Functions the register is disregarded. This is only 105 /// relevant for Function2s. 106 // 107 /// All argument names are declared as variables in the function scope, 108 /// whether the argument is passed or not. 109 // 110 /// @param reg The register for the argument. 111 /// @param name The name of the argument. add_arg(std::uint8_t reg,const ObjectURI & name)112 void add_arg(std::uint8_t reg, const ObjectURI& name) { 113 _args.emplace_back(reg, name); 114 } 115 116 /// Set the length in bytes of the function code. 117 void setLength(size_t len); 118 119 /// Dispatch. 120 virtual as_value call(const fn_call& fn); 121 122 /// Mark reachable resources. Override from as_object 123 // 124 /// Reachable resources from this object are its scope stack 125 /// and the prototype. 126 /// 127 virtual void markReachableResources() const; 128 129 protected: 130 131 struct Argument 132 { ArgumentArgument133 Argument(std::uint8_t r, ObjectURI n) : reg(r), name(std::move(n)) {} 134 std::uint8_t reg; 135 ObjectURI name; 136 }; 137 138 std::vector<Argument> _args; 139 140 /// @@ might need some kind of ref count here, but beware cycles 141 as_environment& _env; 142 143 /// The ConstantPool in effect at time of function definition 144 const ConstantPool* _pool; 145 146 private: 147 148 /// Action buffer containing the function definition 149 const action_buffer& _action_buffer; 150 151 /// Scope stack on function definition. 152 ScopeStack _scopeStack; 153 154 /// \brief 155 /// Offset within the action_buffer where 156 /// start of the function is found. 157 size_t _startPC; 158 159 /// Length of the function within the action_buffer 160 // 161 /// This is currently expressed in bytes as the 162 /// action_buffer is just a blocḱ of memory corresponding 163 /// to a DoAction block 164 size_t _length; 165 166 }; 167 168 /// Add properties to an 'arguments' object. 169 // 170 /// The 'arguments' variable is an array with an additional 171 /// 'callee' member, set to the function being called. 172 as_object* getArguments(Function& callee, as_object& args, 173 const fn_call& fn, as_object* caller); 174 175 176 } // end of gnash namespace 177 178 #endif 179 180