NEURON
hoc_oop.cpp File Reference
#include <../../nrnconf.h>
#include <stdlib.h>
#include <classreg.h>
#include "hocstr.h"
#include "parse.hpp"
#include "hocparse.h"
#include "code.h"
#include "hocassrt.h"
#include "hoclist.h"
#include "nrnmpi.h"
#include "nrnfilewrap.h"
#include <nrnpython_config.h>

Go to the source code of this file.

Classes

union  Templatedatum
 
struct  newobj1_err_t
 

Macros

#define PDEBUG   0
 
#define PUBLIC_TYPE   1
 
#define EXTERNAL_TYPE   2
 
#define NTEMPLATESTACK   20
 
#define pushtemplatesym(arg)
 
#define pushtemplatesymlist(arg)
 
#define pushtemplatei(arg)
 
#define pushtemplateodata(arg)
 
#define pushtemplateo(arg)
 
#define OBJ_STACK_SIZE   10
 
#define NEWOBJ1_ERR_SIZE   32 /* starts with this size, and doubles on overflow */
 If hoc_newob1 fails after creating a new object, that object needs to be unreffed. More...
 
#define objectpath   hoc_objectpath_impl
 
#define pathprepend   hoc_path_prepend
 

Functions

static void call_constructor (Object *, Symbol *, int)
 
static void free_objectdata (Objectdata *, cTemplate *)
 
void hoc_install_hoc_obj (void)
 
Objecthoc_obj_get (int i)
 
void hoc_obj_set (int i, Object *obj)
 
char * hoc_object_name (Object *ob)
 
size_t hoc_total_array (Symbol *s)
 
size_t hoc_total_array_data (Symbol *s, Objectdata *obd)
 
void hoc_push_current_object (void)
 
Objectdatahoc_objectdata_save (void)
 
Objectdatahoc_objectdata_restore (Objectdata *obdsav)
 
void hoc_obvar_declare (Symbol *sym, int type, int pmes)
 
static Templatedatumpoptemplate (void)
 
static void chktemplate (void)
 
void hoc_object_push (void)
 
void hoc_object_pushed (void)
 
void hoc_object_pop (void)
 
int hoc_resize_toplevel (int more)
 
void hoc_install_object_data_index (Symbol *sp)
 
int hoc_obj_run (const char *cmd, Object *ob)
 Brief explanation of hoc_obj_run. More...
 
void hoc_exec_cmd (void)
 
double hoc_call_objfunc (Symbol *s, int narg, Object *ob)
 
void hoc_oop_initaftererror (void)
 
void oc_save_hoc_oop (Object **a1, Objectdata **a2, int *a4, Symlist **a5)
 
void oc_restore_hoc_oop (Object **a1, Objectdata **a2, int *a4, Symlist **a5)
 
Objecthoc_new_object (Symbol *symtemp, void *v)
 
void hoc_new_object_asgn (Object **obp, Symbol *st, void *v)
 
Object ** hoc_temp_objvar (Symbol *symtemp, void *v)
 
voidnrn_get_oji ()
 Return handle for the current longjump buffer info. More...
 
voidnrn_get_hoc_jmp ()
 If one of the two jmp_buf is controlling the longjmp hoc_newobj1_err needs handle to know how much to unwrap the newobj1 stack. More...
 
static void push_newobj1_err (Object *ob)
 save partially constructed object and controlling longjump handle More...
 
void pop_newobj1_err ()
 pop the now fully constructed object More...
 
void hoc_newobj1_err ()
 unref partially constructed objects controlled by current longjump handle More...
 
Objecthoc_newobj1 (Symbol *sym, int narg)
 
void hoc_newobj_arg (void)
 
void hoc_newobj_ret (void)
 
void hoc_newobj (void)
 
Objectnrn_get_gui_redirect_obj ()
 
void call_ob_proc (Object *ob, Symbol *sym, int narg)
 
static void call_ob_iter (Object *ob, Symbol *sym, int narg)
 
void hoc_objvardecl (void)
 
void hoc_cmp_otype (void)
 
void hoc_known_type (void)
 
void hoc_objectvar (void)
 
