annotate dmdscript_tango/program.d @ 4:6d905019f7bf

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