All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.oracle.graal.python.nodes.frame.WriteGlobalNodeGen Maven / Gradle / Ivy

There is a newer version: 24.1.1
Show newest version
// CheckStyle: start generated
package com.oracle.graal.python.nodes.frame;

import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes.SetItemNode;
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodesFactory.SetItemNodeGen;
import com.oracle.graal.python.builtins.objects.dict.PDict;
import com.oracle.graal.python.builtins.objects.module.PythonModule;
import com.oracle.graal.python.lib.PyObjectSetItem;
import com.oracle.graal.python.lib.PyObjectSetItemNodeGen;
import com.oracle.graal.python.nodes.PGuards;
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.dsl.DSLSupport;
import com.oracle.truffle.api.dsl.GeneratedBy;
import com.oracle.truffle.api.dsl.NeverDefault;
import com.oracle.truffle.api.dsl.UnsupportedSpecializationException;
import com.oracle.truffle.api.dsl.DSLSupport.SpecializationDataNode;
import com.oracle.truffle.api.dsl.InlineSupport.InlineTarget;
import com.oracle.truffle.api.dsl.InlineSupport.ReferenceField;
import com.oracle.truffle.api.dsl.InlineSupport.StateField;
import com.oracle.truffle.api.dsl.InlineSupport.UnsafeAccessedField;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.DenyReplace;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.nodes.NodeCost;
import com.oracle.truffle.api.strings.TruffleString;
import com.oracle.truffle.api.utilities.TruffleWeakReference;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;

