コード例 #1
0
            public UdonHeapValueStorage(IUdonHeap heap, IUdonSymbolTable symbolTable, string symbolKey)
            {
                this.heap = heap;

                bool isValid = symbolTable.TryGetAddressFromSymbol(UdonSharpUtils.UnmanglePropertyFieldName(symbolKey), out symbolAddress) &&
                               heap.GetHeapVariableType(symbolAddress) == typeof(T) &&
                               heap.TryGetHeapVariable <T>(symbolAddress, out _);

                if (!isValid)
                {
                    symbolAddress = 0xFFFFFFFF;
                }
            }
コード例 #2
0
ファイル: ValueTable.cs プロジェクト: ureishi/UdonSharp
        private string GetUniqueValueName(TypeSymbol type, Value.ValueFlags flags, string symbolName)
        {
            string uniqueName;

            symbolName = UdonSharpUtils.UnmanglePropertyFieldName(symbolName);

            if ((flags & Value.ValueFlags.Field) != 0 ||
                (flags & Value.ValueFlags.Parameter) != 0 ||
                (flags & Value.ValueFlags.Reflection) != 0)
            {
                uniqueName = symbolName;
            }
            else
            {
                string namePrefix = "";

                switch (flags)
                {
                case Value.ValueFlags.Constant:
                    namePrefix = "const_";
                    break;

                case Value.ValueFlags.Internal:
                    namePrefix = "intnl_";
                    break;

                case Value.ValueFlags.Local:
                    namePrefix = "lcl_";
                    break;

                case Value.ValueFlags.Parameter:
                    namePrefix = "param_";
                    break;

                case Value.ValueFlags.PropertyBackingField:
                    namePrefix = "prop_";
                    break;

                case Value.ValueFlags.UdonThis:
                    namePrefix = "this_";
                    break;

                case Value.ValueFlags.InternalGlobal:
                    namePrefix = "gintnl_";
                    break;
                }

                string valueName = $"__{namePrefix}{(symbolName != null ? $"{symbolName}_" : "")}{type.UdonType.ExternSignature}";

                if (!_uniqueIDTracker.TryGetValue(valueName, out int counter))
                {
                    _uniqueIDTracker.Add(valueName, 0);
                }

                uniqueName = $"{valueName}_{counter}";

                _uniqueIDTracker[valueName] = counter + 1;
            }

            if (_nameCollisionCheckSet.Contains(uniqueName))
            {
                throw new InvalidOperationException("Cannot allocate a symbol with the same name twice");
            }

            _nameCollisionCheckSet.Add(uniqueName);

            return(uniqueName);
        }