From 5dad661f636be7e0225da836d721d6ab60a0d891 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Fri, 12 Sep 2008 14:19:16 -0700 Subject: [PATCH] Re-work keyword argument implementation for TraceMonkey compatibility Also fix various bugs that only show up with the new implementation. --- modules/bindings/default/content-buffer/quote.js | 4 +- modules/keyboard.js | 2 + modules/keywords.js | 146 ++++++++++++----------- modules/page-modes/google-calendar.js | 10 +- 4 files changed, 86 insertions(+), 76 deletions(-) rewrite modules/keywords.js (88%) diff --git a/modules/bindings/default/content-buffer/quote.js b/modules/bindings/default/content-buffer/quote.js index ca07d9b..4623cb6 100644 --- a/modules/bindings/default/content-buffer/quote.js +++ b/modules/bindings/default/content-buffer/quote.js @@ -10,6 +10,6 @@ define_keymap("content_buffer_quote_keymap"); define_key(content_buffer_quote_next_keymap, match_any_key, "content-buffer-update-input-mode-for-focus", $fallthrough); -define_key(content_buffer_quote_keymap, "escape", "content-buffer-update-input-mode-for-focus", null); -define_key(content_buffer_quote_keymap, "M-escape", "content-buffer-update-input-mode-for-focus", null); +define_key(content_buffer_quote_keymap, "escape", "content-buffer-update-input-mode-for-focus"); +define_key(content_buffer_quote_keymap, "M-escape", "content-buffer-update-input-mode-for-focus"); define_key(content_buffer_quote_keymap, match_any_key, null, $fallthrough); diff --git a/modules/keyboard.js b/modules/keyboard.js index 4a974bb..fb6023f 100644 --- a/modules/keyboard.js +++ b/modules/keyboard.js @@ -447,6 +447,7 @@ outer: define_keywords("$fallthrough", "$category"); function define_key(kmap, keys, cmd) { + keywords(arguments); var orig_keys = keys; try { var ref = get_caller_source_code_reference(); @@ -509,6 +510,7 @@ function keymap () } function define_keymap(name) { + keywords(arguments); this[name] = new keymap($name = name, forward_keywords(arguments)); } diff --git a/modules/keywords.js b/modules/keywords.js dissimilarity index 88% index ff3886f..afc19d3 100644 --- a/modules/keywords.js +++ b/modules/keywords.js @@ -1,69 +1,77 @@ -/** - * (C) Copyright 2007-2008 Jeremy Maitin-Shepard - * - * Use, modification, and distribution are subject to the terms specified in the - * COPYING file. -**/ - -function keyword_argument(name, value) -{ - this.name = name; - this.value = value; -} - -function keyword_argument_forwarder(args) -{ - this.args = args; -} - -function _get_keyword_argument_setter(name) { - return function (value) { return new keyword_argument(name, value); } -} - -function _get_keyword_argument_getter(name) { - return function () { return new keyword_argument(name, true); } -} - -// This function must be called with all string arguments, all of -// which must begin with "$". -function define_keywords() -{ - for (var i = 0; i < arguments.length; ++i) - { - var name = arguments[i]; - this.__defineSetter__(name, _get_keyword_argument_setter(name)); - this.__defineGetter__(name, _get_keyword_argument_getter(name)); - } -} - -var define_keyword = define_keywords; - -function forward_keywords(args) -{ - return new keyword_argument_forwarder(args); -} - -// This is called with a function's `arguments' variable. Additional -// default values can also be specified as subsequent arguments. -function keywords(args) -{ - /* First add our own arguments. */ - for (var i = 1; i < arguments.length; ++i) - { - var arg = arguments[i]; - args[arg.name] = arg.value; - } - function helper(in_args) - { - // Begin at the first "undeclared" argument - for (var i = in_args.callee.length; i < in_args.length; ++i) - { - var arg = in_args[i]; - if (arg instanceof keyword_argument) - args[arg.name] = arg.value; - else if (arg instanceof keyword_argument_forwarder) - helper(arg.args); - } - } - helper(args); -} +/** + * (C) Copyright 2007-2008 Jeremy Maitin-Shepard + * + * Use, modification, and distribution are subject to the terms specified in the + * COPYING file. + **/ + +{ + let _keyword_argument_list = []; + let _get_keyword_argument_setter = function _get_keyword_argument_setter(name) { + return function (value) { _keyword_argument_list[_keyword_argument_list.length] = name; return value; } + } + + let _get_keyword_argument_getter = function _get_keyword_argument_getter(name) { + return function () { _keyword_argument_list[_keyword_argument_list.length] = name; return true; } + } + + // This function must be called with all string arguments, all of + // which must begin with "$". + function define_keywords() + { + for (var i = 0; i < arguments.length; ++i) + { + var name = arguments[i]; + this.__defineSetter__(name, _get_keyword_argument_setter(name)); + this.__defineGetter__(name, _get_keyword_argument_getter(name)); + } + } + + var define_keyword = define_keywords; + + let write_keywords = function write_keywords(output, input) { + let first_index = input.callee.length; + let max_index = input.length; + let count = max_index - first_index; + if (count > 0) { + let offset = _keyword_argument_list.length - 1; + for (let i = max_index - 1; i >= first_index; --i) { + let value = input[i]; + if (value instanceof keyword_argument_forwarder) { + for (let x in value) + output[x] = value[x]; + --count; + } else { + let name = _keyword_argument_list[offset--]; + output[name] = value; + } + } + _keyword_argument_list.length -= count; + } + } + + let keyword_argument_forwarder = function keyword_argument_forwarder(args) { + if ("_processed_keywords" in args) { + for (let x in args) { + if (x[0] == "$") { + this[x] = args[x]; + } + } + } else + write_keywords(this, args); + } + + function keywords(args) { + write_keywords(args, arguments); + write_keywords(args, args); + args._processed_keywords = true; + } + + function forward_keywords(args) { + return new keyword_argument_forwarder(args); + } + + function protect_keywords() { + return new keyword_argument_forwarder(arguments); + } +} diff --git a/modules/page-modes/google-calendar.js b/modules/page-modes/google-calendar.js index cb794cc..fc522d8 100644 --- a/modules/page-modes/google-calendar.js +++ b/modules/page-modes/google-calendar.js @@ -11,7 +11,7 @@ require("bindings/default/content-buffer/normal.js"); define_keymap("google_calendar_keymap", $parent = content_buffer_normal_keymap); define_key(google_calendar_keymap, "c", null, $fallthrough); -define_key(google_calendar_keymap, "C-c c", null, "copy"); +define_key(google_calendar_keymap, "C-c c", "copy"); define_key(google_calendar_keymap, "/", null, $fallthrough); define_key(google_calendar_keymap, "p", null, $fallthrough); @@ -19,19 +19,19 @@ define_key(google_calendar_keymap, "j", null, $fallthrough); define_key(google_calendar_keymap, "n", null, $fallthrough); define_key(google_calendar_keymap, "k", null, $fallthrough); define_key(google_calendar_keymap, "t", null, $fallthrough); -define_key(google_calendar_keymap, "C-c t", null, "follow-top"); +define_key(google_calendar_keymap, "C-c t", "follow-top"); define_key(google_calendar_keymap, "d", null, $fallthrough); define_key(google_calendar_keymap, "x", null, $fallthrough); -define_key(google_calendar_keymap, "C-c x", null, "shell-command-on-file"); +define_key(google_calendar_keymap, "C-c x", "shell-command-on-file"); define_key(google_calendar_keymap, "w", null, $fallthrough); define_key(google_calendar_keymap, "m", null, $fallthrough); define_key(google_calendar_keymap, "a", null, $fallthrough); define_key(google_calendar_keymap, "q", null, $fallthrough); define_key(google_calendar_keymap, "s", null, $fallthrough); -define_key(google_calendar_keymap, "C-c s", null, "save"); +define_key(google_calendar_keymap, "C-c s", "save"); define_key(google_calendar_keymap, "u", null, $fallthrough); -define_key(google_calendar_keymap, "C-c u", null, "go-up"); +define_key(google_calendar_keymap, "C-c u", "go-up"); define_key(google_calendar_keymap, "return", null, $fallthrough); define_key(google_calendar_keymap, "tab", null, $fallthrough); define_key(google_calendar_keymap, "M-s", null, $fallthrough); -- 2.11.4.GIT