void hoc_objectarg (void)
 
void hoc_constobject (void)
 
Objecthoc_name2obj (const char *name, int index)
 
void hoc_object_id (void)
 
void hoc_object_component (void)
 
void hoc_object_eval (void)
 
void hoc_ob_pointer (void)
 
void hoc_asgn_obj_to_str (void)
 
void hoc_object_asgn (void)
 
Symbolhoc_which_template (Symbol *s)
 
void hoc_begintemplate (Symbol *t1)
 
void hoc_endtemplate (Symbol *t)
 
void class2oc (const char *name, void *(*cons)(Object *), void(*destruct)(void *), Member_func *m, int(*checkpoint)(void **), Member_ret_obj_func *mobjret, Member_ret_str_func *strret)
 
Symbolhoc_decl (Symbol *s)
 
void hoc_add_publiclist (Symbol *s)
 
void hoc_external_var (Symbol *s)
 
void hoc_ob_check (int type)
 
void hoc_free_allobjects (cTemplate *ctemplate, Symlist *sl, Objectdata *data)
 
void pathprepend (char *path, const char *name, const char *indx)
 
int objectpath (Object *ob, Object *oblook, char *path, int depth)
 
char * hoc_object_pathname (Object *ob)
 
void hoc_obj_ref (Object *obj)
 
void hoc_dec_refcount (Object **pobj)
 
void hoc_obj_unref (Object *obj)
 
static void hoc_allobjects1 (Symlist *sl, int nspace)
 
static void hoc_allobjects2 (Symbol *s, int nspace)
 
void hoc_allobjects (void)
 
static void hoc_list_allobjref (Symlist *, Objectdata *, int)
 
void hoc_allobjectvars (void)
 
void check_obj_type (Object *obj, const char *type_name)
 
int is_obj_type (Object *obj, const char *type_name)
 
voidnrn_opaque_obj2pyobj (Object *ho)
 

Variables

int hoc_print_first_instance = 1
 
int hoc_max_builtin_class_id = -1
 
static Symbolhoc_obj_
 
static int icntobjectdata = 0
 
Objecthoc_thisobject
 
Objectdatahoc_objectdata = (Objectdata*) 0
 
Objectdatahoc_top_level_data
 
static int icnttoplevel
 
int hoc_in_template = 0
 
static Templatedatum templatestack [NTEMPLATESTACK]
 
static Templatedatumtemplatestackp = templatestack
 
static Objectobj_stack_ [OBJ_STACK_SIZE+1]
 
static int obj_stack_loc
 
void(* oc_jump_target_ )()
 
static int newobj1_err_index_
 
static int newobj1_err_size_
 
static newobj1_err_tnewobj1_err_
 
static Objectgui_redirect_obj_
 
static int template_id
 

Macro Definition Documentation

◆ EXTERNAL_TYPE

#define EXTERNAL_TYPE   2

Definition at line 34 of file hoc_oop.cpp.

◆ NEWOBJ1_ERR_SIZE

#define NEWOBJ1_ERR_SIZE   32 /* starts with this size, and doubles on overflow */

If hoc_newob1 fails after creating a new object, that object needs to be unreffed.

To handle the case of constructors themselves creating new objects before the error or intervening recovery of error by a callee recovering from execerror, the incomplete new object is put on a stack along with the current longjump target, and removed from the stack when the object is complete. There could be a problem if the destructor doesn't work with a partially constructed object. In case of a execerror before newobj1 completion, all partially constructed objects with a longjump handle equal to the current longjump handle are unreffed.

Definition at line 506 of file hoc_oop.cpp.

◆ NTEMPLATESTACK

#define NTEMPLATESTACK   20

Definition at line 202 of file hoc_oop.cpp.

◆ OBJ_STACK_SIZE

#define OBJ_STACK_SIZE   10

Definition at line 239 of file hoc_oop.cpp.

◆ objectpath

#define objectpath   hoc_objectpath_impl

Definition at line 1739 of file hoc_oop.cpp.

◆ pathprepend

#define pathprepend   hoc_path_prepend

Definition at line 1740 of file hoc_oop.cpp.

