def generate_method(x, lib, auth=True): auth_f = ', auth=None' if auth else '' auth_a = ', auth' if auth else '' typed_args = ', '.join([(PYTYPEOF(arg) + ' ' + arg_name(arg)).strip() for arg in x.args_in]) arg_list = ', '.join([arg_name(arg) for arg in x.args_in]) if x.form == bindings.AsyncCall: excess = '' magic_attr = '' if x.name == 'put': excess = ', secret=None' magic_attr = " if secret is not None: attributes['__secret'] = secret\n" meth = 'def async_{0}(self, {1}{3}{2}):\n'.format( name(x), typed_args, excess, auth_f) meth += magic_attr meth += ' return self.{0}(hyperdex_{3}_{1}, {2}, auth)\n'.format( bindings.call_name(x), x.name, arg_list, lib) meth += 'def {0}(self, {1}{3}{2}):\n'.format(name(x), typed_args, excess, auth_f) meth += magic_attr meth += ' return self.async_{0}({1}{2}).wait()\n'.format( name(x), arg_list, auth_a) elif x.form == bindings.Iterator: meth = 'def {0}(self, {1}):\n'.format(name(x), typed_args) meth += ' return self.{0}(hyperdex_{3}_{1}, {2})\n'.format( bindings.call_name(x), x.name, arg_list, lib) elif x.form == bindings.MicrotransactionCall: raise RuntimeError( 'generate_method cannot be called on MicrotransactionCall') else: raise RuntimeError('unknown function type') return indent(meth)[:-1]
def generate_method(x, lib): assert x.form in (bindings.AsyncCall, bindings.Iterator) typed_args = ', '.join([(PYTYPEOF(arg) + ' ' + arg_name(arg)).strip() for arg in x.args_in]) arg_list = ', '.join([arg_name(arg) for arg in x.args_in]) if x.form == bindings.AsyncCall: excess = '' magic_attr = '' if x.name == 'put': excess = ', secret=None' magic_attr = " if secret is not None: attributes['__secret'] = secret\n" meth = 'def async_{0}(self, {1}, auth=None{2}):\n'.format( name(x), typed_args, excess) meth += magic_attr meth += ' return self.{0}(hyperdex_{3}_{1}, {2}, auth)\n'.format( bindings.call_name(x), x.name, arg_list, lib) meth += 'def {0}(self, {1}, auth=None{2}):\n'.format( name(x), typed_args, excess) meth += magic_attr meth += ' return self.async_{0}({1}, auth).wait()\n'.format( name(x), arg_list) if x.form == bindings.Iterator: meth = 'def {0}(self, {1}):\n'.format(name(x), typed_args) meth += ' return self.{0}(hyperdex_{3}_{1}, {2})\n'.format( bindings.call_name(x), x.name, arg_list, lib) return indent(meth)[:-1]
def generate_method(x, lib, auth=True): auth_f = ', auth=None' if auth else '' auth_a = ', auth' if auth else '' typed_args = ', '.join([(PYTYPEOF(arg) + ' ' + arg_name(arg)).strip() for arg in x.args_in]) arg_list = ', '.join([arg_name(arg) for arg in x.args_in]) if x.form == bindings.AsyncCall: excess = '' magic_attr = '' if x.name == 'put': excess = ', secret=None' magic_attr = " if secret is not None: attributes['__secret'] = secret\n" meth = 'def async_{0}(self, {1}{3}{2}):\n'.format(name(x), typed_args, excess, auth_f) meth += magic_attr meth += ' return self.{0}(hyperdex_{3}_{1}, {2}, auth)\n'.format(bindings.call_name(x), x.name, arg_list, lib) meth += 'def {0}(self, {1}{3}{2}):\n'.format(name(x), typed_args, excess, auth_f) meth += magic_attr meth += ' return self.async_{0}({1}{2}).wait()\n'.format(name(x), arg_list, auth_a) elif x.form == bindings.Iterator: meth = 'def {0}(self, {1}):\n'.format(name(x), typed_args) meth += ' return self.{0}(hyperdex_{3}_{1}, {2})\n'.format(bindings.call_name(x), x.name, arg_list, lib) elif x.form == bindings.MicrotransactionCall: raise RuntimeError('generate_method cannot be called on MicrotransactionCall') else: raise RuntimeError('unknown function type') return indent(meth)[:-1]
def generate_method(x, lib): assert x.form in (bindings.AsyncCall, bindings.Iterator) typed_args = ', '.join([(PYTYPEOF(arg) + ' ' + arg_name(arg)).strip() for arg in x.args_in]) arg_list = ', '.join([arg_name(arg) for arg in x.args_in]) if x.form == bindings.AsyncCall: meth = 'def async_{0}(self, {1}):\n'.format(name(x), typed_args) meth += ' return self.{0}(hyperdex_{3}_{1}, {2})\n'.format(bindings.call_name(x), x.name, arg_list, lib) meth += 'def {0}(self, {1}):\n'.format(name(x), typed_args) meth += ' return self.async_{0}({1}).wait()\n'.format(name(x), arg_list) if x.form == bindings.Iterator: meth = 'def {0}(self, {1}):\n'.format(name(x), typed_args) meth += ' return self.{0}(hyperdex_{3}_{1}, {2})\n'.format(bindings.call_name(x), x.name, arg_list, lib) return indent(meth)[:-1]
def generate_method(x, lib): assert x.form in (bindings.AsyncCall, bindings.Iterator, bindings.MicrotransactionCall) typed_args_in = ', '.join([(arg_name(arg) + ' ' + GOTYPEOF(arg)).strip() for arg in x.args_in]) if x.form == bindings.AsyncCall: typed_args_out = return_type_async(x.args_out) if x.form == bindings.Iterator: typed_args_out = return_type_iter(x.args_out) arg_list = ', '.join([arg_name(arg) for arg in x.args_in]) stub_args, stub_args_list = generate_stub_args(x) meth = 'func stub_{0}(client *C.struct_hyperdex_client, {1}) int64 {{\n'.format( x.name, stub_args) meth += '\treturn int64(C.hyperdex_client_{0}(client, {1}))\n'.format( x.name, stub_args_list) meth += '}\n' if x.form != bindings.MicrotransactionCall: meth += 'func (client *Client) {0}({1}) ({2}) {{\n'.format( GoIfy(x.name), typed_args_in, typed_args_out) else: meth += 'func (client *Client) {0}({1}) {{\n'.format( GoIfy(x.name), typed_args_in) meth += '\treturn client.{0}(stub_{1}, {2})\n'.format( GoIfy(bindings.call_name(x)), x.name, arg_list) meth += '}\n' return meth
def generate_worker_definitions(xs, lib): calls = set([]) for x in xs: call = bindings.call_name(x) if call in calls: continue if x.form is bindings.MicrotransactionCall: continue #TODO support microtransactions in NodeJS assert x.form in (bindings.AsyncCall, bindings.Iterator) fptr = bindings.c.generate_func_ptr(x, lib) func = 'v8::Handle<v8::Value>\nHyperDexClient :: ' func += '{0}({1}, const v8::Arguments& args)\n'.format(call, fptr) func += '{\n' func += ' v8::HandleScope scope;\n' func += ' v8::Local<v8::Object> client_obj = args.This();\n' func += ' HyperDexClient* client = node::ObjectWrap::Unwrap<HyperDexClient>(client_obj);\n' func += ' e::intrusive_ptr<Operation> op(new Operation(client_obj, client));\n' if x.form == bindings.AsyncCall: func += ' v8::Local<v8::Function> func = args[{0}].As<v8::Function>();\n'.format(len(x.args_in)) func += '\n if (func.IsEmpty() || !func->IsFunction())\n' func += ' {\n' func += ' v8::ThrowException(v8::String::New("Callback must be a function"));\n' func += ' return scope.Close(v8::Undefined());\n' func += ' }\n\n' func += ' if (!op->set_callback(func)) { return scope.Close(v8::Undefined()); }\n' if x.form == bindings.Iterator: func += ' v8::Local<v8::Function> func = args[{0}].As<v8::Function>();\n'.format(len(x.args_in)) func += '\n if (func.IsEmpty() || !func->IsFunction())\n' func += ' {\n' func += ' v8::ThrowException(v8::String::New("Callback must be a function"));\n' func += ' return scope.Close(v8::Undefined());\n' func += ' }\n\n' func += ' v8::Local<v8::Function> done = args[{0}].As<v8::Function>();\n'.format(len(x.args_in) + 1) func += '\n if (done.IsEmpty() || !done->IsFunction())\n'.format(len(x.args_in)) func += ' {\n' func += ' v8::ThrowException(v8::String::New("Callback must be a function"));\n' func += ' return scope.Close(v8::Undefined());\n' func += ' }\n\n' func += ' if (!op->set_callback(func, done)) { return scope.Close(v8::Undefined()); }\n' for idx, arg in enumerate(x.args_in): for p, n in arg.args: func += ' ' + p + ' in_' + n + ';\n' args = ', '.join(['&in_' + n for p, n in arg.args]) func += ' v8::Local<v8::Value> {0} = args[{1}];\n'.format(arg.__name__.lower(), idx) func += ' if (!op->convert_{0}({0}, {1})) return scope.Close(v8::Undefined());\n'.format(arg.__name__.lower(), args) func += ' op->reqid = f(client->client(), {0}, {1});\n\n'.format(', '.join(['in_' + n for p, n in sum([list(a.args) for a in x.args_in], [])]), ', '.join(['&op->' + n for p, n in sum([list(a.args) for a in x.args_out], [])])) func += ' if (op->reqid < 0)\n {\n' func += ' op->callback_error_from_status();\n' func += ' return scope.Close(v8::Undefined());\n' func += ' }\n\n' args = '_'.join([arg.__name__.lower() for arg in x.args_out]) form = x.form.__name__.lower() func += ' op->encode_return = &Operation::encode_{0}_{1};\n'.format(form, args) func += ' client->add(op->reqid, op);\n' func += ' return scope.Close(v8::Undefined());\n' func += '}\n' yield func calls.add(call)
def generate_definition(x): assert x.form in (bindings.AsyncCall, bindings.Iterator) func = 'v8::Handle<v8::Value>\n' func += 'HyperDexClient :: ' + x.name func += '(const v8::Arguments& args)\n{\n' func += ' return {0}(hyperdex_client_{1}, args);\n'.format(bindings.call_name(x), x.name) func += '}\n' return func
def generate_workers(xs): calls = set([]) for x in xs: call = bindings.call_name(x) if call in calls: continue yield generate_worker(call, x) calls.add(call)
def generate_function_pointer_typedefs(xs, lib): calls = set([]) for x in xs: call = bindings.call_name(x) if call in calls: continue assert x.form in (bindings.AsyncCall, bindings.Iterator) yield 'ctypedef ' + generate_function_ptr(x, call + '_fptr', lib) calls.add(call)
def generate_worker_declarations(xs, lib): calls = set([]) for x in xs: call = bindings.call_name(x) if call in calls: continue assert x.form in (bindings.AsyncCall, bindings.Iterator) fptr = bindings.c.generate_func_ptr(x, lib) yield 'static v8::Handle<v8::Value> {0}({1}, const v8::Arguments& args);'.format(call, fptr) calls.add(call)
def generate_workers(xs): calls = set([]) for x in xs: call = bindings.call_name(x) if call in calls: continue if x.form is bindings.MicrotransactionCall: continue yield generate_worker(call, x) calls.add(call)
def generate_workers(xs): calls = set([]) for x in xs: call = bindings.call_name(x) if call in calls: continue assert x.form in (bindings.AsyncCall, bindings.Iterator) if x.form == bindings.AsyncCall: yield generate_worker_asynccall(call, x) if x.form == bindings.Iterator: yield generate_worker_iterator(call, x) calls.add(call)
def generate_method(x, lib): assert x.form in (bindings.AsyncCall, bindings.Iterator) typed_args = ', '.join([(PYTYPEOF(arg) + ' ' + arg_name(arg)).strip() for arg in x.args_in]) arg_list = ', '.join([arg_name(arg) for arg in x.args_in]) if x.form == bindings.AsyncCall: excess = '' magic_attr = '' if x.name == 'put': excess = ', secret=None' magic_attr = " if secret is not None: attributes['__secret'] = secret\n" meth = 'def async_{0}(self, {1}, auth=None{2}):\n'.format(name(x), typed_args, excess) meth += magic_attr meth += ' return self.{0}(hyperdex_{3}_{1}, {2}, auth)\n'.format(bindings.call_name(x), x.name, arg_list, lib) meth += 'def {0}(self, {1}, auth=None{2}):\n'.format(name(x), typed_args, excess) meth += magic_attr meth += ' return self.async_{0}({1}, auth).wait()\n'.format(name(x), arg_list) if x.form == bindings.Iterator: meth = 'def {0}(self, {1}):\n'.format(name(x), typed_args) meth += ' return self.{0}(hyperdex_{3}_{1}, {2})\n'.format(bindings.call_name(x), x.name, arg_list, lib) return indent(meth)[:-1]
def generate_workers(xs): calls = set([]) for x in xs: call = bindings.call_name(x) if call in calls: continue if x.form is bindings.MicrotransactionCall: continue if x.form == bindings.AsyncCall: yield generate_worker_asynccall(call, x) elif x.form == bindings.Iterator: yield generate_worker_iterator(call, x) else: raise RuntimeError('unknown function type') calls.add(call)
def generate_method(x, lib): assert x.form in (bindings.AsyncCall, bindings.Iterator) typed_args_in = ', '.join([(arg_name(arg) + ' ' + GOTYPEOF(arg)).strip() for arg in x.args_in]) if x.form == bindings.AsyncCall: typed_args_out = return_type_async(x.args_out) if x.form == bindings.Iterator: typed_args_out = return_type_iter(x.args_out) arg_list = ', '.join([arg_name(arg) for arg in x.args_in]) stub_args, stub_args_list = generate_stub_args(x) meth = 'func stub_{0}(client *C.struct_hyperdex_client, {1}) int64 {{\n'.format(x.name, stub_args) meth += '\treturn int64(C.hyperdex_client_{0}(client, {1}))\n'.format(x.name, stub_args_list) meth += '}\n' meth += 'func (client *Client) {0}({1}) ({2}) {{\n'.format(GoIfy(x.name), typed_args_in, typed_args_out) meth += '\treturn client.{0}(stub_{1}, {2})\n'.format(GoIfy(bindings.call_name(x)), x.name, arg_list) meth += '}\n' return meth
def generate_definition(x): assert x.form in (bindings.AsyncCall, bindings.Iterator) func = 'JNIEXPORT HYPERDEX_API jobject JNICALL\n' if x.form == bindings.AsyncCall: func += 'Java_org_hyperdex_client_Client_async_1{0}(JNIEnv* env, jobject obj'.format( x.name.replace('_', '_1')) if x.form == bindings.Iterator: func += 'Java_org_hyperdex_client_Client_{0}(JNIEnv* env, jobject obj'.format( x.name.replace('_', '_1')) for arg in x.args_in: func += ', ' + CTYPEOF(arg) + ' ' + arg.__name__.lower() func += ')\n{\n' func += ' return hyperdex_java_client_{0}(env, obj, hyperdex_client_{1}'.format( bindings.call_name(x), x.name) for arg in x.args_in: func += ', ' + arg.__name__.lower() func += ');\n}\n' return func
def generate_definition(x): assert x.form in (bindings.AsyncCall, bindings.Iterator) func = 'static VALUE\nhyperdex_ruby_client_{0}(VALUE self'.format(x.name) for arg in x.args_in: func += ', VALUE ' + arg.__name__.lower() func += ')\n{\n' func += ' return hyperdex_ruby_client_{0}(hyperdex_client_{1}, self'.format(bindings.call_name(x), x.name) for arg in x.args_in: func += ', ' + arg.__name__.lower() func += ');\n}\n' if x.form == bindings.AsyncCall: func += 'VALUE\nhyperdex_ruby_client_wait_{0}(VALUE self'.format(x.name) for arg in x.args_in: func += ', VALUE ' + arg.__name__.lower() func += ')\n{\n' func += ' VALUE deferred = hyperdex_ruby_client_{0}(self'.format(x.name) for arg in x.args_in: func += ', ' + arg.__name__.lower() func += ');\n' func += ' return rb_funcall(deferred, rb_intern("wait"), 0);\n}\n' return func
def generate_definition(x): assert x.form in (bindings.AsyncCall, bindings.Iterator) func = 'static VALUE\nhyperdex_ruby_client_{0}(VALUE self'.format(x.name) for arg in x.args_in: func += ', VALUE ' + arg.__name__.lower() func += ')\n{\n' func += ' return hyperdex_ruby_client_{0}(hyperdex_client_{1}, self'.format( bindings.call_name(x), x.name) for arg in x.args_in: func += ', ' + arg.__name__.lower() func += ');\n}\n' if x.form == bindings.AsyncCall: func += 'VALUE\nhyperdex_ruby_client_wait_{0}(VALUE self'.format( x.name) for arg in x.args_in: func += ', VALUE ' + arg.__name__.lower() func += ')\n{\n' func += ' VALUE deferred = hyperdex_ruby_client_{0}(self'.format( x.name) for arg in x.args_in: func += ', ' + arg.__name__.lower() func += ');\n' func += ' return rb_funcall(deferred, rb_intern("wait"), 0);\n}\n' return func