summaryrefslogtreecommitdiffstats
path: root/kjs/DESIGN.ideas
diff options
context:
space:
mode:
Diffstat (limited to 'kjs/DESIGN.ideas')
-rw-r--r--kjs/DESIGN.ideas110
1 files changed, 110 insertions, 0 deletions
diff --git a/kjs/DESIGN.ideas b/kjs/DESIGN.ideas
new file mode 100644
index 000000000..d7684b45b
--- /dev/null
+++ b/kjs/DESIGN.ideas
@@ -0,0 +1,110 @@
+Get rid of SourceElementsNode by integrating its functionality into
+StatementNode.
+
+==========================================================================
+
+The hash value of a string could be calculated at creation time and be
+stored in the UString instance for later use by the lookup functions.
+
+==========================================================================
+
+Proposal for a new object model. Far from being complete.
+
+ Object Type
++---------+ +-------------+
+| type | ----------------> | toString() |
+| | | toNumber() |
+| data | | .... |
++---------+ | construct() |
+ | +-------------+
+ | | /|\
+ \|/ | |
++---------+ | |
+| type | | |
+| | Shared (optional) \|/ |
+| data | +-------------+
++---------+ +---------+ | types |
+ /|\ | |<------| gc | Interpreter/Environment
+ +-------| | | .... |
+ | | | excp state |
+ +---------+ +-------------+
+ Garbage Collector
+
+Features:
+ - offers class static data (nice replacement for pointers to member
+ function objects in the prototype object)
+ - no more need to pass around ExecState pointers for the C++ user
+ (substituted with the need for Object* in the type implementation)
+ - simple types are stored simple (no new'ed Imp objects)
+
+Alternative A: pass around Object by pointer rather than value
+ rather than new'ing they should come out of a pool
+
+Alternative B: instead of virtual functions like toBoolean(), Type could
+ have an array of function pointers which can be modified
+ on the fly and checked for != 0.
+
+Limitations: Konqueror's requirement to allow access to other frame's
+ interpreter data but flagging errors on the caller's side
+ is not satisfied.
+
+class Interpreter;
+
+class Type {
+public:
+ Type(Interpreter* i, Type *b) : ip(i), bs(b) { }
+ virtual UString name() const = 0;
+ Type* base() const { return bs; }
+ Interpreter* interpreter() const { return ip; }
+
+ virtual bool toBoolean(Object *o);
+ // ....
+ virtual Object construct(const List &args);
+
+ // factory
+ Boolean newBoolean(bool b) { return Boolean(interpreter(), b); }
+
+private:
+ Interpreter* ip;
+ Type* bs;
+};
+
+union Data {
+ bool b;
+ double d;
+ // UString ???
+ Shared* sh;
+};
+
+class Object {
+public:
+ // creation
+ Boolean newBoolean(bool b) { return Boolean(typ->interpreter(), b); }
+
+ // conversion
+ bool to Boolean() const { return typ->toBoolean(this); }
+
+ // this object's "parent"
+ Interpreter* interpreter() const { return typ->ip; }
+private:
+ Type* typ;
+ Data dat;
+};
+
+class Boolean : public Object {
+public:
+ // used by convenience function newBoolean()
+ Boolean(Interpreter *i, bool b) {
+ typ = i->booleanType();
+ dat.b = b;
+ }
+ Boolean(const Boolean &b) {
+ typ = b.typ;
+ dat.b = b.b;
+ }
+ Boolean& operator=(const Boolean &b) {
+ type = b.typ;
+ dat.b = b.b;
+ return *this;
+ }
+};