◆ PDEBUG

#define PDEBUG   0

Definition at line 15 of file hoc_oop.cpp.

◆ PUBLIC_TYPE

#define PUBLIC_TYPE   1

Definition at line 33 of file hoc_oop.cpp.

◆ pushtemplatei

#define pushtemplatei (   arg)
Value:
static Templatedatum * templatestackp
Definition: hoc_oop.cpp:204
static void chktemplate(void)
Definition: hoc_oop.cpp:229
#define i
Definition: md1redef.h:12
#define arg
Definition: redef.h:28

Definition at line 219 of file hoc_oop.cpp.

◆ pushtemplateo

#define pushtemplateo (   arg)
Value:
o
Definition: seclist.cpp:175

Definition at line 225 of file hoc_oop.cpp.

◆ pushtemplateodata

#define pushtemplateodata (   arg)
Value:
(templatestackp++)->odata = arg

Definition at line 222 of file hoc_oop.cpp.

◆ pushtemplatesym

#define pushtemplatesym (   arg)
Value:
(templatestackp++)->sym = arg

Definition at line 213 of file hoc_oop.cpp.

◆ pushtemplatesymlist

#define pushtemplatesymlist (   arg)
Value:
#define symlist
Definition: cabcode.cpp:17

Definition at line 216 of file hoc_oop.cpp.

Function Documentation

◆ call_constructor()

static void call_constructor ( Object ob,
Symbol sym,
int  narg 
)
static

Definition at line 683 of file hoc_oop.cpp.

◆ call_ob_iter()

static void call_ob_iter ( Object ob,
Symbol sym,
int  narg 
)
static

Definition at line 782 of file hoc_oop.cpp.

◆ call_ob_proc()

void call_ob_proc ( Object ob,
Symbol sym,
int  narg 
)

Definition at line 715 of file hoc_oop.cpp.

◆ chktemplate()

static void chktemplate ( void  )
static

Definition at line 229 of file hoc_oop.cpp.

◆ class2oc()

void class2oc ( const char *  name,
void *(*)(Object *)  cons,
void(*)(void *)  destruct,
Member_func m,
int(*)(void **)  checkpoint,
Member_ret_obj_func mobjret,
Member_ret_str_func strret 
)

Definition at line 1560 of file hoc_oop.cpp.

◆ free_objectdata()

static void free_objectdata ( Objectdata od,
cTemplate ctemplate 
)
static

Definition at line 1877 of file hoc_oop.cpp.

◆ hoc_add_publiclist()

void hoc_add_publiclist ( Symbol s)

Definition at line 1623 of file hoc_oop.cpp.

◆ hoc_allobjects()

void hoc_allobjects ( void  )

Definition at line 1941 of file hoc_oop.cpp.

◆ hoc_allobjects1()

void hoc_allobjects1 ( Symlist sl,
int  nspace 
)
static

Definition at line 1960 of file hoc_oop.cpp.

◆ hoc_allobjects2()

void hoc_allobjects2 ( Symbol s,
int  nspace 
)
static

Definition at line 1982 of file hoc_oop.cpp.

◆ hoc_allobjectvars()

void hoc_allobjectvars ( void  )

Definition at line 2001 of file hoc_oop.cpp.

◆ hoc_asgn_obj_to_str()

void hoc_asgn_obj_to_str ( void  )

Definition at line 1362 of file hoc_oop.cpp.

◆ hoc_begintemplate()

void hoc_begintemplate ( Symbol t1)

Definition at line 1486 of file hoc_oop.cpp.

◆ hoc_cmp_otype()

void hoc_cmp_otype ( void  )

Definition at line 845 of file hoc_oop.cpp.

◆ hoc_constobject()

void hoc_constobject ( void  )

Definition at line 903 of file hoc_oop.cpp.

◆ hoc_decl()

Symbol* hoc_decl ( Symbol s)

Definition at line 1608 of file hoc_oop.cpp.

◆ hoc_endtemplate()

void hoc_endtemplate ( Symbol t)

Definition at line 1525 of file hoc_oop.cpp.

◆ hoc_exec_cmd()

