You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kjs/DESIGN.ideas

111 lines
3.2 KiB

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;
}
};