/**
 * Debug Info: 
 *   Specialization {@link WriteGlobalNode#writeDictObjectCached}
 *     Activation probability: 0.32000
 *     With/without class size: 10/4 bytes
 *   Specialization {@link WriteGlobalNode#writeDictObject}
 *     Activation probability: 0.26000
 *     With/without class size: 8/0 bytes
 *   Specialization {@link WriteGlobalNode#writeGenericDict}
 *     Activation probability: 0.20000
 *     With/without class size: 9/9 bytes
 *   Specialization {@link WriteGlobalNode#writeModuleCached}
 *     Activation probability: 0.14000
 *     With/without class size: 6/4 bytes
 *   Specialization {@link WriteGlobalNode#writeModule}
 *     Activation probability: 0.08000
 *     With/without class size: 4/0 bytes
 * 
*/ @GeneratedBy(WriteGlobalNode.class) @SuppressWarnings("javadoc") public final class WriteGlobalNodeGen extends WriteGlobalNode { private static final StateField STATE_0_UPDATER = StateField.create(MethodHandles.lookup(), "state_0_"); private static final StateField STATE_0_WriteGlobalNode_UPDATER = StateField.create(MethodHandles.lookup(), "state_0_"); static final ReferenceField WRITE_DICT_OBJECT_CACHED_CACHE_UPDATER = ReferenceField.create(MethodHandles.lookup(), "writeDictObjectCached_cache", WriteDictObjectCachedData.class); static final ReferenceField WRITE_MODULE_CACHED_CACHE_UPDATER = ReferenceField.create(MethodHandles.lookup(), "writeModuleCached_cache", WriteModuleCachedData.class); /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeDictObjectCached}
     *   Parameter: {@link SetItemNode} storeNode
     *   Inline method: {@link SetItemNodeGen#inline}
*/ private static final SetItemNode INLINED_SET_ITEM_DICT = SetItemNodeGen.inline(InlineTarget.create(SetItemNode.class, STATE_0_UPDATER.subUpdater(5, 6), ReferenceField.create(MethodHandles.lookup(), "setItemDict_field1_", Node.class), ReferenceField.create(MethodHandles.lookup(), "setItemDict_field2_", Node.class), ReferenceField.create(MethodHandles.lookup(), "setItemDict_field3_", Node.class), ReferenceField.create(MethodHandles.lookup(), "setItemDict_field4_", Node.class), ReferenceField.create(MethodHandles.lookup(), "setItemDict_field5_", Node.class))); /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeGenericDict}
     *   Parameter: {@link PyObjectSetItem} storeNode
     *   Inline method: {@link PyObjectSetItemNodeGen#inline}
*/ private static final PyObjectSetItem INLINED_WRITE_GENERIC_DICT_STORE_NODE_ = PyObjectSetItemNodeGen.inline(InlineTarget.create(PyObjectSetItem.class, STATE_0_WriteGlobalNode_UPDATER.subUpdater(11, 2), ReferenceField.create(MethodHandles.lookup(), "writeGenericDict_storeNode__field1_", Node.class), ReferenceField.create(MethodHandles.lookup(), "writeGenericDict_storeNode__field2_", Node.class))); private static final Uncached UNCACHED = new Uncached(); /** * State Info:
     *   0: SpecializationActive {@link WriteGlobalNode#writeDictObjectCached}
     *   1: SpecializationActive {@link WriteGlobalNode#writeDictObject}
     *   2: SpecializationActive {@link WriteGlobalNode#writeGenericDict}
     *   3: SpecializationActive {@link WriteGlobalNode#writeModuleCached}
     *   4: SpecializationActive {@link WriteGlobalNode#writeModule}
     *   5-10: InlinedCache
     *        Specialization: {@link WriteGlobalNode#writeDictObjectCached}
     *        Parameter: {@link SetItemNode} storeNode
     *        Inline method: {@link SetItemNodeGen#inline}
     *   11-12: InlinedCache
     *        Specialization: {@link WriteGlobalNode#writeGenericDict}
     *        Parameter: {@link PyObjectSetItem} storeNode
     *        Inline method: {@link PyObjectSetItemNodeGen#inline}
     * 
*/ @CompilationFinal @UnsafeAccessedField private int state_0_; /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeDictObjectCached}
     *   Parameter: {@link SetItemNode} storeNode
     *   Inline method: {@link SetItemNodeGen#inline}
     *   Inline field: {@link Node} field1
*/ @Child @UnsafeAccessedField @SuppressWarnings("unused") private Node setItemDict_field1_; /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeDictObjectCached}
     *   Parameter: {@link SetItemNode} storeNode
     *   Inline method: {@link SetItemNodeGen#inline}
     *   Inline field: {@link Node} field2
*/ @Child @UnsafeAccessedField @SuppressWarnings("unused") private Node setItemDict_field2_; /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeDictObjectCached}
     *   Parameter: {@link SetItemNode} storeNode
     *   Inline method: {@link SetItemNodeGen#inline}
     *   Inline field: {@link Node} field3
*/ @Child @UnsafeAccessedField @SuppressWarnings("unused") private Node setItemDict_field3_; /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeDictObjectCached}
     *   Parameter: {@link SetItemNode} storeNode
     *   Inline method: {@link SetItemNodeGen#inline}
     *   Inline field: {@link Node} field4
*/ @Child @UnsafeAccessedField @SuppressWarnings("unused") private Node setItemDict_field4_; /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeDictObjectCached}
     *   Parameter: {@link SetItemNode} storeNode
     *   Inline method: {@link SetItemNodeGen#inline}
     *   Inline field: {@link Node} field5
*/ @Child @UnsafeAccessedField @SuppressWarnings("unused") private Node setItemDict_field5_; /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeModuleCached}
     *   Parameter: {@link WriteAttributeToObjectNode} write
