blob: e74c6333ca6b9c7cc536fe953c8936220a1b3344 [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>apache_beam.typehints.opcodes &mdash; Apache Beam 2.47.0 documentation</title>
<script type="text/javascript" src="../../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/javascript" src="../../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../index.html" class="icon icon-home"> Apache Beam
</a>
<div class="version">
2.47.0
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.coders.html">apache_beam.coders package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.dataframe.html">apache_beam.dataframe package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.io.html">apache_beam.io package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.metrics.html">apache_beam.metrics package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.ml.html">apache_beam.ml package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.options.html">apache_beam.options package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.portability.html">apache_beam.portability package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.runners.html">apache_beam.runners package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.testing.html">apache_beam.testing package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.transforms.html">apache_beam.transforms package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.typehints.html">apache_beam.typehints package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.utils.html">apache_beam.utils package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.yaml.html">apache_beam.yaml package</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.error.html">apache_beam.error module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.pipeline.html">apache_beam.pipeline module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.pvalue.html">apache_beam.pvalue module</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">Apache Beam</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html">Docs</a> &raquo;</li>
<li><a href="../../index.html">Module code</a> &raquo;</li>
<li>apache_beam.typehints.opcodes</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for apache_beam.typehints.opcodes</h1><div class="highlight"><pre>
<span></span><span class="c1">#</span>
<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one or more</span>
<span class="c1"># contributor license agreements. See the NOTICE file distributed with</span>
<span class="c1"># this work for additional information regarding copyright ownership.</span>
<span class="c1"># The ASF licenses this file to You under the Apache License, Version 2.0</span>
<span class="c1"># (the &quot;License&quot;); you may not use this file except in compliance with</span>
<span class="c1"># the License. You may obtain a copy of the License at</span>
<span class="c1">#</span>
<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c1">#</span>
<span class="c1"># Unless required by applicable law or agreed to in writing, software</span>
<span class="c1"># distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span>
<span class="c1"># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span class="c1"># See the License for the specific language governing permissions and</span>
<span class="c1"># limitations under the License.</span>
<span class="c1">#</span>
<span class="sd">&quot;&quot;&quot;Defines the actions various bytecodes have on the frame.</span>
<span class="sd">Each function here corresponds to a bytecode documented in</span>
<span class="sd">https://docs.python.org/2/library/dis.html or</span>
<span class="sd">https://docs.python.org/3/library/dis.html. The first argument is a (mutable)</span>
<span class="sd">FrameState object, the second the integer opcode argument.</span>
<span class="sd">Bytecodes with more complicated behavior (e.g. modifying the program counter)</span>
<span class="sd">are handled inline rather than here.</span>
<span class="sd">For internal use only; no backwards-compatibility guarantees.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="c1"># pytype: skip-file</span>
<span class="kn">import</span> <span class="nn">inspect</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">types</span>
<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">reduce</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints</span> <span class="kn">import</span> <span class="n">row_type</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints</span> <span class="kn">import</span> <span class="n">typehints</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.trivial_inference</span> <span class="kn">import</span> <span class="n">BoundMethod</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.trivial_inference</span> <span class="kn">import</span> <span class="n">Const</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.trivial_inference</span> <span class="kn">import</span> <span class="n">element_type</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.trivial_inference</span> <span class="kn">import</span> <span class="n">key_value_types</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.trivial_inference</span> <span class="kn">import</span> <span class="n">union</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.typehints</span> <span class="kn">import</span> <span class="n">Any</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.typehints</span> <span class="kn">import</span> <span class="n">Dict</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.typehints</span> <span class="kn">import</span> <span class="n">Iterable</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.typehints</span> <span class="kn">import</span> <span class="n">List</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.typehints</span> <span class="kn">import</span> <span class="n">Set</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.typehints</span> <span class="kn">import</span> <span class="n">Tuple</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.typehints</span> <span class="kn">import</span> <span class="n">Union</span>
<span class="c1"># This is missing in the builtin types module. str.upper is arbitrary, any</span>
<span class="c1"># method on a C-implemented type will do.</span>
<span class="n">_MethodDescriptorType</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="nb">str</span><span class="o">.</span><span class="n">upper</span><span class="p">)</span>
<div class="viewcode-block" id="pop_one"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.pop_one">[docs]</a><span class="k">def</span> <span class="nf">pop_one</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="k">del</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">:]</span></div>
<div class="viewcode-block" id="pop_two"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.pop_two">[docs]</a><span class="k">def</span> <span class="nf">pop_two</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="k">del</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">:]</span></div>
<div class="viewcode-block" id="pop_three"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.pop_three">[docs]</a><span class="k">def</span> <span class="nf">pop_three</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="k">del</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">3</span><span class="p">:]</span></div>
<div class="viewcode-block" id="push_value"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.push_value">[docs]</a><span class="k">def</span> <span class="nf">push_value</span><span class="p">(</span><span class="n">v</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">pusher</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
<span class="k">return</span> <span class="n">pusher</span></div>
<div class="viewcode-block" id="nop"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.nop">[docs]</a><span class="k">def</span> <span class="nf">nop</span><span class="p">(</span><span class="n">unused_state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="pop_top"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.pop_top">[docs]</a><span class="k">def</span> <span class="nf">pop_top</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span></div>
<div class="viewcode-block" id="rot_n"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.rot_n">[docs]</a><span class="k">def</span> <span class="nf">rot_n</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">n</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">+</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">n</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span></div>
<div class="viewcode-block" id="rot_two"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.rot_two">[docs]</a><span class="k">def</span> <span class="nf">rot_two</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">rot_n</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span></div>
<div class="viewcode-block" id="rot_three"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.rot_three">[docs]</a><span class="k">def</span> <span class="nf">rot_three</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">rot_n</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span></div>
<div class="viewcode-block" id="rot_four"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.rot_four">[docs]</a><span class="k">def</span> <span class="nf">rot_four</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">rot_n</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span></div>
<div class="viewcode-block" id="dup_top"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.dup_top">[docs]</a><span class="k">def</span> <span class="nf">dup_top</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span></div>
<div class="viewcode-block" id="unary"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.unary">[docs]</a><span class="k">def</span> <span class="nf">unary</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span></div>
<span class="n">unary_positive</span> <span class="o">=</span> <span class="n">unary_negative</span> <span class="o">=</span> <span class="n">unary_invert</span> <span class="o">=</span> <span class="n">unary</span>
<div class="viewcode-block" id="unary_not"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.unary_not">[docs]</a><span class="k">def</span> <span class="nf">unary_not</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">bool</span></div>
<div class="viewcode-block" id="unary_convert"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.unary_convert">[docs]</a><span class="k">def</span> <span class="nf">unary_convert</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span></div>
<div class="viewcode-block" id="get_iter"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.get_iter">[docs]</a><span class="k">def</span> <span class="nf">get_iter</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Iterable</span><span class="p">[</span><span class="n">element_type</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">())])</span></div>
<div class="viewcode-block" id="symmetric_binary_op"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.symmetric_binary_op">[docs]</a><span class="k">def</span> <span class="nf">symmetric_binary_op</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="c1"># TODO(robertwb): This may not be entirely correct...</span>
<span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="o">=</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()),</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
<span class="k">if</span> <span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">==</span> <span class="nb">type</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">SequenceTypeConstraint</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">a</span><span class="p">)(</span><span class="n">union</span><span class="p">(</span><span class="n">element_type</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">element_type</span><span class="p">(</span><span class="n">b</span><span class="p">))))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Any</span><span class="p">)</span></div>
<span class="c1"># Except for int ** -int</span>
<span class="n">binary_power</span> <span class="o">=</span> <span class="n">inplace_power</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<span class="n">binary_multiply</span> <span class="o">=</span> <span class="n">inplace_multiply</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<span class="n">binary_divide</span> <span class="o">=</span> <span class="n">inplace_divide</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<span class="n">binary_floor_divide</span> <span class="o">=</span> <span class="n">inplace_floor_divide</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<div class="viewcode-block" id="binary_true_divide"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.binary_true_divide">[docs]</a><span class="k">def</span> <span class="nf">binary_true_divide</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">u</span> <span class="o">=</span> <span class="n">union</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">(),</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">)</span>
<span class="k">if</span> <span class="n">u</span> <span class="o">==</span> <span class="nb">int</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">u</span><span class="p">)</span></div>
<span class="n">inplace_true_divide</span> <span class="o">=</span> <span class="n">binary_true_divide</span>
<span class="n">binary_modulo</span> <span class="o">=</span> <span class="n">inplace_modulo</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<span class="c1"># TODO(robertwb): Tuple add.</span>
<span class="n">binary_add</span> <span class="o">=</span> <span class="n">inplace_add</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<span class="n">binary_subtract</span> <span class="o">=</span> <span class="n">inplace_subtract</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<div class="viewcode-block" id="binary_subscr"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.binary_subscr">[docs]</a><span class="k">def</span> <span class="nf">binary_subscr</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">index</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
<span class="k">if</span> <span class="n">base</span> <span class="ow">is</span> <span class="nb">str</span><span class="p">:</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">base</span>
<span class="k">elif</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">Const</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">index</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">and</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">IndexableTypeConstraint</span><span class="p">)):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">_constraint_for_index</span><span class="p">(</span><span class="n">index</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">element_type</span><span class="p">(</span><span class="n">base</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">index</span> <span class="o">==</span> <span class="nb">slice</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">IndexableTypeConstraint</span><span class="p">):</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">base</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">out</span> <span class="o">=</span> <span class="n">element_type</span><span class="p">(</span><span class="n">base</span><span class="p">)</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">out</span><span class="p">)</span></div>
<span class="c1"># As far as types are concerned.</span>
<span class="n">binary_lshift</span> <span class="o">=</span> <span class="n">inplace_lshift</span> <span class="o">=</span> <span class="n">binary_rshift</span> <span class="o">=</span> <span class="n">inplace_rshift</span> <span class="o">=</span> <span class="n">pop_top</span>
<span class="n">binary_and</span> <span class="o">=</span> <span class="n">inplace_and</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<span class="n">binary_xor</span> <span class="o">=</span> <span class="n">inplace_xor</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<span class="n">binary_or</span> <span class="o">=</span> <span class="n">inplace_or</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<span class="n">binary_op</span> <span class="o">=</span> <span class="n">symmetric_binary_op</span>
<div class="viewcode-block" id="store_subscr"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.store_subscr">[docs]</a><span class="k">def</span> <span class="nf">store_subscr</span><span class="p">(</span><span class="n">unused_state</span><span class="p">,</span> <span class="n">unused_args</span><span class="p">):</span>
<span class="c1"># TODO(robertwb): Update element/value type of iterable/dict.</span>
<span class="k">pass</span></div>
<span class="n">print_item</span> <span class="o">=</span> <span class="n">pop_top</span>
<span class="n">print_newline</span> <span class="o">=</span> <span class="n">nop</span>
<div class="viewcode-block" id="list_append"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.list_append">[docs]</a><span class="k">def</span> <span class="nf">list_append</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">new_element_type</span> <span class="o">=</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">List</span><span class="p">[</span><span class="n">union</span><span class="p">(</span>
<span class="n">element_type</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]),</span> <span class="n">new_element_type</span><span class="p">)]</span></div>
<div class="viewcode-block" id="set_add"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.set_add">[docs]</a><span class="k">def</span> <span class="nf">set_add</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">new_element_type</span> <span class="o">=</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">Set</span><span class="p">[</span><span class="n">union</span><span class="p">(</span>
<span class="n">element_type</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]),</span> <span class="n">new_element_type</span><span class="p">)]</span></div>
<div class="viewcode-block" id="map_add"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.map_add">[docs]</a><span class="k">def</span> <span class="nf">map_add</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">8</span><span class="p">):</span>
<span class="c1"># PEP 572 The MAP_ADD expects the value as the first element in the stack</span>
<span class="c1"># and the key as the second element.</span>
<span class="n">new_value_type</span> <span class="o">=</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
<span class="n">new_key_type</span> <span class="o">=</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">new_key_type</span> <span class="o">=</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
<span class="n">new_value_type</span> <span class="o">=</span> <span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">())</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">Dict</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">key_type</span><span class="p">,</span> <span class="n">new_key_type</span><span class="p">],</span>
<span class="n">Union</span><span class="p">[</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span><span class="o">.</span><span class="n">value_type</span><span class="p">,</span> <span class="n">new_value_type</span><span class="p">]]</span></div>
<span class="n">load_locals</span> <span class="o">=</span> <span class="n">push_value</span><span class="p">(</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span>
<span class="n">exec_stmt</span> <span class="o">=</span> <span class="n">pop_three</span>
<span class="n">build_class</span> <span class="o">=</span> <span class="n">pop_three</span>
<div class="viewcode-block" id="unpack_sequence"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.unpack_sequence">[docs]</a><span class="k">def</span> <span class="nf">unpack_sequence</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">Const</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">unpacked</span> <span class="o">=</span> <span class="p">[</span><span class="n">Const</span><span class="p">(</span><span class="n">ti</span><span class="p">)</span> <span class="k">for</span> <span class="n">ti</span> <span class="ow">in</span> <span class="n">t</span><span class="o">.</span><span class="n">value</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">unpacked</span><span class="p">)</span> <span class="o">!=</span> <span class="n">arg</span><span class="p">:</span>
<span class="n">unpacked</span> <span class="o">=</span> <span class="p">[</span><span class="n">Any</span><span class="p">]</span> <span class="o">*</span> <span class="n">arg</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="n">unpacked</span> <span class="o">=</span> <span class="p">[</span><span class="n">Any</span><span class="p">]</span> <span class="o">*</span> <span class="n">arg</span>
<span class="k">elif</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">TupleHint</span><span class="o">.</span><span class="n">TupleConstraint</span><span class="p">)</span> <span class="ow">and</span>
<span class="nb">len</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">tuple_types</span><span class="p">)</span> <span class="o">==</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">unpacked</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">tuple_types</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">unpacked</span> <span class="o">=</span> <span class="p">[</span><span class="n">element_type</span><span class="p">(</span><span class="n">t</span><span class="p">)]</span> <span class="o">*</span> <span class="n">arg</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span> <span class="o">+=</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">unpacked</span><span class="p">)</span></div>
<div class="viewcode-block" id="dup_topx"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.dup_topx">[docs]</a><span class="k">def</span> <span class="nf">dup_topx</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span> <span class="o">+=</span> <span class="n">state</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:]</span></div>
<span class="n">store_attr</span> <span class="o">=</span> <span class="n">pop_two</span>
<span class="n">delete_attr</span> <span class="o">=</span> <span class="n">pop_top</span>
<span class="n">store_global</span> <span class="o">=</span> <span class="n">pop_top</span>
<span class="n">delete_global</span> <span class="o">=</span> <span class="n">nop</span>
<div class="viewcode-block" id="load_const"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.load_const">[docs]</a><span class="k">def</span> <span class="nf">load_const</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">const_type</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span></div>
<span class="n">load_name</span> <span class="o">=</span> <span class="n">push_value</span><span class="p">(</span><span class="n">Any</span><span class="p">)</span>
<div class="viewcode-block" id="build_tuple"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_tuple">[docs]</a><span class="k">def</span> <span class="nf">build_tuple</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Tuple</span><span class="p">[()])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">Tuple</span><span class="p">[[</span><span class="n">Const</span><span class="o">.</span><span class="n">unwrap</span><span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:]]]]</span></div>
<div class="viewcode-block" id="build_list"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_list">[docs]</a><span class="k">def</span> <span class="nf">build_list</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">List</span><span class="p">[</span><span class="n">Union</span><span class="p">[()]])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="n">reduce</span><span class="p">(</span><span class="n">union</span><span class="p">,</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:],</span> <span class="n">Union</span><span class="p">[()])]]</span></div>
<div class="viewcode-block" id="build_set"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_set">[docs]</a><span class="k">def</span> <span class="nf">build_set</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Set</span><span class="p">[</span><span class="n">Union</span><span class="p">[()]])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">Set</span><span class="p">[</span><span class="n">reduce</span><span class="p">(</span><span class="n">union</span><span class="p">,</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:],</span> <span class="n">Union</span><span class="p">[()])]]</span></div>
<span class="c1"># A Dict[Union[], Union[]] is the type of an empty dict.</span>
<div class="viewcode-block" id="build_map"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_map">[docs]</a><span class="k">def</span> <span class="nf">build_map</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="k">if</span> <span class="n">arg</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Dict</span><span class="p">[</span><span class="n">Union</span><span class="p">[()],</span> <span class="n">Union</span><span class="p">[()]])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span> <span class="o">*</span> <span class="n">arg</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">Dict</span><span class="p">[</span><span class="n">reduce</span><span class="p">(</span><span class="n">union</span><span class="p">,</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span> <span class="o">*</span> <span class="n">arg</span><span class="p">::</span><span class="mi">2</span><span class="p">],</span> <span class="n">Union</span><span class="p">[()]),</span>
<span class="n">reduce</span><span class="p">(</span><span class="n">union</span><span class="p">,</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span> <span class="o">*</span> <span class="n">arg</span> <span class="o">+</span> <span class="mi">1</span><span class="p">::</span><span class="mi">2</span><span class="p">],</span> <span class="n">Union</span><span class="p">[()])]</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="build_const_key_map"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_const_key_map">[docs]</a><span class="k">def</span> <span class="nf">build_const_key_map</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">key_tuple</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key_tuple</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">TupleHint</span><span class="o">.</span><span class="n">TupleConstraint</span><span class="p">):</span>
<span class="n">key_types</span> <span class="o">=</span> <span class="n">key_tuple</span><span class="o">.</span><span class="n">tuple_types</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key_tuple</span><span class="p">,</span> <span class="n">Const</span><span class="p">):</span>
<span class="n">key_types</span> <span class="o">=</span> <span class="p">[</span><span class="n">Const</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">key_tuple</span><span class="o">.</span><span class="n">value</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">key_types</span> <span class="o">=</span> <span class="p">[</span><span class="n">Any</span><span class="p">]</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">Dict</span><span class="p">[</span><span class="n">reduce</span><span class="p">(</span><span class="n">union</span><span class="p">,</span> <span class="n">key_types</span><span class="p">,</span> <span class="n">Union</span><span class="p">[()]),</span>
<span class="n">reduce</span><span class="p">(</span><span class="n">union</span><span class="p">,</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:],</span> <span class="n">Union</span><span class="p">[()])]</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="list_to_tuple"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.list_to_tuple">[docs]</a><span class="k">def</span> <span class="nf">list_to_tuple</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Tuple</span><span class="p">[</span><span class="n">element_type</span><span class="p">(</span><span class="n">base</span><span class="p">),</span> <span class="o">...</span><span class="p">])</span></div>
<div class="viewcode-block" id="list_extend"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.list_extend">[docs]</a><span class="k">def</span> <span class="nf">list_extend</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">tail</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">List</span><span class="p">[</span><span class="n">union</span><span class="p">(</span><span class="n">element_type</span><span class="p">(</span><span class="n">base</span><span class="p">),</span> <span class="n">element_type</span><span class="p">(</span><span class="n">tail</span><span class="p">))]</span></div>
<div class="viewcode-block" id="set_update"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.set_update">[docs]</a><span class="k">def</span> <span class="nf">set_update</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">Set</span><span class="p">[</span><span class="n">union</span><span class="p">(</span><span class="n">element_type</span><span class="p">(</span><span class="n">base</span><span class="p">),</span> <span class="n">element_type</span><span class="p">(</span><span class="n">other</span><span class="p">))]</span></div>
<div class="viewcode-block" id="dict_update"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.dict_update">[docs]</a><span class="k">def</span> <span class="nf">dict_update</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">other</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">Dict</span><span class="o">.</span><span class="n">DictConstraint</span><span class="p">):</span>
<span class="n">base_key_type</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">key_type</span>
<span class="n">base_value_type</span> <span class="o">=</span> <span class="n">base</span><span class="o">.</span><span class="n">value_type</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">base_key_type</span> <span class="o">=</span> <span class="n">Any</span>
<span class="n">base_value_type</span> <span class="o">=</span> <span class="n">Any</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">Dict</span><span class="o">.</span><span class="n">DictConstraint</span><span class="p">):</span>
<span class="n">other_key_type</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">key_type</span>
<span class="n">other_value_type</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="n">value_type</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">other_key_type</span><span class="p">,</span> <span class="n">other_value_type</span> <span class="o">=</span> <span class="n">key_value_types</span><span class="p">(</span><span class="n">element_type</span><span class="p">(</span><span class="n">other</span><span class="p">))</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">Dict</span><span class="p">[</span><span class="n">union</span><span class="p">(</span><span class="n">base_key_type</span><span class="p">,</span> <span class="n">other_key_type</span><span class="p">),</span>
<span class="n">union</span><span class="p">(</span><span class="n">base_value_type</span><span class="p">,</span> <span class="n">other_value_type</span><span class="p">)]</span></div>
<span class="n">dict_merge</span> <span class="o">=</span> <span class="n">dict_update</span>
<div class="viewcode-block" id="load_attr"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.load_attr">[docs]</a><span class="k">def</span> <span class="nf">load_attr</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Replaces the top of the stack, TOS, with</span>
<span class="sd"> getattr(TOS, co_names[arg])</span>
<span class="sd"> Will replace with Any for builtin methods, but these don&#39;t have bytecode in</span>
<span class="sd"> CPython so that&#39;s okay.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">o</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">get_name</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_getattr</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span></div>
<span class="k">def</span> <span class="nf">_getattr</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">Const</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="n">Const</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
<span class="k">elif</span> <span class="p">(</span><span class="n">inspect</span><span class="o">.</span><span class="n">isclass</span><span class="p">(</span><span class="n">o</span><span class="p">)</span> <span class="ow">and</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">),</span>
<span class="p">(</span><span class="n">types</span><span class="o">.</span><span class="n">MethodType</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">FunctionType</span><span class="p">))):</span>
<span class="c1"># TODO(luke-zhu): Support other callable objects</span>
<span class="n">func</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> <span class="c1"># Python 3 has no unbound methods</span>
<span class="k">return</span> <span class="n">Const</span><span class="p">(</span><span class="n">BoundMethod</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="n">o</span><span class="p">))</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">row_type</span><span class="o">.</span><span class="n">RowTypeConstraint</span><span class="p">):</span>
<span class="k">return</span> <span class="n">o</span><span class="o">.</span><span class="n">get_type_for</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Any</span>
<div class="viewcode-block" id="load_method"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.load_method">[docs]</a><span class="k">def</span> <span class="nf">load_method</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Like load_attr. Replaces TOS object with method and TOS.&quot;&quot;&quot;</span>
<span class="n">o</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">get_name</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">Const</span><span class="p">):</span>
<span class="n">method</span> <span class="o">=</span> <span class="n">Const</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">o</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">AnyTypeConstraint</span><span class="p">):</span>
<span class="n">method</span> <span class="o">=</span> <span class="n">typehints</span><span class="o">.</span><span class="n">Any</span>
<span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="n">attr</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">_MethodDescriptorType</span><span class="p">):</span>
<span class="c1"># Skip builtins since they don&#39;t disassemble.</span>
<span class="n">method</span> <span class="o">=</span> <span class="n">typehints</span><span class="o">.</span><span class="n">Any</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">method</span> <span class="o">=</span> <span class="n">Const</span><span class="p">(</span><span class="n">BoundMethod</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">o</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">method</span> <span class="o">=</span> <span class="n">typehints</span><span class="o">.</span><span class="n">Any</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">method</span><span class="p">)</span></div>
<div class="viewcode-block" id="compare_op"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.compare_op">[docs]</a><span class="k">def</span> <span class="nf">compare_op</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="c1"># Could really be anything...</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="nb">bool</span><span class="p">]</span></div>
<span class="n">is_op</span> <span class="o">=</span> <span class="n">compare_op</span>
<span class="n">contains_op</span> <span class="o">=</span> <span class="n">compare_op</span>
<div class="viewcode-block" id="import_name"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.import_name">[docs]</a><span class="k">def</span> <span class="nf">import_name</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">unused_arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">Any</span><span class="p">]</span></div>
<span class="n">import_from</span> <span class="o">=</span> <span class="n">push_value</span><span class="p">(</span><span class="n">Any</span><span class="p">)</span>
<div class="viewcode-block" id="load_global"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.load_global">[docs]</a><span class="k">def</span> <span class="nf">load_global</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">major</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">minor</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">11</span><span class="p">):</span>
<span class="n">arg</span> <span class="o">=</span> <span class="n">arg</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">get_global</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span></div>
<span class="n">store_map</span> <span class="o">=</span> <span class="n">pop_two</span>
<div class="viewcode-block" id="load_fast"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.load_fast">[docs]</a><span class="k">def</span> <span class="nf">load_fast</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">vars</span><span class="p">[</span><span class="n">arg</span><span class="p">])</span></div>
<div class="viewcode-block" id="store_fast"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.store_fast">[docs]</a><span class="k">def</span> <span class="nf">store_fast</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">vars</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span></div>
<div class="viewcode-block" id="delete_fast"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.delete_fast">[docs]</a><span class="k">def</span> <span class="nf">delete_fast</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">vars</span><span class="p">[</span><span class="n">arg</span><span class="p">]</span> <span class="o">=</span> <span class="n">Any</span> <span class="c1"># really an error</span></div>
<span class="c1"># bpo-43683 Adds GEN_START in Python 3.10, but removed in Python 3.11</span>
<span class="c1"># https://github.com/python/cpython/pull/25138</span>
<div class="viewcode-block" id="gen_start"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.gen_start">[docs]</a><span class="k">def</span> <span class="nf">gen_start</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span></div>
<div class="viewcode-block" id="load_closure"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.load_closure">[docs]</a><span class="k">def</span> <span class="nf">load_closure</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="c1"># The arg is no longer offset by len(covar_names) as of 3.11</span>
<span class="c1"># See https://docs.python.org/3/library/dis.html#opcode-LOAD_CLOSURE</span>
<span class="k">if</span> <span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">major</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">minor</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">11</span><span class="p">):</span>
<span class="n">arg</span> <span class="o">-=</span> <span class="nb">len</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">co</span><span class="o">.</span><span class="n">co_varnames</span><span class="p">)</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">get_closure</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span></div>
<div class="viewcode-block" id="load_deref"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.load_deref">[docs]</a><span class="k">def</span> <span class="nf">load_deref</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="c1"># The arg is no longer offset by len(covar_names) as of 3.11</span>
<span class="c1"># See https://docs.python.org/3/library/dis.html#opcode-LOAD_DEREF</span>
<span class="k">if</span> <span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">major</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="o">.</span><span class="n">minor</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">11</span><span class="p">):</span>
<span class="n">arg</span> <span class="o">-=</span> <span class="nb">len</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">co</span><span class="o">.</span><span class="n">co_varnames</span><span class="p">)</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">closure_type</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span></div>
<div class="viewcode-block" id="make_function"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.make_function">[docs]</a><span class="k">def</span> <span class="nf">make_function</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Creates a function with the arguments at the top of the stack.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># TODO(luke-zhu): Handle default argument types</span>
<span class="nb">globals</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="vm">__globals__</span> <span class="c1"># Inherits globals from the current frame</span>
<span class="n">tos</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="c1"># In Python 3.11 lambdas no longer have fully qualified names on the stack,</span>
<span class="c1"># so we check for this case (AKA the code is top of stack.)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tos</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">CodeType</span><span class="p">):</span>
<span class="n">func_name</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">func_code</span> <span class="o">=</span> <span class="n">tos</span>
<span class="n">pop_count</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">is_lambda</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">func_name</span> <span class="o">=</span> <span class="n">tos</span>
<span class="n">func_code</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
<span class="n">pop_count</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">is_lambda</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">closure</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># arg contains flags, with corresponding stack values if positive.</span>
<span class="c1"># https://docs.python.org/3.6/library/dis.html#opcode-MAKE_FUNCTION</span>
<span class="n">pop_count</span> <span class="o">+=</span> <span class="nb">bin</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s1">&#39;1&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">arg</span> <span class="o">&amp;</span> <span class="mh">0x08</span><span class="p">:</span>
<span class="c1"># Convert types in Tuple constraint to a tuple of CPython cells.</span>
<span class="c1"># https://stackoverflow.com/a/44670295</span>
<span class="k">if</span> <span class="n">is_lambda</span><span class="p">:</span>
<span class="n">closureTuplePos</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">closureTuplePos</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span>
<span class="n">closure</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">((</span><span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">_</span><span class="p">)(</span><span class="n">t</span><span class="p">)</span><span class="o">.</span><span class="vm">__closure__</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="n">closureTuplePos</span><span class="p">]</span><span class="o">.</span><span class="n">tuple_types</span><span class="p">)</span>
<span class="n">func</span> <span class="o">=</span> <span class="n">types</span><span class="o">.</span><span class="n">FunctionType</span><span class="p">(</span><span class="n">func_code</span><span class="p">,</span> <span class="nb">globals</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">func_name</span><span class="p">,</span> <span class="n">closure</span><span class="o">=</span><span class="n">closure</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">pop_count</span> <span class="o">&lt;=</span> <span class="nb">len</span><span class="p">(</span><span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">pop_count</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">Const</span><span class="p">(</span><span class="n">func</span><span class="p">)]</span></div>
<div class="viewcode-block" id="make_closure"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.make_closure">[docs]</a><span class="k">def</span> <span class="nf">make_closure</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span> <span class="o">-</span> <span class="mi">2</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">Any</span><span class="p">]</span> <span class="c1"># a callable</span></div>
<div class="viewcode-block" id="build_slice"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_slice">[docs]</a><span class="k">def</span> <span class="nf">build_slice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="nb">slice</span><span class="p">]</span> <span class="c1"># a slice object</span></div>
<span class="k">def</span> <span class="nf">_unpack_lists</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Extract inner types of Lists and Tuples.</span>
<span class="sd"> Pops arg count items from the stack, concatenates their inner types into 1</span>
<span class="sd"> list, and returns that list.</span>
<span class="sd"> Example: if stack[-arg:] == [[i1, i2], [i3]], the output is [i1, i2, i3]</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">types</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="n">type_constraint</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">i</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">type_constraint</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">IndexableTypeConstraint</span><span class="p">):</span>
<span class="n">types</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">type_constraint</span><span class="o">.</span><span class="n">_inner_types</span><span class="p">())</span>
<span class="k">elif</span> <span class="n">type_constraint</span> <span class="o">==</span> <span class="n">Union</span><span class="p">[()]:</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;Unhandled type_constraint: </span><span class="si">%r</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">type_constraint</span><span class="p">)</span>
<span class="n">types</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">typehints</span><span class="o">.</span><span class="n">Any</span><span class="p">)</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="p">[</span><span class="o">-</span><span class="n">arg</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">return</span> <span class="n">types</span>
<div class="viewcode-block" id="build_list_unpack"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_list_unpack">[docs]</a><span class="k">def</span> <span class="nf">build_list_unpack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Joins arg count iterables from the stack into a single list.&quot;&quot;&quot;</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">List</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">_unpack_lists</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">)]])</span></div>
<div class="viewcode-block" id="build_set_unpack"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_set_unpack">[docs]</a><span class="k">def</span> <span class="nf">build_set_unpack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Joins arg count iterables from the stack into a single set.&quot;&quot;&quot;</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Set</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">_unpack_lists</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">)]])</span></div>
<div class="viewcode-block" id="build_tuple_unpack"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_tuple_unpack">[docs]</a><span class="k">def</span> <span class="nf">build_tuple_unpack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Joins arg count iterables from the stack into a single tuple.&quot;&quot;&quot;</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Tuple</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">_unpack_lists</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">)],</span> <span class="o">...</span><span class="p">])</span></div>
<div class="viewcode-block" id="build_tuple_unpack_with_call"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_tuple_unpack_with_call">[docs]</a><span class="k">def</span> <span class="nf">build_tuple_unpack_with_call</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Same as build_tuple_unpack, with an extra fn argument at the bottom of the</span>
<span class="sd"> stack, which remains untouched.&quot;&quot;&quot;</span>
<span class="n">build_tuple_unpack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span></div>
<div class="viewcode-block" id="build_map_unpack"><a class="viewcode-back" href="../../../apache_beam.typehints.opcodes.html#apache_beam.typehints.opcodes.build_map_unpack">[docs]</a><span class="k">def</span> <span class="nf">build_map_unpack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Joins arg count maps from the stack into a single dict.&quot;&quot;&quot;</span>
<span class="n">key_types</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">value_types</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
<span class="n">type_constraint</span> <span class="o">=</span> <span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">type_constraint</span><span class="p">,</span> <span class="n">typehints</span><span class="o">.</span><span class="n">Dict</span><span class="o">.</span><span class="n">DictConstraint</span><span class="p">):</span>
<span class="n">key_types</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">type_constraint</span><span class="o">.</span><span class="n">key_type</span><span class="p">)</span>
<span class="n">value_types</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">type_constraint</span><span class="o">.</span><span class="n">value_type</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">key_type</span><span class="p">,</span> <span class="n">value_type</span> <span class="o">=</span> <span class="n">key_value_types</span><span class="p">(</span><span class="n">element_type</span><span class="p">(</span><span class="n">type_constraint</span><span class="p">))</span>
<span class="n">key_types</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">key_type</span><span class="p">)</span>
<span class="n">value_types</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value_type</span><span class="p">)</span>
<span class="n">state</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Dict</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">key_types</span><span class="p">],</span> <span class="n">Union</span><span class="p">[</span><span class="n">value_types</span><span class="p">]])</span></div>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>