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 #ifndef GNASH_AS_NAMESPACE_H
00019 #define GNASH_AS_NAMESPACE_H
00020
00021 #include "string_table.h"
00022 #include <map>
00023
00024
00025 namespace gnash {
00026 namespace abc {
00027 class Class;
00028 }
00029 class ClassHierarchy;
00030 class string_table;
00031 }
00032
00033 namespace gnash {
00034 namespace abc {
00035
00037
00040
00044
00047 class Namespace
00048 {
00049 public:
00050
00052 Namespace()
00053 :
00054 _parent(0),
00055 _uri(0),
00056 _prefix(0),
00057 _scripts(),
00058 mRecursePrevent(false),
00059 _private(false),
00060 _protected(false),
00061 _package(false)
00062 {}
00063
00064 void markReachableResources() const { }
00065
00067 void setParent(Namespace* p) { _parent = p; }
00068
00069 Namespace* getParent() { return _parent; }
00070
00072 void setURI(string_table::key name) { _uri = name; }
00073
00075 string_table::key getURI() const { return _uri; }
00076
00078 string_table::key getPrefix() const { return _prefix; }
00079
00082 bool addScript(string_table::key name, Class* a)
00083 {
00084 if (getScriptInternal(name)) return false;
00085 _scripts[static_cast<std::size_t>(name)] = a;
00086 return true;
00087 }
00088
00089 void stubPrototype(ClassHierarchy& ch, string_table::key name);
00090
00093 Class* getScript(string_table::key name)
00094 {
00095 if (mRecursePrevent) return NULL;
00096
00097 Class* found = getScriptInternal(name);
00098
00099 if (found || !getParent()) return found;
00100
00101 mRecursePrevent = true;
00102 found = getParent()->getScript(name);
00103 mRecursePrevent = false;
00104 return found;
00105 }
00106
00107 void dump(string_table& st);
00108
00109 void setPrivate() { _private = true; }
00110 void unsetPrivate() { _private = false; }
00111 bool isPrivate() { return _private; }
00112
00113 void setProtected() { _protected = true; }
00114 void unsetProtected() { _protected = false; }
00115 bool isProtected() { return _protected; }
00116
00117 void setPackage() { _package = true; }
00118 void unsetPackage() { _package = false; }
00119 bool isPackage() { return _package; }
00120
00121 private:
00122
00123 Namespace* _parent;
00124 string_table::key _uri;
00125 string_table::key _prefix;
00126
00127 typedef std::map<string_table::key, Class*> container;
00128 container _scripts;
00129 mutable bool mRecursePrevent;
00130
00131 bool _private;
00132 bool _protected;
00133 bool _package;
00134
00135 Class* getScriptInternal(string_table::key name) const
00136 {
00137 container::const_iterator i;
00138
00139 if (_scripts.empty()) return NULL;
00140
00141 i = _scripts.find(name);
00142
00143 if (i == _scripts.end()) return NULL;
00144 return i->second;
00145 }
00146 };
00147
00148 }
00149 }
00150
00151 #endif