This repository was archived by the owner on Apr 10, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathIdFunctionObject.cs
More file actions
196 lines (167 loc) · 5.88 KB
/
Copy pathIdFunctionObject.cs
File metadata and controls
196 lines (167 loc) · 5.88 KB
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
//------------------------------------------------------------------------------
// <license file="IdFunctionObject.cs">
//
// The use and distribution terms for this software are contained in the file
// named 'LICENSE', which can be found in the resources directory of this
// distribution.
//
// By using this software in any fashion, you are agreeing to be bound by the
// terms of this license.
//
// </license>
//------------------------------------------------------------------------------
using System;
namespace EcmaScript.NET
{
public class IdFunctionObject : BaseFunction
{
public IdFunctionObject ()
{
;
}
override public int Arity
{
get
{
return arity;
}
}
override public int Length
{
get
{
return Arity;
}
}
override public string FunctionName
{
get
{
return (functionName == null) ? "" : functionName;
}
}
public IdFunctionObject (IIdFunctionCall idcall, object tag, int id, int arity)
{
if (arity < 0)
throw new ArgumentException ();
this.idcall = idcall;
this.tag = tag;
this.m_MethodId = id;
this.arity = arity;
if (arity < 0)
throw new ArgumentException ();
}
public IdFunctionObject (IIdFunctionCall idcall, object tag, int id, string name, int arity, IScriptable scope)
: base (scope, null)
{
if (arity < 0)
throw new ArgumentException ();
if (name == null)
throw new ArgumentException ();
this.idcall = idcall;
this.tag = tag;
this.m_MethodId = id;
this.arity = arity;
this.functionName = name;
}
public virtual void InitFunction (string name, IScriptable scope)
{
if (name == null)
throw new ArgumentException ();
if (scope == null)
throw new ArgumentException ();
this.functionName = name;
ParentScope = scope;
}
public bool HasTag (object tag)
{
return this.tag == tag;
}
public int MethodId
{
get
{
return m_MethodId;
}
}
public void MarkAsConstructor (IScriptable prototypeProperty)
{
useCallAsConstructor = true;
ImmunePrototypeProperty = prototypeProperty;
}
public void AddAsProperty (IScriptable target)
{
AddAsProperty (target, ScriptableObject.DONTENUM);
}
public void AddAsProperty (IScriptable target, int attributes)
{
ScriptableObject.DefineProperty (target, functionName, this, attributes);
}
public virtual void ExportAsScopeProperty ()
{
AddAsProperty (ParentScope);
}
public virtual void ExportAsScopeProperty (int attributes)
{
AddAsProperty (ParentScope, attributes);
}
public override IScriptable GetPrototype ()
{
// Lazy initialization of prototype: for native functions this
// may not be called at all
IScriptable proto = base.GetPrototype ();
if (proto == null) {
proto = GetFunctionPrototype (ParentScope);
SetPrototype (proto);
}
return proto;
}
public override object Call (Context cx, IScriptable scope, IScriptable thisObj, object [] args)
{
return idcall.ExecIdCall (this, cx, scope, thisObj, args);
}
public override IScriptable CreateObject (Context cx, IScriptable scope)
{
if (useCallAsConstructor) {
return null;
}
// Throw error if not explicitly coded to be used as constructor,
// to satisfy ECMAScript standard (see bugzilla 202019).
// To follow current (2003-05-01) SpiderMonkey behavior, change it to:
// return super.createObject(cx, scope);
throw ScriptRuntime.TypeErrorById ("msg.not.ctor", functionName);
}
internal override string Decompile (int indent, int flags)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder ();
bool justbody = (0 != (flags & Decompiler.ONLY_BODY_FLAG));
if (!justbody) {
sb.Append ("function ");
sb.Append (FunctionName);
sb.Append ("() { ");
}
sb.Append ("[native code for ");
if (idcall is IScriptable) {
IScriptable sobj = (IScriptable)idcall;
sb.Append (sobj.ClassName);
sb.Append ('.');
}
sb.Append (FunctionName);
sb.Append (", arity=");
sb.Append (Arity);
sb.Append (justbody ? "]\n" : "] }\n");
return sb.ToString ();
}
public Exception Unknown ()
{
// It is program error to call id-like methods for unknown function
return new Exception ("BAD FUNCTION ID=" + m_MethodId + " MASTER=" + idcall);
}
private IIdFunctionCall idcall;
private object tag;
private int m_MethodId;
private int arity;
private bool useCallAsConstructor;
private string functionName;
}
}