| README for gdb/guile |
| ==================== |
| |
| This file contains important notes for gdb/guile developers. |
| ["gdb/guile" refers to the directory you found this file in] |
| |
| Nomenclature: |
| |
| In the implementation we use "Scheme" or "Guile" depending on context. |
| And sometimes it doesn't matter. |
| Guile is Scheme, and for the most part this is what we present to the user |
| as well. However, to highlight the fact that it is Guile, the GDB commands |
| that invoke Scheme functions are named "guile" and "guile-repl", |
| abbreviated "gu" and "gr" respectively. |
| |
| Co-existence with Python: |
| |
| Keep the user interfaces reasonably consistent, but don't shy away from |
| providing a clearer (or more Scheme-friendly/consistent) user interface |
| where appropriate. |
| |
| Additions to Python support or Scheme support don't require corresponding |
| changes in the other scripting language. |
| |
| Scheme-wrapped breakpoints are created lazily so that if the user |
| doesn't use Scheme s/he doesn't pay any cost. |
| |
| Importing the gdb module into Scheme: |
| |
| To import the gdb module: |
| (gdb) guile (use-modules (gdb)) |
| |
| If you want to add a prefix to gdb module symbols: |
| (gdb) guile (use-modules ((gdb) #:renamer (symbol-prefix-proc 'gdb:))) |
| This gives every symbol a "gdb:" prefix which is a common convention. |
| OTOH it's more to type. |
| |
| Implementation/Hacking notes: |
| |
| Don't use scm_is_false. |
| For this C function, () == #f (a la Lisp) and it's not clear how treating |
| them as equivalent for truth values will affect the GDB interface. |
| Until the effect is clear avoid them. |
| Instead use gdbscm_is_false, gdbscm_is_true, gdbscm_is_bool. |
| There are macros in guile-internal.h to enforce this. |
| |
| Use gdbscm_foo as the name of functions that implement Scheme procedures |
| to provide consistent naming in error messages. The user can see "gdbscm" |
| in the name and immediately know where the function came from. |
| |
| All smobs contain gdb_smob or chained_gdb_smob as the first member. |
| This provides a mechanism for extending them in the Scheme side without |
| tying GDB to the details. |
| |
| The lifetime of a smob, AIUI, is decided by the containing SCM. |
| When there is no longer a reference to the containing SCM then the |
| smob can be GC'd. Objects that have references from outside of Scheme, |
| e.g., breakpoints, need to be protected from GC. |
| |
| Don't do something that can cause a Scheme exception inside a TRY_CATCH, |
| and, in code that can be called from Scheme, don't do something that can |
| cause a GDB exception outside a TRY_CATCH. |
| This makes the code a little tricky to write sometimes, but it is a |
| rule imposed by the programming environment. Bugs often happen because |
| this rule is broken. Learn it, follow it. |
| |
| Coding style notes: |
| |
| - If you find violations to these rules, let's fix the code. |
| Some attempt has been made to be consistent, but it's early. |
| Over time we want things to be more consistent, not less. |
| |
| - None of this really needs to be read. Instead, do not be creative: |
| Monkey-See-Monkey-Do hacking should generally Just Work. |
| |
| - Absence of the word "typically" means the rule is reasonably strict. |
| |
| - The gdbscm_initialize_foo function (e.g., gdbscm_initialize_values) |
| is the last thing to appear in the file, immediately preceded by any |
| tables of exported variables and functions. |
| |
| - In addition to these of course, follow GDB coding conventions. |
| |
| General naming rules: |
| |
| - The word "object" absent any modifier (like "GOOPS object") means a |
| Scheme object (of any type), and is never used otherwise. |
| If you want to refer to, e.g., a GOOPS object, say "GOOPS object". |
| |
| - Do not begin any function, global variable, etc. name with scm_. |
| That's what the Guile implementation uses. |
| (kinda obvious, just being complete). |
| |
| - The word "invalid" carries a specific connotation. Try not to use it |
| in a different way. It means the underlying GDB object has disappeared. |
| For example, a <gdb:objfile> smob becomes "invalid" when the underlying |
| objfile is removed from GDB. |
| |
| - We typically use the word "exception" to mean Scheme exceptions, |
| and we typically use the word "error" to mean GDB errors. |
| |
| Comments: |
| |
| - function comments for functions implementing Scheme procedures begin with |
| a description of the Scheme usage. Example: |
| /* (gsmob-aux gsmob) -> object */ |
| |
| - the following comment appears after the copyright header: |
| /* See README file in this directory for implementation notes, coding |
| conventions, et.al. */ |
| |
| Smob naming: |
| |
| - gdb smobs are named, internally, "gdb:foo" |
| - in Guile they become <gdb:foo>, that is the convention for naming classes |
| and smobs have rudimentary GOOPS support (they can't be inherited from, |
| but generics can work with them) |
| - in comments use the Guile naming for smobs, |
| i.e., <gdb:foo> instead of gdb:foo. |
| Note: This only applies to smobs. Exceptions are also named gdb:foo, |
| but since they are not "classes" they are not wrapped in <>. |
| - smob names are stored in a global, and for simplicity we pass this |
| global as the "expected type" parameter to SCM_ASSERT_TYPE, thus in |
| this instance smob types are printed without the <>. |
| [Hmmm, this rule seems dated now. Plus I18N rules in GDB are not always |
| clear, sometimes we pass the smob name through _(), however it's not |
| clear that's actually a good idea.] |
| |
| Type naming: |
| |
| - smob structs are typedefs named foo_smob |
| |
| Variable naming: |
| |
| - "scm" by itself is reserved for arbitrary Scheme objects |
| |
| - variables that are pointers to smob structs are named <char>_smob or |
| <char><char>_smob, e.g., f_smob for a pointer to a frame smob |
| |
| - variables that are gdb smob objects are typically named <char>_scm or |
| <char><char>_scm, e.g., f_scm for a <gdb:frame> object |
| |
| - the name of the first argument for method-like functions is "self" |
| |
| Function naming: |
| |
| General: |
| |
| - all non-static functions have a prefix, |
| either gdbscm_ or <char><char>scm_ [or <char><char><char>scm_] |
| |
| - all functions that implement Scheme procedures have a gdbscm_ prefix, |
| this is for consistency and readability of Scheme exception text |
| |
| - static functions typically have a prefix |
| - the prefix is typically <char><char>scm_ where the first two letters |
| are unique to the file or class the function works with. |
| E.g., the scm-arch.c prefix is arscm_. |
| This follows something used in gdb/python in some places, |
| we make it formal. |
| |
| - if the function is of a general nature, or no other prefix works, |
| use gdbscm_ |
| |
| Conversion functions: |
| |
| - the from/to in function names follows from libguile's existing style |
| - conversions from/to Scheme objects are named: |
| prefix_scm_from_foo: converts from foo to scm |
| prefix_scm_to_foo: converts from scm to foo |
| |
| Exception handling: |
| |
| - functions that may throw a Scheme exception have an _unsafe suffix |
| - This does not apply to functions that implement Scheme procedures. |
| - This does not apply to functions whose explicit job is to throw |
| an exception. Adding _unsafe to gdbscm_throw is kinda superfluous. :-) |
| - functions that can throw a GDB error aren't adorned with _unsafe |
| |
| - "_safe" in a function name means it will never throw an exception |
| - Generally unnecessary, since the convention is to mark the ones that |
| *can* throw an exception. But sometimes it's useful to highlight the |
| fact that the function is safe to call without worrying about exception |
| handling. |
| |
| - except for functions that implement Scheme procedures, all functions |
| that can throw exceptions (GDB or Scheme) say so in their function comment |
| |
| - functions that don't throw an exception, but still need to indicate to |
| the caller that one happened (i.e., "safe" functions), either return |
| a <gdb:exception> smob as a result or pass it back via a parameter. |
| For this reason don't pass back <gdb:exception> smobs for any other |
| reason. There are functions that explicitly construct <gdb:exception> |
| smobs. They're obviously the, umm, exception. |
| |
| Internal functions: |
| |
| - internal Scheme functions begin with "%" and are intentionally undocumented |
| in the manual |
| |
| Standard Guile/Scheme conventions: |
| |
| - predicates that return Scheme values have the suffix _p and have suffix "?" |
| in the Scheme procedure's name |
| - functions that implement Scheme procedures that modify state have the |
| suffix _x and have suffix "!" in the Scheme procedure's name |
| - object predicates that return a C truth value are named prefix_is_foo |
| - functions that set something have "set" at the front (except for a prefix) |
| write this: gdbscm_set_gsmob_aux_x implements (set-gsmob-aux! ...) |
| not this: gdbscm_gsmob_set_aux_x implements (gsmob-set-aux! ...) |
| |
| Doc strings: |
| |
| - there are lots of existing examples, they should be pretty consistent, |
| use them as boilerplate/examples |
| - begin with a one line summary (can be multiple lines if necessary) |
| - if the arguments need description: |
| - blank line |
| - " Arguments: arg1 arg2" |
| " arg1: blah ..." |
| " arg2: blah ..." |
| - if the result requires more description: |
| - blank line |
| - " Returns:" |
| " Blah ..." |
| - if it's important to list exceptions that can be thrown: |
| - blank line |
| - " Throws:" |
| " exception-name: blah ..." |