Przeglądaj źródła

Merge remote-tracking branch 'upstream/v1.4.x' into advance-version-v1.4.2

Muxi Yan 8 lat temu
rodzic
commit
0550029673
3 zmienionych plików z 109 dodań i 31 usunięć
  1. 5 0
      gRPC-Core.podspec
  2. 99 31
      src/node/src/client.js
  3. 5 0
      templates/gRPC-Core.podspec.template

+ 5 - 0
gRPC-Core.podspec

@@ -988,4 +988,9 @@ Pod::Spec.new do |s|
                       'test/core/util/port.c',
                       'test/core/util/port_server_client.{c,h}'
   end
+
+  # TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path?
+  s.prepare_command = <<-END_OF_COMMAND
+    find src/core/ -type f -exec sed -E -i '.back' 's;#include "third_party/nanopb/(.*)";#include <nanopb/\\1>;g' {} \\\;
+  END_OF_COMMAND
 end

+ 99 - 31
src/node/src/client.js

@@ -48,7 +48,6 @@
 'use strict';
 
 var _ = require('lodash');
-var arguejs = require('arguejs');
 
 var grpc = require('./grpc_extension');
 
@@ -515,14 +514,33 @@ exports.Client = Client;
 Client.prototype.makeUnaryRequest = function(method, serialize, deserialize,
                                              argument, metadata, options,
                                              callback) {
-  /* While the arguments are listed in the function signature, those variables
-   * are not used directly. Instead, ArgueJS processes the arguments
-   * object. This allows for simple handling of optional arguments in the
-   * middle of the argument list, and also provides type checking. */
-  var args = arguejs({method: String, serialize: Function,
-                      deserialize: Function,
-                      argument: null, metadata: [Metadata, new Metadata()],
-                      options: [Object], callback: Function}, arguments);
+  /* Remove argue.js and parse arguments array explicitly as it reduces overhead by almost 40% */
+  /* Required function arguments. */
+  var args = {
+    method: arguments[0],
+    serialize: arguments[1],
+    deserialize: arguments[2],
+    argument: arguments[3],
+    callback: arguments[arguments.length -1]
+  };
+
+  if (arguments.length >= 7) {
+    args.metadata = arguments[4];
+    args.options =  arguments[5];
+    args.callback = arguments[6];
+  } else if (arguments.length === 6) {
+    if (arguments[4] instanceof Metadata) {
+      args.metadata = arguments[4]
+      args.options = {};
+    } else {
+      args.options = arguments[4];
+      args.metadata = new Metadata();
+    }
+  } else {
+    args.options = {};
+    args.metadata = new Metadata();
+  }
+
   var call = getCall(this.$channel, method, args.options);
   var emitter = new ClientUnaryCall(call);
   metadata = args.metadata.clone();
@@ -597,14 +615,31 @@ Client.prototype.makeUnaryRequest = function(method, serialize, deserialize,
 Client.prototype.makeClientStreamRequest = function(method, serialize,
                                                       deserialize, metadata,
                                                       options, callback) {
-  /* While the arguments are listed in the function signature, those variables
-   * are not used directly. Instead, ArgueJS processes the arguments
-   * object. This allows for simple handling of optional arguments in the
-   * middle of the argument list, and also provides type checking. */
-  var args = arguejs({method:String, serialize: Function,
-                      deserialize: Function,
-                      metadata: [Metadata, new Metadata()],
-                      options: [Object], callback: Function}, arguments);
+  /* Required function arguments. */
+  var args = {
+    method: arguments[0],
+    serialize: arguments[1],
+    deserialize: arguments[2],
+    callback: arguments[arguments.length - 1]
+  };
+
+  if (arguments.length >= 6) {
+    args.metadata = arguments[3];
+    args.options =  arguments[4];
+    args.callback = arguments[5];
+  } else if (arguments.length === 5) {
+    if (arguments[3] instanceof Metadata) {
+      args.metadata = arguments[3]
+      args.options = {};
+    } else {
+      args.options = arguments[3];
+      args.metadata = new Metadata();
+    }
+  } else {
+    args.options = {};
+    args.metadata = new Metadata();
+  }
+  
   var call = getCall(this.$channel, method, args.options);
   metadata = args.metadata.clone();
   var stream = new ClientWritableStream(call, serialize);
@@ -679,13 +714,30 @@ Client.prototype.makeClientStreamRequest = function(method, serialize,
 Client.prototype.makeServerStreamRequest = function(method, serialize,
                                                     deserialize, argument,
                                                     metadata, options) {
-  /* While the arguments are listed in the function signature, those variables
-   * are not used directly. Instead, ArgueJS processes the arguments
-   * object. */
-  var args = arguejs({method:String, serialize: Function,
-                      deserialize: Function,
-                      argument: null, metadata: [Metadata, new Metadata()],
-                      options: [Object]}, arguments);
+  /* Required function arguments. */
+  var args = {
+    method: arguments[0],
+    serialize: arguments[1],
+    deserialize: arguments[2],
+    argument: arguments[3]
+  };
+
+  if (arguments.length >= 6) {
+    args.metadata = arguments[4];
+    args.options =  arguments[5];
+  } else if (arguments.length === 5) {
+    if (arguments[4] instanceof Metadata) {
+      args.metadata = arguments[4]
+      args.options = {};
+    } else {
+      args.options = arguments[4];
+      args.metadata = new Metadata();
+    }
+  } else {
+    args.options = {};
+    args.metadata = new Metadata();
+  }
+  
   var call = getCall(this.$channel, method, args.options);
   metadata = args.metadata.clone();
   var stream = new ClientReadableStream(call, deserialize);
@@ -737,13 +789,29 @@ Client.prototype.makeServerStreamRequest = function(method, serialize,
 Client.prototype.makeBidiStreamRequest = function(method, serialize,
                                                   deserialize, metadata,
                                                   options) {
-  /* While the arguments are listed in the function signature, those variables
-   * are not used directly. Instead, ArgueJS processes the arguments
-   * object. */
-  var args = arguejs({method:String, serialize: Function,
-                      deserialize: Function,
-                      metadata: [Metadata, new Metadata()],
-                      options: [Object]}, arguments);
+  /* Required function arguments. */
+  var args = {
+    method: arguments[0],
+    serialize: arguments[1],
+    deserialize: arguments[2],
+  };
+
+  if (arguments.length >= 5) {
+    args.metadata = arguments[3];
+    args.options =  arguments[4];
+  } else if (arguments.length === 4) {
+    if (arguments[3] instanceof Metadata) {
+      args.metadata = arguments[3]
+      args.options = {};
+    } else {
+      args.options = arguments[3];
+      args.metadata = new Metadata();
+    }
+  } else {
+    args.options = {};
+    args.metadata = new Metadata();
+  }
+
   var call = getCall(this.$channel, method, args.options);
   metadata = args.metadata.clone();
   var stream = new ClientDuplexStream(call, serialize, deserialize);

+ 5 - 0
templates/gRPC-Core.podspec.template

@@ -193,4 +193,9 @@
                         'test/core/util/port.c',
                         'test/core/util/port_server_client.{c,h}'
     end
+
+    # TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path?
+    s.prepare_command = <<-END_OF_COMMAND
+      find src/core/ -type f -exec sed -E -i '.back' 's;#include "third_party/nanopb/(.*)";#include <nanopb/\\1>;g' {} \\\;
+    END_OF_COMMAND
   end