native.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*jshint loopfunc: true */
  2. /*
  3. * Object to facilitate building native Javascript functions that
  4. * behave similarly to Python functions.
  5. *
  6. * Use:
  7. * foo = Sk.nativejs.func(function foo(...) {...});
  8. */
  9. Sk.nativejs = {
  10. FN_ARGS : /^function\s*[^\(]*\(\s*([^\)]*)\)/m,
  11. FN_ARG_SPLIT : /,/,
  12. FN_ARG : /^\s*(_?)(\S+?)\1\s*$/,
  13. STRIP_COMMENTS : /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,
  14. formalParameterList: function (fn) {
  15. var r;
  16. var a;
  17. var arg;
  18. var fnText, argDecl;
  19. var args = [];
  20. fnText = fn.toString().replace(this.STRIP_COMMENTS, "");
  21. argDecl = fnText.match(this.FN_ARGS);
  22. r = argDecl[1].split(this.FN_ARG_SPLIT);
  23. for (a in r) {
  24. arg = r[a];
  25. arg.replace(this.FN_ARG, function (all, underscore, name) {
  26. args.push(name);
  27. });
  28. }
  29. return args;
  30. },
  31. func : function (code) {
  32. code["co_name"] = new Sk.builtin.str(code.name);
  33. code["co_varnames"] = Sk.nativejs.formalParameterList(code);
  34. return new Sk.builtin.func(code);
  35. },
  36. func_nokw : function (code) {
  37. code["co_name"] = new Sk.builtin.str(code.name);
  38. code["co_varnames"] = Sk.nativejs.formalParameterList(code);
  39. code["no_kw"] = true;
  40. return new Sk.builtin.func(code);
  41. }
  42. };
  43. goog.exportSymbol("Sk.nativejs.func", Sk.nativejs.func);
  44. goog.exportSymbol("Sk.nativejs.func_nokw", Sk.nativejs.func_nokw);