void hoc_exec_cmd ( void  )

Definition at line 356 of file hoc_oop.cpp.

◆ hoc_external_var()

void hoc_external_var ( Symbol s)

Definition at line 1635 of file hoc_oop.cpp.

◆ hoc_install_hoc_obj()

void hoc_install_hoc_obj ( void  )

Definition at line 44 of file hoc_oop.cpp.

◆ hoc_known_type()

void hoc_known_type ( void  )

Definition at line 850 of file hoc_oop.cpp.

◆ hoc_list_allobjref()

static void hoc_list_allobjref ( Symlist sl,
Objectdata data,
int  depth 
)
static

Definition at line 2007 of file hoc_oop.cpp.

◆ hoc_new_object()

Object* hoc_new_object ( Symbol symtemp,
void v 
)

Definition at line 457 of file hoc_oop.cpp.

◆ hoc_newobj()

void hoc_newobj ( void  )

Definition at line 655 of file hoc_oop.cpp.

◆ hoc_newobj1()

Object* hoc_newobj1 ( Symbol sym,
int  narg 
)

Definition at line 565 of file hoc_oop.cpp.

◆ hoc_newobj1_err()

void hoc_newobj1_err ( )

unref partially constructed objects controlled by current longjump handle

Definition at line 546 of file hoc_oop.cpp.

◆ hoc_newobj_arg()

void hoc_newobj_arg ( void  )

Definition at line 640 of file hoc_oop.cpp.

◆ hoc_newobj_ret()

void hoc_newobj_ret ( void  )

Definition at line 651 of file hoc_oop.cpp.

◆ hoc_ob_check()

void hoc_ob_check ( int  type)

Definition at line 1673 of file hoc_oop.cpp.

◆ hoc_ob_pointer()

void hoc_ob_pointer ( void  )

Definition at line 1326 of file hoc_oop.cpp.

◆ hoc_object_asgn()

void hoc_object_asgn ( void  )

Definition at line 1369 of file hoc_oop.cpp.

◆ hoc_object_component()

void hoc_object_component ( void  )

Definition at line 999 of file hoc_oop.cpp.

◆ hoc_object_eval()

void hoc_object_eval ( void  )

Definition at line 1296 of file hoc_oop.cpp.

◆ hoc_object_id()

void hoc_object_id ( void  )

Definition at line 947 of file hoc_oop.cpp.

◆ hoc_object_pop()

void hoc_object_pop ( void  )

Definition at line 273 of file hoc_oop.cpp.

◆ hoc_object_push()

void hoc_object_push ( void  )

Definition at line 243 of file hoc_oop.cpp.

◆ hoc_object_pushed()

void hoc_object_pushed ( void  )

Definition at line 265 of file hoc_oop.cpp.

◆ hoc_objectarg()

void hoc_objectarg ( void  )

Definition at line 888 of file hoc_oop.cpp.

◆ hoc_objectdata_restore()

Objectdata* hoc_objectdata_restore ( Objectdata obdsav)

Definition at line 143 of file hoc_oop.cpp.

◆ hoc_objectdata_save()

Objectdata* hoc_objectdata_save ( void  )

Definition at line 133 of file hoc_oop.cpp.

◆ hoc_objectvar()

void hoc_objectvar ( void  )

Definition at line 855 of file hoc_oop.cpp.

◆ hoc_objvardecl()

void hoc_objvardecl ( void  )

Definition at line 812 of file hoc_oop.cpp.

◆ hoc_obvar_declare()

void hoc_obvar_declare ( Symbol sym,
int  type,
int  pmes 
)

Definition at line 152 of file hoc_oop.cpp.

◆ hoc_push_current_object()

void hoc_push_current_object ( void  )

Definition at line 129 of file hoc_oop.cpp.

◆ hoc_resize_toplevel()

int hoc_resize_toplevel ( int  more)

Definition at line 292 of file hoc_oop.cpp.

◆ hoc_which_template()

Symbol* hoc_which_template ( Symbol s)

Definition at line 1468 of file hoc_oop.cpp.

◆ nrn_get_gui_redirect_obj()

