annotate dmdscript_tango/program.d @ 0:55c2951c07be

initial, files origin, premoved tree
author saaadel
date Sun, 24 Jan 2010 12:34:47 +0200
parents
children 8363a4bf6a8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2005 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
22 module dmdscript.program;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.stdio;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25 import std.c.stdlib;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27 import dmdscript.script;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28 import dmdscript.dobject;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29 import dmdscript.dglobal;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30 import dmdscript.functiondefinition;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 import dmdscript.statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 import dmdscript.threadcontext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33 import dmdscript.value;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34 import dmdscript.opcodes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35 import dmdscript.darray;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 import dmdscript.parse;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 import dmdscript.scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 import dmdscript.text;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 import dmdscript.property;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 class Program
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 uint errors; // if any errors in file
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 CallContext *callcontext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 FunctionDefinition globalfunction;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 // Locale info
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 uint lcid; // current locale
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 tchar[] slist; // list separator
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 this()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 initContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 void initContext()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 //writefln("Program.initContext()");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 if (callcontext) // if already done
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 return;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 callcontext = new CallContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 CallContext *cc = callcontext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 // Do object inits
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 ThreadContext *tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 assert(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 dobject_init(tc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 cc.prog = this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 // Create global object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 cc.global = new Dglobal(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 Dobject[] scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 scopex ~= cc.global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 cc.variable = cc.global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 cc.scopex = scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 cc.scoperoot++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83 cc.globalroot++;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 assert(tc.Ddate_prototype.proptable.table.length != 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 /**************************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 * Two ways of calling this:
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 * 1. with text representing group of topstatements (pfd == null)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 * 2. with text representing a function name & body (pfd != null)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 void compile(char[] progIdentifier, tchar[] srctext, FunctionDefinition *pfd)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 TopStatement[] topstatements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 tchar[] msg;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 //writef("parse_common()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 Parser p = new Parser(progIdentifier, srctext, 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 if (p.parseProgram(topstatements, &errinfo))
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 topstatements[] = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 throw new ScriptException(&errinfo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 if (pfd)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 { // If we are expecting a function, we should have parsed one
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 assert(p.lastnamedfunc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 *pfd = p.lastnamedfunc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115 // Build empty function definition array
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 // Make globalfunction an anonymous one (by passing in null for name) so
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 // it won't get instantiated as a property
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 globalfunction = new FunctionDefinition(0, 1, null, null, null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 // Any functions parsed in topstatements wind up in the global
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 // object (cc.global), where they are found by normal property lookups.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 // Any global new top statements only get executed once, and so although
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 // the previous group of topstatements gets lost, it does not matter.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 // In essence, globalfunction encapsulates the *last* group of topstatements
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 // passed to script, and any previous version of globalfunction, along with
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 // previous topstatements, gets discarded.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 globalfunction.topstatements = topstatements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 // If pfd, it is not really necessary to create a global function just
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 // so we can do the semantic analysis, we could use p.lastnamedfunc
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 // instead if we're careful to insure that p.lastnamedfunc winds up
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 // as a property of the global object.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 Scope sc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 sc.ctor(this, globalfunction); // create global scope
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 sc.src = srctext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 globalfunction.semantic(&sc);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 msg = sc.errinfo.message;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 if (msg) // if semantic() failed
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 globalfunction.topstatements[] = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 globalfunction.topstatements = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 globalfunction = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 throw new ScriptException(&sc.errinfo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 if (pfd)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 // If expecting a function, that is the only topstatement we should
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 // have had
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 (*pfd).toIR(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 globalfunction.toIR(null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 // Don't need parse trees anymore, so null'ing the pointer allows
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 // the garbage collector to find & free them.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 globalfunction.topstatements[] = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 globalfunction.topstatements = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 /*******************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 * Execute program.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 * Throw ScriptException on error.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 void execute(char[][] args)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 // ECMA 10.2.1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 //writef("Program.execute(argc = %d, argv = %p)\n", argc, argv);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 //writef("Program.execute()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 initContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 Value[] locals;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 Value ret;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 Value* result;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 CallContext *cc = callcontext;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 Darray arguments;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 Dobject dglobal = cc.global;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 Program program_save;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 // Set argv and argc for execute
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 arguments = new Darray();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 dglobal.Put(TEXT_arguments, arguments, DontDelete | DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 arguments.length.putVnumber(args.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 for (int i = 0; i < args.length; i++)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 arguments.Put(i, args[i], DontEnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 Value[] p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 Value* v;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 version (Win32) // eh and alloca() not working under linux
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 if (globalfunction.nlocals < 128)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 v = cast(Value*)alloca(globalfunction.nlocals * Value.sizeof);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202 if (v)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
203 locals = v[0 .. globalfunction.nlocals];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
204 else
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
205 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
206 p1 = new Value[globalfunction.nlocals];
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
207 locals = p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
208 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
209
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
210 // Instantiate global variables as properties of global
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
211 // object with 0 attributes
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
212 globalfunction.instantiate(cc.scopex, cc.variable, 0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
213
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
214 // cc.scopex.reserve(globalfunction.withdepth + 1);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
215
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
216 // The 'this' value is the global object
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
217 //printf("cc.scopex.ptr = %x, cc.scopex.length = %d\n", cc.scopex.ptr, cc.scopex.length);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
218 program_save = getProgram();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
219 try
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
220 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
221 setProgram(this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
222 ret.putVundefined();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
223 result = cast(Value*)IR.call(cc, cc.global, globalfunction.code, &ret, locals.ptr);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
224 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
225 finally
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
226 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
227 setProgram(program_save);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
228 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
229 //writef("-Program.execute()\n");
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
230 if (result)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
231 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
232 ErrInfo errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
233
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
234 result.getErrInfo(&errinfo, cc.linnum);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
235 cc.linnum = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
236 delete p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
237 throw new ScriptException(&errinfo);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
238 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
239
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
240 delete p1;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
241 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
242
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
243 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
244 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
245 if (globalfunction)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
246 globalfunction.toBuffer(buf);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
247 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
248
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
249 /***********************************************
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
250 * Get/Set Program associated with this thread.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
251 * This enables multiple scripts (Programs) running simultaneously
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
252 * in different threads.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
253 * It is needed because which Program is being run is essentially
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
254 * global data - and this makes it thread local data.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
255 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
256
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
257 static Program getProgram()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
258 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
259 ThreadContext *tc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
260
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
261 tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
262 assert(tc != null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
263 return tc.program;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
264 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
265
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
266 static void setProgram(Program p)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
267 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
268 ThreadContext *tc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
269
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
270 tc = ThreadContext.getThreadContext();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
271
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
272 assert(tc != null);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
273 tc.program = p;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
274 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
275
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
276 }