public override object Execute(ProtoCore.Runtime.Context c, Interpreter dsi)
        {
            Object retVal = base.Execute(c, dsi);

            if (retVal == null)
            {
                return(null);
            }

            StackValue propValue  = (StackValue)retVal;
            StackValue thisObject = dsi.runtime.rmem.Stack.Last();

            if (StackUtils.IsValidPointer(thisObject) && StackUtils.IsReferenceType(propValue))
            {
                int classIndex = (int)thisObject.metaData.type;
                if (classIndex != ProtoCore.DSASM.Constants.kInvalidIndex)
                {
                    var core    = dsi.runtime.Core;
                    int thisptr = (int)thisObject.opdata;

                    int        idx      = core.ClassTable.ClassNodes[classIndex].symbols.IndexOf(PropertyName);
                    StackValue oldValue = core.Heap.Heaplist[(int)thisObject.opdata].GetValue(idx, core);
                    if (!StackUtils.Equals(oldValue, propValue))
                    {
                        GCUtils.GCRetain(propValue, core);
                        core.Heap.Heaplist[thisptr].SetValue(idx, propValue);
                    }
                }
            }

            return(retVal);
        }
Example #2
0
            public bool IsHeapActive(StackValue sv)
            {
                if (!StackUtils.IsReferenceType(sv))
                {
                    return(false);
                }

                return(Heap.Heaplist[(int)sv.opdata].Active);
            }