Object* nrn_get_gui_redirect_obj ( )

Definition at line 711 of file hoc_oop.cpp.

◆ nrn_get_hoc_jmp()

void* nrn_get_hoc_jmp ( )

If one of the two jmp_buf is controlling the longjmp hoc_newobj1_err needs handle to know how much to unwrap the newobj1 stack.

Definition at line 697 of file hoc.cpp.

◆ nrn_get_oji()

void* nrn_get_oji ( )

Return handle for the current longjump buffer info.

Valid until finish is called on the oji_ instance.

Definition at line 129 of file ocjump.cpp.

◆ objectpath()

int objectpath ( Object ob,
Object oblook,
char *  path,
int  depth 
)

Definition at line 1752 of file hoc_oop.cpp.

◆ oc_restore_hoc_oop()

void oc_restore_hoc_oop ( Object **  a1,
Objectdata **  a2,
int *  a4,
Symlist **  a5 
)

Definition at line 446 of file hoc_oop.cpp.

◆ oc_save_hoc_oop()

void oc_save_hoc_oop ( Object **  a1,
Objectdata **  a2,
int *  a4,
Symlist **  a5 
)

Definition at line 430 of file hoc_oop.cpp.

◆ pathprepend()

void pathprepend ( char *  path,
const char *  name,
const char *  indx 
)

Definition at line 1742 of file hoc_oop.cpp.

◆ pop_newobj1_err()

void pop_newobj1_err ( )

pop the now fully constructed object

Definition at line 540 of file hoc_oop.cpp.

◆ poptemplate()

static Templatedatum* poptemplate ( void  )
static

Definition at line 206 of file hoc_oop.cpp.

◆ push_newobj1_err()

static void push_newobj1_err ( Object ob)
static

save partially constructed object and controlling longjump handle

Definition at line 520 of file hoc_oop.cpp.

Variable Documentation

◆ gui_redirect_obj_

Object* gui_redirect_obj_
static

Definition at line 710 of file hoc_oop.cpp.

◆ hoc_in_template

int hoc_in_template = 0

Definition at line 126 of file hoc_oop.cpp.

◆ hoc_max_builtin_class_id

int hoc_max_builtin_class_id = -1

Definition at line 40 of file hoc_oop.cpp.

◆ hoc_obj_

Symbol* hoc_obj_
static

Definition at line 42 of file hoc_oop.cpp.

◆ hoc_print_first_instance

int hoc_print_first_instance = 1

Definition at line 38 of file hoc_oop.cpp.

◆ hoc_thisobject

Object* hoc_thisobject

Definition at line 122 of file hoc_oop.cpp.

◆ hoc_top_level_data

Objectdata* hoc_top_level_data

Definition at line 124 of file hoc_oop.cpp.

◆ icntobjectdata

int icntobjectdata = 0
static

Definition at line 121 of file hoc_oop.cpp.

◆ icnttoplevel

int icnttoplevel
static

Definition at line 125 of file hoc_oop.cpp.

◆ newobj1_err_

newobj1_err_t* newobj1_err_
static

Definition at line 517 of file hoc_oop.cpp.

◆ newobj1_err_index_

int newobj1_err_index_
static

Definition at line 515 of file hoc_oop.cpp.

◆ newobj1_err_size_

int newobj1_err_size_
static

Definition at line 516 of file hoc_oop.cpp.

◆ obj_stack_

Object* obj_stack_[OBJ_STACK_SIZE+1]
static

Definition at line 240 of file hoc_oop.cpp.

◆ obj_stack_loc

int obj_stack_loc
static

Definition at line 241 of file hoc_oop.cpp.

◆ oc_jump_target_

void(* oc_jump_target_) () ( void  )
extern

Definition at line 686 of file hoc.cpp.

◆ template_id

int template_id
static

Definition at line 1484 of file hoc_oop.cpp.

◆ templatestack

Templatedatum templatestack[NTEMPLATESTACK]
static

Definition at line 203 of file hoc_oop.cpp.

◆ templatestackp

Templatedatum* templatestackp = templatestack
static

Definition at line 204 of file hoc_oop.cpp.