| |
| |
| <!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 — 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> »</li> |
| |
| <li><a href="../../index.html">Module code</a> »</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 "License"); 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 "AS IS" 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">"""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">"""</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">>=</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">"""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't have bytecode in</span> |
| <span class="sd"> CPython so that's okay.</span> |
| <span class="sd"> """</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">"""Like load_attr. Replaces TOS object with method and TOS."""</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'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">>=</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">>></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">>=</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">>=</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">"""Creates a function with the arguments at the top of the stack.</span> |
| <span class="sd"> """</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">'1'</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">arg</span> <span class="o">&</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"><=</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">"""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"> """</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">'Unhandled type_constraint: </span><span class="si">%r</span><span class="s1">'</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">"""Joins arg count iterables from the stack into a single list."""</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">"""Joins arg count iterables from the stack into a single set."""</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">"""Joins arg count iterables from the stack into a single tuple."""</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">"""Same as build_tuple_unpack, with an extra fn argument at the bottom of the</span> |
| <span class="sd"> stack, which remains untouched."""</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">"""Joins arg count maps from the stack into a single dict."""</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> |
| © 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> |