forked from gfwilliams/tiny-js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathasObjects.h
173 lines (127 loc) · 4.44 KB
/
asObjects.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
* File: asObjects.h
* Author: ghernan
*
* Support for object oriented programming in AsyncScript.
* Contains the runtime objects for AsyncScript classes and objects
*
* Created on January 3, 2017, 11:16 AM
*/
#ifndef ASOBJECTS_H
#define ASOBJECTS_H
#pragma once
#include "jsVars.h"
#include "microVM.h"
/**
* Runtime object for classes
* @return
*/
class JSClass : public RefCountObj
{
public:
static Ref<JSClass> create (const std::string& name,
Ref<JSClass> parent,
const VarMap& members,
Ref<JSFunction> constructorFn);
static Ref<JSClass> createNative (const std::string& name,
Ref<JSClass> parent,
const VarMap& members,
const StringVector& params,
JSNativeFn nativeFn);
virtual std::string toString()const
{
return std::string("class ") + getName();
}
virtual StringSet getFields(bool inherited = true)const;
virtual ASValue readField(const std::string& key)const;
virtual const StringVector& getParams()const;
virtual const std::string& getName()const
{
return m_name;
}
Ref<JSClass> getParent()const
{
return m_parent;
}
ASValue getConstructor()const
{
return m_constructor;
}
ASValue value()
{
return ASValue(this, VT_CLASS);
}
static ASValue scSetEnv(ExecutionContext* ec);
protected:
JSClass(const std::string& name,
Ref<JSClass> parent,
const VarMap& members,
Ref<JSFunction> constructorFn);
private:
const std::string m_name;
VarMap m_members;
Ref<JSClass> m_parent;
ASValue m_constructor;
};
/**
* AsyncScript object class
*/
class JSObject : public RefCountObj
{
public:
static Ref<JSObject> create();
static Ref<JSObject> create(Ref<JSClass> cls);
virtual JSMutability getMutability()const
{
return m_mutability;
}
virtual ASValue freeze();
virtual ASValue deepFreeze(ASValue::ValuesMap& transformed);
virtual ASValue unFreeze(bool forceClone=false);
void setFrozen();
std::vector <ASValue > getKeys()const;
bool isWritable(const std::string& key)const;
// JSValue
/////////////////////////////////////////
virtual std::string toString(ExecutionContext* ec)const;
bool toBoolean(ExecutionContext* ec)const;
double toDouble(ExecutionContext* ec)const;
virtual ASValue readField(const std::string& key)const;
virtual ASValue writeField(const std::string& key, ASValue value, bool isConst);
virtual ASValue deleteField(const std::string& key);
virtual StringSet getFields(bool inherited = true)const;
virtual ASValue getAt(ASValue index, ExecutionContext* ec);
virtual ASValue setAt(ASValue index, ASValue value, ExecutionContext* ec);
virtual ASValue iterator(ExecutionContext* ec)const;
virtual double compare (const ASValue& b, ExecutionContext* ec)const;
virtual std::string getJSON(int indent);
/////////////////////////////////////////
ASValue setFieldProperty (const std::string& field, const std::string& propName, ASValue value);
ASValue getFieldProperty (const std::string& field, const std::string& propName)const;
Ref<JSClass> getClass()const
{
return m_cls;
}
ASValue value()
{
return ASValue(this, VT_OBJECT);
}
///'JSObject' default class
static Ref<JSClass> DefaultClass;
static ASValue scSetObjClass(ExecutionContext* ec);
protected:
JSObject(Ref<JSClass> cls, JSMutability mutability);
~JSObject();
JSObject(const JSObject& src, bool _mutable);
virtual Ref<JSObject> clone (bool _mutable);
static JSMutability selectMutability(const JSObject& src, bool _mutable);
ASValue callMemberFn (ASValue function, ExecutionContext* ec)const;
ASValue callMemberFn (ASValue function, ASValue p1, ExecutionContext* ec)const;
ASValue callMemberFn (ASValue function, ASValue p1, ASValue p2, ExecutionContext* ec)const;
private:
VarMap m_members;
Ref<JSClass> m_cls;
protected:
JSMutability m_mutability;
};
#endif /* ASOBJECTS_H */