0
|
1 using System;
|
|
2
|
|
3 namespace Jint.Runtime.VM
|
|
4 {
|
|
5 public class Frame
|
|
6 {
|
|
7 BoxBase[] m_data;
|
|
8 RuntimeContext m_runtimeContext;
|
|
9
|
|
10 public Frame (int size, RuntimeContext runtime)
|
|
11 {
|
|
12 if (size < 0)
|
|
13 throw new ArgumentOutOfRangeException ("size");
|
|
14 if (runtime == null)
|
|
15 throw new ArgumentNullException ("runtime");
|
|
16
|
|
17 m_data = new BoxBase[size];
|
|
18 m_runtimeContext = runtime;
|
|
19 }
|
|
20
|
|
21 public RuntimeContext Runtime {
|
|
22 get { return m_runtimeContext; }
|
|
23 }
|
|
24
|
|
25 public T Get<T> (int index)
|
|
26 {
|
|
27 var bbox = m_data [index];
|
|
28
|
|
29 if (bbox == null)
|
|
30 return default(T);
|
|
31
|
|
32 var box = bbox as IGetter<T>;
|
|
33 if (box != null)
|
|
34 return box.Get();
|
|
35 else
|
|
36 return bbox.Convert<T>();
|
|
37 }
|
|
38
|
|
39 public void Set<T> (int index, T value)
|
|
40 {
|
|
41 var bbox = m_data [index];
|
|
42 var box = bbox as ISetter<T>;
|
|
43 if (box != null)
|
|
44 box.Set (value);
|
|
45 else
|
|
46 m_data [index] = m_runtimeContext.BoxValue(value);
|
|
47 }
|
|
48
|
|
49 public BoxBase GetBox(int index) {
|
|
50 return m_data[index];
|
|
51 }
|
|
52
|
|
53 public void SetBox(int index, BoxBase box) {
|
|
54 m_data [index] = box;
|
|
55 }
|
|
56
|
|
57 }
|
|
58 }
|
|
59
|