Ejemplo n.º 1
0
    private void DeclareParameterSymbols(ref mdr.CallFrame callFrame)
    {
      var parameters = _currFuncMetadata.FunctionIR.Parameters;

      //Extend missing arguments
      callFrame.SetExpectedArgsCount(parameters.Count);

      if (_currScope.HasArgumentsSymbol)
      {
        ///In this case, we already read/write from the arguments.Elements[i] for the symbol. 
        ///however, we should always refer to the arguments variable itself since its .Elements 
        ///may be resized and changed
        ///we cannot rely on the argument symbol's variable for this since the progremmer
        ///may write the arguments symbol and we can lose the value, so we keep our own separately

        Arguments = JSFunctionArguments.CreateArgumentsObject(ref callFrame, Context);
        var symbols = _currScope.Symbols;
        for (var i = parameters.Count; i < symbols.Count; ++i) //Hopefully "arguments" is the symbol almost immediately after the parameters
        {
          var symbol = symbols[i];
          if (symbol.SymbolType == JSSymbol.SymbolTypes.Arguments)
          {
            SymbolValues[symbol.ValueIndex].Set(Arguments);
            break;
          }
        }
      }
      else
      {
        Arguments = null;
        var i = parameters.Count;
        if (i > callFrame.PassedArgsCount)
          i = callFrame.PassedArgsCount;
        for (i = i - 1; i >= 0; --i)
        {
          var symbol = parameters[i].Symbol;
          Debug.Assert(symbol.ParameterIndex == i, "Invalid situation!, symbol {0} should be paramter with parameter index {1} instead of {2}", symbol.Name, i, symbol.ParameterIndex);
          if (symbol.SymbolType == JSSymbol.SymbolTypes.ClosedOnLocal)
          {
            var pd = Context.Map.GetPropertyDescriptorByFieldId(symbol.FieldId);
            Debug.Assert(
              pd != null
              && !pd.HasAttributes(mdr.PropertyDescriptor.Attributes.Undefined | mdr.PropertyDescriptor.Attributes.Inherited | mdr.PropertyDescriptor.Attributes.Accessor)
              , "Invalid situation, symbol {0} is not properly added to context", symbol.Name);
            Context.Fields[pd.Index] = callFrame.Arg(i);
            SymbolValues[symbol.ValueIndex].Set(pd);
          }
        }
      }
    }