#ifndef _RUNTIME_H_
#define _RUNTIME_H_
#include "list.h"
#include "object.h"
#include "value.h"
namespace KJS
{
namespace Bindings
{
class Instance;
class Method;
class RootObject;
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 ~Constructor() {};
};
class Field
{
public:
virtual const char *name() const = 0;
virtual RuntimeType type() const = 0;
virtual KJS::Value valueFromInstance(KJS::ExecState *exec, 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();
MethodList (const MethodList &other);
MethodList &operator=(const MethodList &other);
private:
Method **_methods;
unsigned int _length;
};
class Method
{
public:
virtual const char *name() const = 0;
virtual long numParameters() 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() {};
};
typedef void (*KJSDidExecuteFunctionPtr)(KJS::ExecState *exec, KJS::ObjectImp *rootObject);
class Instance
{
public:
typedef enum {
JavaLanguage,
ObjectiveCLanguage,
CLanguage
} BindingLanguage;
static void setDidExecuteFunction (KJSDidExecuteFunctionPtr func);
static KJSDidExecuteFunctionPtr didExecuteFunction ();
static Instance *createBindingForLanguageInstance (BindingLanguage language, void *instance);
static Object createRuntimeObject (BindingLanguage language, void *myInterface);
virtual void begin() {};
virtual void end() {};
virtual Class *getClass() const = 0;
virtual KJS::Value getValueOfField (KJS::ExecState *exec, 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(KJS::ExecState *exec, unsigned int index) const = 0;
virtual unsigned int getLength() const = 0;
virtual ~Array() {};
};
const char *signatureForParameters(const KJS::List &aList);
}
}
#endif