36 |
#include "extcall.h" |
#include "extcall.h" |
37 |
|
|
38 |
struct ExtCallNode *CreateExtCall(struct ExternalFunc *efunc, |
struct ExtCallNode *CreateExtCall(struct ExternalFunc *efunc, |
39 |
struct gl_list_t *args, |
struct gl_list_t *args, |
40 |
struct Instance *subject, |
struct Instance *subject, |
41 |
struct Instance *data) |
struct Instance *data |
42 |
{ |
){ |
43 |
struct ExtCallNode *ext; |
struct ExtCallNode *ext; |
44 |
struct Instance **hndl=NULL; |
struct Instance **hndl=NULL; |
45 |
unsigned long pos; |
unsigned long pos; |
48 |
CONSOLE_DEBUG("..."); |
CONSOLE_DEBUG("..."); |
49 |
int i,n; |
int i,n; |
50 |
struct Instance *inst; |
struct Instance *inst; |
51 |
char *tmp; |
/* char *tmp; */ |
52 |
n = gl_length(args); |
n = gl_length(args); |
53 |
for(i = 1; i < n; ++i){ |
for(i = 1; i < n; ++i){ |
54 |
inst = (struct Instance *)gl_fetch(args,i); |
inst = (struct Instance *)gl_fetch(args,i); |
59 |
} |
} |
60 |
|
|
61 |
ext = ASC_NEW(struct ExtCallNode); |
ext = ASC_NEW(struct ExtCallNode); |
62 |
|
CONSOLE_DEBUG("ASSIGNING efunc = %p TO ExtCallNode %p",efunc,ext); |
63 |
ext->efunc = efunc; |
ext->efunc = efunc; |
64 |
ext->arglist = args; |
ext->arglist = args; |
65 |
if (data) { |
if(data){ |
66 |
hndl = AddVarToTable(data,&added); /** FIX FIX FIX **/ |
hndl = AddVarToTable(data,&added); /** FIX FIX FIX **/ |
67 |
} |
} |
68 |
ext->data = hndl; |
ext->data = hndl; |
69 |
if (subject) { |
|
70 |
|
if(subject){ |
71 |
pos = GetSubjectIndex(args,subject); |
pos = GetSubjectIndex(args,subject); |
72 |
ext->subject = pos; |
ext->subject = pos; |
73 |
} else { |
}else{ |
74 |
ext->subject = 0L; |
ext->subject = 0L; |
75 |
} |
} |
76 |
|
|
77 |
ext->nodestamp = -1; |
ext->nodestamp = -1; |
78 |
return ext; |
return ext; |
79 |
} |
} |
80 |
|
|
81 |
void DestroyExtCall(struct ExtCallNode *ext, struct Instance *relinst) |
void DestroyExtCall(struct ExtCallNode *ext, struct Instance *relinst){ |
|
{ |
|
82 |
struct Instance *ptr; |
struct Instance *ptr; |
83 |
unsigned long len1, c1; |
unsigned long len1, c1; |
84 |
unsigned long len2, c2; |
unsigned long len2, c2; |
133 |
} |
} |
134 |
|
|
135 |
unsigned long GetSubjectIndex(struct gl_list_t *arglist, |
unsigned long GetSubjectIndex(struct gl_list_t *arglist, |
136 |
struct Instance *subject) |
struct Instance *subject |
137 |
{ |
){ |
138 |
unsigned long len1,c1,len2,c2; |
unsigned long len1,c1,len2,c2; |
139 |
struct gl_list_t *branch; |
struct gl_list_t *branch; |
140 |
struct Instance *arg; |
struct Instance *arg; |
164 |
} |
} |
165 |
|
|
166 |
unsigned long CountNumberOfArgs(struct gl_list_t *arglist, |
unsigned long CountNumberOfArgs(struct gl_list_t *arglist, |
167 |
unsigned long start, unsigned long end) |
unsigned long start, unsigned long end |
168 |
{ |
){ |
169 |
unsigned long c,count=0L; |
unsigned long c,count=0L; |
170 |
struct gl_list_t *branch; |
struct gl_list_t *branch; |
171 |
|
|
185 |
} |
} |
186 |
|
|
187 |
struct gl_list_t *LinearizeArgList(struct gl_list_t *arglist, |
struct gl_list_t *LinearizeArgList(struct gl_list_t *arglist, |
188 |
unsigned long start, unsigned long end) |
unsigned long start, unsigned long end |
189 |
{ |
){ |
190 |
struct gl_list_t *result,*branch; |
struct gl_list_t *result,*branch; |
191 |
struct Instance *arg; |
struct Instance *arg; |
192 |
unsigned long c1,len2,c2; |
unsigned long c1,len2,c2; |
229 |
} |
} |
230 |
} |
} |
231 |
|
|
232 |
struct gl_list_t *CopySpecialList(struct gl_list_t *list) |
struct gl_list_t *CopySpecialList(struct gl_list_t *list){ |
|
{ |
|
233 |
unsigned long len1,c1,len2,c2; |
unsigned long len1,c1,len2,c2; |
234 |
struct gl_list_t *result,*branch,*tmp; |
struct gl_list_t *result,*branch,*tmp; |
235 |
struct Instance *arg; |
struct Instance *arg; |
257 |
return NULL; |
return NULL; |
258 |
} |
} |
259 |
|
|
260 |
struct ExternalFunc *ExternalCallExtFuncF(struct ExtCallNode *ext) |
struct ExternalFunc *ExternalCallExtFuncF(struct ExtCallNode *ext){ |
|
{ |
|
261 |
return ext->efunc; |
return ext->efunc; |
262 |
} |
} |
263 |
|
|
264 |
struct gl_list_t *ExternalCallArgListF(struct ExtCallNode *ext) |
struct gl_list_t *ExternalCallArgListF(struct ExtCallNode *ext){ |
|
{ |
|
265 |
return ext->arglist; |
return ext->arglist; |
266 |
} |
} |
267 |
|
|
268 |
struct Instance *ExternalCallDataInstance(struct ExtCallNode *ext) |
struct Instance *ExternalCallDataInstance(struct ExtCallNode *ext){ |
|
{ |
|
269 |
struct Instance **hndl; |
struct Instance **hndl; |
270 |
hndl = ext->data; |
hndl = ext->data; |
271 |
if(hndl!=NULL){ |
if(hndl!=NULL){ |
279 |
} |
} |
280 |
} |
} |
281 |
|
|
282 |
int ExternalCallNodeStampF(struct ExtCallNode *ext) |
int ExternalCallNodeStampF(struct ExtCallNode *ext){ |
|
{ |
|
283 |
return ext->nodestamp; |
return ext->nodestamp; |
284 |
} |
} |
285 |
|
|
286 |
void SetExternalCallNodeStamp(struct ExtCallNode *ext, |
void SetExternalCallNodeStamp(struct ExtCallNode *ext, int nodestamp){ |
|
int nodestamp) |
|
|
{ |
|
287 |
if (ext->nodestamp==-1) { |
if (ext->nodestamp==-1) { |
288 |
ext->nodestamp = nodestamp; |
ext->nodestamp = nodestamp; |
289 |
} |
} |
290 |
} |
} |
291 |
|
|
292 |
unsigned long ExternalCallVarIndexF(struct ExtCallNode *ext) |
unsigned long ExternalCallVarIndexF(struct ExtCallNode *ext){ |
|
{ |
|
293 |
return ext->subject; |
return ext->subject; |
294 |
} |
} |
295 |
|
|
296 |
struct Instance *ExternalCallVarInstance(struct ExtCallNode *ext) |
struct Instance *ExternalCallVarInstance(struct ExtCallNode *ext){ |
|
{ |
|
297 |
struct Instance *i; |
struct Instance *i; |
298 |
assert(ext->subject); |
assert(ext->subject); |
299 |
i = GetSubjectInstance(ext->arglist,ext->subject); |
i = GetSubjectInstance(ext->arglist,ext->subject); |