Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GNASH_AS_ENVIRONMENT_H
00020 #define GNASH_AS_ENVIRONMENT_H
00021
00022 #include <string>
00023 #include <vector>
00024 #include <algorithm>
00025
00026 #include "as_value.h"
00027 #include "SafeStack.h"
00028
00029
00030 namespace gnash {
00031 class DisplayObject;
00032 class VM;
00033 class Global_as;
00034 class movie_root;
00035 class string_table;
00036 }
00037
00038 namespace gnash {
00039
00040
00042
00046
00049 class as_environment
00050 {
00051 public:
00052
00054 typedef std::vector<as_object*> ScopeStack;
00055
00056 as_environment(VM& vm);
00057
00058 VM& getVM() const { return _vm; }
00059
00060 DisplayObject* target() const { return _target; }
00061
00063
00067 void set_target(DisplayObject* target) {
00068 if (!_original_target) _original_target = target;
00069 _target = target;
00070 }
00071
00072 void set_original_target(DisplayObject* target) {
00073 _original_target = target;
00074 }
00075
00076 DisplayObject* get_original_target() const { return _original_target; }
00077
00078
00079 void reset_target() { _target = _original_target; }
00080
00082 void push(const as_value& val) {
00083 _stack.push(val);
00084 }
00085
00087 as_value pop()
00088 try {
00089 return _stack.pop();
00090 }
00091 catch (const StackException&) {
00092 return as_value();
00093 }
00094
00096
00101 as_value& top(size_t dist) const
00102 try {
00103 return _stack.top(dist);
00104 }
00105 catch (const StackException&) {
00106 return undefVal;
00107 }
00108
00110 void drop(size_t count) {
00111
00112
00113 _stack.drop(std::min(count, _stack.size()));
00114 }
00115
00116 size_t stack_size() const { return _stack.size(); }
00117
00119
00121 void markReachableResources() const;
00122
00124
00126 int get_version() const;
00127
00128 private:
00129
00130 VM& _vm;
00131
00133 SafeStack<as_value>& _stack;
00134
00136 DisplayObject* _target;
00137
00139 DisplayObject* _original_target;
00140
00141 static as_value undefVal;
00142
00143 };
00144
00146
00152 as_value getVariable(const as_environment& ctx, const std::string& varname,
00153 const as_environment::ScopeStack& scope, as_object** retTarget = 0);
00154
00156
00161
00166 void setVariable(const as_environment& ctx, const std::string& path,
00167 const as_value& val, const as_environment::ScopeStack& scope);
00168
00170
00174 bool delVariable(const as_environment& ctx, const std::string& varname,
00175 const as_environment::ScopeStack& scope);
00176
00195 bool parsePath(const std::string& var_path, std::string& path,
00196 std::string& var);
00197
00199
00201
00203
00207 as_object* findObject(const as_environment& ctx, const std::string& path,
00208 const as_environment::ScopeStack* scope = 0);
00209
00211
00214
00218 DisplayObject* findTarget(const as_environment& env, const std::string& path);
00219
00220 inline VM&
00221 getVM(const as_environment& env)
00222 {
00223 return env.getVM();
00224 }
00225
00226 movie_root& getRoot(const as_environment& env);
00227 string_table& getStringTable(const as_environment& env);
00228 int getSWFVersion(const as_environment& env);
00229 Global_as& getGlobal(const as_environment &env);
00230
00231 }
00232
00233 #endif
00234
00235
00236
00237
00238
00239