comparison Jint.Runtime/VM/FunctionBuilder.cs @ 6:a6329b092499

Added scopes, function builder
author cin
date Wed, 30 Oct 2013 17:38:35 +0400
parents
children
comparison
equal deleted inserted replaced
5:cb13da6e3349 6:a6329b092499
1 using System;
2 using System.Collections.Generic;
3
4 namespace Jint.Runtime.VM
5 {
6 class FunctionBuidler
7 {
8 Scope m_parentScope;
9
10 /// <summary>
11 /// maps local variable names to the registers
12 /// </summary>
13 Dictionary<string,int> m_locals;
14
15 /// <summary>
16 /// maps formal parameters to local variables
17 /// </summary>
18 int[] m_formalParameters;
19
20 int m_frameSize;
21
22 IInstruction m_code;
23
24 RuntimeContext m_runtime;
25
26 public FunctionBuilder (string[] argumentNames, RuntimeContext runtime, Scope parentScope)
27 {
28 m_parentScope;
29 m_frameSize = 2; // reserve for this and scope
30
31 m_locals = new Dictionary<string,int>();
32
33 if (argumentNames!= null) {
34 m_formalParameters = new int[argumentNames.Length];
35 for(int i = 0; i < argumentNames.Length; i++)
36 m_formalParameters[i] = AllocVariable(argumentNames[i]);
37 }
38 }
39
40 // all vars should be allocated before temp registers
41 public int AllocVariable(string name) {
42 int id;
43
44 if (m_locals.TryGetValue (name, out id))
45 return id;
46
47 id = m_frameSize++;
48 m_locals [name] = id;
49 return id;
50 }
51
52 public int AllocateRegister() {
53 return m_frameSize++;
54 }
55
56 public void Invoke (object that, object[] args) {
57 var frame = new Frame (m_frameSize, m_runtime);
58 var scope = new Scope (m_locals, frame, m_declaringScope);
59 frame.SetValue (Frame.ThisRegister, that);
60 frame.SetValue (Frame.ScopeRegister, scope);
61
62 var paramLen = Math.Min (m_formalParameters.Length, args.Length);
63
64 for (int i=0; i< paramLen; i++)
65 frame.SetValue (m_formalParameters [i], args [i]);
66 }
67
68 }
69 }
70