Beispiel #1
0
        public static void DeclareVariable(mdr.DObject context, string field, int fieldId, ref Stack stack)
        {
            //we may be looking at a global or this might be second time we call this function with the same context, so following assert will fail (incorrectly)
            //Debug.Assert(!context.HasOwnPropertyByFieldId(fieldId), "Cannot redeclare local variable {0}", field);

            context.AddOwnPropertyDescriptorByFieldId(fieldId, mdr.PropertyDescriptor.Attributes.Data | mdr.PropertyDescriptor.Attributes.NotConfigurable);
        }
        public static mdr.DArray CreateArgumentsObject(ref mdr.CallFrame callFrame, mdr.DObject context)
        {
            var metadata = (JSFunctionMetadata)callFrame.Function.Metadata;

            Debug.Assert(metadata.Scope.HasArgumentsSymbol, "Invalid situation, created arguments for the wrong scope!");
            mdr.DArray arguments = null;
            if (metadata.Scope.IsEvalFunction)
            {
                //Read from context
                var tmp = new mdr.DValue();
                context.GetField(JSFunctionArguments.Name, ref tmp);
                arguments = tmp.AsDArray();
            }
            else
            {
                arguments = CreateArgumentsObject(ref callFrame);
                var parameters = metadata.FunctionIR.Parameters;
                Debug.Assert(arguments.Length >= parameters.Count, "arguments array is not large enough to hold all arguments.");
                for (var i = parameters.Count - 1; i >= 0; --i)
                {
                    var symbol     = parameters[i].Symbol;
                    var paramIndex = symbol.ParameterIndex;
                    Debug.Assert(paramIndex == i, "Invalid situation!, Parameter indexes don't match!");

                    if (symbol.SymbolType == JSSymbol.SymbolTypes.ClosedOnLocal)
                    {
                        var pd = context.AddOwnPropertyDescriptorByFieldId(symbol.FieldId, mdr.PropertyDescriptor.Attributes.Accessor | mdr.PropertyDescriptor.Attributes.NotConfigurable);
                        context.Fields[pd.Index].Set(new ArgumentAccessor(arguments, paramIndex));
                    }
                }
                if (metadata.Scope.HasEval)
                {
                    context.SetField(JSFunctionArguments.Name, arguments);
                }
            }
            return(arguments);
        }