*/ @Child private WriteAttributeToObjectNode write; @UnsafeAccessedField @Child private WriteDictObjectCachedData writeDictObjectCached_cache; /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeGenericDict}
     *   Parameter: {@link PyObjectSetItem} storeNode
     *   Inline method: {@link PyObjectSetItemNodeGen#inline}
     *   Inline field: {@link Node} field1
*/ @Child @UnsafeAccessedField @SuppressWarnings("unused") private Node writeGenericDict_storeNode__field1_; /** * Source Info:
     *   Specialization: {@link WriteGlobalNode#writeGenericDict}
     *   Parameter: {@link PyObjectSetItem} storeNode
     *   Inline method: {@link PyObjectSetItemNodeGen#inline}
     *   Inline field: {@link Node} field2
*/ @Child @UnsafeAccessedField @SuppressWarnings("unused") private Node writeGenericDict_storeNode__field2_; @UnsafeAccessedField @CompilationFinal private WriteModuleCachedData writeModuleCached_cache; private WriteGlobalNodeGen() { } @Override public void executeObjectWithGlobals(VirtualFrame frameValue, Object arg0Value, TruffleString arg1Value, Object arg2Value) { int state_0 = this.state_0_; if ((state_0 & 0b11111) != 0 /* is SpecializationActive[WriteGlobalNode.writeDictObjectCached(VirtualFrame, PDict, TruffleString, Object, Node, PDict, SetItemNode)] || SpecializationActive[WriteGlobalNode.writeDictObject(VirtualFrame, PDict, TruffleString, Object, Node, SetItemNode)] || SpecializationActive[WriteGlobalNode.writeGenericDict(VirtualFrame, PDict, TruffleString, Object, Node, PyObjectSetItem)] || SpecializationActive[WriteGlobalNode.writeModuleCached(PythonModule, TruffleString, Object, PythonModule, WriteAttributeToObjectNode)] || SpecializationActive[WriteGlobalNode.writeModule(PythonModule, TruffleString, Object, WriteAttributeToObjectNode)] */) { if ((state_0 & 0b111) != 0 /* is SpecializationActive[WriteGlobalNode.writeDictObjectCached(VirtualFrame, PDict, TruffleString, Object, Node, PDict, SetItemNode)] || SpecializationActive[WriteGlobalNode.writeDictObject(VirtualFrame, PDict, TruffleString, Object, Node, SetItemNode)] || SpecializationActive[WriteGlobalNode.writeGenericDict(VirtualFrame, PDict, TruffleString, Object, Node, PyObjectSetItem)] */ && arg0Value instanceof PDict) { PDict arg0Value_ = (PDict) arg0Value; if ((state_0 & 0b1) != 0 /* is SpecializationActive[WriteGlobalNode.writeDictObjectCached(VirtualFrame, PDict, TruffleString, Object, Node, PDict, SetItemNode)] */) { WriteDictObjectCachedData s0_ = this.writeDictObjectCached_cache; if (s0_ != null) { { PDict cachedGlobals__ = (s0_.weakCachedGlobalsGen__.get()); assert DSLSupport.assertIdempotence((isSingleContext())); if ((cachedGlobals__ != null) && (arg0Value_ == cachedGlobals__) && (PGuards.isBuiltinDict(cachedGlobals__))) { Node inliningTarget__ = (this); writeDictObjectCached(frameValue, arg0Value_, arg1Value, arg2Value, inliningTarget__, cachedGlobals__, INLINED_SET_ITEM_DICT); return; } } } } if ((state_0 & 0b10) != 0 /* is SpecializationActive[WriteGlobalNode.writeDictObject(VirtualFrame, PDict, TruffleString, Object, Node, SetItemNode)] */) { if ((PGuards.isBuiltinDict(arg0Value_))) { Node inliningTarget__1 = (this); writeDictObject(frameValue, arg0Value_, arg1Value, arg2Value, inliningTarget__1, INLINED_SET_ITEM_DICT); return; } } if ((state_0 & 0b100) != 0 /* is SpecializationActive[WriteGlobalNode.writeGenericDict(VirtualFrame, PDict, TruffleString, Object, Node, PyObjectSetItem)] */) { { Node inliningTarget__2 = (this); writeGenericDict(frameValue, arg0Value_, arg1Value, arg2Value, inliningTarget__2, INLINED_WRITE_GENERIC_DICT_STORE_NODE_); return; } } } if ((state_0 & 0b11000) != 0 /* is SpecializationActive[WriteGlobalNode.writeModuleCached(PythonModule, TruffleString, Object, PythonModule, WriteAttributeToObjectNode)] || SpecializationActive[WriteGlobalNode.writeModule(PythonModule, TruffleString, Object, WriteAttributeToObjectNode)] */ && arg0Value instanceof PythonModule) { PythonModule arg0Value_ = (PythonModule) arg0Value; if ((state_0 & 0b1000) != 0 /* is SpecializationActive[WriteGlobalNode.writeModuleCached(PythonModule, TruffleString, Object, PythonModule, WriteAttributeToObjectNode)] */) { WriteModuleCachedData s3_ = this.writeModuleCached_cache; if (s3_ != null) { { WriteAttributeToObjectNode write_ = this.write; if (write_ != null) { PythonModule cachedGlobals__1 = (s3_.weakCachedGlobalsGen__.get()); assert DSLSupport.assertIdempotence((isSingleContext())); if ((cachedGlobals__1 != null) && (arg0Value_ == cachedGlobals__1)) { writeModuleCached(arg0Value_, arg1Value, arg2Value, cachedGlobals__1, write_); return; } } } } } if ((state_0 & 0b10000) != 0 /* is SpecializationActive[WriteGlobalNode.writeModule(PythonModule, TruffleString, Object, WriteAttributeToObjectNode)] */) { { WriteAttributeToObjectNode write_1 = this.write; if (write_1 != null) { writeModule(arg0Value_, arg1Value, arg2Value, write_1); return; } } } } } CompilerDirectives.transferToInterpreterAndInvalidate(); executeAndSpecialize(frameValue, arg0Value, arg1Value, arg2Value); return; } private void executeAndSpecialize(VirtualFrame frameValue, Object arg0Value, TruffleString arg1Value, Object arg2Value) { int state_0 = this.state_0_; if (arg0Value instanceof PDict) { PDict arg0Value_ = (PDict) arg0Value; { PDict cachedGlobals__ = null; Node inliningTarget__ = null; if (((state_0 & 0b110)) == 0 /* is-not SpecializationActive[WriteGlobalNode.writeDictObject(VirtualFrame, PDict, TruffleString, Object, Node, SetItemNode)] && SpecializationActive[WriteGlobalNode.writeGenericDict(VirtualFrame, PDict, TruffleString, Object, Node, PyObjectSetItem)] */) { while (true) { int count0_ = 0; WriteDictObjectCachedData s0_ = WRITE_DICT_OBJECT_CACHED_CACHE_UPDATER.getVolatile(this); WriteDictObjectCachedData s0_original = s0_; while (s0_ != null) { { cachedGlobals__ = (s0_.weakCachedGlobalsGen__.get()); assert DSLSupport.assertIdempotence((isSingleContext())); if ((cachedGlobals__ != null) && (arg0Value_ == cachedGlobals__) && (PGuards.isBuiltinDict(cachedGlobals__))) { inliningTarget__ = (this); break; } } count0_++; s0_ = null; break; } if (s0_ == null && count0_ < 1) { if ((isSingleContext())) { TruffleWeakReference weakCachedGlobalsGen___ = (new TruffleWeakReference<>(arg0Value_)); cachedGlobals__ = (weakCachedGlobalsGen___.get()); if ((cachedGlobals__ != null) && (arg0Value_ == cachedGlobals__) && (PGuards.isBuiltinDict(cachedGlobals__))) { s0_ = this.insert(new WriteDictObjectCachedData()); s0_.weakCachedGlobalsGen__ = weakCachedGlobalsGen___; inliningTarget__ = (this); if (!WRITE_DICT_OBJECT_CACHED_CACHE_UPDATER.compareAndSet(this, s0_original, s0_)) { continue; } state_0 = state_0 | 0b1 /* add SpecializationActive[WriteGlobalNode.writeDictObjectCached(VirtualFrame, PDict, TruffleString, Object, Node, PDict, SetItemNode)] */; this.state_0_ = state_0; } } } if (s0_ != null) { writeDictObjectCached(frameValue, arg0Value_, arg1Value, arg2Value, inliningTarget__, cachedGlobals__, INLINED_SET_ITEM_DICT); return; } break; } } } { Node inliningTarget__1 = null; if (((state_0 & 0b100)) == 0 /* is-not SpecializationActive[WriteGlobalNode.writeGenericDict(VirtualFrame, PDict, TruffleString, Object, Node, PyObjectSetItem)] */) { if ((PGuards.isBuiltinDict(arg0Value_))) { inliningTarget__1 = (this); this.writeDictObjectCached_cache = null; state_0 = state_0 & 0xfffffffe /* remove SpecializationActive[WriteGlobalNode.writeDictObjectCached(VirtualFrame, PDict, TruffleString, Object, Node, PDict, SetItemNode)] */; state_0 = state_0 | 0b10 /* add SpecializationActive[WriteGlobalNode.writeDictObject(VirtualFrame, PDict, TruffleString, Object, Node, SetItemNode)] */; this.state_0_ = state_0; writeDictObject(frameValue, arg0Value_, arg1Value, arg2Value, inliningTarget__1, INLINED_SET_ITEM_DICT); return; } } } { Node inliningTarget__2 = null; inliningTarget__2 = (this); this.writeDictObjectCached_cache = null; state_0 = state_0 & 0xfffffffc /* remove SpecializationActive[WriteGlobalNode.writeDictObjectCached(VirtualFrame, PDict, TruffleString, Object, Node, PDict, SetItemNode)], SpecializationActive[WriteGlobalNode.writeDictObject(VirtualFrame, PDict, TruffleString, Object, Node, SetItemNode)] */; state_0 = state_0 | 0b100 /* add SpecializationActive[WriteGlobalNode.writeGenericDict(VirtualFrame, PDict, TruffleString, Object, Node, PyObjectSetItem)] */; this.state_0_ = state_0; writeGenericDict(frameValue, arg0Value_, arg1Value, arg2Value, inliningTarget__2, INLINED_WRITE_GENERIC_DICT_STORE_NODE_); return; } } if (arg0Value instanceof PythonModule) { PythonModule arg0Value_ = (PythonModule) arg0Value; { PythonModule cachedGlobals__1 = null; if (((state_0 & 0b10000)) == 0 /* is-not SpecializationActive[WriteGlobalNode.writeModule(PythonModule, TruffleString, Object, WriteAttributeToObjectNode)] */) { while (true) { int count3_ = 0; WriteModuleCachedData s3_ = WRITE_MODULE_CACHED_CACHE_UPDATER.getVolatile(this); WriteModuleCachedData s3_original = s3_; while (s3_ != null) { { WriteAttributeToObjectNode write_ = this.write; if (write_ != null) { cachedGlobals__1 = (s3_.weakCachedGlobalsGen__.get()); assert DSLSupport.assertIdempotence((isSingleContext())); if ((cachedGlobals__1 != null) && (arg0Value_ == cachedGlobals__1)) { break; } } } count3_++; s3_ = null; break; } if (s3_ == null && count3_ < 1) { if ((isSingleContext())) { TruffleWeakReference weakCachedGlobalsGen___1 = (new TruffleWeakReference<>(arg0Value_)); cachedGlobals__1 = (weakCachedGlobalsGen___1.get()); if ((cachedGlobals__1 != null) && (arg0Value_ == cachedGlobals__1)) { s3_ = new WriteModuleCachedData(); s3_.weakCachedGlobalsGen__ = weakCachedGlobalsGen___1; WriteAttributeToObjectNode write_; WriteAttributeToObjectNode write__shared = this.write; if (write__shared != null) { write_ = write__shared; } else { write_ = this.insert((WriteAttributeToObjectNode.create())); if (write_ == null) { throw new IllegalStateException("Specialization 'writeModuleCached(PythonModule, TruffleString, Object, PythonModule, WriteAttributeToObjectNode)' contains a shared cache with name 'write' that returned a default value for the cached initializer. Default values are not supported for shared cached initializers because the default value is reserved for the uninitialized state."); } } if (this.write == null) { this.write = write_; } if (!WRITE_MODULE_CACHED_CACHE_UPDATER.compareAndSet(this, s3_original, s3_)) { continue; } state_0 = state_0 | 0b1000 /* add SpecializationActive[WriteGlobalNode.writeModuleCached(PythonModule, TruffleString, Object, PythonModule, WriteAttributeToObjectNode)] */; this.state_0_ = state_0; } } } if (s3_ != null) { writeModuleCached(arg0Value_, arg1Value, arg2Value, cachedGlobals__1, this.write); return; } break; } } } WriteAttributeToObjectNode write_1; WriteAttributeToObjectNode write_1_shared = this.write; if (write_1_shared != null) { write_1 = write_1_shared; } else { write_1 = this.insert((WriteAttributeToObjectNode.create())); if (write_1 == null) { throw new IllegalStateException("Specialization 'writeModule(PythonModule, TruffleString, Object, WriteAttributeToObjectNode)' contains a shared cache with name 'write' that returned a default value for the cached initializer. Default values are not supported for shared cached initializers because the default value is reserved for the uninitialized state."); } } if (this.write == null) { VarHandle.storeStoreFence(); this.write = write_1; } this.writeModuleCached_cache = null; state_0 = state_0 & 0xfffffff7 /* remove SpecializationActive[WriteGlobalNode.writeModuleCached(PythonModule, TruffleString, Object, PythonModule, WriteAttributeToObjectNode)] */; state_0 = state_0 | 0b10000 /* add SpecializationActive[WriteGlobalNode.writeModule(PythonModule, TruffleString, Object, WriteAttributeToObjectNode)] */; this.state_0_ = state_0; writeModule(arg0Value_, arg1Value, arg2Value, write_1); return; } throw new UnsupportedSpecializationException(this, new Node[] {null, null, null}, arg0Value, arg1Value, arg2Value); } @Override public NodeCost getCost() { int state_0 = this.state_0_; if ((state_0 & 0b11111) == 0) { return NodeCost.UNINITIALIZED; } else { if (((state_0 & 0b11111) & ((state_0 & 0b11111) - 1)) == 0 /* is-single */) { return NodeCost.MONOMORPHIC; } } return NodeCost.POLYMORPHIC; } @NeverDefault public static WriteGlobalNode create() { return new WriteGlobalNodeGen(); } @NeverDefault public static WriteGlobalNode getUncached() { return WriteGlobalNodeGen.UNCACHED; } @GeneratedBy(WriteGlobalNode.class) @DenyReplace private static final class WriteDictObjectCachedData extends Node implements SpecializationDataNode { /** * Source Info:
         *   Specialization: {@link WriteGlobalNode#writeDictObjectCached}
         *   Parameter: {@link TruffleWeakReference} weakCachedGlobalsGen_
*/ @CompilationFinal TruffleWeakReference weakCachedGlobalsGen__; WriteDictObjectCachedData() { } @Override public NodeCost getCost() { return NodeCost.NONE; } } @GeneratedBy(WriteGlobalNode.class) @DenyReplace private static final class WriteModuleCachedData implements SpecializationDataNode { /** * Source Info:
         *   Specialization: {@link WriteGlobalNode#writeModuleCached}
         *   Parameter: {@link TruffleWeakReference} weakCachedGlobalsGen_
*/ @CompilationFinal TruffleWeakReference weakCachedGlobalsGen__; WriteModuleCachedData() { } } @GeneratedBy(WriteGlobalNode.class) @DenyReplace private static final class Uncached extends WriteGlobalNode { @Override public void executeObjectWithGlobals(VirtualFrame frameValue, Object arg0Value, TruffleString arg1Value, Object arg2Value) { CompilerDirectives.transferToInterpreterAndInvalidate(); if (arg0Value instanceof PDict) { PDict arg0Value_ = (PDict) arg0Value; writeGenericDict(frameValue, arg0Value_, arg1Value, arg2Value, (this), (PyObjectSetItem.getUncached())); return; } if (arg0Value instanceof PythonModule) { PythonModule arg0Value_ = (PythonModule) arg0Value; writeModule(arg0Value_, arg1Value, arg2Value, (WriteAttributeToObjectNode.getUncached())); return; } throw new UnsupportedSpecializationException(this, new Node[] {null, null, null}, arg0Value, arg1Value, arg2Value); } @Override public NodeCost getCost() { return NodeCost.MEGAMORPHIC; } @Override public boolean isAdoptable() { return false; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy