media/mtransport/runnable_utils.py

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 # This Source Code Form is subject to the terms of the Mozilla Public
     2 # License, v. 2.0. If a copy of the MPL was not distributed with this
     3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
     4 MAX_ARGS = 15
     6 boilerplate = "/* This Source Code Form is subject to the terms of the Mozilla Public\n\
     7  * License, v. 2.0. If a copy of the MPL was not distributed with this\n\
     8  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n"
    10 def gen_args_type(args, member):
    11     if member:
    12         ret = ["C o"]
    13     else:
    14         ret = []
    15     ret.append("M m")
    16     for arg in range(0, args):
    17         ret.append("A%d a%d"%(arg, arg))
    18     return ", ".join(ret)
    20 def gen_args(args, member):
    21     if member:
    22         ret = ["o"]
    23     else:
    24         ret = []
    25     ret.append("m")
    26     for arg in range(0, args):
    27         ret.append("a%d"%(arg))
    28     return ", ".join(ret)
    30 def gen_args_(args):
    31     ret = []
    32     for arg in range(0, args):
    33         ret.append("a%d_"%(arg))
    34     return ", ".join(ret)
    36 def gen_init(args, r = False, member = False):
    37     if member:
    38         ret = ["o_(o)"]
    39     else:
    40         ret = []
    41     ret.append("m_(m)")
    43     if r:
    44         ret.append("r_(r)")
    46     for arg in range(0, args):
    47         ret.append("a%d_(a%d)"%(arg, arg))
    48     return ", ".join(ret)
    50 def gen_typenames(args, member):
    51     if member:
    52         ret = ["typename C"]
    53     else:
    54         ret = []
    55     ret.append("typename M")
    57     for arg in range(0, args):
    58         ret.append("typename A%d"%(arg))
    59     return ", ".join(ret)
    61 def gen_types(args, member):
    62     if member:
    63         ret = ["C"]
    64     else:
    65         ret = []
    66     ret.append("M")
    67     for arg in range(0, args):
    68         ret.append("A%d"%(arg))
    69     return ", ".join(ret)
    72 def generate_class_template(args, ret = False, member = True):
    73     print "// %d arguments --"%args
    74     if member:
    75         nm = "m"
    76     else:
    77         nm = "nm"
    79     if not ret:
    80         print "template<"+ gen_typenames(args, member) + "> class runnable_args_%s_%d : public runnable_args_base {"%(nm, args)
    81     else:
    82         print "template<"+ gen_typenames(args, member) + ", typename R> class runnable_args_%s_%d_ret : public runnable_args_base {"%(nm, args)
    84     print " public:"
    86     if not ret:
    87         print "  runnable_args_%s_%d("%(nm, args) + gen_args_type(args, member) + ") :"
    88         print "    " + gen_init(args, False, member) + "  {}"
    89     else:
    90         print "  runnable_args_%s_%d_ret("%(nm, args) + gen_args_type(args, member) + ", R *r) :"
    91         print "    " + gen_init(args, True, member) + "  {}"
    92         print "  virtual bool returns_value() const { return true; }"
    93     print
    94     print "  NS_IMETHOD Run() {"
    95     if ret:
    96         print "    *r_ =",
    97     else:
    98         print "   ",
    99     if member:
   100         print "((*o_).*m_)(" + gen_args_(args) + ");"
   101     else:
   102         print "m_(" + gen_args_(args) + ");"
   104     print "    return NS_OK;"
   105     print "  }"
   106     print
   107     print " private:"
   108     if member:
   109         print "  C o_;"
   110     print "  M m_;"
   111     if ret:
   112         print "  R* r_;"
   113     for arg in range(0, args):
   114         print "  A%d a%d_;"%(arg, arg)
   115     print "};"
   116     print
   117     print
   118     print
   120 def generate_function_template(args, member):
   121     if member:
   122         nm = "m"
   123         NM = "";
   124     else:
   125         nm = "nm"
   126         NM = "NM";
   128     print "// %d arguments --"%args
   129     print "template<" + gen_typenames(args, member) + ">"
   130     print "runnable_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">* WrapRunnable%s("%NM + gen_args_type(args, member) + ") {"
   131     print "  return new runnable_args_%s_%d<"%(nm, args) + gen_types(args, member) + ">"
   132     print "    (" + gen_args(args, member) + ");"
   133     print "}"
   134     print
   136 def generate_function_template_ret(args, member):
   137     if member:
   138         nm = "m"
   139         NM = "";
   140     else:
   141         nm = "nm"
   142         NM = "NM";
   143     print "// %d arguments --"%args
   144     print "template<" + gen_typenames(args, member) + ", typename R>"
   145     print "runnable_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>* WrapRunnable%sRet("%NM + gen_args_type(args, member) + ", R* r) {"
   146     print "  return new runnable_args_%s_%d_ret<"%(nm, args) + gen_types(args, member) + ", R>"
   147     print "    (" + gen_args(args, member) + ", r);"
   148     print "}"
   149     print
   152 print boilerplate
   153 print
   155 for num_args in range (0, MAX_ARGS):
   156     generate_class_template(num_args, False, False)
   157     generate_class_template(num_args, True, False)
   158     generate_class_template(num_args, False, True)
   159     generate_class_template(num_args, True, True)
   162 print
   163 print
   164 print
   166 for num_args in range(0, MAX_ARGS):
   167     generate_function_template(num_args, False)
   168     generate_function_template_ret(num_args, False)
   169     generate_function_template(num_args, True)
   170     generate_function_template_ret(num_args, True)

mercurial