#ifndef _RUNTIME_H_
#define _RUNTIME_H_
#include "list.h"
#include "value.h"
namespace KJS
{
namespace Bindings
{
class Instance;
class Method;
typedef const char * RuntimeType;
class Parameter
{
public:
virtual RuntimeType type() const = 0;
virtual ~Parameter() {};
};
class Constructor
{
public:
virtual Parameter *parameterAt(long i) const = 0;
virtual long numParameters() const = 0;
virtual KJS::Value value() const = 0;
virtual ~Constructor() {};
};
class Field
{
public:
virtual const char *name() const = 0;
virtual RuntimeType type() const = 0;
virtual KJS::Value valueFromInstance(const Instance *instance) const = 0;
virtual void setValueToInstance(KJS::ExecState *exec, const Instance *instance, const KJS::Value &aValue) const = 0;
virtual ~Field() {};
};
class MethodList
{
public:
MethodList() : _methods(0), _length(0) {};
void addMethod (Method *aMethod);
unsigned int length() const;
Method *methodAt (unsigned int index) const;
~MethodList();
private:
Method **_methods;
unsigned int _length;
};
class Method
{
public:
virtual const char *name() const = 0;
virtual RuntimeType returnType() const = 0;
virtual Parameter *parameterAt(long i) const = 0;
virtual long numParameters() const = 0;
virtual KJS::Value value() const = 0;
virtual ~Method() {};
};
class Class
{
public:
virtual const char *name() const = 0;
virtual MethodList *methodsNamed(const char *name) const = 0;
virtual Constructor *constructorAt(long i) const = 0;
virtual long numConstructors() const = 0;
virtual Field *fieldNamed(const char *name) const = 0;
virtual ~Class() {};
};
class Instance
{
public:
typedef enum {
JavaLanguage,
ObjectiveCLanguage
} BindingLanguage;
static Instance *createBindingForLanguageInstance (BindingLanguage language, void *instance);
virtual void begin() {};
virtual void end() {};
virtual Class *getClass() const = 0;
virtual KJS::Value getValueOfField (const Field *aField) const;
virtual void setValueOfField (KJS::ExecState *exec, const Field *aField, const KJS::Value &aValue) const;
virtual KJS::Value invokeMethod (KJS::ExecState *exec, const MethodList *method, const KJS::List &args) = 0;
virtual KJS::Value defaultValue (KJS::Type hint) const = 0;
virtual KJS::Value valueOf() const { return KJS::String(getClass()->name()); };
virtual ~Instance() {};
};
class Array
{
public:
virtual void setValueAt(KJS::ExecState *exec, unsigned int index, const KJS::Value &aValue) const = 0;
virtual KJS::Value valueAt(unsigned int index) const = 0;
virtual unsigned int getLength() const = 0;
virtual ~Array() {};
};
const char *signatureForParameters(const KJS::List &aList);
}
}
#endif