Gnash  0.8.11dev
Function.h
Go to the documentation of this file.
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 
40 {
41 public:
42 
43  // @param ch : target to set temporarely
44  // @param och : original target to set temporarily
46  ~TargetGuard();
47 
48 private:
49 
50  as_environment& env;
51  DisplayObject* from;
52  DisplayObject* from_orig;
53 
54 };
55 
57 //
61 //
63 class Function : public UserFunction
64 {
65 
66 public:
67 
68  typedef std::vector<as_object*> ScopeStack;
69 
73  //
74  Function(const action_buffer& ab, as_environment& env, size_t start,
75  const ScopeStack& with_stack);
76 
77  virtual ~Function() {}
78 
79  const ScopeStack& getScopeStack() const {
80  return _scopeStack;
81  }
82 
83  const action_buffer& getActionBuffer() const {
84  return _action_buffer;
85  }
86 
87  size_t getStartPC() const {
88  return _startPC;
89  }
90 
91  size_t getLength() const {
92  return _length;
93  }
94 
96  //
98  virtual boost::uint8_t registers() const {
99  return 0;
100  }
101 
103  //
106  //
109  //
112  void add_arg(boost::uint8_t reg, const ObjectURI& name) {
113  _args.push_back(Argument(reg, name));
114  }
115 
117  void setLength(size_t len);
118 
120  virtual as_value call(const fn_call& fn);
121 
123  //
127  virtual void markReachableResources() const;
128 
129 protected:
130 
131  struct Argument
132  {
133  Argument(boost::uint8_t r, const ObjectURI& n) : reg(r), name(n) {}
134  boost::uint8_t reg;
136  };
137 
138  std::vector<Argument> _args;
139 
142 
145 
146 private:
147 
149  const action_buffer& _action_buffer;
150 
152  ScopeStack _scopeStack;
153 
157  size_t _startPC;
158 
160  //
164  size_t _length;
165 
166 };
167 
169 //
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